gdiplus: Don't use IPicture to manage the HDC associated with a GpBitmap.

This commit is contained in:
Vincent Povirk 2009-08-28 15:05:38 -05:00 committed by Alexandre Julliard
parent e48524ceb6
commit d87adf2a60
3 changed files with 14 additions and 12 deletions

View File

@ -672,7 +672,7 @@ GpStatus WINGDIPAPI GdipCreateTextureIA(GpImage *image,
hbm = ((GpBitmap*)image)->hbitmap; hbm = ((GpBitmap*)image)->hbitmap;
if(!hbm) return GenericError; if(!hbm) return GenericError;
IPicture_get_CurDC(image->picture, &hdc); hdc = ((GpBitmap*)image)->hdc;
bm_is_selected = (hdc != 0); bm_is_selected = (hdc != 0);
pbmi = GdipAlloc(sizeof(BITMAPINFOHEADER) + 256 * sizeof(RGBQUAD)); pbmi = GdipAlloc(sizeof(BITMAPINFOHEADER) + 256 * sizeof(RGBQUAD));

View File

@ -223,6 +223,7 @@ struct GpBitmap{
INT numlocks; INT numlocks;
BYTE *bitmapbits; /* pointer to the buffer we passed in BitmapLockBits */ BYTE *bitmapbits; /* pointer to the buffer we passed in BitmapLockBits */
HBITMAP hbitmap; HBITMAP hbitmap;
HDC hdc;
}; };
struct GpCachedBitmap{ struct GpCachedBitmap{

View File

@ -168,7 +168,7 @@ GpStatus WINGDIPAPI GdipBitmapLockBits(GpBitmap* bitmap, GDIPCONST GpRect* rect,
return WrongState; return WrongState;
hbm = bitmap->hbitmap; hbm = bitmap->hbitmap;
IPicture_get_CurDC(bitmap->image.picture, &hdc); hdc = bitmap->hdc;
bm_is_selected = (hdc != 0); bm_is_selected = (hdc != 0);
pbmi = GdipAlloc(sizeof(BITMAPINFOHEADER) + 256 * sizeof(RGBQUAD)); pbmi = GdipAlloc(sizeof(BITMAPINFOHEADER) + 256 * sizeof(RGBQUAD));
@ -264,7 +264,7 @@ GpStatus WINGDIPAPI GdipBitmapUnlockBits(GpBitmap* bitmap,
} }
hbm = bitmap->hbitmap; hbm = bitmap->hbitmap;
IPicture_get_CurDC(bitmap->image.picture, &hdc); hdc = bitmap->hdc;
bm_is_selected = (hdc != 0); bm_is_selected = (hdc != 0);
pbmi = GdipAlloc(sizeof(BITMAPINFOHEADER) + 256 * sizeof(RGBQUAD)); pbmi = GdipAlloc(sizeof(BITMAPINFOHEADER) + 256 * sizeof(RGBQUAD));
@ -588,6 +588,7 @@ GpStatus WINGDIPAPI GdipCreateBitmapFromHICON(HICON hicon, GpBitmap** bitmap)
(*bitmap)->width = ipicture_pixel_width((*bitmap)->image.picture); (*bitmap)->width = ipicture_pixel_width((*bitmap)->image.picture);
(*bitmap)->height = ipicture_pixel_height((*bitmap)->image.picture); (*bitmap)->height = ipicture_pixel_height((*bitmap)->image.picture);
(*bitmap)->hbitmap = NULL; (*bitmap)->hbitmap = NULL;
(*bitmap)->hdc = NULL;
DeleteObject(iinfo.hbmColor); DeleteObject(iinfo.hbmColor);
DeleteObject(iinfo.hbmMask); DeleteObject(iinfo.hbmMask);
@ -689,6 +690,7 @@ GpStatus WINGDIPAPI GdipCreateBitmapFromScan0(INT width, INT height, INT stride,
(*bitmap)->height = height; (*bitmap)->height = height;
(*bitmap)->format = format; (*bitmap)->format = format;
IPicture_get_Handle((*bitmap)->image.picture, (OLE_HANDLE*)&(*bitmap)->hbitmap); IPicture_get_Handle((*bitmap)->image.picture, (OLE_HANDLE*)&(*bitmap)->hbitmap);
IPicture_get_CurDC((*bitmap)->image.picture, &(*bitmap)->hdc);
return Ok; return Ok;
} }
@ -786,18 +788,17 @@ GpStatus WINGDIPAPI GdipEmfToWmfBits(HENHMETAFILE hemf, UINT cbData16,
GpStatus WINGDIPAPI GdipDisposeImage(GpImage *image) GpStatus WINGDIPAPI GdipDisposeImage(GpImage *image)
{ {
HDC hdc;
TRACE("%p\n", image); TRACE("%p\n", image);
if(!image) if(!image)
return InvalidParameter; return InvalidParameter;
IPicture_get_CurDC(image->picture, &hdc);
DeleteDC(hdc);
IPicture_Release(image->picture); IPicture_Release(image->picture);
if (image->type == ImageTypeBitmap) if (image->type == ImageTypeBitmap)
{
GdipFree(((GpBitmap*)image)->bitmapbits); GdipFree(((GpBitmap*)image)->bitmapbits);
DeleteDC(((GpBitmap*)image)->hdc);
}
GdipFree(image); GdipFree(image);
return Ok; return Ok;
@ -889,11 +890,12 @@ GpStatus WINGDIPAPI GdipGetImageGraphicsContext(GpImage *image,
return NotImplemented; return NotImplemented;
} }
IPicture_get_CurDC(image->picture, &hdc); hdc = ((GpBitmap*)image)->hdc;
if(!hdc){ if(!hdc){
hdc = CreateCompatibleDC(0); hdc = CreateCompatibleDC(0);
IPicture_SelectPicture(image->picture, hdc, NULL, NULL); SelectObject(hdc, ((GpBitmap*)image)->hbitmap);
((GpBitmap*)image)->hdc = hdc;
} }
return GdipCreateFromHDC(hdc, graphics); return GdipCreateFromHDC(hdc, graphics);
@ -1264,6 +1266,7 @@ static GpStatus decode_image_olepicture_bitmap(IStream* stream, REFCLSID clsid,
IPicture_get_CurDC(pic, &hdc); IPicture_get_CurDC(pic, &hdc);
(*((GpBitmap**) image))->hbitmap = hbm; (*((GpBitmap**) image))->hbitmap = hbm;
(*((GpBitmap**) image))->hdc = hdc;
bmch = (BITMAPCOREHEADER*) (&pbmi->bmiHeader); bmch = (BITMAPCOREHEADER*) (&pbmi->bmiHeader);
bmch->bcSize = sizeof(BITMAPCOREHEADER); bmch->bcSize = sizeof(BITMAPCOREHEADER);
@ -1583,9 +1586,7 @@ GpStatus WINGDIPAPI GdipSaveImageToStream(GpImage *image, IStream* stream,
hbmp = ((GpBitmap*)image)->hbitmap; hbmp = ((GpBitmap*)image)->hbitmap;
if (!hbmp) if (!hbmp)
return GenericError; return GenericError;
hr = IPicture_get_CurDC(image->picture, &hdc); hdc = ((GpBitmap*)image)->hdc;
if (FAILED(hr))
return GenericError;
bm_is_selected = (hdc != 0); bm_is_selected = (hdc != 0);
if (!bm_is_selected) { if (!bm_is_selected) {
hdc = CreateCompatibleDC(0); hdc = CreateCompatibleDC(0);