From e0c5044fb8038f7124d1e526c4687d3086a2df65 Mon Sep 17 00:00:00 2001 From: Werner Lemberg Date: Sun, 8 Feb 2004 16:30:37 +0000 Subject: [PATCH] * 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. --- ChangeLog | 8 ++++++++ docs/CHANGES | 2 ++ src/bdf/bdfdrivr.c | 45 +++++++++++++++++++++++++-------------------- src/pcf/pcfdrivr.c | 6 +++--- src/pcf/pcfread.c | 36 ++++++++++++++++++++++-------------- 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 + + * 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 * 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 ); + 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; 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 ); + 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 */