diff --git a/reactos/dll/win32/gdi32/misc/hacks.c b/reactos/dll/win32/gdi32/misc/hacks.c index 8b4196d76d2..ec4f215b5a3 100644 --- a/reactos/dll/win32/gdi32/misc/hacks.c +++ b/reactos/dll/win32/gdi32/misc/hacks.c @@ -60,17 +60,6 @@ SelectObject(HDC hdc, return NtGdiSelectObject(hdc,hgdiobj); } -/* - * @implemented - * - */ -int -STDCALL -GetStretchBltMode(HDC hdc) -{ - return NtGdiGetStretchBltMode(hdc); -} - /* * @implemented * diff --git a/reactos/dll/win32/gdi32/misc/stubs.c b/reactos/dll/win32/gdi32/misc/stubs.c index f2c3791539c..739b0ebbcf7 100644 --- a/reactos/dll/win32/gdi32/misc/stubs.c +++ b/reactos/dll/win32/gdi32/misc/stubs.c @@ -63,17 +63,6 @@ SetDIBits(HDC hdc, return NtGdiSetDIBits(hdc, hbmp, uStartScan, cScanLines, lpvBits, lpbmi, fuColorUse); } -/* - * @unimplemented - */ -int -STDCALL -SetStretchBltMode(HDC hdc, int iStretchMode) -{ - /* FIXME share memory */ - return NtGdiSetStretchBltMode(hdc, iStretchMode); -} - /* * @unimplemented */ @@ -1438,31 +1427,6 @@ GetFontAssocStatus(HDC hdc) return retValue; } -/* - * @unimplemented - */ -HFONT -STDCALL -GetHFONT(HDC dc) -{ - UNIMPLEMENTED; - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return 0; -} - -/* - * @unimplemented - */ -DWORD -STDCALL -GetLayout(HDC hdc -) -{ - UNIMPLEMENTED; - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return 0; -} - /* * @implemented */ @@ -1584,33 +1548,6 @@ SetBrushAttributes(HBRUSH hbm, DWORD dwFlags) return 0; } -/* - * @unimplemented - */ -DWORD -STDCALL -SetLayout(HDC hdc, - DWORD dwLayout) -{ - UNIMPLEMENTED; - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return 0; -} - -/* - * @unimplemented - */ -DWORD -STDCALL -SetLayoutWidth(HDC hdc,LONG wox,DWORD dwLayout) -{ - UNIMPLEMENTED; - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return 0; -} - - - /* * @implemented */ diff --git a/reactos/dll/win32/gdi32/objects/dc.c b/reactos/dll/win32/gdi32/objects/dc.c index c9ba89edd9d..f7edc2e7868 100644 --- a/reactos/dll/win32/gdi32/objects/dc.c +++ b/reactos/dll/win32/gdi32/objects/dc.c @@ -1515,7 +1515,7 @@ SelectPalette( if ( !pLDC ) { SetLastError(ERROR_INVALID_HANDLE); - return FALSE; + return NULL; } if (pLDC->iType == LDC_EMFLDC) { @@ -1560,11 +1560,134 @@ SetMapMode( else { SetLastError(ERROR_INVALID_HANDLE); - return FALSE; + return 0; } #endif if ((Mode == Dc_Attr->iMapMode) && (Mode != MM_ISOTROPIC)) return Mode; return GetAndSetDCDWord( hdc, GdiGetSetMapMode, Mode, 0, 0, 0 ); } +/* + * @implemented + * + */ +int +STDCALL +GetStretchBltMode(HDC hdc) +{ + PDC_ATTR Dc_Attr; + if (!GdiGetHandleUserData((HGDIOBJ) hdc, (PVOID) &Dc_Attr)) return 0; + return Dc_Attr->lStretchBltMode; +} + +/* + * @implemented + */ +int +STDCALL +SetStretchBltMode(HDC hdc, int iStretchMode) +{ + INT oSMode; + PDC_ATTR Dc_Attr; +#if 0 + if (GDI_HANDLE_GET_TYPE(hdc) != GDI_OBJECT_TYPE_DC) + { + if (GDI_HANDLE_GET_TYPE(hdc) == GDI_OBJECT_TYPE_METADC) + return MFDRV_SetStretchBltMode( hdc, iStretchMode); + else + { + PLDC pLDC = GdiGetLDC(hdc); + if ( !pLDC ) + { + SetLastError(ERROR_INVALID_HANDLE); + return 0; + } + if (pLDC->iType == LDC_EMFLDC) + { + return EMFDRV_SetStretchBltMode( hdc, iStretchMode); + } + } + } +#endif + if (!GdiGetHandleUserData((HGDIOBJ) hdc, (PVOID) &Dc_Attr)) return 0; + + oSMode = Dc_Attr->lStretchBltMode; + Dc_Attr->lStretchBltMode = iStretchMode; + + // Wine returns an error here. We set the default. + if ((iStretchMode <= 0) || (iStretchMode > MAXSTRETCHBLTMODE)) iStretchMode = WHITEONBLACK; + + Dc_Attr->jStretchBltMode = iStretchMode; + + return oSMode; +} + +/* + * @implemented + */ +HFONT +STDCALL +GetHFONT(HDC hdc) +{ + PDC_ATTR Dc_Attr; + if (!GdiGetHandleUserData((HGDIOBJ) hdc, (PVOID) &Dc_Attr)) return NULL; + return Dc_Attr->hlfntNew; +} + +/* + * @implemented + */ +DWORD +STDCALL +GetLayout(HDC hdc +) +{ + PDC_ATTR Dc_Attr; + if (!GdiGetHandleUserData((HGDIOBJ) hdc, (PVOID) &Dc_Attr)) return GDI_ERROR; + return Dc_Attr->dwLayout; +} + + +/* + * @implemented + */ +DWORD +STDCALL +SetLayout(HDC hdc, + DWORD dwLayout) +{ +#if 0 + if (GDI_HANDLE_GET_TYPE(hdc) != GDI_OBJECT_TYPE_DC) + { + if (GDI_HANDLE_GET_TYPE(hdc) == GDI_OBJECT_TYPE_METADC) + return MFDRV_SetLayout( hdc, dwLayout); + else + { + PLDC pLDC = GdiGetLDC(hdc); + if ( !pLDC ) + { + SetLastError(ERROR_INVALID_HANDLE); + return 0; + } + if (pLDC->iType == LDC_EMFLDC) + { + return EMFDRV_SetLayout( hdc, dwLayout); + } + } + } +#endif + if (!GdiIsHandleValid((HGDIOBJ) hdc)) return GDI_ERROR; + return NtGdiSetLayout( hdc, -1, dwLayout); +} + +/* + * @implemented + */ +DWORD +STDCALL +SetLayoutWidth(HDC hdc,LONG wox,DWORD dwLayout) +{ + if (!GdiIsHandleValid((HGDIOBJ) hdc)) return GDI_ERROR; + return NtGdiSetLayout( hdc, wox, dwLayout); +} diff --git a/reactos/include/psdk/wingdi.h b/reactos/include/psdk/wingdi.h index 714a8522e0d..f2c32c218d8 100644 --- a/reactos/include/psdk/wingdi.h +++ b/reactos/include/psdk/wingdi.h @@ -1193,7 +1193,10 @@ extern "C" { #define WGL_SWAP_UNDERLAY14 0x20000000 #define WGL_SWAP_UNDERLAY15 0x40000000 #define AC_SRC_OVER 0 -#define LAYOUT_RTL 1 +#define LAYOUT_RTL 1 // Right to left +#define LAYOUT_BTT 2 // Bottom to top +#define LAYOUT_VBH 4 // Vertical before horizontal +#define LAYOUT_ORIENTATIONMASK (LAYOUT_RTL | LAYOUT_BTT | LAYOUT_VBH) #define LAYOUT_BITMAPORIENTATIONPRESERVED 8 #if (WINVER > 0x400) #define CS_ENABLE 0x00000001 diff --git a/reactos/include/reactos/win32k/ntgdibad.h b/reactos/include/reactos/win32k/ntgdibad.h index f4eca70690d..73380ccd1ad 100644 --- a/reactos/include/reactos/win32k/ntgdibad.h +++ b/reactos/include/reactos/win32k/ntgdibad.h @@ -275,9 +275,6 @@ INT STDCALL NtGdiGetPixelFormat(HDC hDC); -/* Should be done in user-mode using shared GDI Objects. */ -INT STDCALL NtGdiGetStretchBltMode(HDC hDC); - /* Should be done in user-mode using shared GDI Objects. */ UINT STDCALL @@ -389,9 +386,6 @@ STDCALL NtGdiSetMapperFlags(HDC hDC, DWORD Flag); -/* Needs to be done in user-mode, using shared GDI Object Attributes. */ -INT STDCALL NtGdiSetStretchBltMode(HDC hDC, INT stretchBltMode); - /* Needs to be done in user-mode. */ BOOL STDCALL diff --git a/reactos/include/reactos/win32k/ntgdihdl.h b/reactos/include/reactos/win32k/ntgdihdl.h index 297944d85b6..38279704677 100644 --- a/reactos/include/reactos/win32k/ntgdihdl.h +++ b/reactos/include/reactos/win32k/ntgdihdl.h @@ -378,6 +378,9 @@ typedef struct _DC HDC hNext; HDC hPrev; + RECTL erclWindow; + RECTL erclBounds; + CLIPOBJ *CombinedClip; XLATEOBJ *XlateBrush; XLATEOBJ *XlatePen; diff --git a/reactos/subsystems/win32/win32k/include/dc.h b/reactos/subsystems/win32/win32k/include/dc.h index 728792e4a14..db0aa70777b 100644 --- a/reactos/subsystems/win32/win32k/include/dc.h +++ b/reactos/subsystems/win32/win32k/include/dc.h @@ -42,6 +42,7 @@ typedef struct PERESOURCE hsemDevLock; + PVOID pvGammaRamp; PVOID pfnSync; DHPDEV PDev; @@ -112,6 +113,7 @@ COLORREF FASTCALL NtGdiSetTextColor(HDC hDC, COLORREF color); UINT FASTCALL NtGdiSetTextAlign(HDC hDC, UINT Mode); UINT STDCALL NtGdiGetTextAlign(HDC hDC); COLORREF STDCALL NtGdiGetTextColor(HDC hDC); +INT STDCALL NtGdiSetStretchBltMode(HDC hDC, INT stretchBltMode); /* For Metafile and MetaEnhFile not in windows this struct taken from wine cvs 15/9-2006*/ typedef struct diff --git a/reactos/subsystems/win32/win32k/objects/coord.c b/reactos/subsystems/win32/win32k/objects/coord.c index 604126c0dbd..5661c8e9a7c 100644 --- a/reactos/subsystems/win32/win32k/objects/coord.c +++ b/reactos/subsystems/win32/win32k/objects/coord.c @@ -959,5 +959,43 @@ NtGdiSetWindowOrgEx(HDC hDC, return TRUE; } + /* + * @unimplemented + */ +DWORD +APIENTRY +NtGdiSetLayout( + IN HDC hdc, + IN LONG wox, + IN DWORD dwLayout) +{ + PDC dc; + PDC_ATTR Dc_Attr; + DWORD oLayout; + + dc = DC_LockDc(hdc); + if (!dc) + { + SetLastWin32Error(ERROR_INVALID_HANDLE); + return GDI_ERROR; + } + Dc_Attr = dc->pDc_Attr; + if(!Dc_Attr) Dc_Attr = &dc->Dc_Attr; + + Dc_Attr->dwLayout = dwLayout; + oLayout = Dc_Attr->dwLayout; + + if (!(dwLayout & LAYOUT_ORIENTATIONMASK)) + { + DC_UnlockDc(dc); + return oLayout; + } + +// DC_UpdateXforms(dc); + DC_UnlockDc(dc); + + UNIMPLEMENTED; + return GDI_ERROR; +} /* EOF */ diff --git a/reactos/subsystems/win32/win32k/objects/dc.c b/reactos/subsystems/win32/win32k/objects/dc.c index 944f84b9569..a27e395fd11 100644 --- a/reactos/subsystems/win32/win32k/objects/dc.c +++ b/reactos/subsystems/win32/win32k/objects/dc.c @@ -827,12 +827,16 @@ IntGdiCreateDC(PUNICODE_STRING Driver, ((PGDIDEVICE)NewDC->pPDev)->GDIInfo.cPlanes; DPRINT("Bits per pel: %u\n", NewDC->w.bitsPerPixel); - if (! CreateAsIC) + if (!CreateAsIC) { NewDC->PalIndexed = NtGdiGetStockObject(DEFAULT_PALETTE); NewDC->w.hPalette = PrimarySurface.DevInfo.hpalDefault; nDc_Attr->jROP2 = R2_COPYPEN; + NewDC->erclWindow.top = NewDC->erclWindow.left = 0; + NewDC->erclWindow.right = ((PGDIDEVICE)NewDC->pPDev)->GDIInfo.ulHorzRes; + NewDC->erclWindow.bottom = ((PGDIDEVICE)NewDC->pPDev)->GDIInfo.ulVertRes; + DC_UnlockDc( NewDC ); hVisRgn = NtGdiCreateRectRgn(0, 0, ((PGDIDEVICE)NewDC->pPDev)->GDIInfo.ulHorzRes, @@ -1189,6 +1193,7 @@ IntGdiCopyToSaveState(PDC dc, PDC newdc) if(!nDc_Attr) nDc_Attr = &newdc->Dc_Attr; newdc->w.flags = dc->w.flags | DC_SAVED; + nDc_Attr->dwLayout = Dc_Attr->dwLayout; nDc_Attr->hpen = Dc_Attr->hpen; nDc_Attr->hbrush = Dc_Attr->hbrush; nDc_Attr->hlfntNew = Dc_Attr->hlfntNew; @@ -1272,6 +1277,7 @@ IntGdiCopyFromSaveState(PDC dc, PDC dcs, HDC hDC) dc->w.hDevice = dcs->w.hDevice; #endif + Dc_Attr->dwLayout = sDc_Attr->dwLayout; dc->w.totalExtent = dcs->w.totalExtent; Dc_Attr->jROP2 = sDc_Attr->jROP2; Dc_Attr->jFillMode = sDc_Attr->jFillMode; diff --git a/reactos/subsystems/win32/win32k/stubs/stubs.c b/reactos/subsystems/win32/win32k/stubs/stubs.c index ebd6c9d7666..88419c5e11e 100644 --- a/reactos/subsystems/win32/win32k/stubs/stubs.c +++ b/reactos/subsystems/win32/win32k/stubs/stubs.c @@ -3169,20 +3169,6 @@ NtGdiMirrorWindowOrg( return FALSE; } - /* - * @unimplemented - */ -DWORD -APIENTRY -NtGdiSetLayout( - IN HDC hdc, - IN LONG wox, - IN DWORD dwLayout) -{ - UNIMPLEMENTED; - return 0; -} - /* * @unimplemented */ diff --git a/reactos/subsystems/win32/win32k/w32ksvc.db b/reactos/subsystems/win32/win32k/w32ksvc.db index d90b80e74d4..e68c83b0439 100644 --- a/reactos/subsystems/win32/win32k/w32ksvc.db +++ b/reactos/subsystems/win32/win32k/w32ksvc.db @@ -683,7 +683,6 @@ NtGdiSetDIBits 7 NtGdiSetEnhMetaFileBits 2 NtGdiSetICMProfile 2 NtGdiSetMapperFlags 2 -NtGdiSetStretchBltMode 2 NtGdiSetViewportExtEx 4 NtGdiSetViewportOrgEx 4 NtGdiSetWindowExtEx 4 @@ -749,7 +748,6 @@ NtGdiGetFontLanguageInfo 1 NtGdiGetICMProfile 3 NtGdiGetLogColorSpace 3 NtGdiGetPixelFormat 1 -NtGdiGetStretchBltMode 1 NtGdiGetTextExtentPoint32 4 NtGdiOffsetViewportOrgEx 4 NtGdiOffsetWindowOrgEx 4