- Use GdiAllocBatchCommand in DeleteObject instead of doing all manually

svn path=/trunk/; revision=57492
This commit is contained in:
Timo Kreuzer 2012-10-06 08:33:17 +00:00
parent e71dbbe6f4
commit ca41d88df3
2 changed files with 16 additions and 18 deletions

View file

@ -320,27 +320,28 @@ BOOL
WINAPI WINAPI
DeleteObject(HGDIOBJ hObject) DeleteObject(HGDIOBJ hObject)
{ {
UINT Type = 0; DWORD dwType = 0;
/* From Wine: DeleteObject does not SetLastError() on a null object */ /* From Wine: DeleteObject does not SetLastError() on a null object */
if(!hObject) return FALSE; 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! // Relax! This is a normal return!
DPRINT("Trying to delete system object 0x%x\n", hObject); DPRINT("Trying to delete system object 0x%x\n", hObject);
return TRUE; return TRUE;
} }
// If you dont own it?! Get OUT! // If you dont own it?! Get OUT!
if(!GdiIsHandleValid(hObject)) return FALSE; if(!GdiIsHandleValid(hObject)) return FALSE;
Type = GDI_HANDLE_GET_TYPE(hObject); dwType = GDI_HANDLE_GET_TYPE(hObject);
if ((Type == GDI_OBJECT_TYPE_METAFILE) || if ((dwType == GDI_OBJECT_TYPE_METAFILE) ||
(Type == GDI_OBJECT_TYPE_ENHMETAFILE)) (dwType == GDI_OBJECT_TYPE_ENHMETAFILE))
return FALSE; return FALSE;
switch (Type) switch (dwType)
{ {
case GDI_OBJECT_TYPE_DC: case GDI_OBJECT_TYPE_DC:
return DeleteDC((HDC) hObject); return DeleteDC((HDC) hObject);
@ -367,33 +368,30 @@ DeleteObject(HGDIOBJ hObject)
{ {
PBRUSH_ATTR Brh_Attr; PBRUSH_ATTR Brh_Attr;
PTEB pTeb; PTEB pTeb;
PGDIBSOBJECT pgO;
if ((!GdiGetHandleUserData(hObject, (DWORD)Type, (PVOID) &Brh_Attr)) || if ((!GdiGetHandleUserData(hObject, dwType, (PVOID) &Brh_Attr)) ||
(Brh_Attr == NULL)) break; (Brh_Attr == NULL)) break;
pTeb = NtCurrentTeb(); pTeb = NtCurrentTeb();
if (pTeb->Win32ThreadInfo == NULL) break; 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; pgO->hgdiobj = hObject;
pTeb->GdiTebBatch.Offset += sizeof(GDIBSOBJECT);
pTeb->GdiBatchCount++;
if (pTeb->GdiBatchCount >= GDI_BatchLimit) NtGdiFlush();
return TRUE; return TRUE;
} }
break; break;
} }
case GDI_OBJECT_TYPE_BITMAP: case GDI_OBJECT_TYPE_BITMAP:
default: default:
break; break;
} }
return NtGdiDeleteObjectApp(hObject); return NtGdiDeleteObjectApp(hObject);
} }