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