Huw Davies : gdi32: Correct the font family values returned in the text metrics.

Alexandre Julliard julliard at winehq.org
Wed Feb 11 09:25:50 CST 2009


Module: wine
Branch: master
Commit: 8ab829a68a993434506d5307e7681fc97bbc3fee
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=8ab829a68a993434506d5307e7681fc97bbc3fee

Author: Huw Davies <huw at codeweavers.com>
Date:   Wed Feb 11 13:49:52 2009 +0000

gdi32: Correct the font family values returned in the text metrics.

---

 dlls/gdi32/freetype.c   |   55 ++++++++++++++++++++++++++++++------------
 dlls/gdi32/tests/font.c |   60 +++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 99 insertions(+), 16 deletions(-)

diff --git a/dlls/gdi32/freetype.c b/dlls/gdi32/freetype.c
index 34e4aed..97dd1a6 100644
--- a/dlls/gdi32/freetype.c
+++ b/dlls/gdi32/freetype.c
@@ -5420,31 +5420,54 @@ UINT WineEngGetOutlineTextMetrics(GdiFont *font, UINT cbSize,
     else
         TM.tmPitchAndFamily = 0;
 
-    switch(pOS2->panose[PAN_FAMILYTYPE_INDEX]) {
+    switch(pOS2->panose[PAN_FAMILYTYPE_INDEX])
+    {
     case PAN_FAMILY_SCRIPT:
         TM.tmPitchAndFamily |= FF_SCRIPT;
-	break;
+        break;
+
     case PAN_FAMILY_DECORATIVE:
-    case PAN_FAMILY_PICTORIAL:
         TM.tmPitchAndFamily |= FF_DECORATIVE;
-	break;
+        break;
+
+    case PAN_ANY:
+    case PAN_NO_FIT:
     case PAN_FAMILY_TEXT_DISPLAY:
+    case PAN_FAMILY_PICTORIAL: /* symbol fonts get treated as if they were text */
+                               /* which is clearly not what the panose spec says. */
+    default:
         if(TM.tmPitchAndFamily == 0) /* fixed */
 	    TM.tmPitchAndFamily = FF_MODERN;
-	else {
-	    switch(pOS2->panose[PAN_SERIFSTYLE_INDEX]) {
-	    case PAN_SERIF_NORMAL_SANS:
-	    case PAN_SERIF_OBTUSE_SANS:
-	    case PAN_SERIF_PERP_SANS:
-	        TM.tmPitchAndFamily |= FF_SWISS;
-		break;
-	    default:
-	        TM.tmPitchAndFamily |= FF_ROMAN;
-	    }
+        else
+        {
+            switch(pOS2->panose[PAN_SERIFSTYLE_INDEX])
+            {
+            case PAN_ANY:
+            case PAN_NO_FIT:
+            default:
+                TM.tmPitchAndFamily |= FF_DONTCARE;
+                break;
+
+            case PAN_SERIF_COVE:
+            case PAN_SERIF_OBTUSE_COVE:
+            case PAN_SERIF_SQUARE_COVE:
+            case PAN_SERIF_OBTUSE_SQUARE_COVE:
+            case PAN_SERIF_SQUARE:
+            case PAN_SERIF_THIN:
+            case PAN_SERIF_BONE:
+            case PAN_SERIF_EXAGGERATED:
+            case PAN_SERIF_TRIANGLE:
+                TM.tmPitchAndFamily |= FF_ROMAN;
+                break;
+
+            case PAN_SERIF_NORMAL_SANS:
+            case PAN_SERIF_OBTUSE_SANS:
+            case PAN_SERIF_PERP_SANS:
+                TM.tmPitchAndFamily |= FF_SWISS;
+                break;
+            }
 	}
 	break;
-    default:
-        TM.tmPitchAndFamily |= FF_DONTCARE;
     }
 
     if(FT_IS_SCALABLE(ft_face))
diff --git a/dlls/gdi32/tests/font.c b/dlls/gdi32/tests/font.c
index 38339ea..abb3a4d 100644
--- a/dlls/gdi32/tests/font.c
+++ b/dlls/gdi32/tests/font.c
@@ -2019,6 +2019,14 @@ typedef struct
                     ((DWORD)(BYTE)(ch2) << 16) | ((DWORD)(BYTE)(ch3) << 24))
 #define MS_OS2_TAG MS_MAKE_TAG('O','S','/','2')
 
+static void expect_ff(const TEXTMETRICW *tmW, const TT_OS2_V2 *os2, WORD family, const char *name)
+{
+    ok((tmW->tmPitchAndFamily & 0xf0) == family, "%s: expected family %02x got %02x. panose %d-%d-%d-%d-...\n",
+       name, family, tmW->tmPitchAndFamily, os2->panose.bFamilyType, os2->panose.bSerifStyle,
+       os2->panose.bWeight, os2->panose.bProportion);
+
+}
+
 static void test_text_metrics(const LOGFONTA *lf)
 {
     HDC hdc;
@@ -2130,6 +2138,58 @@ static void test_text_metrics(const LOGFONTA *lf)
            tmW.tmDigitizedAspectX, ret);
     }
 
+    /* test FF_ values */
+    switch(tt_os2.panose.bFamilyType)
+    {
+    case PAN_ANY:
+    case PAN_NO_FIT:
+    case PAN_FAMILY_TEXT_DISPLAY:
+    case PAN_FAMILY_PICTORIAL:
+    default:
+        if((tmW.tmPitchAndFamily & 1) == 0) /* fixed */
+        {
+            expect_ff(&tmW, &tt_os2, FF_MODERN, font_name);
+            break;
+        }
+        switch(tt_os2.panose.bSerifStyle)
+        {
+        case PAN_ANY:
+        case PAN_NO_FIT:
+        default:
+            expect_ff(&tmW, &tt_os2, FF_DONTCARE, font_name);
+            break;
+
+        case PAN_SERIF_COVE:
+        case PAN_SERIF_OBTUSE_COVE:
+        case PAN_SERIF_SQUARE_COVE:
+        case PAN_SERIF_OBTUSE_SQUARE_COVE:
+        case PAN_SERIF_SQUARE:
+        case PAN_SERIF_THIN:
+        case PAN_SERIF_BONE:
+        case PAN_SERIF_EXAGGERATED:
+        case PAN_SERIF_TRIANGLE:
+            expect_ff(&tmW, &tt_os2, FF_ROMAN, font_name);
+            break;
+
+        case PAN_SERIF_NORMAL_SANS:
+        case PAN_SERIF_OBTUSE_SANS:
+        case PAN_SERIF_PERP_SANS:
+        case PAN_SERIF_FLARED:
+        case PAN_SERIF_ROUNDED:
+            expect_ff(&tmW, &tt_os2, FF_SWISS, font_name);
+            break;
+        }
+        break;
+
+    case PAN_FAMILY_SCRIPT:
+        expect_ff(&tmW, &tt_os2, FF_SCRIPT, font_name);
+        break;
+
+    case PAN_FAMILY_DECORATIVE:
+        expect_ff(&tmW, &tt_os2, FF_DECORATIVE, font_name);
+        break;
+    }
+
     test_negative_width(hdc, lf);
 
 end_of_test:




More information about the wine-cvs mailing list