Remove typecasts PBITMAPOBJ <-> PSURFOBJ. Use GDIOBJ_ShareLockObj / _UnlockObjByPtr instead of Eng(Un)LockSurface as BITMAPOBJ_Un/LockObj. Add BASEOBJECT to the BITMAPOBJ structure.

svn path=/trunk/; revision=32428
This commit is contained in:
Timo Kreuzer 2008-02-19 22:21:39 +00:00
parent 71719dc6bd
commit 1bd028f33b
5 changed files with 69 additions and 64 deletions

View file

@ -47,7 +47,7 @@ EngCopyBits(SURFOBJ *Dest,
RECT_ENUM RectEnum; RECT_ENUM RectEnum;
BOOL EnumMore; BOOL EnumMore;
BLTINFO BltInfo; BLTINFO BltInfo;
BITMAPOBJ *DestObj = NULL; BITMAPOBJ *DestObj;
BITMAPOBJ *SourceObj; BITMAPOBJ *SourceObj;
ASSERT(Dest != NULL && Source != NULL && DestRect != NULL && SourcePoint != NULL); ASSERT(Dest != NULL && Source != NULL && DestRect != NULL && SourcePoint != NULL);
@ -57,11 +57,13 @@ EngCopyBits(SURFOBJ *Dest,
MouseSafetyOnDrawStart(Source, SourcePoint->x, SourcePoint->y, MouseSafetyOnDrawStart(Source, SourcePoint->x, SourcePoint->y,
(SourcePoint->x + abs(DestRect->right - DestRect->left)), (SourcePoint->x + abs(DestRect->right - DestRect->left)),
(SourcePoint->y + abs(DestRect->bottom - DestRect->top))); (SourcePoint->y + abs(DestRect->bottom - DestRect->top)));
DestObj = CONTAINING_RECORD(Dest, BITMAPOBJ, SurfObj);
if (Dest != Source) if (Dest != Source)
{ {
DestObj = CONTAINING_RECORD(Dest, BITMAPOBJ, SurfObj);
BITMAPOBJ_LockBitmapBits(DestObj); BITMAPOBJ_LockBitmapBits(DestObj);
} }
MouseSafetyOnDrawStart(Dest, DestRect->left, DestRect->top, DestRect->right, DestRect->bottom); MouseSafetyOnDrawStart(Dest, DestRect->left, DestRect->top, DestRect->right, DestRect->bottom);
// FIXME: Don't punt to the driver's DrvCopyBits immediately. Instead, // FIXME: Don't punt to the driver's DrvCopyBits immediately. Instead,
@ -76,8 +78,7 @@ EngCopyBits(SURFOBJ *Dest,
if(Dest->iType!=STYPE_BITMAP) if(Dest->iType!=STYPE_BITMAP)
{ {
/* FIXME: Eng* functions shouldn't call Drv* functions. ? */ /* FIXME: Eng* functions shouldn't call Drv* functions. ? */
/* FIXME: Remove typecast. */ if (DestObj->flHooks & HOOK_COPYBITS)
if (((BITMAPOBJ*)Dest)->flHooks & HOOK_COPYBITS)
{ {
ret = GDIDEVFUNCS(Dest).CopyBits( ret = GDIDEVFUNCS(Dest).CopyBits(
Dest, Source, Clip, ColorTranslation, DestRect, SourcePoint); Dest, Source, Clip, ColorTranslation, DestRect, SourcePoint);
@ -98,8 +99,7 @@ EngCopyBits(SURFOBJ *Dest,
if(Source->iType!=STYPE_BITMAP) if(Source->iType!=STYPE_BITMAP)
{ {
/* FIXME: Eng* functions shouldn't call Drv* functions. ? */ /* FIXME: Eng* functions shouldn't call Drv* functions. ? */
/* FIXME: Remove typecast. */ if (SourceObj->flHooks & HOOK_COPYBITS)
if (((BITMAPOBJ*)Source)->flHooks & HOOK_COPYBITS)
{ {
ret = GDIDEVFUNCS(Source).CopyBits( ret = GDIDEVFUNCS(Source).CopyBits(
Dest, Source, Clip, ColorTranslation, DestRect, SourcePoint); Dest, Source, Clip, ColorTranslation, DestRect, SourcePoint);

View file

@ -25,11 +25,11 @@
BOOL STDCALL BOOL STDCALL
IntEngEnter(PINTENG_ENTER_LEAVE EnterLeave, IntEngEnter(PINTENG_ENTER_LEAVE EnterLeave,
SURFOBJ *DestObj, SURFOBJ *DestSurf,
RECTL *DestRect, RECTL *DestRect,
BOOL ReadOnly, BOOL ReadOnly,
POINTL *Translate, POINTL *Translate,
SURFOBJ **OutputObj) SURFOBJ **OutputSurf)
{ {
LONG Exchange; LONG Exchange;
SIZEL BitmapSize; SIZEL BitmapSize;
@ -51,12 +51,12 @@ IntEngEnter(PINTENG_ENTER_LEAVE EnterLeave,
DestRect->bottom = Exchange; DestRect->bottom = Exchange;
} }
if (NULL != DestObj && STYPE_BITMAP != DestObj->iType && if (NULL != DestSurf && STYPE_BITMAP != DestSurf->iType &&
(NULL == DestObj->pvScan0 || 0 == DestObj->lDelta)) (NULL == DestSurf->pvScan0 || 0 == DestSurf->lDelta))
{ {
/* Driver needs to support DrvCopyBits, else we can't do anything */ /* Driver needs to support DrvCopyBits, else we can't do anything */
/* FIXME: Remove typecast! */ BITMAPOBJ *DestBmp = CONTAINING_RECORD(DestSurf, BITMAPOBJ, SurfObj);
if (!(((BITMAPOBJ*)DestObj)->flHooks & HOOK_COPYBITS)) if (!(DestBmp->flHooks & HOOK_COPYBITS))
{ {
return FALSE; return FALSE;
} }
@ -64,9 +64,9 @@ IntEngEnter(PINTENG_ENTER_LEAVE EnterLeave,
/* Allocate a temporary bitmap */ /* Allocate a temporary bitmap */
BitmapSize.cx = DestRect->right - DestRect->left; BitmapSize.cx = DestRect->right - DestRect->left;
BitmapSize.cy = DestRect->bottom - DestRect->top; BitmapSize.cy = DestRect->bottom - DestRect->top;
Width = DIB_GetDIBWidthBytes(BitmapSize.cx, BitsPerFormat(DestObj->iBitmapFormat)); Width = DIB_GetDIBWidthBytes(BitmapSize.cx, BitsPerFormat(DestSurf->iBitmapFormat));
EnterLeave->OutputBitmap = EngCreateBitmap(BitmapSize, Width, EnterLeave->OutputBitmap = EngCreateBitmap(BitmapSize, Width,
DestObj->iBitmapFormat, DestSurf->iBitmapFormat,
BMF_TOPDOWN | BMF_NOZEROINIT, NULL); BMF_TOPDOWN | BMF_NOZEROINIT, NULL);
if (!EnterLeave->OutputBitmap) if (!EnterLeave->OutputBitmap)
@ -75,7 +75,7 @@ IntEngEnter(PINTENG_ENTER_LEAVE EnterLeave,
return FALSE; return FALSE;
} }
*OutputObj = EngLockSurface((HSURF)EnterLeave->OutputBitmap); *OutputSurf = EngLockSurface((HSURF)EnterLeave->OutputBitmap);
EnterLeave->DestRect.left = 0; EnterLeave->DestRect.left = 0;
EnterLeave->DestRect.top = 0; EnterLeave->DestRect.top = 0;
@ -89,35 +89,35 @@ IntEngEnter(PINTENG_ENTER_LEAVE EnterLeave,
ClippedDestRect.left -= SrcPoint.x; ClippedDestRect.left -= SrcPoint.x;
SrcPoint.x = 0; SrcPoint.x = 0;
} }
if (DestObj->sizlBitmap.cx < SrcPoint.x + ClippedDestRect.right - ClippedDestRect.left) if (DestSurf->sizlBitmap.cx < SrcPoint.x + ClippedDestRect.right - ClippedDestRect.left)
{ {
ClippedDestRect.right = ClippedDestRect.left + DestObj->sizlBitmap.cx - SrcPoint.x; ClippedDestRect.right = ClippedDestRect.left + DestSurf->sizlBitmap.cx - SrcPoint.x;
} }
if (SrcPoint.y < 0) if (SrcPoint.y < 0)
{ {
ClippedDestRect.top -= SrcPoint.y; ClippedDestRect.top -= SrcPoint.y;
SrcPoint.y = 0; SrcPoint.y = 0;
} }
if (DestObj->sizlBitmap.cy < SrcPoint.y + ClippedDestRect.bottom - ClippedDestRect.top) if (DestSurf->sizlBitmap.cy < SrcPoint.y + ClippedDestRect.bottom - ClippedDestRect.top)
{ {
ClippedDestRect.bottom = ClippedDestRect.top + DestObj->sizlBitmap.cy - SrcPoint.y; ClippedDestRect.bottom = ClippedDestRect.top + DestSurf->sizlBitmap.cy - SrcPoint.y;
} }
EnterLeave->TrivialClipObj = EngCreateClip(); EnterLeave->TrivialClipObj = EngCreateClip();
EnterLeave->TrivialClipObj->iDComplexity = DC_TRIVIAL; EnterLeave->TrivialClipObj->iDComplexity = DC_TRIVIAL;
if (ClippedDestRect.left < (*OutputObj)->sizlBitmap.cx && if (ClippedDestRect.left < (*OutputSurf)->sizlBitmap.cx &&
0 <= ClippedDestRect.right && 0 <= ClippedDestRect.right &&
SrcPoint.x < DestObj->sizlBitmap.cx && SrcPoint.x < DestSurf->sizlBitmap.cx &&
ClippedDestRect.top <= (*OutputObj)->sizlBitmap.cy && ClippedDestRect.top <= (*OutputSurf)->sizlBitmap.cy &&
0 <= ClippedDestRect.bottom && 0 <= ClippedDestRect.bottom &&
SrcPoint.y < DestObj->sizlBitmap.cy && SrcPoint.y < DestSurf->sizlBitmap.cy &&
! GDIDEVFUNCS(DestObj).CopyBits( ! GDIDEVFUNCS(DestSurf).CopyBits(
*OutputObj, DestObj, *OutputSurf, DestSurf,
EnterLeave->TrivialClipObj, NULL, EnterLeave->TrivialClipObj, NULL,
&ClippedDestRect, &SrcPoint)) &ClippedDestRect, &SrcPoint))
{ {
EngDeleteClip(EnterLeave->TrivialClipObj); EngDeleteClip(EnterLeave->TrivialClipObj);
EngFreeMem((*OutputObj)->pvBits); EngFreeMem((*OutputSurf)->pvBits);
EngUnlockSurface(*OutputObj); EngUnlockSurface(*OutputSurf);
EngDeleteSurface((HSURF)EnterLeave->OutputBitmap); EngDeleteSurface((HSURF)EnterLeave->OutputBitmap);
return FALSE; return FALSE;
} }
@ -132,25 +132,28 @@ IntEngEnter(PINTENG_ENTER_LEAVE EnterLeave,
{ {
Translate->x = 0; Translate->x = 0;
Translate->y = 0; Translate->y = 0;
*OutputObj = DestObj; *OutputSurf = DestSurf;
} }
if (NULL != *OutputObj if (NULL != *OutputSurf)
&& 0 != (((BITMAPOBJ*) *OutputObj)->flHooks & HOOK_SYNCHRONIZE))
{ {
if (NULL != GDIDEVFUNCS(*OutputObj).SynchronizeSurface) BITMAPOBJ* OutputBmp = CONTAINING_RECORD(*OutputSurf, BITMAPOBJ, SurfObj);
if (0 != (OutputBmp->flHooks & HOOK_SYNCHRONIZE))
{ {
GDIDEVFUNCS(*OutputObj).SynchronizeSurface(*OutputObj, DestRect, 0); if (NULL != GDIDEVFUNCS(*OutputSurf).SynchronizeSurface)
{
GDIDEVFUNCS(*OutputSurf).SynchronizeSurface(*OutputSurf, DestRect, 0);
} }
else if (STYPE_BITMAP == (*OutputObj)->iType else if (STYPE_BITMAP == (*OutputSurf)->iType
&& NULL != GDIDEVFUNCS(*OutputObj).Synchronize) && NULL != GDIDEVFUNCS(*OutputSurf).Synchronize)
{ {
GDIDEVFUNCS(*OutputObj).Synchronize((*OutputObj)->dhpdev, DestRect); GDIDEVFUNCS(*OutputSurf).Synchronize((*OutputSurf)->dhpdev, DestRect);
}
} }
} }
EnterLeave->DestObj = DestObj; EnterLeave->DestObj = DestSurf;
EnterLeave->OutputObj = *OutputObj; EnterLeave->OutputObj = *OutputSurf;
EnterLeave->ReadOnly = ReadOnly; EnterLeave->ReadOnly = ReadOnly;
return TRUE; return TRUE;

View file

@ -575,7 +575,10 @@ VOID STDCALL
EngUnlockSurface(IN SURFOBJ *Surface) EngUnlockSurface(IN SURFOBJ *Surface)
{ {
if (Surface != NULL) if (Surface != NULL)
GDIOBJ_UnlockObjByPtr(GdiHandleTable, Surface); {
BITMAPOBJ *bmp = CONTAINING_RECORD(Surface, BITMAPOBJ, SurfObj);
GDIOBJ_UnlockObjByPtr(GdiHandleTable, bmp);
}
} }

View file

@ -5,10 +5,7 @@
/* GDI logical bitmap object */ /* GDI logical bitmap object */
typedef struct _BITMAPOBJ typedef struct _BITMAPOBJ
{ {
// HGDIOBJ hHmgr; BASEOBJECT BaseObject;
// PVOID pvEntry;
// ULONG lucExcLock;
// ULONG Tid;
SURFOBJ SurfObj; SURFOBJ SurfObj;
FLONG flHooks; FLONG flHooks;
@ -34,8 +31,11 @@ typedef struct _BITMAPOBJ
#define BITMAPOBJ_FreeBitmap(hBMObj) \ #define BITMAPOBJ_FreeBitmap(hBMObj) \
GDIOBJ_FreeObj(GdiHandleTable, (HGDIOBJ) hBMObj, GDI_OBJECT_TYPE_BITMAP) GDIOBJ_FreeObj(GdiHandleTable, (HGDIOBJ) hBMObj, GDI_OBJECT_TYPE_BITMAP)
/* NOTE: Use shared locks! */ /* NOTE: Use shared locks! */
#define BITMAPOBJ_LockBitmap(hBMObj) (PBITMAPOBJ)EngLockSurface((HSURF)hBMObj) #define BITMAPOBJ_LockBitmap(hBMObj) \
#define BITMAPOBJ_UnlockBitmap(pBMObj) EngUnlockSurface(&pBMObj->SurfObj) ((PBITMAPOBJ) GDIOBJ_ShareLockObj (GdiHandleTable, (HGDIOBJ) hBMObj, GDI_OBJECT_TYPE_BITMAP))
#define BITMAPOBJ_UnlockBitmap(pBMObj) \
GDIOBJ_UnlockObjByPtr (GdiHandleTable, pBMObj)
BOOL INTERNAL_CALL BITMAP_Cleanup(PVOID ObjectBody); BOOL INTERNAL_CALL BITMAP_Cleanup(PVOID ObjectBody);
BOOL INTERNAL_CALL BITMAPOBJ_InitBitsLock(BITMAPOBJ *pBMObj); BOOL INTERNAL_CALL BITMAPOBJ_InitBitsLock(BITMAPOBJ *pBMObj);

View file

@ -928,7 +928,6 @@ GDIOBJ_LockObj (PGDI_HANDLE_TABLE HandleTable, HGDIOBJ hObj, DWORD ExpectedType)
#ifdef GDI_DEBUG #ifdef GDI_DEBUG
CaptureStackBackTace((PVOID*)GDIHandleLocker[GDI_HANDLE_GET_INDEX(hObj)], GDI_STACK_LEVELS); CaptureStackBackTace((PVOID*)GDIHandleLocker[GDI_HANDLE_GET_INDEX(hObj)], GDI_STACK_LEVELS);
#endif #endif
Object = Entry->KernelData;
} }
else else
{ {
@ -943,8 +942,8 @@ GDIOBJ_LockObj (PGDI_HANDLE_TABLE HandleTable, HGDIOBJ hObj, DWORD ExpectedType)
DelayExecution(); DelayExecution();
continue; continue;
} }
Object = Entry->KernelData;
} }
Object = Entry->KernelData;
} }
else else
{ {