mirror of
https://github.com/reactos/reactos.git
synced 2025-07-31 19:21:38 +00:00
[GDI32]
- Use GdiAllocBatchCommand in DeleteObject instead of doing all manually svn path=/trunk/; revision=57492
This commit is contained in:
parent
e71dbbe6f4
commit
ca41d88df3
2 changed files with 16 additions and 18 deletions
|
@ -334,7 +334,7 @@ GdiAllocBatchCommand(
|
|||
|
||||
/* Check if the buffer is full */
|
||||
if ((pTeb->GdiBatchCount >= GDI_BatchLimit) ||
|
||||
((pTeb->GdiTebBatch.Offset + cjSize) > GDIBATCHBUFSIZE))
|
||||
((pTeb->GdiTebBatch.Offset + cjSize) > GDIBATCHBUFSIZE))
|
||||
{
|
||||
/* Call win32k, the kernel will call NtGdiFlushUserBatch to flush
|
||||
the current batch */
|
||||
|
|
|
@ -320,27 +320,28 @@ BOOL
|
|||
WINAPI
|
||||
DeleteObject(HGDIOBJ hObject)
|
||||
{
|
||||
UINT Type = 0;
|
||||
DWORD dwType = 0;
|
||||
|
||||
/* From Wine: DeleteObject does not SetLastError() on a null object */
|
||||
if(!hObject) return FALSE;
|
||||
|
||||
if (0 != ((DWORD) hObject & GDI_HANDLE_STOCK_MASK))
|
||||
if ((DWORD)hObject & GDI_HANDLE_STOCK_MASK)
|
||||
{
|
||||
// Relax! This is a normal return!
|
||||
DPRINT("Trying to delete system object 0x%x\n", hObject);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
// If you dont own it?! Get OUT!
|
||||
if(!GdiIsHandleValid(hObject)) return FALSE;
|
||||
|
||||
Type = GDI_HANDLE_GET_TYPE(hObject);
|
||||
dwType = GDI_HANDLE_GET_TYPE(hObject);
|
||||
|
||||
if ((Type == GDI_OBJECT_TYPE_METAFILE) ||
|
||||
(Type == GDI_OBJECT_TYPE_ENHMETAFILE))
|
||||
if ((dwType == GDI_OBJECT_TYPE_METAFILE) ||
|
||||
(dwType == GDI_OBJECT_TYPE_ENHMETAFILE))
|
||||
return FALSE;
|
||||
|
||||
switch (Type)
|
||||
switch (dwType)
|
||||
{
|
||||
case GDI_OBJECT_TYPE_DC:
|
||||
return DeleteDC((HDC) hObject);
|
||||
|
@ -367,33 +368,30 @@ DeleteObject(HGDIOBJ hObject)
|
|||
{
|
||||
PBRUSH_ATTR Brh_Attr;
|
||||
PTEB pTeb;
|
||||
PGDIBSOBJECT pgO;
|
||||
|
||||
if ((!GdiGetHandleUserData(hObject, (DWORD)Type, (PVOID) &Brh_Attr)) ||
|
||||
(Brh_Attr == NULL) ) break;
|
||||
if ((!GdiGetHandleUserData(hObject, dwType, (PVOID) &Brh_Attr)) ||
|
||||
(Brh_Attr == NULL)) break;
|
||||
|
||||
pTeb = NtCurrentTeb();
|
||||
|
||||
if (pTeb->Win32ThreadInfo == NULL) break;
|
||||
|
||||
if ((pTeb->GdiTebBatch.Offset + sizeof(GDIBSOBJECT)) <= GDIBATCHBUFSIZE)
|
||||
pgO = GdiAllocBatchCommand(NULL, GdiBCDelObj);
|
||||
if (pgO)
|
||||
{
|
||||
PGDIBSOBJECT pgO = (PGDIBSOBJECT)(&pTeb->GdiTebBatch.Buffer[0] +
|
||||
pTeb->GdiTebBatch.Offset);
|
||||
pgO->gbHdr.Cmd = GdiBCDelObj;
|
||||
pgO->gbHdr.Size = sizeof(GDIBSOBJECT);
|
||||
pgO->hgdiobj = hObject;
|
||||
|
||||
pTeb->GdiTebBatch.Offset += sizeof(GDIBSOBJECT);
|
||||
pTeb->GdiBatchCount++;
|
||||
if (pTeb->GdiBatchCount >= GDI_BatchLimit) NtGdiFlush();
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case GDI_OBJECT_TYPE_BITMAP:
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return NtGdiDeleteObjectApp(hObject);
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue