Exclusively lock surface bits before reading or writing them Modified: trunk/reactos/include/win32k/bitmaps.h Modified: trunk/reactos/subsys/win32k/eng/bitblt.c Modified: trunk/reactos/subsys/win32k/eng/copybits.c Modified: trunk/reactos/subsys/win32k/eng/gradient.c Modified: trunk/reactos/subsys/win32k/eng/lineto.c Modified: trunk/reactos/subsys/win32k/eng/mouse.c Modified: trunk/reactos/subsys/win32k/eng/paint.c Modified: trunk/reactos/subsys/win32k/eng/surface.c Modified: trunk/reactos/subsys/win32k/eng/transblt.c Modified: trunk/reactos/subsys/win32k/include/inteng.h Modified: trunk/reactos/subsys/win32k/include/tags.h Modified: trunk/reactos/subsys/win32k/ntuser/cursoricon.c Modified: trunk/reactos/subsys/win32k/ntuser/input.c Modified: trunk/reactos/subsys/win32k/objects/bitmaps.c Modified: trunk/reactos/subsys/win32k/objects/brush.c Modified: trunk/reactos/subsys/win32k/objects/fillshap.c Modified: trunk/reactos/subsys/win32k/objects/line.c Modified: trunk/reactos/subsys/win32k/objects/polyfill.c Modified: trunk/reactos/subsys/win32k/objects/region.c Modified: trunk/reactos/subsys/win32k/objects/text.c _____
Modified: trunk/reactos/include/win32k/bitmaps.h --- trunk/reactos/include/win32k/bitmaps.h 2005-06-20 07:18:20 UTC (rev 16142) +++ trunk/reactos/include/win32k/bitmaps.h 2005-06-20 08:31:48 UTC (rev 16143) @@ -11,10 +11,12 @@
SURFOBJ SurfObj; FLONG flHooks; FLONG flFlags; - SIZE dimension; /* For SetBitmapDimension(), do NOT use - to get width/height of bitmap, use - bitmap.bmWidth/bitmap.bmHeight for - that */ + SIZE dimension; /* For SetBitmapDimension(), do NOT use + to get width/height of bitmap, use + bitmap.bmWidth/bitmap.bmHeight for + that */ + PFAST_MUTEX BitsLock; /* You need to hold this lock before you touch + the actual bits in the bitmap */
/* For device-independent bitmaps: */ DIBSECTION *dib; @@ -34,6 +36,11 @@ #define BITMAPOBJ_UnlockBitmap(pBMObj) EngUnlockSurface(&pBMObj->SurfObj) BOOL INTERNAL_CALL BITMAP_Cleanup(PVOID ObjectBody);
+BOOL INTERNAL_CALL BITMAPOBJ_InitBitsLock(BITMAPOBJ *pBMObj); +#define BITMAPOBJ_LockBitmapBits(pBMObj) ExAcquireFastMutex((pBMObj)->BitsLock) +#define BITMAPOBJ_UnlockBitmapBits(pBMObj) ExReleaseFastMutex((pBMObj)->BitsLock) +void INTERNAL_CALL BITMAPOBJ_CleanupBitsLock(BITMAPOBJ *pBMObj); + INT FASTCALL BITMAPOBJ_GetWidthBytes (INT bmWidth, INT bpp); HBITMAP FASTCALL BITMAPOBJ_CopyBitmap (HBITMAP hBitmap); INT FASTCALL DIB_GetDIBWidthBytes (INT width, INT depth); _____
Modified: trunk/reactos/subsys/win32k/eng/bitblt.c --- trunk/reactos/subsys/win32k/eng/bitblt.c 2005-06-20 07:18:20 UTC (rev 16142) +++ trunk/reactos/subsys/win32k/eng/bitblt.c 2005-06-20 08:31:48 UTC (rev 16143) @@ -526,30 +526,30 @@
}
BOOL STDCALL -IntEngBitBlt(BITMAPOBJ *DestObj, - BITMAPOBJ *SourceObj, - BITMAPOBJ *MaskObj, - CLIPOBJ *ClipRegion, - XLATEOBJ *ColorTranslation, - RECTL *DestRect, - POINTL *SourcePoint, - POINTL *MaskOrigin, - BRUSHOBJ *Brush, - POINTL *BrushOrigin, - ROP4 Rop4) +IntEngBitBltEx(SURFOBJ *DestSurf, + SURFOBJ *SourceSurf, + SURFOBJ *MaskSurf, + CLIPOBJ *ClipRegion, + XLATEOBJ *ColorTranslation, + RECTL *DestRect, + POINTL *SourcePoint, + POINTL *MaskOrigin, + BRUSHOBJ *Brush, + POINTL *BrushOrigin, + ROP4 Rop4, + BOOL RemoveMouse) { BOOLEAN ret; RECTL InputClippedRect; RECTL OutputRect; POINTL InputPoint; BOOLEAN UsesSource; - SURFOBJ *DestSurf; - SURFOBJ *SourceSurf = SourceObj ? &SourceObj->SurfObj : NULL; - SURFOBJ *MaskSurf = MaskObj ? &MaskObj->SurfObj : NULL; + BITMAPOBJ *DestObj; + BITMAPOBJ *SourceObj = NULL;
+ ASSERT(DestSurf); + DestObj = CONTAINING_RECORD(DestSurf, BITMAPOBJ, SurfObj); ASSERT(DestObj); - DestSurf = &DestObj->SurfObj; - ASSERT(DestSurf);
InputClippedRect = *DestRect; if (InputClippedRect.right < InputClippedRect.left) @@ -623,17 +623,27 @@ OutputRect = InputClippedRect; }
- if (UsesSource) + if (RemoveMouse) { - MouseSafetyOnDrawStart(SourceSurf, InputPoint.x, InputPoint.y, - (InputPoint.x + abs(DestRect->right - DestRect->left)), - (InputPoint.y + abs(DestRect->bottom - DestRect->top))); + BITMAPOBJ_LockBitmapBits(DestObj); + + if (UsesSource) + { + if (SourceSurf != DestSurf) + { + SourceObj = CONTAINING_RECORD(SourceSurf, BITMAPOBJ, SurfObj); + BITMAPOBJ_LockBitmapBits(SourceObj); + } + MouseSafetyOnDrawStart(SourceSurf, InputPoint.x, InputPoint.y, + (InputPoint.x + abs(DestRect->right - DestRect->left)), + (InputPoint.y + abs(DestRect->bottom - DestRect->top))); + } + MouseSafetyOnDrawStart(DestSurf, OutputRect.left, OutputRect.top, + OutputRect.right, OutputRect.bottom); }
/* No success yet */ ret = FALSE; - MouseSafetyOnDrawStart(DestSurf, OutputRect.left, OutputRect.top, - OutputRect.right, OutputRect.bottom);
/* Call the driver's DrvBitBlt if available */ if (DestObj->flHooks & HOOK_BITBLT) @@ -651,10 +661,19 @@ Rop4); }
- MouseSafetyOnDrawEnd(DestSurf); - if (UsesSource) + if (RemoveMouse) { - MouseSafetyOnDrawEnd(SourceSurf); + MouseSafetyOnDrawEnd(DestSurf); + if (UsesSource) + { + MouseSafetyOnDrawEnd(SourceSurf); + if (SourceSurf != DestSurf) + { + BITMAPOBJ_UnlockBitmapBits(SourceObj); + } + } + + BITMAPOBJ_UnlockBitmapBits(DestObj); }
return ret; @@ -786,9 +805,9 @@ }
BOOL STDCALL -IntEngStretchBlt(BITMAPOBJ *DestObj, - BITMAPOBJ *SourceObj, - BITMAPOBJ *MaskObj, +IntEngStretchBlt(SURFOBJ *DestSurf, + SURFOBJ *SourceSurf, + SURFOBJ *MaskSurf, CLIPOBJ *ClipRegion, XLATEOBJ *ColorTranslation, RECTL *DestRect, @@ -801,32 +820,37 @@ BOOLEAN ret; COLORADJUSTMENT ca; POINT MaskOrigin; - SURFOBJ *DestSurf; - SURFOBJ *SourceSurf = SourceObj ? &SourceObj->SurfObj : NULL; - SURFOBJ *MaskSurf = MaskObj ? &MaskObj->SurfObj : NULL; + BITMAPOBJ *DestObj; + BITMAPOBJ *SourceObj = NULL;
+ ASSERT(DestSurf); + DestObj = CONTAINING_RECORD(DestSurf, BITMAPOBJ, SurfObj); ASSERT(DestObj); - DestSurf = &DestObj->SurfObj; - ASSERT(DestSurf);
if (pMaskOrigin != NULL) { MaskOrigin.x = pMaskOrigin->x; MaskOrigin.y = pMaskOrigin->y; }
+ /* No success yet */ + ret = FALSE; + ASSERT(DestRect); + BITMAPOBJ_LockBitmapBits(DestObj); + MouseSafetyOnDrawStart(DestSurf, DestRect->left, DestRect->top, + DestRect->right, DestRect->bottom); + if (NULL != SourceSurf) { + SourceObj = CONTAINING_RECORD(SourceSurf, BITMAPOBJ, SurfObj); ASSERT(SourceRect); + if (SourceSurf != DestSurf) + { + BITMAPOBJ_LockBitmapBits(SourceObj); + } MouseSafetyOnDrawStart(SourceSurf, SourceRect->left, SourceRect->top, SourceRect->right, SourceRect->bottom); }
- /* No success yet */ - ret = FALSE; - ASSERT(DestRect); - MouseSafetyOnDrawStart(DestSurf, DestRect->left, DestRect->top, - DestRect->right, DestRect->bottom); - /* Prepare color adjustment */
/* Call the driver's DrvStretchBlt if available */ @@ -847,11 +871,16 @@ &ca, BrushOrigin, DestRect, SourceRect, NULL, Mode); }
- MouseSafetyOnDrawEnd(DestSurf); if (NULL != SourceSurf) { MouseSafetyOnDrawEnd(SourceSurf); + if (SourceSurf != DestSurf) + { + BITMAPOBJ_UnlockBitmapBits(SourceObj); + } } + MouseSafetyOnDrawEnd(DestSurf); + BITMAPOBJ_UnlockBitmapBits(DestObj);
return ret; } @@ -1147,7 +1176,7 @@ }
BOOL STDCALL -IntEngMaskBlt(SURFOBJ *DestObj, +IntEngMaskBlt(SURFOBJ *DestSurf, SURFOBJ *Mask, CLIPOBJ *ClipRegion, XLATEOBJ *DestColorTranslation, @@ -1161,6 +1190,7 @@ BOOLEAN ret; RECTL OutputRect; POINTL InputPoint; + BITMAPOBJ *DestObj;
ASSERT(Mask);
@@ -1187,26 +1217,30 @@
/* No success yet */ ret = FALSE; - ASSERT(DestObj); - MouseSafetyOnDrawStart(DestObj, OutputRect.left, OutputRect.top, + ASSERT(DestSurf); + DestObj = CONTAINING_RECORD(DestSurf, BITMAPOBJ, SurfObj); + + BITMAPOBJ_LockBitmapBits(DestObj); + MouseSafetyOnDrawStart(DestSurf, OutputRect.left, OutputRect.top, OutputRect.right, OutputRect.bottom);
/* Dummy BitBlt to let driver know that it should flush its changes. This should really be done using a call to DrvSynchronizeSurface, but the VMware driver doesn't hook that call. */ - /* FIXME: Remove the typecast! */ - IntEngBitBlt((BITMAPOBJ*)DestObj, NULL, (BITMAPOBJ*)Mask, ClipRegion, DestColorTranslation, - DestRect, SourcePoint, MaskOrigin, Brush, BrushOrigin, R4_NOOP); + IntEngBitBltEx(DestSurf, NULL, Mask, ClipRegion, DestColorTranslation, + DestRect, SourcePoint, MaskOrigin, Brush, BrushOrigin, + R4_NOOP, FALSE);
- ret = EngMaskBitBlt(DestObj, Mask, ClipRegion, DestColorTranslation, SourceColorTranslation, + ret = EngMaskBitBlt(DestSurf, Mask, ClipRegion, DestColorTranslation, SourceColorTranslation, &OutputRect, &InputPoint, MaskOrigin, Brush, BrushOrigin);
/* Dummy BitBlt to let driver know that something has changed. */ - /* FIXME: Remove the typecast! */ - IntEngBitBlt((BITMAPOBJ*)DestObj, NULL, (BITMAPOBJ*)Mask, ClipRegion, DestColorTranslation, - DestRect, SourcePoint, MaskOrigin, Brush, BrushOrigin, R4_NOOP); + IntEngBitBltEx(DestSurf, NULL, Mask, ClipRegion, DestColorTranslation, + DestRect, SourcePoint, MaskOrigin, Brush, BrushOrigin, + R4_NOOP, FALSE);
- MouseSafetyOnDrawEnd(DestObj); + MouseSafetyOnDrawEnd(DestSurf); + BITMAPOBJ_UnlockBitmapBits(DestObj);
return ret; } _____
Modified: trunk/reactos/subsys/win32k/eng/copybits.c --- trunk/reactos/subsys/win32k/eng/copybits.c 2005-06-20 07:18:20 UTC (rev 16142) +++ trunk/reactos/subsys/win32k/eng/copybits.c 2005-06-20 08:31:48 UTC (rev 16143) @@ -16,8 +16,7 @@
* along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id$ - * +/* * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel * PURPOSE: GDI EngCopyBits Function @@ -44,12 +43,21 @@ RECT_ENUM RectEnum; BOOL EnumMore; BLTINFO BltInfo; + BITMAPOBJ *DestObj = NULL; + BITMAPOBJ *SourceObj;
ASSERT(Dest != NULL && Source != NULL && DestRect != NULL && SourcePoint != NULL);
+ SourceObj = CONTAINING_RECORD(Source, BITMAPOBJ, SurfObj); + BITMAPOBJ_LockBitmapBits(SourceObj); MouseSafetyOnDrawStart(Source, SourcePoint->x, SourcePoint->y, (SourcePoint->x + abs(DestRect->right - DestRect->left)), (SourcePoint->y + abs(DestRect->bottom - DestRect->top))); + if (Dest != Source) + { + DestObj = CONTAINING_RECORD(Dest, BITMAPOBJ, SurfObj); + BITMAPOBJ_LockBitmapBits(DestObj); + } MouseSafetyOnDrawStart(Dest, DestRect->left, DestRect->top, DestRect->right, DestRect->bottom);
// FIXME: Don't punt to the driver's DrvCopyBits immediately. Instead, @@ -71,7 +79,12 @@ Dest, Source, Clip, ColorTranslation, DestRect, SourcePoint);
MouseSafetyOnDrawEnd(Dest); + if (Dest != Source) + { + BITMAPOBJ_UnlockBitmapBits(DestObj); + } MouseSafetyOnDrawEnd(Source); + BITMAPOBJ_UnlockBitmapBits(SourceObj);
return ret; } @@ -88,20 +101,29 @@ Dest, Source, Clip, ColorTranslation, DestRect, SourcePoint);
MouseSafetyOnDrawEnd(Dest); + if (Dest != Source) + { + BITMAPOBJ_UnlockBitmapBits(DestObj); + } MouseSafetyOnDrawEnd(Source); + BITMAPOBJ_UnlockBitmapBits(SourceObj);
return ret; } }
// If CopyBits wasn't hooked, BitBlt must be - /* FIXME: Remove the typecast! */ - ret = IntEngBitBlt((BITMAPOBJ*)Dest, (BITMAPOBJ*)Source, + ret = IntEngBitBlt(Dest, Source, NULL, Clip, ColorTranslation, DestRect, SourcePoint, NULL, NULL, NULL, ROP3_TO_ROP4(SRCCOPY));
MouseSafetyOnDrawEnd(Dest); + if (Dest != Source) + { + BITMAPOBJ_UnlockBitmapBits(DestObj); + } MouseSafetyOnDrawEnd(Source); + BITMAPOBJ_UnlockBitmapBits(SourceObj);
return ret; } @@ -130,7 +152,12 @@
DibFunctionsForBitmapFormat[Dest->iBitmapFormat].DIB_BitBltSrcCopy(&BltI nfo);
MouseSafetyOnDrawEnd(Dest); + if (Dest != Source) + { + BITMAPOBJ_UnlockBitmapBits(DestObj); + } MouseSafetyOnDrawEnd(Source); + BITMAPOBJ_UnlockBitmapBits(SourceObj);
return(TRUE);
@@ -144,7 +171,12 @@
DibFunctionsForBitmapFormat[Dest->iBitmapFormat].DIB_BitBltSrcCopy(&BltI nfo);
MouseSafetyOnDrawEnd(Dest); + if (Dest != Source) + { + BITMAPOBJ_UnlockBitmapBits(DestObj); + } MouseSafetyOnDrawEnd(Source); + BITMAPOBJ_UnlockBitmapBits(SourceObj);
return(TRUE);
@@ -177,13 +209,23 @@ } while(EnumMore);
MouseSafetyOnDrawEnd(Dest); + if (Dest != Source) + { + BITMAPOBJ_UnlockBitmapBits(DestObj); + } MouseSafetyOnDrawEnd(Source); + BITMAPOBJ_UnlockBitmapBits(SourceObj);
return(TRUE); }
MouseSafetyOnDrawEnd(Dest); + if (Dest != Source) + { + BITMAPOBJ_UnlockBitmapBits(DestObj); + } MouseSafetyOnDrawEnd(Source); + BITMAPOBJ_UnlockBitmapBits(SourceObj);
return FALSE; } _____
Modified: trunk/reactos/subsys/win32k/eng/gradient.c --- trunk/reactos/subsys/win32k/eng/gradient.c 2005-06-20 07:18:20 UTC (rev 16142) +++ trunk/reactos/subsys/win32k/eng/gradient.c 2005-06-20 08:31:48 UTC (rev 16143) @@ -516,7 +516,7 @@
BOOL STDCALL IntEngGradientFill( - IN BITMAPOBJ *pboDest, + IN SURFOBJ *psoDest, IN CLIPOBJ *pco, IN XLATEOBJ *pxlo, IN TRIVERTEX *pVertex, @@ -528,13 +528,14 @@ IN ULONG ulMode) { BOOL Ret; - SURFOBJ *psoDest; - ASSERT(pboDest); + BITMAPOBJ *pboDest; + ASSERT(psoDest); ASSERT(pco);
- psoDest = &pboDest->SurfObj; - ASSERT(psoDest); + pboDest = CONTAINING_RECORD(psoDest, BITMAPOBJ, SurfObj); + ASSERT(pboDest);
+ BITMAPOBJ_LockBitmapBits(pboDest); MouseSafetyOnDrawStart( psoDest, pco->rclBounds.left, @@ -552,5 +553,7 @@ Ret = EngGradientFill(psoDest, pco, pxlo, pVertex, nVertex, pMesh, nMesh, prclExtents, pptlDitherOrg, ulMode); MouseSafetyOnDrawEnd(psoDest); + BITMAPOBJ_UnlockBitmapBits(pboDest); + return Ret; } _____
Modified: trunk/reactos/subsys/win32k/eng/lineto.c --- trunk/reactos/subsys/win32k/eng/lineto.c 2005-06-20 07:18:20 UTC (rev 16142) +++ trunk/reactos/subsys/win32k/eng/lineto.c 2005-06-20 08:31:48 UTC (rev 16143) @@ -485,7 +485,7 @@
}
BOOL STDCALL -IntEngLineTo(BITMAPOBJ *DestObj, +IntEngLineTo(SURFOBJ *DestSurf, CLIPOBJ *ClipObj, BRUSHOBJ *Brush, LONG x1, @@ -496,13 +496,13 @@ MIX Mix) { BOOLEAN ret; - SURFOBJ *DestSurf; + BITMAPOBJ *DestObj; PGDIBRUSHINST GdiBrush; RECTL b;
+ ASSERT(DestSurf); + DestObj = CONTAINING_RECORD(DestSurf, BITMAPOBJ, SurfObj); ASSERT(DestObj); - DestSurf = &DestObj->SurfObj; - ASSERT(DestSurf);
GdiBrush = CONTAINING_RECORD( Brush, @@ -543,6 +543,8 @@ b.bottom = max(y1, y2); if (b.left == b.right) b.right++; if (b.top == b.bottom) b.bottom++; + + BITMAPOBJ_LockBitmapBits(DestObj); MouseSafetyOnDrawStart(DestSurf, x1, y1, x2, y2);
if (DestObj->flHooks & HOOK_LINETO) @@ -565,12 +567,13 @@ }
MouseSafetyOnDrawEnd(DestSurf); + BITMAPOBJ_UnlockBitmapBits(DestObj);
return ret; }
BOOL STDCALL -IntEngPolyline(BITMAPOBJ *DestObj, +IntEngPolyline(SURFOBJ *DestSurf, CLIPOBJ *Clip, BRUSHOBJ *Brush, CONST LPPOINT pt, @@ -588,7 +591,7 @@ rect.top = min(pt[i-1].y, pt[i].y); rect.right = max(pt[i-1].x, pt[i].x); rect.bottom = max(pt[i-1].y, pt[i].y); - ret = IntEngLineTo(DestObj, + ret = IntEngLineTo(DestSurf, Clip, Brush, pt[i-1].x, _____
Modified: trunk/reactos/subsys/win32k/eng/mouse.c --- trunk/reactos/subsys/win32k/eng/mouse.c 2005-06-20 07:18:20 UTC (rev 16142) +++ trunk/reactos/subsys/win32k/eng/mouse.c 2005-06-20 08:31:48 UTC (rev 16143) @@ -177,8 +177,9 @@
{ if((MaskSurface = EngLockSurface(pgp->MaskSurface))) { - EngBitBlt(DestSurface, SaveSurface, MaskSurface, NULL, NULL, - &DestRect, &SrcPoint, &SrcPoint, NULL, NULL, ROP3_TO_ROP4(SRCCOPY)); + IntEngBitBltEx(DestSurface, SaveSurface, MaskSurface, NULL, NULL, + &DestRect, &SrcPoint, &SrcPoint, NULL, NULL, + ROP3_TO_ROP4(SRCCOPY), FALSE); EngUnlockSurface(MaskSurface); } EngUnlockSurface(SaveSurface); @@ -230,8 +231,9 @@ pgp->Size.cy, DestSurface->sizlBitmap.cy - pt.y);
- EngBitBlt(SaveSurface, DestSurface, NULL, NULL, NULL, - &DestRect, &SrcPoint, NULL, NULL, NULL, ROP3_TO_ROP4(SRCCOPY)); + IntEngBitBltEx(SaveSurface, DestSurface, NULL, NULL, NULL, + &DestRect, &SrcPoint, NULL, NULL, NULL, + ROP3_TO_ROP4(SRCCOPY), FALSE); EngUnlockSurface(SaveSurface); }
@@ -266,18 +268,21 @@ { if((ColorSurf = EngLockSurface(pgp->ColorSurface))) { - EngBitBlt(DestSurface, ColorSurf, MaskSurf, NULL, pgp->XlateObject, - &DestRect, &SrcPoint, &SrcPoint, NULL, NULL, R4_MASK); + IntEngBitBltEx(DestSurface, ColorSurf, MaskSurf, NULL, + pgp->XlateObject, &DestRect, &SrcPoint, &SrcPoint, + NULL, NULL, R4_MASK, FALSE); EngUnlockSurface(ColorSurf); } } else { - EngBitBlt(DestSurface, MaskSurf, NULL, NULL, pgp->XlateObject, - &DestRect, &SrcPoint, NULL, NULL, NULL, ROP3_TO_ROP4(SRCAND)); + IntEngBitBltEx(DestSurface, MaskSurf, NULL, NULL, pgp->XlateObject, + &DestRect, &SrcPoint, NULL, NULL, NULL, + ROP3_TO_ROP4(SRCAND), FALSE); SrcPoint.y += pgp->Size.cy; - EngBitBlt(DestSurface, MaskSurf, NULL, NULL, pgp->XlateObject, - &DestRect, &SrcPoint, NULL, NULL, NULL, ROP3_TO_ROP4(SRCINVERT)); + IntEngBitBltEx(DestSurface, MaskSurf, NULL, NULL, pgp->XlateObject, + &DestRect, &SrcPoint, NULL, NULL, NULL, + ROP3_TO_ROP4(SRCINVERT), FALSE); } EngUnlockSurface(MaskSurf); } @@ -523,4 +528,25 @@
}
+VOID STDCALL +IntEngMovePointer( + IN SURFOBJ *SurfObj, + IN LONG x, + IN LONG y, + IN RECTL *prcl) +{ + BITMAPOBJ *BitmapObj = CONTAINING_RECORD(SurfObj, BITMAPOBJ, SurfObj); + + BITMAPOBJ_LockBitmapBits(BitmapObj); + if (GDIDEV(SurfObj)->Pointer.MovePointer) + { + GDIDEV(SurfObj)->Pointer.MovePointer(SurfObj, x, y, prcl); + } + else + { + EngMovePointer(SurfObj, x, y, prcl); + } + BITMAPOBJ_UnlockBitmapBits(BitmapObj); +} + /* EOF */ _____
Modified: trunk/reactos/subsys/win32k/eng/paint.c --- trunk/reactos/subsys/win32k/eng/paint.c 2005-06-20 07:18:20 UTC (rev 16142) +++ trunk/reactos/subsys/win32k/eng/paint.c 2005-06-20 08:31:48 UTC (rev 16143) @@ -33,9 +33,12 @@
{ LONG y; ULONG LineWidth; + BITMAPOBJ *BitmapObj;
ASSERT ( Surface ); ASSERT ( pRect ); + BitmapObj = CONTAINING_RECORD(Surface, BITMAPOBJ, SurfObj); + BITMAPOBJ_LockBitmapBits(BitmapObj); MouseSafetyOnDrawStart(Surface, pRect->left, pRect->top, pRect->right, pRect->bottom); LineWidth = pRect->right - pRect->left; DPRINT(" LineWidth: %d, top: %d, bottom: %d\n", LineWidth, pRect->top, pRect->bottom); @@ -45,6 +48,7 @@ Surface, pRect->left, pRect->right, y, iColor); } MouseSafetyOnDrawEnd(Surface); + BITMAPOBJ_UnlockBitmapBits(BitmapObj);
return TRUE; } @@ -111,13 +115,13 @@ }
BOOL STDCALL -IntEngPaint(IN BITMAPOBJ *BitmapObj, +IntEngPaint(IN SURFOBJ *Surface, IN CLIPOBJ *ClipRegion, IN BRUSHOBJ *Brush, IN POINTL *BrushOrigin, IN MIX Mix) { - SURFOBJ *Surface = &BitmapObj->SurfObj; + BITMAPOBJ *BitmapObj = CONTAINING_RECORD(Surface, BITMAPOBJ, SurfObj); BOOL ret;
DPRINT("SurfGDI type: %d\n", Surface->iType); @@ -125,6 +129,7 @@ if((Surface->iType!=STYPE_BITMAP) && (BitmapObj->flHooks & HOOK_PAINT)) { // Call the driver's DrvPaint + BITMAPOBJ_LockBitmapBits(BitmapObj); MouseSafetyOnDrawStart(Surface, ClipRegion->rclBounds.left, ClipRegion->rclBounds.top, ClipRegion->rclBounds.right,
ClipRegion->rclBounds.bottom); @@ -132,6 +137,7 @@ ret = GDIDEVFUNCS(Surface).Paint( Surface, ClipRegion, Brush, BrushOrigin, Mix); MouseSafetyOnDrawEnd(Surface); + BITMAPOBJ_UnlockBitmapBits(BitmapObj); return ret; } return EngPaint( Surface, ClipRegion, Brush, BrushOrigin, Mix ); _____
Modified: trunk/reactos/subsys/win32k/eng/surface.c --- trunk/reactos/subsys/win32k/eng/surface.c 2005-06-20 07:18:20 UTC (rev 16142) +++ trunk/reactos/subsys/win32k/eng/surface.c 2005-06-20 08:31:48 UTC (rev 16143) @@ -79,6 +79,33 @@
} }
+BOOL INTERNAL_CALL +BITMAPOBJ_InitBitsLock(BITMAPOBJ *BitmapObj) +{ + BitmapObj->BitsLock = ExAllocatePoolWithTag(NonPagedPool, + sizeof(FAST_MUTEX), + TAG_BITMAPOBJ); + if (NULL == BitmapObj->BitsLock) + { + return FALSE; + } + + ExInitializeFastMutex(BitmapObj->BitsLock); + + return TRUE; +} + +void INTERNAL_CALL +BITMAPOBJ_CleanupBitsLock(BITMAPOBJ *BitmapObj) +{ + if (NULL != BitmapObj->BitsLock) + { + ExFreePoolWithTag(BitmapObj->BitsLock, TAG_BITMAPOBJ); + BitmapObj->BitsLock = NULL; + } +} + + /* * @implemented */ @@ -232,6 +259,12 @@ return 0;
BitmapObj = BITMAPOBJ_LockBitmap(NewBitmap); + if (! BITMAPOBJ_InitBitsLock(BitmapObj)) + { + BITMAPOBJ_UnlockBitmap(BitmapObj); + BITMAPOBJ_FreeBitmap(NewBitmap); + return 0; + } SurfObj = &BitmapObj->SurfObj;
if (Format == BMF_4RLE) @@ -357,11 +390,17 @@ if (NewSurface == NULL) return 0;
- GDIOBJ_SetOwnership(NewSurface, NULL); - BitmapObj = BITMAPOBJ_LockBitmap(NewSurface); + if (! BITMAPOBJ_InitBitsLock(BitmapObj)) + { + BITMAPOBJ_UnlockBitmap(BitmapObj); + BITMAPOBJ_FreeBitmap(NewSurface); + return 0; + } SurfObj = &BitmapObj->SurfObj;
+ GDIOBJ_SetOwnership(NewSurface, NULL); + SurfObj->dhsurf = dhsurf; SurfObj->hsurf = NewSurface; SurfObj->sizlBitmap = Size; _____
Modified: trunk/reactos/subsys/win32k/eng/transblt.c --- trunk/reactos/subsys/win32k/eng/transblt.c 2005-06-20 07:18:20 UTC (rev 16142) +++ trunk/reactos/subsys/win32k/eng/transblt.c 2005-06-20 08:31:48 UTC (rev 16143) @@ -193,8 +193,8 @@
}
BOOL FASTCALL -IntEngTransparentBlt(BITMAPOBJ *DestObj, - BITMAPOBJ *SourceObj, +IntEngTransparentBlt(SURFOBJ *DestSurf, + SURFOBJ *SourceSurf, CLIPOBJ *Clip, XLATEOBJ *ColorTranslation, PRECTL DestRect, @@ -204,18 +204,18 @@ { BOOL Ret; RECTL OutputRect, InputClippedRect; - SURFOBJ *DestSurf; - SURFOBJ *SourceSurf; + BITMAPOBJ *DestObj; + BITMAPOBJ *SourceObj;
- ASSERT(DestObj); - ASSERT(SourceObj); + ASSERT(DestSurf); + ASSERT(SourceSurf); ASSERT(DestRect);
- DestSurf = &DestObj->SurfObj; - SourceSurf = &SourceObj->SurfObj; + DestObj = CONTAINING_RECORD(DestSurf, BITMAPOBJ, SurfObj); + SourceObj = CONTAINING_RECORD(SourceSurf, BITMAPOBJ, SurfObj);
- ASSERT(DestSurf); - ASSERT(SourceSurf); + ASSERT(DestObj); + ASSERT(SourceObj);
InputClippedRect = *DestRect; if(InputClippedRect.right < InputClippedRect.left) @@ -249,9 +249,11 @@
if(SourceSurf != DestSurf) { + BITMAPOBJ_LockBitmapBits(SourceObj); MouseSafetyOnDrawStart(SourceSurf, SourceRect->left, SourceRect->top, SourceRect->right, SourceRect->bottom); } + BITMAPOBJ_LockBitmapBits(DestObj); MouseSafetyOnDrawStart(DestSurf, OutputRect.left, OutputRect.top, OutputRect.right, OutputRect.bottom);
@@ -271,9 +273,11 @@ }
MouseSafetyOnDrawEnd(DestSurf); + BITMAPOBJ_UnlockBitmapBits(DestObj); if(SourceSurf != DestSurf) { MouseSafetyOnDrawEnd(SourceSurf); + BITMAPOBJ_UnlockBitmapBits(SourceObj); }
return Ret; _____
Modified: trunk/reactos/subsys/win32k/include/inteng.h --- trunk/reactos/subsys/win32k/include/inteng.h 2005-06-20 07:18:20 UTC (rev 16142) +++ trunk/reactos/subsys/win32k/include/inteng.h 2005-06-20 08:31:48 UTC (rev 16143) @@ -43,7 +43,7 @@
PW32PROCESS Win32Process);
BOOL STDCALL -IntEngLineTo(BITMAPOBJ *Surface, +IntEngLineTo(SURFOBJ *Surface, CLIPOBJ *Clip, BRUSHOBJ *Brush, LONG x1, @@ -54,22 +54,29 @@ MIX mix);
BOOL STDCALL -IntEngBitBlt(BITMAPOBJ *DestObj, - BITMAPOBJ *SourceObj, - BITMAPOBJ *Mask, - CLIPOBJ *ClipRegion, - XLATEOBJ *ColorTranslation, - RECTL *DestRect, - POINTL *SourcePoint, - POINTL *MaskOrigin, - BRUSHOBJ *Brush, - POINTL *BrushOrigin, - ROP4 rop4); +IntEngBitBltEx(SURFOBJ *DestObj, + SURFOBJ *SourceObj, + SURFOBJ *Mask, + CLIPOBJ *ClipRegion, + XLATEOBJ *ColorTranslation, + RECTL *DestRect, + POINTL *SourcePoint, + POINTL *MaskOrigin, + BRUSHOBJ *Brush, + POINTL *BrushOrigin, + ROP4 Rop4, + BOOL RemoveMouse); +#define IntEngBitBlt(DestObj, SourceObj, Mask, ClipRegion, ColorTranslation, \ + DestRect, SourcePoint, MaskOrigin, Brush, BrushOrigin, \ + Rop4) \ + IntEngBitBltEx((DestObj), (SourceObj), (Mask), (ClipRegion), \ + (ColorTranslation), (DestRect), (SourcePoint), \ + (MaskOrigin), (Brush), (BrushOrigin), (Rop4), TRUE)
BOOL STDCALL -IntEngStretchBlt(BITMAPOBJ *DestObj, - BITMAPOBJ *SourceObj, - BITMAPOBJ *Mask, +IntEngStretchBlt(SURFOBJ *DestObj, + SURFOBJ *SourceObj, + SURFOBJ *Mask, CLIPOBJ *ClipRegion, XLATEOBJ *ColorTranslation, RECTL *DestRect, @@ -80,7 +87,7 @@ ULONG Mode);
BOOL STDCALL -IntEngGradientFill(BITMAPOBJ *psoDest, +IntEngGradientFill(SURFOBJ *psoDest, CLIPOBJ *pco, XLATEOBJ *pxlo, TRIVERTEX *pVertex, @@ -109,7 +116,7 @@ ULONG BackgroundColor);
BOOL STDCALL -IntEngPolyline(BITMAPOBJ *DestSurf, +IntEngPolyline(SURFOBJ *DestSurf, CLIPOBJ *Clip, BRUSHOBJ *Brush, CONST LPPOINT pt, @@ -131,8 +138,8 @@ PRECTL Boundary);
BOOL FASTCALL -IntEngTransparentBlt(BITMAPOBJ *Dest, - BITMAPOBJ *Source, +IntEngTransparentBlt(SURFOBJ *Dest, + SURFOBJ *Source, CLIPOBJ *Clip, XLATEOBJ *ColorTranslation, PRECTL DestRect, @@ -141,10 +148,17 @@ ULONG Reserved);
BOOL STDCALL -IntEngPaint(IN BITMAPOBJ *Surface, +IntEngPaint(IN SURFOBJ *Surface, IN CLIPOBJ *ClipRegion, IN BRUSHOBJ *Brush, IN POINTL *BrushOrigin, IN MIX Mix);
+VOID STDCALL +IntEngMovePointer(IN SURFOBJ *pso, + IN LONG x, + IN LONG y, + IN RECTL *prcl); + + #endif /* _WIN32K_INTENG_H */ _____
Modified: trunk/reactos/subsys/win32k/include/tags.h --- trunk/reactos/subsys/win32k/include/tags.h 2005-06-20 07:18:20 UTC (rev 16142) +++ trunk/reactos/subsys/win32k/include/tags.h 2005-06-20 08:31:48 UTC (rev 16143) @@ -51,6 +51,7 @@
#define TAG_FONTOBJ TAG('F', 'N', 'T', 'O') /* font object */ #define TAG_WNDOBJ TAG('W', 'N', 'D', 'O') /* window object */ #define TAG_XLATEOBJ TAG('X', 'L', 'A', 'O') /* xlate object */ +#define TAG_BITMAPOBJ TAG('B', 'M', 'P', 'O') /* bitmap object */
/* misc */ #define TAG_DRIVER TAG('G', 'D', 'R', 'V') /* video drivers */ _____
Modified: trunk/reactos/subsys/win32k/ntuser/cursoricon.c --- trunk/reactos/subsys/win32k/ntuser/cursoricon.c 2005-06-20 07:18:20 UTC (rev 16142) +++ trunk/reactos/subsys/win32k/ntuser/cursoricon.c 2005-06-20 08:31:48 UTC (rev 16143) @@ -142,10 +142,7 @@
if (NULL != CurInfo->CurrentCursorObject && CurInfo->ShowingCursor) { /* Remove the cursor if it was displayed */ - if (GDIDEV(SurfObj)->Pointer.MovePointer) - GDIDEV(SurfObj)->Pointer.MovePointer(SurfObj, -1, -1, &GDIDEV(SurfObj)->Pointer.Exclude); - else - EngMovePointer(SurfObj, -1, -1, &GDIDEV(SurfObj)->Pointer.Exclude); + IntEngMovePointer(SurfObj, -1, -1, &GDIDEV(SurfObj)->Pointer.Exclude); }
GDIDEV(SurfObj)->Pointer.Status = SPS_ACCEPT_NOEXCLUDE; @@ -266,7 +263,7 @@ GDIDEV(SurfObj)->Pointer.Pos.y, &(GDIDEV(SurfObj)->Pointer.Exclude), SPS_CHANGE); - GDIDEV(SurfObj)->Pointer.MovePointer = EngMovePointer; + GDIDEV(SurfObj)->Pointer.MovePointer = NULL; } else { _____
Modified: trunk/reactos/subsys/win32k/ntuser/input.c --- trunk/reactos/subsys/win32k/ntuser/input.c 2005-06-20 07:18:20 UTC (rev 16142) +++ trunk/reactos/subsys/win32k/ntuser/input.c 2005-06-20 08:31:48 UTC (rev 16143) @@ -959,12 +959,7 @@
{ SurfObj = &BitmapObj->SurfObj;
- if (GDIDEV(SurfObj)->Pointer.MovePointer) - { - GDIDEV(SurfObj)->Pointer.MovePointer(SurfObj, MousePos.x, MousePos.y, &(GDIDEV(SurfObj)->Pointer.Exclude)); - } else { - EngMovePointer(SurfObj, MousePos.x, MousePos.y, &(GDIDEV(SurfObj)->Pointer.Exclude)); - } + IntEngMovePointer(SurfObj, MousePos.x, MousePos.y, &(GDIDEV(SurfObj)->Pointer.Exclude)); /* Only now, update the info in the GDIDEVICE, so EngMovePointer can * use the old values to move the pointer image */ GDIDEV(SurfObj)->Pointer.Pos.x = MousePos.x; _____
Modified: trunk/reactos/subsys/win32k/objects/bitmaps.c --- trunk/reactos/subsys/win32k/objects/bitmaps.c 2005-06-20 07:18:20 UTC (rev 16142) +++ trunk/reactos/subsys/win32k/objects/bitmaps.c 2005-06-20 08:31:48 UTC (rev 16143) @@ -213,8 +213,10 @@
}
/* Perform the bitblt operation */ - Status = IntEngBitBlt(BitmapDest, BitmapSrc, NULL, DCDest->CombinedClip, XlateObj, - &DestRect, &SourcePoint, NULL, BrushObj ? &BrushInst.BrushObject : NULL, + Status = IntEngBitBlt(&BitmapDest->SurfObj, &BitmapSrc->SurfObj, NULL, + DCDest->CombinedClip, XlateObj, &DestRect, + &SourcePoint, NULL, + BrushObj ? &BrushInst.BrushObject : NULL, &BrushOrigin, ROP3_TO_ROP4(ROP));
if (UsesSource && XlateObj != NULL) @@ -371,7 +373,8 @@ goto done; }
- Ret = IntEngTransparentBlt(BitmapDest, BitmapSrc, DCDest->CombinedClip, XlateObj, &rcDest, &rcSrc, + Ret = IntEngTransparentBlt(&BitmapDest->SurfObj, &BitmapSrc->SurfObj, + DCDest->CombinedClip, XlateObj, &rcDest, &rcSrc, TransparentColor, 0);
done: @@ -469,6 +472,12 @@ } }
+ if (NULL != pBmp->BitsLock) + { + ExFreePoolWithTag(pBmp->BitsLock, TAG_BITMAPOBJ); + pBmp->BitsLock = NULL; + } + return TRUE; }
@@ -1246,8 +1255,10 @@ }
/* Perform the bitblt operation */ - Status = IntEngStretchBlt(BitmapDest, BitmapSrc, NULL, DCDest->CombinedClip, - XlateObj, &DestRect, &SourceRect, NULL, NULL, NULL, COLORONCOLOR); + Status = IntEngStretchBlt(&BitmapDest->SurfObj, &BitmapSrc->SurfObj, + NULL, DCDest->CombinedClip, XlateObj, + &DestRect, &SourceRect, NULL, NULL, NULL, + COLORONCOLOR);
[truncated at 1000 lines; 273 more skipped]