From a780f4c9217cab3f09723f3bccba0e481ce8a3dc Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Fri, 5 Sep 2014 20:16:52 +0000 Subject: [PATCH] [GDI32] Use GdiAllocBatchCommand in SetBrushOrgEx instead of manual and broken fiddling with GdiTebBatch. Fixes CID 716217. svn path=/trunk/; revision=64040 --- reactos/win32ss/gdi/gdi32/include/gdi32p.h | 2 +- reactos/win32ss/gdi/gdi32/objects/brush.c | 39 +++++++++------------- 2 files changed, 17 insertions(+), 24 deletions(-) diff --git a/reactos/win32ss/gdi/gdi32/include/gdi32p.h b/reactos/win32ss/gdi/gdi32/include/gdi32p.h index 590872a323f..8dc34994166 100644 --- a/reactos/win32ss/gdi/gdi32/include/gdi32p.h +++ b/reactos/win32ss/gdi/gdi32/include/gdi32p.h @@ -323,7 +323,7 @@ GdiAllocBatchCommand( else if (Cmd == GdiBCPolyPatBlt) cjSize = 0; else if (Cmd == GdiBCTextOut) cjSize = 0; else if (Cmd == GdiBCExtTextOut) cjSize = 0; - else if (Cmd == GdiBCSetBrushOrg) cjSize = 0; + else if (Cmd == GdiBCSetBrushOrg) cjSize = sizeof(GDIBSSETBRHORG); else if (Cmd == GdiBCExtSelClipRgn) cjSize = 0; else if (Cmd == GdiBCSelObj) cjSize = sizeof(GDIBSOBJECT); else if (Cmd == GdiBCDelRgn) cjSize = sizeof(GDIBSOBJECT); diff --git a/reactos/win32ss/gdi/gdi32/objects/brush.c b/reactos/win32ss/gdi/gdi32/objects/brush.c index 4ef0b79e53a..6a686402c1a 100644 --- a/reactos/win32ss/gdi/gdi32/objects/brush.c +++ b/reactos/win32ss/gdi/gdi32/objects/brush.c @@ -393,44 +393,37 @@ SetBrushOrgEx(HDC hdc, return FALSE; } #endif - if (GdiGetHandleUserData((HGDIOBJ) hdc, GDI_OBJECT_TYPE_DC, (PVOID) &Dc_Attr)) + if (GdiGetHandleUserData((HGDIOBJ) hdc, GDI_OBJECT_TYPE_DC, (PVOID)&Dc_Attr)) { - PTEB pTeb = NtCurrentTeb(); + PGDIBSSETBRHORG pgSBO; + + /* Does the caller want the current brush origin to be returned? */ if (lppt) { lppt->x = Dc_Attr->ptlBrushOrigin.x; lppt->y = Dc_Attr->ptlBrushOrigin.y; } - if ((nXOrg == Dc_Attr->ptlBrushOrigin.x) && (nYOrg == Dc_Attr->ptlBrushOrigin.y)) + + /* Check if we have nothing to do */ + if ((nXOrg == Dc_Attr->ptlBrushOrigin.x) && + (nYOrg == Dc_Attr->ptlBrushOrigin.y)) return TRUE; - if(((pTeb->GdiTebBatch.HDC == NULL) || (pTeb->GdiTebBatch.HDC == hdc)) && - ((pTeb->GdiTebBatch.Offset + sizeof(GDIBSSETBRHORG)) <= GDIBATCHBUFSIZE) && - (!(Dc_Attr->ulDirty_ & DC_DIBSECTION)) ) + /* Allocate a batch command buffer */ + pgSBO = GdiAllocBatchCommand(hdc, GdiBCSetBrushOrg); + if (pgSBO != NULL) { - PGDIBSSETBRHORG pgSBO = (PGDIBSSETBRHORG)(&pTeb->GdiTebBatch.Buffer[0] + - pTeb->GdiTebBatch.Offset); - + /* Set current brush origin in the DC attribute */ Dc_Attr->ptlBrushOrigin.x = nXOrg; Dc_Attr->ptlBrushOrigin.y = nYOrg; - pgSBO->gbHdr.Cmd = GdiBCSetBrushOrg; - pgSBO->gbHdr.Size = sizeof(GDIBSSETBRHORG); + /* Setup the GDI batch command */ pgSBO->ptlBrushOrigin = Dc_Attr->ptlBrushOrigin; - pTeb->GdiTebBatch.Offset += sizeof(GDIBSSETBRHORG); - pTeb->GdiTebBatch.HDC = hdc; - pTeb->GdiBatchCount++; - DPRINT("Loading the Flush!! COUNT-> %lu\n", pTeb->GdiBatchCount); - - if (pTeb->GdiBatchCount >= GDI_BatchLimit) - { - DPRINT("Call GdiFlush!!\n"); - NtGdiFlush(); - DPRINT("Exit GdiFlush!!\n"); - } return TRUE; } } - return NtGdiSetBrushOrg(hdc,nXOrg,nYOrg,lppt); + + /* Fall back to the slower kernel path */ + return NtGdiSetBrushOrg(hdc, nXOrg, nYOrg, lppt); } -- 2.17.1