Authors: Alexandre Julliard <julliard@codeweavers.com> (for Corel), Albert den Haan <albertd@corel.com>
Added syslevel locking for GDI operations.
Propagate the changes through the graphics code.
diff --git a/objects/dib.c b/objects/dib.c
index 4947f12..8d5dcc8 100644
--- a/objects/dib.c
+++ b/objects/dib.c
@@ -133,11 +133,11 @@
INT heightSrc, const void *bits,
const BITMAPINFO *info, UINT wUsage, DWORD dwRop )
{
- DC *dc = DC_GetDCPtr( hdc );
+ DC *dc = DC_GetDCUpdate( hdc );
if(!dc) return FALSE;
if(dc->funcs->pStretchDIBits)
- return dc->funcs->pStretchDIBits(dc, xDst, yDst, widthDst,
+ heightSrc = dc->funcs->pStretchDIBits(dc, xDst, yDst, widthDst,
heightDst, xSrc, ySrc, widthSrc,
heightSrc, bits, info, wUsage,
dwRop);
@@ -157,8 +157,9 @@
SelectObject( hdcMem, hOldBitmap );
DeleteDC( hdcMem );
DeleteObject( hBitmap );
- return heightSrc;
}
+ GDI_ReleaseObj( hdc );
+ return heightSrc;
}
@@ -198,16 +199,11 @@
INT result;
/* Check parameters */
- dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
- if (!dc)
- {
- dc = (DC *) GDI_GetObjPtr(hdc, METAFILE_DC_MAGIC);
- if (!dc) return 0;
- }
+ if (!(dc = DC_GetDCUpdate( hdc ))) return 0;
if (!(bitmap = (BITMAPOBJ *) GDI_GetObjPtr( hbitmap, BITMAP_MAGIC )))
{
- GDI_HEAP_UNLOCK( hdc );
+ GDI_ReleaseObj( hdc );
return 0;
}
@@ -215,8 +211,8 @@
lines, bits, info,
coloruse, hbitmap);
- GDI_HEAP_UNLOCK( hdc );
- GDI_HEAP_UNLOCK( hbitmap );
+ GDI_ReleaseObj( hbitmap );
+ GDI_ReleaseObj( hdc );
return result;
}
@@ -246,7 +242,7 @@
INT ret;
DC *dc;
- if (!(dc = DC_GetDCPtr( hdc ))) return 0;
+ if (!(dc = DC_GetDCUpdate( hdc ))) return 0;
if(dc->funcs->pSetDIBitsToDevice)
ret = dc->funcs->pSetDIBitsToDevice( dc, xDest, yDest, cx, cy, xSrc,
@@ -257,7 +253,7 @@
ret = 0;
}
- GDI_HEAP_UNLOCK( hdc );
+ GDI_ReleaseObj( hdc );
return ret;
}
@@ -281,15 +277,11 @@
PALETTEOBJ * palette;
RGBQUAD *end;
- dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
- if (!dc)
- {
- dc = (DC *)GDI_GetObjPtr(hdc, METAFILE_DC_MAGIC);
- if (!dc) return 0;
- }
+ if (!(dc = DC_GetDCUpdate( hdc ))) return 0;
if (!(palette = (PALETTEOBJ*)GDI_GetObjPtr( dc->w.hPalette, PALETTE_MAGIC )))
{
+ GDI_ReleaseObj( hdc );
return 0;
}
@@ -312,7 +304,8 @@
} else {
entries = 0;
}
- GDI_HEAP_UNLOCK( dc->w.hPalette );
+ GDI_ReleaseObj( dc->w.hPalette );
+ GDI_ReleaseObj( hdc );
return entries;
}
@@ -336,15 +329,11 @@
PALETTEOBJ * palette;
RGBQUAD *end;
- dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
- if (!dc)
- {
- dc = (DC *)GDI_GetObjPtr(hdc, METAFILE_DC_MAGIC);
- if (!dc) return 0;
- }
+ if (!(dc = DC_GetDCUpdate( hdc ))) return 0;
if (!(palette = (PALETTEOBJ*)GDI_GetObjPtr( dc->w.hPalette, PALETTE_MAGIC )))
{
+ GDI_ReleaseObj( hdc );
return 0;
}
@@ -365,7 +354,8 @@
} else {
entries = 0;
}
- GDI_HEAP_UNLOCK( dc->w.hPalette );
+ GDI_ReleaseObj( dc->w.hPalette );
+ GDI_ReleaseObj( hdc );
return entries;
}
@@ -456,21 +446,16 @@
int i;
if (!info) return 0;
- dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
- if (!dc)
- {
- dc = (DC *)GDI_GetObjPtr(hdc, METAFILE_DC_MAGIC);
- if (!dc) return 0;
- }
+ if (!(dc = DC_GetDCUpdate( hdc ))) return 0;
if (!(bmp = (BITMAPOBJ *)GDI_GetObjPtr( hbitmap, BITMAP_MAGIC )))
{
- GDI_HEAP_UNLOCK( hdc );
+ GDI_ReleaseObj( hdc );
return 0;
}
if (!(palette = (PALETTEOBJ*)GDI_GetObjPtr( dc->w.hPalette, PALETTE_MAGIC )))
{
- GDI_HEAP_UNLOCK( hdc );
- GDI_HEAP_UNLOCK( hbitmap );
+ GDI_ReleaseObj( hdc );
+ GDI_ReleaseObj( hbitmap );
return 0;
}
@@ -530,7 +515,7 @@
}
}
- GDI_HEAP_UNLOCK( dc->w.hPalette );
+ GDI_ReleaseObj( dc->w.hPalette );
if (bits && lines)
{
@@ -728,10 +713,10 @@
/* Otherwise, get bits from the XImage */
else if(!BITMAP_Driver->pGetDIBits(bmp, dc, startscan, lines, bits, info, coloruse, hbitmap))
{
- GDI_HEAP_UNLOCK( hdc );
- GDI_HEAP_UNLOCK( hbitmap );
+ GDI_ReleaseObj( hdc );
+ GDI_ReleaseObj( hbitmap );
- return FALSE;
+ return 0;
}
}
else if( info->bmiHeader.biSize >= sizeof(BITMAPINFOHEADER) )
@@ -763,8 +748,8 @@
info->bmiHeader.biSizeImage, info->bmiHeader.biWidth,
info->bmiHeader.biHeight);
- GDI_HEAP_UNLOCK( hdc );
- GDI_HEAP_UNLOCK( hbitmap );
+ GDI_ReleaseObj( hdc );
+ GDI_ReleaseObj( hbitmap );
return lines;
}
@@ -870,7 +855,7 @@
SEGPTR *bits, HANDLE section,
DWORD offset)
{
- HBITMAP16 hbitmap;
+ HBITMAP16 hbitmap = 0;
DC *dc;
BOOL bDesktopDC = FALSE;
@@ -881,13 +866,11 @@
bDesktopDC = TRUE;
}
- dc = (DC *) GDI_GetObjPtr(hdc, DC_MAGIC);
- if(!dc) dc = (DC *) GDI_GetObjPtr(hdc, METAFILE_DC_MAGIC);
- if(!dc) return (HBITMAP16) NULL;
-
- hbitmap = dc->funcs->pCreateDIBSection16(dc, bmi, usage, bits, section, offset, 0);
-
- GDI_HEAP_UNLOCK(hdc);
+ if ((dc = DC_GetDCPtr( hdc )))
+ {
+ hbitmap = dc->funcs->pCreateDIBSection16(dc, bmi, usage, bits, section, offset, 0);
+ GDI_ReleaseObj(hdc);
+ }
if (bDesktopDC)
DeleteDC(hdc);
@@ -902,7 +885,7 @@
LPVOID *bits, HANDLE section,
DWORD offset, DWORD ovr_pitch)
{
- HBITMAP hbitmap;
+ HBITMAP hbitmap = 0;
DC *dc;
BOOL bDesktopDC = FALSE;
@@ -913,13 +896,11 @@
bDesktopDC = TRUE;
}
- dc = (DC *) GDI_GetObjPtr(hdc, DC_MAGIC);
- if(!dc) dc = (DC *) GDI_GetObjPtr(hdc, METAFILE_DC_MAGIC);
- if(!dc) return (HBITMAP) NULL;
-
- hbitmap = dc->funcs->pCreateDIBSection(dc, bmi, usage, bits, section, offset, ovr_pitch);
-
- GDI_HEAP_UNLOCK(hdc);
+ if ((dc = DC_GetDCPtr( hdc )))
+ {
+ hbitmap = dc->funcs->pCreateDIBSection(dc, bmi, usage, bits, section, offset, ovr_pitch);
+ GDI_ReleaseObj(hdc);
+ }
if (bDesktopDC)
DeleteDC(hdc);
@@ -976,6 +957,7 @@
/* Get a pointer to the BITMAPOBJ structure */
pBmp = (BITMAPOBJ *)GDI_GetObjPtr( hBmp, BITMAP_MAGIC );
+ if (!pBmp) return hPackedDIB;
/* Get the bitmap dimensions */
width = pBmp->bitmap.bmWidth;
@@ -1042,5 +1024,6 @@
}
END:
+ GDI_ReleaseObj( hBmp );
return hPackedDIB;
}