From 1f35b6e62ef920e2f783cbfa86bdc337f17e3c5c Mon Sep 17 00:00:00 2001 From: Dmitry Timoshkov Date: Mon, 7 Apr 2008 16:11:42 +0900 Subject: [PATCH] gdi32: Fully initialize face->ntmFlags on font load. --- dlls/gdi32/freetype.c | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/dlls/gdi32/freetype.c b/dlls/gdi32/freetype.c index 0284a0093f6..be8688a1d91 100644 --- a/dlls/gdi32/freetype.c +++ b/dlls/gdi32/freetype.c @@ -256,11 +256,9 @@ typedef struct tagFace { void *font_data_ptr; DWORD font_data_size; FT_Long face_index; - BOOL Italic; - BOOL Bold; FONTSIGNATURE fs; FONTSIGNATURE fs_links; - DWORD ntmFlags; /* Only some bits stored here. Others are computed on the fly */ + DWORD ntmFlags; FT_Fixed font_version; BOOL scalable; Bitmap_Size size; /* set if face is a bitmap */ @@ -1380,8 +1378,12 @@ static INT AddFontToList(const char *file, void *font_data_ptr, DWORD font_data_ face->font_data_size = font_data_size; } face->face_index = face_index; - face->Italic = (ft_face->style_flags & FT_STYLE_FLAG_ITALIC) ? 1 : 0; - face->Bold = (ft_face->style_flags & FT_STYLE_FLAG_BOLD) ? 1 : 0; + face->ntmFlags = 0; + if (ft_face->style_flags & FT_STYLE_FLAG_ITALIC) + face->ntmFlags |= NTM_ITALIC; + if (ft_face->style_flags & FT_STYLE_FLAG_BOLD) + face->ntmFlags |= NTM_BOLD; + if (face->ntmFlags == 0) face->ntmFlags = NTM_REGULAR; face->font_version = pHeader ? pHeader->Font_Revision : 0; face->family = family; face->external = (flags & ADDFONT_EXTERNAL_FONT) ? TRUE : FALSE; @@ -1409,10 +1411,8 @@ static INT AddFontToList(const char *file, void *font_data_ptr, DWORD font_data_ if (pFT_Load_Sfnt_Table && !pFT_Load_Sfnt_Table(ft_face, FT_MAKE_TAG('C','F','F',' '), 0, NULL, &tmp_size)) { TRACE("Font %s/%p is OTF Type1\n", wine_dbgstr_a(file), font_data_ptr); - face->ntmFlags = NTM_PS_OPENTYPE; + face->ntmFlags |= NTM_PS_OPENTYPE; } - else - face->ntmFlags = 0; TRACE("fsCsb = %08x %08x/%08x %08x %08x %08x\n", face->fs.fsCsb[0], face->fs.fsCsb[1], @@ -3335,11 +3335,15 @@ found: { if((csi.fs.fsCsb[0] & (face->fs.fsCsb[0] | face->fs_links.fsCsb[0])) || !csi.fs.fsCsb[0]) { - new_score = (face->Italic ^ it) + (face->Bold ^ bd); + BOOL italic, bold; + + italic = (face->ntmFlags & NTM_ITALIC) ? 1 : 0; + bold = (face->ntmFlags & NTM_BOLD) ? 1 : 0; + new_score = (italic ^ it) + (bold ^ bd); if(!best || new_score <= score) { TRACE("(it=%d, bd=%d) is selected for (it=%d, bd=%d)\n", - face->Italic, face->Bold, it, bd); + italic, bold, it, bd); score = new_score; best = face; if(best->scalable && score == 0) break; @@ -3363,8 +3367,8 @@ found: } if(best) face = best->scalable ? best : best_bitmap; - ret->fake_italic = (it && !face->Italic); - ret->fake_bold = (bd && !face->Bold); + ret->fake_italic = (it && !(face->ntmFlags & NTM_ITALIC)); + ret->fake_bold = (bd && !(face->ntmFlags & NTM_BOLD)); ret->fs = face->fs;