fonts: avoid a divide by zero - take 2

Huw D M Davies h.davies1 at physics.ox.ac.uk
Mon Dec 8 08:38:41 CST 2003


Sorry Alexandre, please use this one instead.

      Huw Davies <huw_at_codeweavers.com>
      If usWinAscent + usWinDescent == 0 then use the Ascender
      and Descender values instead.
-- 
Huw Davies
huw at codeweavers.com
Index: dlls/gdi/freetype.c
===================================================================
RCS file: /home/wine/wine/dlls/gdi/freetype.c,v
retrieving revision 1.45
diff -u -r1.45 freetype.c
--- dlls/gdi/freetype.c	19 Nov 2003 02:18:13 -0000	1.45
+++ dlls/gdi/freetype.c	8 Dec 2003 14:35:21 -0000
@@ -899,9 +899,12 @@
 static LONG calc_ppem_for_height(FT_Face ft_face, LONG height)
 {
     TT_OS2 *pOS2;
+    TT_HoriHeader *pHori;
+
     LONG ppem;
 
     pOS2 = pFT_Get_Sfnt_Table(ft_face, ft_sfnt_os2);
+    pHori = pFT_Get_Sfnt_Table(ft_face, ft_sfnt_hhea);
 
     if(height == 0) height = 16;
 
@@ -919,9 +922,14 @@
      *
      */
 
-    if(height > 0)
-        ppem = ft_face->units_per_EM * height /
-	    (pOS2->usWinAscent + pOS2->usWinDescent);
+    if(height > 0) {
+        if(pOS2->usWinAscent + pOS2->usWinDescent == 0)
+            ppem = ft_face->units_per_EM * height /
+                (pHori->Ascender - pHori->Descender);
+        else
+            ppem = ft_face->units_per_EM * height /
+                (pOS2->usWinAscent + pOS2->usWinDescent);
+    }
     else
         ppem = -height;
 
@@ -2109,6 +2117,7 @@
     WCHAR *family_nameW, *style_nameW;
     WCHAR spaceW[] = {' ', '\0'};
     char *cp;
+    INT ascent, descent;
 
     TRACE("font=%p\n", font);
 
@@ -2179,14 +2188,22 @@
 
 #define TM font->potm->otmTextMetrics
 
+    if(pOS2->usWinAscent + pOS2->usWinDescent == 0) {
+        ascent = pHori->Ascender;
+        descent = -pHori->Descender;
+    } else {
+        ascent = pOS2->usWinAscent;
+        descent = pOS2->usWinDescent;
+    }
+
     if(font->yMax) {
 	TM.tmAscent = font->yMax;
 	TM.tmDescent = -font->yMin;
 	TM.tmInternalLeading = (TM.tmAscent + TM.tmDescent) - ft_face->size->metrics.y_ppem;
     } else {
-	TM.tmAscent = (pFT_MulFix(pOS2->usWinAscent, y_scale) + 32) >> 6;
-	TM.tmDescent = (pFT_MulFix(pOS2->usWinDescent, y_scale) + 32) >> 6;
-	TM.tmInternalLeading = (pFT_MulFix(pOS2->usWinAscent + pOS2->usWinDescent
+	TM.tmAscent = (pFT_MulFix(ascent, y_scale) + 32) >> 6;
+	TM.tmDescent = (pFT_MulFix(descent, y_scale) + 32) >> 6;
+	TM.tmInternalLeading = (pFT_MulFix(ascent + descent
 					    - ft_face->units_per_EM, y_scale) + 32) >> 6;
     }
 
@@ -2196,7 +2213,7 @@
      el = MAX(0, LineGap - ((WinAscent + WinDescent) - (Ascender - Descender)))
     */
     TM.tmExternalLeading = max(0, (pFT_MulFix(pHori->Line_Gap -
-       		 ((pOS2->usWinAscent + pOS2->usWinDescent) -
+       		 ((ascent + descent) -
 		  (pHori->Ascender - pHori->Descender)), y_scale) + 32) >> 6);
 
     TM.tmAveCharWidth = (pFT_MulFix(pOS2->xAvgCharWidth, x_scale) + 32) >> 6;



More information about the wine-patches mailing list