* src/bdf/bdfdrivr.c (BDF_Face_Init, BDF_Set_Pixel_Size): Fix

computation of various vertical and horizontal metric values.

* src/pcfdrivr.c (PCF_Set_Pixel_Size), src/pcfread (pcf_load_font):
Ditto.
This commit is contained in:
Werner Lemberg 2004-02-08 16:30:37 +00:00
parent 3c711454e2
commit 9963101dbe
5 changed files with 60 additions and 37 deletions

View File

@ -1,3 +1,11 @@
2003-02-07 Keith Packard <keithp@keithp.com>
* src/bdf/bdfdrivr.c (BDF_Face_Init, BDF_Set_Pixel_Size): Fix
computation of various vertical and horizontal metric values.
* src/pcfdrivr.c (PCF_Set_Pixel_Size), src/pcfread (pcf_load_font):
Ditto.
2003-02-07 Werner Lemberg <wl@gnu.org>
* builds/win32/visualc/index.html,

View File

@ -32,6 +32,8 @@ LATEST CHANGES BETWEEN 2.1.8 and 2.1.7
- The flex operator didn't work for CFF fonts.
- Metrics for BDF and PCF bitmap font formats have been fixed.
II. IMPORTANT CHANGES

View File

@ -2,7 +2,7 @@
FreeType font driver for bdf files
Copyright (C) 2001, 2002, 2003 by
Copyright (C) 2001, 2002, 2003, 2004 by
Francesco Zappa Nardelli
Permission is hereby granted, free of charge, to any person obtaining a copy
@ -397,17 +397,18 @@ THE SOFTWARE.
{
FT_Bitmap_Size* bsize = root->available_sizes;
FT_Short resolution_x = 0, resolution_y = 0;
FT_MEM_ZERO( bsize, sizeof ( FT_Bitmap_Size ) );
prop = bdf_get_font_property( font, "PIXEL_SIZE" );
if ( prop )
bsize->height = (FT_Short)prop->value.int32;
bsize->height = font->font_ascent + font->font_descent;
prop = bdf_get_font_property( font, "AVERAGE_WIDTH" );
if ( prop )
bsize->width = (FT_Short)( ( prop->value.int32 + 5 ) / 10 );
else
bsize->width = bsize->height * 2/3;
prop = bdf_get_font_property( font, "POINT_SIZE" );
if ( prop )
@ -415,25 +416,28 @@ THE SOFTWARE.
bsize->size =
(FT_Pos)( ( prop->value.int32 * 64 * 7200 + 36135L ) / 72270L );
prop = bdf_get_font_property( font, "PIXEL_SIZE" );
if ( prop )
bsize->y_ppem = (FT_Short)prop->value.int32 << 6;
prop = bdf_get_font_property( font, "RESOLUTION_X" );
if ( prop )
bsize->x_ppem =
(FT_Pos)( ( prop->value.int32 * bsize->size + 36 ) / 72 );
resolution_x = (FT_Short)prop->value.int32;
prop = bdf_get_font_property( font, "RESOLUTION_Y" );
if ( prop )
bsize->y_ppem =
(FT_Pos)( ( prop->value.int32 * bsize->size + 36 ) / 72 );
resolution_y = (FT_Short)prop->value.int32;
if ( bsize->height == 0 )
bsize->height = (FT_Short)( ( bsize->y_ppem + 32 ) / 64 );
if ( bsize->height == 0 )
if ( bsize->y_ppem == 0 )
{
/* some fonts have a broken SIZE declaration (jiskan24.bdf) */
FT_ERROR(( "BDF_Face_Init: reading size\n" ));
bsize->height = (FT_Short)font->point_size;
bsize->y_ppem = bsize->size;
if ( resolution_y )
bsize->y_ppem = bsize->y_ppem * resolution_y / 72;
}
if ( resolution_x && resolution_y )
bsize->x_ppem = bsize->y_ppem * resolution_x / resolution_y;
else
bsize->x_ppem = bsize->y_ppem;
}
/* encoding table */
@ -563,13 +567,14 @@ THE SOFTWARE.
FT_TRACE4(( "rec %d - pres %d\n",
size->metrics.y_ppem, root->available_sizes->height ));
size->metrics.y_ppem, root->available_sizes->y_ppem ));
if ( size->metrics.y_ppem == root->available_sizes->height )
if ( size->metrics.y_ppem == root->available_sizes->y_ppem >> 6 )
{
size->metrics.ascender = face->bdffont->bbx.ascent << 6;
size->metrics.descender = face->bdffont->bbx.descent * ( -64 );
size->metrics.height = face->bdffont->bbx.height << 6;
size->metrics.ascender = face->bdffont->font_ascent << 6;
size->metrics.descender = -face->bdffont->font_descent << 6;
size->metrics.height = ( face->bdffont->font_ascent +
face->bdffont->font_descent ) << 6;
size->metrics.max_advance = face->bdffont->bbx.width << 6;
return BDF_Err_Ok;

View File

@ -2,7 +2,7 @@
FreeType font driver for pcf files
Copyright (C) 2000, 2001, 2002, 2003 by
Copyright (C) 2000, 2001, 2002, 2003, 2004 by
Francesco Zappa Nardelli
Permission is hereby granted, free of charge, to any person obtaining a copy
@ -336,9 +336,9 @@ THE SOFTWARE.
FT_TRACE4(( "rec %d - pres %d\n", size->metrics.y_ppem,
face->root.available_sizes->height ));
face->root.available_sizes->y_ppem >> 6 ));
if ( size->metrics.y_ppem == face->root.available_sizes->height )
if ( size->metrics.y_ppem == face->root.available_sizes->y_ppem >> 6 )
{
size->metrics.ascender = face->accel.fontAscent << 6;
size->metrics.descender = face->accel.fontDescent * (-64);

View File

@ -2,7 +2,7 @@
FreeType font driver for pcf fonts
Copyright 2000, 2001, 2002, 2003 by
Copyright 2000, 2001, 2002, 2003, 2004 by
Francesco Zappa Nardelli
Permission is hereby granted, free of charge, to any person obtaining a copy
@ -1070,39 +1070,47 @@ THE SOFTWARE.
{
FT_Bitmap_Size* bsize = root->available_sizes;
FT_Short resolution_x = 0, resolution_y = 0;
FT_MEM_ZERO( bsize, sizeof ( FT_Bitmap_Size ) );
prop = pcf_find_property( face, "PIXEL_SIZE" );
if ( prop )
bsize->height = (FT_Short)prop->value.integer;
bsize->height = face->accel.fontAscent + face->accel.fontDescent;
prop = pcf_find_property( face, "AVERAGE_WIDTH" );
if ( prop )
bsize->width = (FT_Short)( ( prop->value.integer + 5 ) / 10 );
else
bsize->width = bsize->height * 2/3;
prop = pcf_find_property( face, "POINT_SIZE" );
if ( prop )
/* convert from 722,7 decipoints to 72 points per inch */
/* convert from 722.7 decipoints to 72 points per inch */
bsize->size =
(FT_Pos)( ( prop->value.integer * 64 * 7200 + 36135L ) / 72270L );
prop = pcf_find_property( face, "PIXEL_SIZE" );
if ( prop )
bsize->y_ppem = (FT_Short)prop->value.integer << 6;
prop = pcf_find_property( face, "RESOLUTION_X" );
if ( prop )
bsize->x_ppem =
(FT_Pos)( ( prop->value.integer * bsize->size + 36 ) / 72 );
resolution_x = (FT_Short)prop->value.integer;
prop = pcf_find_property( face, "RESOLUTION_Y" );
if ( prop )
bsize->y_ppem =
(FT_Pos)( ( prop->value.integer * bsize->size + 36 ) / 72 );
resolution_y = (FT_Short)prop->value.integer;
if ( bsize->height == 0 )
bsize->height = (FT_Short)( ( bsize->y_ppem + 32 ) / 64 );
if ( bsize->height == 0 )
bsize->height = 12;
if ( bsize->y_ppem == 0 )
{
bsize->y_ppem = bsize->size;
if ( resolution_y )
bsize->y_ppem = bsize->y_ppem * resolution_y / 72;
}
if ( resolution_x && resolution_y )
bsize->x_ppem = bsize->y_ppem * resolution_x / resolution_y;
else
bsize->x_ppem = bsize->y_ppem;
}
/* set up charset */