From c027f427efbc98149f9f57197f354d0a2c26ec94 Mon Sep 17 00:00:00 2001 From: Adam Petaccia Date: Thu, 3 Jul 2008 14:26:50 -0400 Subject: [PATCH] gdiplus: Use a better framework for filling out FontFamilies. --- dlls/gdiplus/font.c | 40 ++++++++++++++++++++-------------------- dlls/gdiplus/gdiplus_private.h | 2 +- 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/dlls/gdiplus/font.c b/dlls/gdiplus/font.c index c7cea811d24..4e443cf418d 100644 --- a/dlls/gdiplus/font.c +++ b/dlls/gdiplus/font.c @@ -95,7 +95,7 @@ GpStatus WINGDIPAPI GdipCreateFont(GDIPCONST GpFontFamily *fontFamily, { WCHAR facename[LF_FACESIZE]; LOGFONTW* lfw; - const TEXTMETRICW* tmw; + const NEWTEXTMETRICW* tmw; GpStatus stat; if (!fontFamily || !fontFamily->FamilyName || !font) @@ -333,19 +333,31 @@ GpStatus WINGDIPAPI GdipGetFontHeightGivenDPI(GDIPCONST GpFont *font, REAL dpi, return NotImplemented; } -/* Borrowed from GDI32 */ +/*********************************************************************** + * Borrowed from GDI32: + * + * Elf is really an ENUMLOGFONTEXW, and ntm is a NEWTEXTMETRICEXW. + * We have to use other types because of the FONTENUMPROCW definition. + */ static INT CALLBACK is_font_installed_proc(const LOGFONTW *elf, const TEXTMETRICW *ntm, DWORD type, LPARAM lParam) { + if (!ntm) + { + return 1; + } + + *(NEWTEXTMETRICW*)lParam = *(const NEWTEXTMETRICW*)ntm; + return 0; } -static BOOL is_font_installed(const WCHAR *name) +static BOOL find_installed_font(const WCHAR *name, NEWTEXTMETRICW *ntm) { HDC hdc = GetDC(0); BOOL ret = FALSE; - if(!EnumFontFamiliesW(hdc, name, is_font_installed_proc, 0)) + if(!EnumFontFamiliesW(hdc, name, is_font_installed_proc, (LPARAM)ntm)) ret = TRUE; ReleaseDC(0, hdc); @@ -377,9 +389,7 @@ GpStatus WINGDIPAPI GdipCreateFontFamilyFromName(GDIPCONST WCHAR *name, GpFontFamily **FontFamily) { GpFontFamily* ffamily; - HDC hdc; - HFONT hFont, hfont_old; - LOGFONTW lfw; + NEWTEXTMETRICW ntm; TRACE("%s, %p %p\n", debugstr_w(name), fontCollection, FontFamily); @@ -387,35 +397,25 @@ GpStatus WINGDIPAPI GdipCreateFontFamilyFromName(GDIPCONST WCHAR *name, return InvalidParameter; if (fontCollection) FIXME("No support for FontCollections yet!\n"); - if (!is_font_installed(name)) + + if (!find_installed_font(name, &ntm)) return FontFamilyNotFound; ffamily = GdipAlloc(sizeof (GpFontFamily)); if (!ffamily) return OutOfMemory; - hdc = GetDC(0); - lstrcpynW(lfw.lfFaceName, name, sizeof(WCHAR) * LF_FACESIZE); - lfw.lfCharSet = DEFAULT_CHARSET; - lfw.lfEscapement = lfw.lfOrientation = 0; - - hFont = CreateFontIndirectW (&lfw); - hfont_old = SelectObject(hdc, hFont); - - GetTextMetricsW(hdc, &ffamily->tmw); - DeleteObject(SelectObject(hdc, hfont_old)); + ffamily->tmw = ntm; ffamily->FamilyName = GdipAlloc(LF_FACESIZE * sizeof (WCHAR)); if (!ffamily->FamilyName) { GdipFree(ffamily); - ReleaseDC(0, hdc); return OutOfMemory; } lstrcpynW(ffamily->FamilyName, name, sizeof(WCHAR) * LF_FACESIZE); *FontFamily = ffamily; - ReleaseDC(0, hdc); return Ok; } diff --git a/dlls/gdiplus/gdiplus_private.h b/dlls/gdiplus/gdiplus_private.h index b8269f21107..2b953bf309b 100644 --- a/dlls/gdiplus/gdiplus_private.h +++ b/dlls/gdiplus/gdiplus_private.h @@ -192,7 +192,7 @@ struct GpFontCollection{ }; struct GpFontFamily{ - TEXTMETRICW tmw; + NEWTEXTMETRICW tmw; WCHAR* FamilyName; }; -- 2.11.4.GIT