Author: tkreuzer
Date: Tue Apr 24 14:49:09 2012
New Revision: 56407
URL:
http://svn.reactos.org/svn/reactos?rev=56407&view=rev
Log:
[WIN32K/GDI32]
- rewrite GetObject again :)
- simplify and fix FontGetObject
- remove some pointless code
Modified:
trunk/reactos/win32ss/gdi/gdi32/objects/dc.c
trunk/reactos/win32ss/gdi/ntgdi/font.c
trunk/reactos/win32ss/gdi/ntgdi/gdiobj.c
trunk/reactos/win32ss/gdi/ntgdi/text.h
Modified: trunk/reactos/win32ss/gdi/gdi32/objects/dc.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/gdi/gdi32/objects/…
==============================================================================
--- trunk/reactos/win32ss/gdi/gdi32/objects/dc.c [iso-8859-1] (original)
+++ trunk/reactos/win32ss/gdi/gdi32/objects/dc.c [iso-8859-1] Tue Apr 24 14:49:09 2012
@@ -422,7 +422,7 @@
_In_ HDC hdc,
_In_ UINT uObjectType)
{
- PDC_ATTR pdcattr;
+ PDC_ATTR pdcattr = NULL;
/* Check if this is a user mode object */
if ((uObjectType == OBJ_PEN) ||
@@ -762,86 +762,6 @@
return(MAKELONG(Pt.x, Pt.y));
}
-ULONG
-WINAPI
-GetFontObjectW(HGDIOBJ hfont, ULONG cbSize, LPVOID lpBuffer)
-{
- ENUMLOGFONTEXDVW elfedvW;
- ULONG cbResult, cbMaxSize;
-
- /* Check if size only is requested */
- if (!lpBuffer) return sizeof(LOGFONTW);
-
- /* Check for size 0 */
- if (cbSize == 0)
- {
- /* Windows does not SetLastError() */
- return 0;
- }
-
- /* Call win32k to get the logfont (widechar) */
- cbResult = NtGdiExtGetObjectW(hfont, sizeof(ENUMLOGFONTEXDVW), &elfedvW);
- if (cbResult == 0)
- {
- return 0;
- }
-
- /* Calculate the maximum size according to number of axes */
- cbMaxSize = FIELD_OFFSET(ENUMLOGFONTEXDVW,
- elfDesignVector.dvValues[elfedvW.elfDesignVector.dvNumAxes]);
-
- /* Don't copy more than the maximum */
- if (cbSize > cbMaxSize) cbSize = cbMaxSize;
- if (cbSize > cbResult) cbSize = cbResult;
-
- /* Copy the number of bytes requested */
- memcpy(lpBuffer, &elfedvW, cbSize);
-
- /* Return the number of bytes copied */
- return cbSize;
-}
-
-ULONG
-WINAPI
-GetFontObjectA(HGDIOBJ hfont, ULONG cbSize, LPVOID lpBuffer)
-{
- ENUMLOGFONTEXDVW elfedvW;
- ENUMLOGFONTEXDVA elfedvA;
- ULONG cbResult;
-
- /* Check if size only is requested */
- if (!lpBuffer) return sizeof(LOGFONTA);
-
- /* Check for size 0 */
- if (cbSize == 0)
- {
- /* Windows does not SetLastError() */
- return 0;
- }
-
- /* Windows does this ... */
- if (cbSize == sizeof(LOGFONTW)) cbSize = sizeof(LOGFONTA);
-
- /* Call win32k to get the logfont (widechar) */
- cbResult = NtGdiExtGetObjectW(hfont, sizeof(ENUMLOGFONTEXDVW), &elfedvW);
- if (cbResult == 0)
- {
- return 0;
- }
-
- /* Convert the logfont from widechar to ansi */
- EnumLogFontExW2A(&elfedvA.elfEnumLogfontEx, &elfedvW.elfEnumLogfontEx);
- elfedvA.elfDesignVector = elfedvW.elfDesignVector;
-
- /* Don't copy more than maximum */
- if (cbSize > sizeof(ENUMLOGFONTEXDVA)) cbSize = sizeof(ENUMLOGFONTEXDVA);
-
- /* Copy the number of bytes requested */
- memcpy(lpBuffer, &elfedvA, cbSize);
-
- /* Return the number of bytes copied */
- return cbSize;
-}
/*
* @implemented
@@ -853,50 +773,38 @@
DWORD dwType;
INT cbResult = 0;
+ /* Fixup handles with upper 16 bits masked */
hGdiObj = GdiFixUpHandle(hGdiObj);
/* Get the object type */
dwType = GDI_HANDLE_GET_TYPE(hGdiObj);
/* Check what kind of object we have */
- switch(dwType)
+ switch (dwType)
{
case GDI_OBJECT_TYPE_PEN:
if (!lpBuffer) return sizeof(LOGPEN);
- cbResult = NtGdiExtGetObjectW(hGdiObj, cbSize, lpBuffer);
- if (cbResult == 0)
- SetLastError(ERROR_INVALID_PARAMETER);
- return cbResult;
+ break;
case GDI_OBJECT_TYPE_BRUSH:
- if (!lpBuffer) return sizeof(LOGBRUSH);
- cbResult = NtGdiExtGetObjectW(hGdiObj, cbSize, lpBuffer);
- if (cbResult == 0)
- SetLastError(ERROR_INVALID_PARAMETER);
- return cbResult;
+ if (!lpBuffer || !cbSize) return sizeof(LOGBRUSH);
+ break;
case GDI_OBJECT_TYPE_BITMAP:
if (!lpBuffer) return sizeof(BITMAP);
- return NtGdiExtGetObjectW(hGdiObj, cbSize, lpBuffer);
+ break;
case GDI_OBJECT_TYPE_PALETTE:
if (!lpBuffer) return sizeof(WORD);
- return NtGdiExtGetObjectW(hGdiObj, cbSize, lpBuffer);
+ break;
case GDI_OBJECT_TYPE_FONT:
- return GetFontObjectW(hGdiObj, cbSize, lpBuffer);
+ if (!lpBuffer) return sizeof(LOGFONTW);
+ break;
case GDI_OBJECT_TYPE_EXTPEN:
/* we don't know the size, ask win32k */
- cbResult = NtGdiExtGetObjectW(hGdiObj, cbSize, lpBuffer);
- if (cbResult == 0)
- {
- if (!GdiIsHandleValid(hGdiObj))
- SetLastError(ERROR_INVALID_PARAMETER);
- else if (cbSize == 0)
- SetLastError(ERROR_NOACCESS);
- }
- return cbResult;
+ break;
case GDI_OBJECT_TYPE_COLORSPACE:
if ((cbSize < 328) || !lpBuffer)
@@ -904,10 +812,7 @@
SetLastError(ERROR_INSUFFICIENT_BUFFER);
return 0;
}
- cbResult = NtGdiExtGetObjectW(hGdiObj, cbSize, lpBuffer);
- if (cbResult == 0)
- SetLastError(ERROR_INVALID_PARAMETER);
- return cbResult;
+ break;
case GDI_OBJECT_TYPE_DC:
case GDI_OBJECT_TYPE_REGION:
@@ -919,8 +824,82 @@
return 0;
}
- return 0;
-}
+ /* Call win32k */
+ cbResult = NtGdiExtGetObjectW(hGdiObj, cbSize, lpBuffer);
+
+ /* Handle error */
+ if (cbResult == 0)
+ {
+ if (!GdiIsHandleValid(hGdiObj))
+ {
+ if ((dwType == GDI_OBJECT_TYPE_PEN) ||
+ (dwType == GDI_OBJECT_TYPE_EXTPEN) ||
+ (dwType == GDI_OBJECT_TYPE_BRUSH) ||
+ (dwType == GDI_OBJECT_TYPE_COLORSPACE))
+ {
+ SetLastError(ERROR_INVALID_PARAMETER);
+ }
+ }
+ else
+ {
+ if ((dwType == GDI_OBJECT_TYPE_PEN) ||
+ (dwType == GDI_OBJECT_TYPE_BRUSH) ||
+ (dwType == GDI_OBJECT_TYPE_COLORSPACE) ||
+ ( (dwType == GDI_OBJECT_TYPE_EXTPEN) &&
+ ( (cbSize >= sizeof(EXTLOGPEN)) || (cbSize == 0) ) ) ||
+ ( (dwType == GDI_OBJECT_TYPE_BITMAP) && (cbSize >=
sizeof(BITMAP)) ))
+ {
+ SetLastError(ERROR_NOACCESS);
+ }
+ }
+ }
+
+ return cbResult;
+}
+
+
+ULONG
+WINAPI
+GetFontObjectA(HGDIOBJ hfont, ULONG cbSize, LPVOID lpBuffer)
+{
+ ENUMLOGFONTEXDVW elfedvW;
+ ENUMLOGFONTEXDVA elfedvA;
+ ULONG cbResult;
+
+ /* Check if size only is requested */
+ if (!lpBuffer) return sizeof(LOGFONTA);
+
+ /* Check for size 0 */
+ if (cbSize == 0)
+ {
+ /* Windows does not SetLastError() */
+ return 0;
+ }
+
+ /* Windows does this ... */
+ if (cbSize == sizeof(LOGFONTW)) cbSize = sizeof(LOGFONTA);
+
+ /* Call win32k to get the logfont (widechar) */
+ cbResult = NtGdiExtGetObjectW(hfont, sizeof(ENUMLOGFONTEXDVW), &elfedvW);
+ if (cbResult == 0)
+ {
+ return 0;
+ }
+
+ /* Convert the logfont from widechar to ansi */
+ EnumLogFontExW2A(&elfedvA.elfEnumLogfontEx, &elfedvW.elfEnumLogfontEx);
+ elfedvA.elfDesignVector = elfedvW.elfDesignVector;
+
+ /* Don't copy more than maximum */
+ if (cbSize > sizeof(ENUMLOGFONTEXDVA)) cbSize = sizeof(ENUMLOGFONTEXDVA);
+
+ /* Copy the number of bytes requested */
+ memcpy(lpBuffer, &elfedvA, cbSize);
+
+ /* Return the number of bytes copied */
+ return cbSize;
+}
+
/*
* @implemented
Modified: trunk/reactos/win32ss/gdi/ntgdi/font.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/gdi/ntgdi/font.c?r…
==============================================================================
--- trunk/reactos/win32ss/gdi/ntgdi/font.c [iso-8859-1] (original)
+++ trunk/reactos/win32ss/gdi/ntgdi/font.c [iso-8859-1] Tue Apr 24 14:49:09 2012
@@ -260,43 +260,23 @@
}
#endif
-INT
+ULONG
FASTCALL
-FontGetObject(PTEXTOBJ TFont, INT cjBuffer, PVOID pvBuffer)
-{
+FontGetObject(PTEXTOBJ plfont, ULONG cjBuffer, PVOID pvBuffer)
+{
+ ULONG cjMaxSize;
+ ENUMLOGFONTEXDVW *plf = &plfont->logfont;
+
+ /* If buffer is NULL, only the size is requested */
if (pvBuffer == NULL) return sizeof(LOGFONTW);
- switch (cjBuffer)
- {
- case sizeof(ENUMLOGFONTEXDVW):
- RtlCopyMemory(pvBuffer,
- &TFont->logfont,
- sizeof(ENUMLOGFONTEXDVW));
- break;
-
- case sizeof(ENUMLOGFONTEXW):
- RtlCopyMemory(pvBuffer,
- &TFont->logfont.elfEnumLogfontEx,
- sizeof(ENUMLOGFONTEXW));
- break;
-
- case sizeof(EXTLOGFONTW):
- case sizeof(ENUMLOGFONTW):
- RtlCopyMemory((LPENUMLOGFONTW) pvBuffer,
- &TFont->logfont.elfEnumLogfontEx.elfLogFont,
- sizeof(ENUMLOGFONTW));
- break;
-
- case sizeof(LOGFONTW):
- RtlCopyMemory((LPLOGFONTW) pvBuffer,
- &TFont->logfont.elfEnumLogfontEx.elfLogFont,
- sizeof(LOGFONTW));
- break;
-
- default:
- EngSetLastError(ERROR_BUFFER_OVERFLOW);
- return 0;
- }
+ /* Calculate the maximum size according to number of axes */
+ cjMaxSize = FIELD_OFFSET(ENUMLOGFONTEXDVW,
+ elfDesignVector.dvValues[plf->elfDesignVector.dvNumAxes]);
+
+ if (cjBuffer > cjMaxSize) cjBuffer = cjMaxSize;
+
+ RtlCopyMemory(pvBuffer, plf, cjBuffer);
return cjBuffer;
}
Modified: trunk/reactos/win32ss/gdi/ntgdi/gdiobj.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/gdi/ntgdi/gdiobj.c…
==============================================================================
--- trunk/reactos/win32ss/gdi/ntgdi/gdiobj.c [iso-8859-1] (original)
+++ trunk/reactos/win32ss/gdi/ntgdi/gdiobj.c [iso-8859-1] Tue Apr 24 14:49:09 2012
@@ -1038,15 +1038,9 @@
case GDILoObjType_LO_BITMAP_TYPE:
iResult = BITMAP_GetObject(pvObj, cbCount, pvBuffer);
break;
+
case GDILoObjType_LO_FONT_TYPE:
iResult = FontGetObject(pvObj, cbCount, pvBuffer);
-#if 0
- // Fix the LOGFONT structure for the stock fonts
- if (FIRST_STOCK_HANDLE <= hobj && hobj <= LAST_STOCK_HANDLE)
- {
- FixStockFontSizeW(hobj, cbCount, pvBuffer);
- }
-#endif
break;
case GDILoObjType_LO_PALETTE_TYPE:
@@ -1096,7 +1090,7 @@
/* Enter SEH for buffer transfer */
_SEH2_TRY
{
- // Probe the buffer and copy it
+ /* Probe the buffer and copy it */
ProbeForWrite(lpBuffer, cbCopyCount, sizeof(WORD));
RtlCopyMemory(lpBuffer, &object, cbCopyCount);
}
Modified: trunk/reactos/win32ss/gdi/ntgdi/text.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/gdi/ntgdi/text.h?r…
==============================================================================
--- trunk/reactos/win32ss/gdi/ntgdi/text.h [iso-8859-1] (original)
+++ trunk/reactos/win32ss/gdi/ntgdi/text.h [iso-8859-1] Tue Apr 24 14:49:09 2012
@@ -88,7 +88,7 @@
BOOL FASTCALL IntIsFontRenderingEnabled(VOID);
BOOL FASTCALL IntIsFontRenderingEnabled(VOID);
VOID FASTCALL IntEnableFontRendering(BOOL Enable);
-INT FASTCALL FontGetObject(PTEXTOBJ TextObj, INT Count, PVOID Buffer);
+ULONG FASTCALL FontGetObject(PTEXTOBJ TextObj, ULONG Count, PVOID Buffer);
VOID FASTCALL IntLoadSystemFonts(VOID);
INT FASTCALL IntGdiAddFontResource(PUNICODE_STRING FileName, DWORD Characteristics);
ULONG FASTCALL
ftGdiGetGlyphOutline(PDC,WCHAR,UINT,LPGLYPHMETRICS,ULONG,PVOID,LPMAT2,BOOL);