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/d... ============================================================================== --- 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?re... ============================================================================== --- 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?re... ============================================================================== --- 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);