From fe82da5539f9f93b1405c8254bc6d89981c5546f Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Wed, 5 Sep 2007 19:32:37 +0000 Subject: [PATCH] New implementation of EnumFontFamiliesExW, based on NtGdiEnumFontXxx, does not work on ros, because those apis are not implemented yet, but it works on Windows XP. svn path=/trunk/; revision=28883 --- reactos/dll/win32/gdi32/objects/font.c | 66 +++++++++++++++++++++++++- 1 file changed, 65 insertions(+), 1 deletion(-) diff --git a/reactos/dll/win32/gdi32/objects/font.c b/reactos/dll/win32/gdi32/objects/font.c index 78e932e448f..230bd61bcdb 100644 --- a/reactos/dll/win32/gdi32/objects/font.c +++ b/reactos/dll/win32/gdi32/objects/font.c @@ -1310,6 +1310,70 @@ EnumFontsA ( #endif } - +#define EfdFontFamilies 3 + +INT +STDCALL +NewEnumFontFamiliesExW( + HDC hDC, + LPLOGFONTW lpLogfont, + FONTENUMPROCW lpEnumFontFamExProcW, + LPARAM lParam, + DWORD dwFlags) +{ + ULONG_PTR idEnum, ulCount, ulSize; + PENUMFONTDATAW pEfdw; + PBYTE pBuffer; + PBYTE pMax; + INT ret = 1; + + idEnum = NtGdiEnumFontOpen(hDC, + EfdFontFamilies, + 0, + LF_FACESIZE, + lpLogfont->lfFaceName, + lpLogfont->lfCharSet, + &ulCount); + if (idEnum == 0) + { + return 0; + } + if (ulCount == 0) + { + NtGdiEnumFontClose(idEnum); + return 0; + } + + pBuffer = HeapAlloc(GetProcessHeap(), 0, ulCount); + if (pBuffer == NULL) + { + NtGdiEnumFontClose(idEnum); + return 0; + } + pMax = pBuffer + ulCount; + + if (!NtGdiEnumFontChunk(hDC, idEnum, ulCount, &ulSize, (PVOID)pBuffer)) + { + HeapFree(GetProcessHeap(), 0, pBuffer); + NtGdiEnumFontClose(idEnum); + return 0; + } + + /* Iterate through the structures */ + for (pEfdw = (PENUMFONTDATAW)pBuffer; + (PBYTE)pEfdw < pMax && pEfdw->cbSize != 0 && ret != 0; + pEfdw = (PENUMFONTDATAW)((PBYTE)pEfdw + pEfdw->cbSize)) + { + ENUMLOGFONTEXW *pElfew = &pEfdw->efdi.elfex; + NEWTEXTMETRICEXW *pNtmew = (NEWTEXTMETRICEXW*)((PBYTE)&pEfdw->efdi + pEfdw->efdi.cbSize + sizeof(DWORD)); // FIXME + DWORD dwFontType = pEfdw->efdi.dwFontType; + ret = lpEnumFontFamExProcW(pElfew, pNtmew, dwFontType, lParam); + } + + HeapFree(GetProcessHeap(), 0, pBuffer); + NtGdiEnumFontClose(idEnum); + + return ret; +}