Author: tkreuzer Date: Sat May 28 21:53:58 2011 New Revision: 51985 URL: http://svn.reactos.org/svn/reactos?rev=51985&view=rev Log: [GDI32] - Rewrite EnumFontFamilies*, redirecting to EnumFontFamiliesExW, of which a new version has been waiting for its time since ages.
Modified: branches/GSoC_2011/GdiFontDriver/dll/win32/gdi32/include/gdi32p.h branches/GSoC_2011/GdiFontDriver/dll/win32/gdi32/objects/font.c Modified: branches/GSoC_2011/GdiFontDriver/dll/win32/gdi32/include/gdi32p.h URL: http://svn.reactos.org/svn/reactos/branches/GSoC_2011/GdiFontDriver/dll/win32/gdi32/include/gdi32p.h?rev=51985&r1=51984&r2=51985&view=diff ============================================================================== --- branches/GSoC_2011/GdiFontDriver/dll/win32/gdi32/include/gdi32p.h [iso-8859-1] (original) +++ branches/GSoC_2011/GdiFontDriver/dll/win32/gdi32/include/gdi32p.h [iso-8859-1] Sat May 28 21:53:58 2011 @@ -184,14 +184,14 @@ FASTCALL NewTextMetricW2A( NEWTEXTMETRICA *tma, - NEWTEXTMETRICW *tmw + const NEWTEXTMETRICW *tmw ); VOID FASTCALL NewTextMetricExW2A( NEWTEXTMETRICEXA *tma, - NEWTEXTMETRICEXW *tmw + const NEWTEXTMETRICEXW *tmw ); BOOL Modified: branches/GSoC_2011/GdiFontDriver/dll/win32/gdi32/objects/font.c URL: http://svn.reactos.org/svn/reactos/branches/GSoC_2011/GdiFontDriver/dll/win32/gdi32/objects/font.c?rev=51985&r1=51984&r2=51985&view=diff ============================================================================== --- branches/GSoC_2011/GdiFontDriver/dll/win32/gdi32/objects/font.c [iso-8859-1] (original) +++ branches/GSoC_2011/GdiFontDriver/dll/win32/gdi32/objects/font.c [iso-8859-1] Sat May 28 21:53:58 2011 @@ -128,7 +128,7 @@ } VOID FASTCALL -NewTextMetricW2A(NEWTEXTMETRICA *tma, NEWTEXTMETRICW *tmw) +NewTextMetricW2A(NEWTEXTMETRICA *tma, const NEWTEXTMETRICW *tmw) { FONT_TextMetricWToA((TEXTMETRICW *) tmw, (TEXTMETRICA *) tma); tma->ntmFlags = tmw->ntmFlags; @@ -138,168 +138,10 @@ } VOID FASTCALL -NewTextMetricExW2A(NEWTEXTMETRICEXA *tma, NEWTEXTMETRICEXW *tmw) +NewTextMetricExW2A(NEWTEXTMETRICEXA *tma, const NEWTEXTMETRICEXW *tmw) { NewTextMetricW2A(&tma->ntmTm, &tmw->ntmTm); tma->ntmFontSig = tmw->ntmFontSig; -} - -static int FASTCALL -IntEnumFontFamilies(HDC Dc, LPLOGFONTW LogFont, PVOID EnumProc, LPARAM lParam, - BOOL Unicode) -{ - int FontFamilyCount; - int FontFamilySize; - PFONTFAMILYINFO Info; - int Ret = 0; - int i; - ENUMLOGFONTEXA EnumLogFontExA; - NEWTEXTMETRICEXA NewTextMetricExA; - LOGFONTW lfW; - - Info = RtlAllocateHeap(GetProcessHeap(), 0, - INITIAL_FAMILY_COUNT * sizeof(FONTFAMILYINFO)); - if (NULL == Info) - { - return 0; - } - - if (!LogFont) - { - lfW.lfCharSet = DEFAULT_CHARSET; - lfW.lfPitchAndFamily = 0; - lfW.lfFaceName[0] = 0; - LogFont = &lfW; - } - - FontFamilyCount = NtGdiGetFontFamilyInfo(Dc, LogFont, Info, INITIAL_FAMILY_COUNT); - if (FontFamilyCount < 0) - { - RtlFreeHeap(GetProcessHeap(), 0, Info); - return 0; - } - if (INITIAL_FAMILY_COUNT < FontFamilyCount) - { - FontFamilySize = FontFamilyCount; - RtlFreeHeap(GetProcessHeap(), 0, Info); - Info = RtlAllocateHeap(GetProcessHeap(), 0, - FontFamilyCount * sizeof(FONTFAMILYINFO)); - if (NULL == Info) - { - return 0; - } - FontFamilyCount = NtGdiGetFontFamilyInfo(Dc, LogFont, Info, FontFamilySize); - if (FontFamilyCount < 0 || FontFamilySize < FontFamilyCount) - { - RtlFreeHeap(GetProcessHeap(), 0, Info); - return 0; - } - } - - for (i = 0; i < FontFamilyCount; i++) - { - if (Unicode) - { - Ret = ((FONTENUMPROCW) EnumProc)( - (VOID*)&Info[i].EnumLogFontEx, - (VOID*)&Info[i].NewTextMetricEx, - Info[i].FontType, lParam); - } - else - { - // Could use EnumLogFontExW2A here? - LogFontW2A(&EnumLogFontExA.elfLogFont, &Info[i].EnumLogFontEx.elfLogFont); - WideCharToMultiByte(CP_THREAD_ACP, 0, Info[i].EnumLogFontEx.elfFullName, -1, - (LPSTR)EnumLogFontExA.elfFullName, LF_FULLFACESIZE, NULL, NULL); - WideCharToMultiByte(CP_THREAD_ACP, 0, Info[i].EnumLogFontEx.elfStyle, -1, - (LPSTR)EnumLogFontExA.elfStyle, LF_FACESIZE, NULL, NULL); - WideCharToMultiByte(CP_THREAD_ACP, 0, Info[i].EnumLogFontEx.elfScript, -1, - (LPSTR)EnumLogFontExA.elfScript, LF_FACESIZE, NULL, NULL); - NewTextMetricExW2A(&NewTextMetricExA, - &Info[i].NewTextMetricEx); - Ret = ((FONTENUMPROCA) EnumProc)( - (VOID*)&EnumLogFontExA, - (VOID*)&NewTextMetricExA, - Info[i].FontType, lParam); - } - } - - RtlFreeHeap(GetProcessHeap(), 0, Info); - - return Ret; -} - -/* - * @implemented - */ -int WINAPI -EnumFontFamiliesExW(HDC hdc, LPLOGFONTW lpLogfont, FONTENUMPROCW lpEnumFontFamExProc, - LPARAM lParam, DWORD dwFlags) -{ - return IntEnumFontFamilies(hdc, lpLogfont, lpEnumFontFamExProc, lParam, TRUE); -} - - -/* - * @implemented - */ -int WINAPI -EnumFontFamiliesW(HDC hdc, LPCWSTR lpszFamily, FONTENUMPROCW lpEnumFontFamProc, - LPARAM lParam) -{ - LOGFONTW LogFont; - - ZeroMemory(&LogFont, sizeof(LOGFONTW)); - LogFont.lfCharSet = DEFAULT_CHARSET; - if (NULL != lpszFamily) - { - if (!*lpszFamily) return 1; - lstrcpynW(LogFont.lfFaceName, lpszFamily, LF_FACESIZE); - } - - return IntEnumFontFamilies(hdc, &LogFont, lpEnumFontFamProc, lParam, TRUE); -} - - -/* - * @implemented - */ -int WINAPI -EnumFontFamiliesExA (HDC hdc, LPLOGFONTA lpLogfont, FONTENUMPROCA lpEnumFontFamExProc, - LPARAM lParam, DWORD dwFlags) -{ - LOGFONTW LogFontW, *pLogFontW; - - if (lpLogfont) - { - LogFontA2W(&LogFontW,lpLogfont); - pLogFontW = &LogFontW; - } - else pLogFontW = NULL; - - /* no need to convert LogFontW back to lpLogFont b/c it's an [in] parameter only */ - return IntEnumFontFamilies(hdc, pLogFontW, lpEnumFontFamExProc, lParam, FALSE); -} - - -/* - * @implemented - */ -int WINAPI -EnumFontFamiliesA(HDC hdc, LPCSTR lpszFamily, FONTENUMPROCA lpEnumFontFamProc, - LPARAM lParam) -{ - LOGFONTW LogFont; - - ZeroMemory(&LogFont, sizeof(LOGFONTW)); - LogFont.lfCharSet = DEFAULT_CHARSET; - if (NULL != lpszFamily) - { - if (!*lpszFamily) return 1; - MultiByteToWideChar(CP_THREAD_ACP, 0, lpszFamily, -1, LogFont.lfFaceName, LF_FACESIZE); - } - - return IntEnumFontFamilies(hdc, &LogFont, lpEnumFontFamProc, lParam, FALSE); } @@ -1881,7 +1723,7 @@ INT WINAPI -NewEnumFontFamiliesExW( +EnumFontFamiliesExW( HDC hDC, LPLOGFONTW lpLogfont, FONTENUMPROCW lpEnumFontFamExProcW, @@ -1952,3 +1794,96 @@ return ret; } + +int +CALLBACK +EnumFontFamProcWtoA( + const LOGFONTW *plfw, + const NEWTEXTMETRICW *pntmw, + DWORD FontType, + LPARAM lParam) +{ + NEWTEXTMETRICA ntma; + LOGFONTA lfa; + PVOID *ppvParams = (PVOID*)lParam; + FONTENUMPROCA lpEnumFontFamProcA = ppvParams[0]; + + LogFontW2A(&lfa, plfw); + NewTextMetricW2A(&ntma, pntmw); + + return lpEnumFontFamProcA(&lfa, (const TEXTMETRICA*)&ntma, FontType, (LPARAM)ppvParams[1]); +} + +int +WINAPI +EnumFontFamiliesW( + HDC hdc, + LPCWSTR lpszFamily, + FONTENUMPROCW lpEnumFontFamProc, + LPARAM lParam) +{ + LOGFONTW lfw = {0}; + + lfw.lfCharSet = DEFAULT_CHARSET; + lfw.lfFaceName[0] = 0; + lfw.lfPitchAndFamily = 0; + if (lpszFamily) + { + if (!*lpszFamily) return 1; + wcsncpy(lfw.lfFaceName, lpszFamily, LF_FACESIZE); + } + + return EnumFontFamiliesExW(hdc, &lfw, lpEnumFontFamProc, lParam, 0); +} + +int +WINAPI +EnumFontFamiliesExA( + HDC hdc, + LPLOGFONTA lpLogfont, + FONTENUMPROCA lpEnumFontFamExProc, + LPARAM lParam, + DWORD dwFlags) +{ + LOGFONTW LogFontW, *pLogFontW; + PVOID apvParams[2]; + + apvParams[0] = lpEnumFontFamExProc; + apvParams[1] = (PVOID)lParam; + + if (lpLogfont) + { + LogFontA2W(&LogFontW, lpLogfont); + pLogFontW = &LogFontW; + } + else pLogFontW = NULL; + + return EnumFontFamiliesExW(hdc, pLogFontW, (PVOID)EnumFontFamProcWtoA, (LPARAM)apvParams, dwFlags); +} + + +int WINAPI +EnumFontFamiliesA( + HDC hdc, + LPCSTR lpszFamily, + FONTENUMPROCA lpEnumFontFamProc, + LPARAM lParam) +{ + LOGFONTW lfw = {0}; + PVOID apvParams[2]; + + apvParams[0] = lpEnumFontFamProc; + apvParams[1] = (PVOID)lParam; + + lfw.lfCharSet = DEFAULT_CHARSET; + lfw.lfFaceName[0] = 0; + lfw.lfPitchAndFamily = 0; + if (lpszFamily) + { + if (!*lpszFamily) return 1; + MultiByteToWideChar(CP_THREAD_ACP, 0, lpszFamily, -1, lfw.lfFaceName, LF_FACESIZE); + } + + return EnumFontFamiliesExW(hdc, &lfw, (PVOID)EnumFontFamProcWtoA, (LPARAM)apvParams, 0); +} +