[Gdiplus 13/16] Use a better framework for filling out FontFamilies
Adam Petaccia
adam at tpetaccia.com
Thu Jul 3 13:26:50 CDT 2008
In addition to the added simplicity, this makes Valgrind happy, because we're
not using uninitialized data (now it's handed to us ready to go).
Also, a NEWtextmetric is apparently what was needed.
---
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 8c7cd90..2fd4020 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)
@@ -335,19 +335,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);
@@ -379,9 +391,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);
@@ -389,35 +399,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 b8269f2..2b953bf 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;
};
--
1.5.4.3
More information about the wine-patches
mailing list