Author: tkreuzer Date: Fri Sep 5 20:16:52 2014 New Revision: 64040
URL: http://svn.reactos.org/svn/reactos?rev=64040&view=rev Log: [GDI32] Use GdiAllocBatchCommand in SetBrushOrgEx instead of manual and broken fiddling with GdiTebBatch. Fixes CID 716217.
Modified: trunk/reactos/win32ss/gdi/gdi32/include/gdi32p.h trunk/reactos/win32ss/gdi/gdi32/objects/brush.c
Modified: trunk/reactos/win32ss/gdi/gdi32/include/gdi32p.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/gdi/gdi32/include/g... ============================================================================== --- trunk/reactos/win32ss/gdi/gdi32/include/gdi32p.h [iso-8859-1] (original) +++ trunk/reactos/win32ss/gdi/gdi32/include/gdi32p.h [iso-8859-1] Fri Sep 5 20:16:52 2014 @@ -323,7 +323,7 @@ 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);
Modified: trunk/reactos/win32ss/gdi/gdi32/objects/brush.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/gdi/gdi32/objects/b... ============================================================================== --- trunk/reactos/win32ss/gdi/gdi32/objects/brush.c [iso-8859-1] (original) +++ trunk/reactos/win32ss/gdi/gdi32/objects/brush.c [iso-8859-1] Fri Sep 5 20:16:52 2014 @@ -393,44 +393,37 @@ return FALSE; } #endif - if (GdiGetHandleUserData((HGDIOBJ) hdc, GDI_OBJECT_TYPE_DC, (PVOID) &Dc_Attr)) - { - PTEB pTeb = NtCurrentTeb(); + if (GdiGetHandleUserData((HGDIOBJ) hdc, GDI_OBJECT_TYPE_DC, (PVOID)&Dc_Attr)) + { + 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)) ) - { - PGDIBSSETBRHORG pgSBO = (PGDIBSSETBRHORG)(&pTeb->GdiTebBatch.Buffer[0] + - pTeb->GdiTebBatch.Offset); - + /* Allocate a batch command buffer */ + pgSBO = GdiAllocBatchCommand(hdc, GdiBCSetBrushOrg); + if (pgSBO != NULL) + { + /* 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); +}