ref: e0c5044fb8038f7124d1e526c4687d3086a2df65
parent: 9cef479d3b72b54eaa1ad3c058357b026bb66156
author: Werner Lemberg <[email protected]>
date: Sun Feb 8 11:30:37 EST 2004
* 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.
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2003-02-07 Keith Packard <[email protected]>
+
+ * 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 <[email protected]>
* builds/win32/visualc/index.html,
--- a/docs/CHANGES
+++ b/docs/CHANGES
@@ -32,6 +32,8 @@
- The flex operator didn't work for CFF fonts.
+ - Metrics for BDF and PCF bitmap font formats have been fixed.
+
II. IMPORTANT CHANGES
--- a/src/bdf/bdfdrivr.c
+++ b/src/bdf/bdfdrivr.c
@@ -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 @@
{
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 @@
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 @@
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;
--- a/src/pcf/pcfdrivr.c
+++ b/src/pcf/pcfdrivr.c
@@ -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 @@
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);
--- a/src/pcf/pcfread.c
+++ b/src/pcf/pcfread.c
@@ -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 @@
{
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 */