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/…
==============================================================================
--- 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/…
==============================================================================
--- 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);
+}