shithub: freetype+ttf2subf

Download patch

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.

git/fs: mount .git/fs: mount/attach disallowed
--- 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 */