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/fo…
==============================================================================
--- 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/ntg…
==============================================================================
--- 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