summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWerner Lemberg <wl@gnu.org>2004-02-08 16:30:37 +0000
committerWerner Lemberg <wl@gnu.org>2004-02-08 16:30:37 +0000
commit9963101dbe361b7382bd116e2b1da70e491a8978 (patch)
tree5c716355279045ed306c15be55847b4352400d2e
parent3c711454e26b5006505b786cca10daa5129cfcb9 (diff)
downloadfreetype2-9963101dbe361b7382bd116e2b1da70e491a8978.tar.gz
* 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.
-rw-r--r--ChangeLog8
-rw-r--r--docs/CHANGES2
-rw-r--r--src/bdf/bdfdrivr.c45
-rw-r--r--src/pcf/pcfdrivr.c6
-rw-r--r--src/pcf/pcfread.c36
5 files changed, 60 insertions, 37 deletions
diff --git a/ChangeLog b/ChangeLog
index 71eac3518..3df5e4fab 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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,
diff --git a/docs/CHANGES b/docs/CHANGES
index d04e0efa8..a1e6c7000 100644
--- a/docs/CHANGES
+++ b/docs/CHANGES
@@ -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
diff --git a/src/bdf/bdfdrivr.c b/src/bdf/bdfdrivr.c
index a231fcd4f..7358615a1 100644
--- 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 @@ 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 );
-
- if ( bsize->height == 0 )
- bsize->height = (FT_Short)( ( bsize->y_ppem + 32 ) / 64 );
+ resolution_y = (FT_Short)prop->value.int32;
- 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;
diff --git a/src/pcf/pcfdrivr.c b/src/pcf/pcfdrivr.c
index 8807332df..dc25b5d87 100644
--- 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 @@ 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);
diff --git a/src/pcf/pcfread.c b/src/pcf/pcfread.c
index f29512fad..c8a14045c 100644
--- 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 @@ 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 );
-
- if ( bsize->height == 0 )
- bsize->height = (FT_Short)( ( bsize->y_ppem + 32 ) / 64 );
+ resolution_y = (FT_Short)prop->value.integer;
- 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 */