From b8e0dc9948d6bd5682edc57ebdecebde22f5659f Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Mon, 23 Aug 2010 01:41:56 +0000 Subject: [PATCH] [WIN32K] Seperate DC_vSetLayout from NtGdiSetLayout and save the old value before setting the new one. svn path=/trunk/; revision=48605 --- .../subsystems/win32/win32k/objects/coord.c | 83 ++++++++++--------- 1 file changed, 46 insertions(+), 37 deletions(-) diff --git a/reactos/subsystems/win32/win32k/objects/coord.c b/reactos/subsystems/win32/win32k/objects/coord.c index 7310dcb1adc..12cb42a024b 100644 --- a/reactos/subsystems/win32/win32k/objects/coord.c +++ b/reactos/subsystems/win32/win32k/objects/coord.c @@ -886,6 +886,46 @@ IntMirrorWindowOrg(PDC dc) return; } +VOID +NTAPI +DC_vSetLayout( + IN PDC pdc, + IN LONG wox, + IN DWORD dwLayout) +{ + PDC_ATTR pdcattr = pdc->pdcattr; + + pdcattr->dwLayout = dwLayout; + + if (!(dwLayout & LAYOUT_ORIENTATIONMASK)) return; + + if (dwLayout & LAYOUT_RTL) + { + pdcattr->iMapMode = MM_ANISOTROPIC; + } + + pdcattr->szlWindowExt.cy = -pdcattr->szlWindowExt.cy; + pdcattr->ptlWindowOrg.x = -pdcattr->ptlWindowOrg.x; + + if (wox == -1) + IntMirrorWindowOrg(pdc); + else + pdcattr->ptlWindowOrg.x = wox - pdcattr->ptlWindowOrg.x; + + if (!(pdcattr->flTextAlign & TA_CENTER)) pdcattr->flTextAlign |= TA_RIGHT; + + if (pdc->dclevel.flPath & DCPATH_CLOCKWISE) + pdc->dclevel.flPath &= ~DCPATH_CLOCKWISE; + else + pdc->dclevel.flPath |= DCPATH_CLOCKWISE; + + pdcattr->flXform |= (PAGE_EXTENTS_CHANGED | + INVALIDATE_ATTRIBUTES | + DEVICE_TO_WORLD_INVALID); + +// DC_UpdateXforms(pdc); +} + // NtGdiSetLayout // // The default is left to right. This function changes it to right to left, which @@ -901,53 +941,22 @@ NtGdiSetLayout( IN LONG wox, IN DWORD dwLayout) { - PDC dc; + PDC pdc; PDC_ATTR pdcattr; DWORD oLayout; - dc = DC_LockDc(hdc); - if (!dc) + pdc = DC_LockDc(hdc); + if (!pdc) { SetLastWin32Error(ERROR_INVALID_HANDLE); return GDI_ERROR; } - pdcattr = dc->pdcattr; + pdcattr = pdc->pdcattr; - pdcattr->dwLayout = dwLayout; oLayout = pdcattr->dwLayout; + DC_vSetLayout(pdc, wox, dwLayout); - if (!(dwLayout & LAYOUT_ORIENTATIONMASK)) - { - DC_UnlockDc(dc); - return oLayout; - } - - if (dwLayout & LAYOUT_RTL) - { - pdcattr->iMapMode = MM_ANISOTROPIC; - } - - pdcattr->szlWindowExt.cy = -pdcattr->szlWindowExt.cy; - pdcattr->ptlWindowOrg.x = -pdcattr->ptlWindowOrg.x; - - if (wox == -1) - IntMirrorWindowOrg(dc); - else - pdcattr->ptlWindowOrg.x = wox - pdcattr->ptlWindowOrg.x; - - if (!(pdcattr->flTextAlign & TA_CENTER)) pdcattr->flTextAlign |= TA_RIGHT; - - if (dc->dclevel.flPath & DCPATH_CLOCKWISE) - dc->dclevel.flPath &= ~DCPATH_CLOCKWISE; - else - dc->dclevel.flPath |= DCPATH_CLOCKWISE; - - pdcattr->flXform |= (PAGE_EXTENTS_CHANGED | - INVALIDATE_ATTRIBUTES | - DEVICE_TO_WORLD_INVALID); - -// DC_UpdateXforms(dc); - DC_UnlockDc(dc); + DC_UnlockDc(pdc); return oLayout; }