From 8ab829a68a993434506d5307e7681fc97bbc3fee Mon Sep 17 00:00:00 2001 From: Huw Davies Date: Wed, 11 Feb 2009 13:49:52 +0000 Subject: [PATCH] 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 34e4aed8c0f..97dd1a67b38 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 38339ea3b88..abb3a4dfbf4 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: