From 3c7ef0d99156ccda75200806e46e39a18f4dab9d Mon Sep 17 00:00:00 2001 From: James Tabor Date: Sat, 19 Apr 2008 02:20:36 +0000 Subject: [PATCH] Update OffsetClipRgn, IntersectClipRect, GetRgnBox, moved SetDIBitsToDevice from stubs and misc changes. Properly implement EngGetDriverName and EngGetPrinterDataFileName. svn path=/trunk/; revision=33030 --- reactos/dll/win32/gdi32/gdi32.def | 2 +- reactos/dll/win32/gdi32/misc/stubs.c | 134 +++++++++++------------ reactos/dll/win32/gdi32/objects/bitmap.c | 43 +++++++- reactos/dll/win32/gdi32/objects/eng.c | 24 +++- 4 files changed, 131 insertions(+), 72 deletions(-) diff --git a/reactos/dll/win32/gdi32/gdi32.def b/reactos/dll/win32/gdi32/gdi32.def index dfb14f515e9..9e4e229742a 100644 --- a/reactos/dll/win32/gdi32/gdi32.def +++ b/reactos/dll/win32/gdi32/gdi32.def @@ -436,7 +436,7 @@ GetSystemPaletteUse@4=NtGdiGetSystemPaletteUse@4 GetTextAlign@4 GetTextCharacterExtra@4 GetTextCharset@4 -GetTextCharsetInfo@12 +GetTextCharsetInfo@12=NtGdiGetTextCharsetInfo@12 GetTextColor@4 GetTextExtentExPointA@28 GetTextExtentExPointI@28 diff --git a/reactos/dll/win32/gdi32/misc/stubs.c b/reactos/dll/win32/gdi32/misc/stubs.c index 214fcb04fe9..0e1c9b54e36 100644 --- a/reactos/dll/win32/gdi32/misc/stubs.c +++ b/reactos/dll/win32/gdi32/misc/stubs.c @@ -46,44 +46,6 @@ StretchDIBits(HDC hdc, nSrcWidth, nSrcHeight, (LPBYTE)lpBits, (LPBITMAPINFO)lpBitsInfo, (DWORD)iUsage, dwRop, 0, 0, NULL); } -/* - * @implemented - * - */ -INT -STDCALL -SetDIBitsToDevice( - HDC hDC, - int XDest, - int YDest, - DWORD Width, - DWORD Height, - int XSrc, - int YSrc, - UINT StartScan, - UINT ScanLines, - CONST VOID *Bits, - CONST BITMAPINFO *lpbmi, - UINT ColorUse) -{ - return NtGdiSetDIBitsToDeviceInternal(hDC, - XDest, - YDest, - Width, - Height, - XSrc, - YSrc, - StartScan, - ScanLines, - (LPBYTE)Bits, - (LPBITMAPINFO)lpbmi, - ColorUse, - lpbmi->bmiHeader.biSizeImage, - lpbmi->bmiHeader.biSize, - FALSE, - NULL); -} - /* * @unimplemented */ @@ -1977,17 +1939,6 @@ CreateBitmap(INT Width, return NtGdiCreateBitmap(Width, Height, Planes, BitsPixel, (LPBYTE) pUnsafeBits); } -/* - * @unimplemented - */ -LPWSTR STDCALL -EngGetDriverName(HDEV hdev) -{ - UNIMPLEMENTED; - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return 0; -} - /* * @unimplemented */ @@ -2179,7 +2130,6 @@ STDCALL GetClipBox(HDC hdc, LPRECT lprc) { - /* FIXME some part need be done in user mode */ return NtGdiGetAppClipBox(hdc, lprc); } @@ -2231,8 +2181,25 @@ STDCALL GetRgnBox(HRGN hrgn, LPRECT prcOut) { - /* FIXME some stuff need be done in user mode */ - return NtGdiGetRgnBox(hrgn, prcOut); +#if 0 + PRGN_ATTR Rgn_Attr; + if (!GdiGetHandleUserData((HGDIOBJ) hRgn, GDI_OBJECT_TYPE_REGION, (PVOID) &Rgn_Attr)) + return NtGdiGetRgnBox(hrgn, prcOut); + if (Rgn_Attr->Flags == NULLREGION) + { + prcOut->left = 0; + prcOut->top = 0; + prcOut->right = 0; + prcOut->bottom = 0; + } + else + { + if (Rgn_Attr->Flags != SIMPLEREGION) return NtGdiGetRgnBox(hrgn, prcOut); + *prcOut = Rgn_Attr->Rect; + } + return Rgn_Attr->Flags; +#endif + return NtGdiGetRgnBox(hrgn, prcOut); } @@ -2250,19 +2217,9 @@ OffsetRgn( HRGN hrgn, return NtGdiOffsetRgn(hrgn,nXOffset,nYOffset); } - -INT -STDCALL -GetTextCharsetInfo(HDC hdc, - LPFONTSIGNATURE lpSig, - DWORD dwFlags) -{ - /* FIXME some part are done in user mode */ - return NtGdiGetTextCharsetInfo(hdc, lpSig, dwFlags); -} - - - +/* + * @implemented + */ INT STDCALL IntersectClipRect(HDC hdc, @@ -2271,18 +2228,59 @@ IntersectClipRect(HDC hdc, int nRightRect, int nBottomRect) { - /* FIXME some part are done in user mode */ +#if 0 +// Handle something other than a normal dc object. + if (GDI_HANDLE_GET_TYPE(hdc) != GDI_OBJECT_TYPE_DC) + { + if (GDI_HANDLE_GET_TYPE(hdc) == GDI_OBJECT_TYPE_METADC) + return MFDRV_IntersectClipRect( hdc, nLeftRect, nTopRect, nRightRect, nBottomRect); + else + { + PLDC pLDC = GdiGetLDC(hdc); + if ( pLDC ) + { + if (pLDC->iType != LDC_EMFLDC || EMFDRV_IntersectClipRect( hdc, nLeftRect, nTopRect, nRightRect, nBottomRect)) + return NtGdiIntersectClipRect(hdc, nLeftRect, nTopRect, nRightRect, nBottomRect); + } + else + SetLastError(ERROR_INVALID_HANDLE); + return 0; + } + } +#endif return NtGdiIntersectClipRect(hdc, nLeftRect, nTopRect, nRightRect, nBottomRect); } +/* + * @implemented + */ INT STDCALL OffsetClipRgn(HDC hdc, int nXOffset, int nYOffset) { - /* FIXME some part are done in user mode */ - return NtGdiOffsetClipRgn( hdc, nXOffset, nYOffset); +#if 0 +// Handle something other than a normal dc object. + if (GDI_HANDLE_GET_TYPE(hdc) != GDI_OBJECT_TYPE_DC) + { + if (GDI_HANDLE_GET_TYPE(hdc) == GDI_OBJECT_TYPE_METADC) + return MFDRV_OffsetClipRgn( hdc, nXOffset, nYOffset ); + else + { + PLDC pLDC = GdiGetLDC(hdc); + if ( !pLDC ) + { + SetLastError(ERROR_INVALID_HANDLE); + return 0; + } + if (pLDC->iType == LDC_EMFLDC && !EMFDRV_OffsetClipRgn( hdc, nXOffset, nYOffset )) + return 0; + return NtGdiOffsetClipRgn( hdc, nXOffset, nYOffset); + } + } +#endif + return NtGdiOffsetClipRgn( hdc, nXOffset, nYOffset); } diff --git a/reactos/dll/win32/gdi32/objects/bitmap.c b/reactos/dll/win32/gdi32/objects/bitmap.c index c6302d996f3..68b9cc7726c 100644 --- a/reactos/dll/win32/gdi32/objects/bitmap.c +++ b/reactos/dll/win32/gdi32/objects/bitmap.c @@ -381,10 +381,49 @@ SetDIBits(HDC hDC, } if ( newDC ) - DeleteDC((HDC)SavehDC); + DeleteDC(SavehDC); else - RestoreDC((HDC)SavehDC, -1); + RestoreDC(SavehDC, -1); return LinesCopied; } +/* + * @implemented + * + */ +INT +STDCALL +SetDIBitsToDevice( + HDC hDC, + int XDest, + int YDest, + DWORD Width, + DWORD Height, + int XSrc, + int YSrc, + UINT StartScan, + UINT ScanLines, + CONST VOID *Bits, + CONST BITMAPINFO *lpbmi, + UINT ColorUse) +{ + return NtGdiSetDIBitsToDeviceInternal(hDC, + XDest, + YDest, + Width, + Height, + XSrc, + YSrc, + StartScan, + ScanLines, + (LPBYTE)Bits, + (LPBITMAPINFO)lpbmi, + ColorUse, + lpbmi->bmiHeader.biSizeImage, + lpbmi->bmiHeader.biSize, + FALSE, + NULL); +} + + diff --git a/reactos/dll/win32/gdi32/objects/eng.c b/reactos/dll/win32/gdi32/objects/eng.c index cd1e091b818..33c5000ca3f 100644 --- a/reactos/dll/win32/gdi32/objects/eng.c +++ b/reactos/dll/win32/gdi32/objects/eng.c @@ -147,13 +147,35 @@ EngGetCurrentCodePage( OUT PUSHORT OemCodePage, } +/* + * @implemented + */ +LPWSTR STDCALL +EngGetDriverName(HDEV hdev) +{ + // DHPDEV from NtGdiGetDhpdev must be from print driver. + PDRIVER_INFO_2W pDrvInfo2 = (PDRIVER_INFO_2W)NtGdiGetDhpdev(hdev); + if (pDrvInfo2->cVersion != 0xFEDCBA98 ) // Init mask for ver 2+ + { + PDRIVER_INFO_1W pDrvInfo1 = (PDRIVER_INFO_1W) pDrvInfo2; + return pDrvInfo1->pName; + } + return pDrvInfo2->pDriverPath; +} + /* * @implemented */ LPWSTR STDCALL EngGetPrinterDataFileName(HDEV hdev) { - return EngGetDriverName(hdev); + PDRIVER_INFO_2W pDrvInfo2 = (PDRIVER_INFO_2W)NtGdiGetDhpdev(hdev); + if (pDrvInfo2->cVersion != 0xFEDCBA98 ) + { + PDRIVER_INFO_1W pDrvInfo1 = (PDRIVER_INFO_1W) pDrvInfo2; + return pDrvInfo1->pName; + } + return pDrvInfo2->pDataFile; } /*