- mark surface as not selected in DC_vSelectSurface when its released from a DC
NtGdiSelectBitmap: 
- Don't allow selecting a bitmap into a dc that is already selected!
- Use DC_vSelectSurface instead of manually selecting
- set the DC size based on bitmap size

svn path=/trunk/; revision=50921
This commit is contained in:
Timo Kreuzer
2011-02-27 17:51:37 +00:00
parent 760940d0bd
commit 736733be4d
3 changed files with 27 additions and 26 deletions
+1 -3
View File
@@ -541,8 +541,6 @@ IntEngBitBlt(
BOOL bResult;
RECTL rclClipped;
RECTL rclSrc;
// INTENG_ENTER_LEAVE EnterLeaveSource;
// INTENG_ENTER_LEAVE EnterLeaveDest;
PFN_DrvBitBlt pfnBitBlt;
ASSERT(psoTrg);
@@ -552,9 +550,9 @@ IntEngBitBlt(
rclClipped = *prclTrg;
RECTL_vMakeWellOrdered(&rclClipped);
/* Clip target rect against the bounds of the clipping region */
if (pco)
{
/* Clip target rect against the bounds of the clipping region */
if (!RECTL_bIntersectRect(&rclClipped, &rclClipped, &pco->rclBounds))
{
/* Nothing left */
@@ -213,7 +213,10 @@ DC_vSelectSurface(PDC pdc, PSURFACE psurfNew)
{
PSURFACE psurfOld = pdc->dclevel.pSurface;
if (psurfOld)
{
psurfOld->hdc = NULL;
SURFACE_ShareUnlockSurface(psurfOld);
}
if (psurfNew)
GDIOBJ_IncrementShareCount((POBJ)psurfNew);
pdc->dclevel.pSurface = psurfNew;
@@ -257,9 +257,10 @@ NtGdiSelectBitmap(
PDC pdc;
PDC_ATTR pdcattr;
HBITMAP hbmpOld;
PSURFACE psurfNew, psurfOld;
PSURFACE psurfNew;
HRGN hVisRgn;
SIZEL sizlBitmap = {1, 1};
HDC hdcOld;
ASSERT_NOGDILOCKS();
/* Verify parameters */
@@ -280,8 +281,17 @@ NtGdiSelectBitmap(
return NULL;
}
/* Save the old bitmap */
psurfOld = pdc->dclevel.pSurface;
/* Check if there was a bitmap selected before */
if (pdc->dclevel.pSurface)
{
/* Return its handle */
hbmpOld = pdc->dclevel.pSurface->BaseObject.hHmgr;
}
else
{
/* Return default bitmap */
hbmpOld = StockObjects[DEFAULT_BITMAP];
}
/* Check if the default bitmap was passed */
if (hbmp == StockObjects[DEFAULT_BITMAP])
@@ -300,16 +310,17 @@ NtGdiSelectBitmap(
DC_UnlockDc(pdc);
return NULL;
}
#if 0 // FIXME: bug bug, causes problems
/* Set the bitmp's hdc */
if (InterlockedCompareExchangePointer((PVOID*)&psurfNew->hdc, hdc, 0))
hdcOld = InterlockedCompareExchangePointer((PVOID*)&psurfNew->hdc, hdc, 0);
if (hdcOld != NULL && hdcOld != hdc)
{
/* The bitmap is already selected, fail */
SURFACE_ShareUnlockSurface(psurfNew);
DC_UnlockDc(pdc);
return NULL;
}
#endif
/* Get the bitmap size */
sizlBitmap = psurfNew->SurfObj.sizlBitmap;
@@ -325,25 +336,14 @@ NtGdiSelectBitmap(
}
}
/* Select the new bitmap */
pdc->dclevel.pSurface = psurfNew;
/* Select the new surface, release the old */
DC_vSelectSurface(pdc, psurfNew);
/* Check if there was a bitmap selected before */
if (psurfOld)
{
hbmpOld = psurfOld->BaseObject.hHmgr;
/* Set the new size */
pdc->dclevel.sizl = sizlBitmap;
/* Reset hdc of old bitmap, this surface isn't selected anymore */
psurfOld->hdc = NULL;
/* Release the old bitmap */
SURFACE_ShareUnlockSurface(psurfOld);
}
else
{
/* Return default bitmap */
hbmpOld = StockObjects[DEFAULT_BITMAP];
}
/* Release one reference we added */
SURFACE_ShareUnlockSurface(psurfNew);
/* Mark the dc brushes invalid */
pdcattr->ulDirty_ |= DIRTY_FILL | DIRTY_LINE;