Author: tkreuzer Date: Fri Sep 7 07:33:00 2007 New Revision: 28911
URL: http://svn.reactos.org/svn/reactos?rev=28911&view=rev Log: - add NTMW_INTERNAL structure - better structure implementation for ENUMFONTDATAW - change NewEnumFontFamiliesEx to use the new structure - some fixes and comments
Modified: trunk/reactos/dll/win32/gdi32/objects/font.c trunk/reactos/include/reactos/win32k/ntgdityp.h
Modified: trunk/reactos/dll/win32/gdi32/objects/font.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/gdi32/objects/fon... ============================================================================== --- trunk/reactos/dll/win32/gdi32/objects/font.c (original) +++ trunk/reactos/dll/win32/gdi32/objects/font.c Fri Sep 7 07:33:00 2007 @@ -1321,59 +1321,67 @@ LPARAM lParam, DWORD dwFlags) { - ULONG_PTR idEnum, ulCount, ulSize; + ULONG_PTR idEnum, cbDataSize, cbRetSize; PENUMFONTDATAW pEfdw; PBYTE pBuffer; PBYTE pMax; INT ret = 1;
+ /* Open enumeration handle and find out how much memory we need */ idEnum = NtGdiEnumFontOpen(hDC, EfdFontFamilies, 0, LF_FACESIZE, - lpLogfont->lfFaceName, - lpLogfont->lfCharSet, - &ulCount); + (lpLogfont && lpLogfont->lfFaceName[0])? lpLogfont->lfFaceName : NULL, + lpLogfont? lpLogfont->lfCharSet : DEFAULT_CHARSET, + &cbDataSize); if (idEnum == 0) { return 0; } - if (ulCount == 0) + if (cbDataSize == 0) { NtGdiEnumFontClose(idEnum); return 0; }
- pBuffer = HeapAlloc(GetProcessHeap(), 0, ulCount); + /* Allocate memory */ + pBuffer = HeapAlloc(GetProcessHeap(), 0, cbDataSize); if (pBuffer == NULL) { + SetLastError(ERROR_NOT_ENOUGH_MEMORY); NtGdiEnumFontClose(idEnum); return 0; } - pMax = pBuffer + ulCount; - - if (!NtGdiEnumFontChunk(hDC, idEnum, ulCount, &ulSize, (PVOID)pBuffer)) + + /* Do the enumeration */ + if (!NtGdiEnumFontChunk(hDC, idEnum, cbDataSize, &cbRetSize, (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); + /* Get start and end address */ + pEfdw = (PENUMFONTDATAW)pBuffer; + pMax = pBuffer + cbDataSize; + + /* Iterate through the structures */ + while ((PBYTE)pEfdw < pMax && ret) + { + PNTMW_INTERNAL pNtmwi = (PNTMW_INTERNAL)((ULONG_PTR)pEfdw + pEfdw->ulNtmwiOffset); + + ret = lpEnumFontFamExProcW(&pEfdw->elfexdv.elfEnumLogfontEx, + &pNtmwi->ntmw, + pEfdw->dwFontType, + lParam); + + pEfdw = (PENUMFONTDATAW)((ULONG_PTR)pEfdw + pEfdw->cbSize); }
+ /* Release the memory and close handle */ HeapFree(GetProcessHeap(), 0, pBuffer); NtGdiEnumFontClose(idEnum);
return ret; } - -
Modified: trunk/reactos/include/reactos/win32k/ntgdityp.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/include/reactos/win32k/ntgd... ============================================================================== --- trunk/reactos/include/reactos/win32k/ntgdityp.h (original) +++ trunk/reactos/include/reactos/win32k/ntgdityp.h Fri Sep 7 07:33:00 2007 @@ -120,32 +120,20 @@ TMDIFF Diff; } TMW_INTERNAL, *PTMW_INTERNAL;
-typedef struct +typedef struct _NTMW_INTERNAL { - ULONG cbSize; - DWORD dwFontType; - ENUMLOGFONTEXW elfex; -/* - * Yuan 14.5: - * DESIGNVECTOR is a variable-size data structure that specifies the number of - * axes and a value for each axis. - * So it maybe smaller than MM_MAX_NUMAXES. - */ - DESIGNVECTOR dv; -} ENUMFONTDATAINTW, *PENUMFONTDATAINTW; + TMDIFF tmd; + NEWTEXTMETRICEXW ntmw; +} NTMW_INTERNAL, *PNTMW_INTERNAL;
-/* Warning: this structure is of variable size! - * It is only to access the cbSize and efdi member. - * The rest of the structure has to be parsed. */ typedef struct _ENUMFONTDATAW { ULONG cbSize; - ENUMFONTDATAINTW efdi; -/* The following 2 members do not have a constant offset! */ -/* DWORD dwFlags; - ENUMTEXTMETRICW etm; */ + ULONG ulNtmwiOffset; + DWORD dwFontType; + ENUMLOGFONTEXDVW elfexdv; /* variable size! */ + /* NTMW_INTERNAL ntmwi; use ulNtwmOffset */ } ENUMFONTDATAW, *PENUMFONTDATAW; -
/* Number Representation */ typedef struct _EFLOAT_S