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

Alexandre Julliard julliard at winehq.org
Sat Aug 29 11:36:15 CDT 2009


Module: wine
Branch: master
Commit: d87adf2a60723ee5dacdd59a0d2849c4534306bf
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=d87adf2a60723ee5dacdd59a0d2849c4534306bf

Author: Vincent Povirk <vincent at codeweavers.com>
Date:   Fri Aug 28 15:05:38 2009 -0500

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

---

 dlls/gdiplus/brush.c           |    2 +-
 dlls/gdiplus/gdiplus_private.h |    1 +
 dlls/gdiplus/image.c           |   23 ++++++++++++-----------
 3 files changed, 14 insertions(+), 12 deletions(-)

diff --git a/dlls/gdiplus/brush.c b/dlls/gdiplus/brush.c
index f719ff8..370de61 100644
--- a/dlls/gdiplus/brush.c
+++ b/dlls/gdiplus/brush.c
@@ -672,7 +672,7 @@ GpStatus WINGDIPAPI GdipCreateTextureIA(GpImage *image,
 
     hbm = ((GpBitmap*)image)->hbitmap;
     if(!hbm)   return GenericError;
-    IPicture_get_CurDC(image->picture, &hdc);
+    hdc = ((GpBitmap*)image)->hdc;
     bm_is_selected = (hdc != 0);
 
     pbmi = GdipAlloc(sizeof(BITMAPINFOHEADER) + 256 * sizeof(RGBQUAD));
diff --git a/dlls/gdiplus/gdiplus_private.h b/dlls/gdiplus/gdiplus_private.h
index 5765eac..7197463 100644
--- a/dlls/gdiplus/gdiplus_private.h
+++ b/dlls/gdiplus/gdiplus_private.h
@@ -223,6 +223,7 @@ struct GpBitmap{
     INT numlocks;
     BYTE *bitmapbits;   /* pointer to the buffer we passed in BitmapLockBits */
     HBITMAP hbitmap;
+    HDC hdc;
 };
 
 struct GpCachedBitmap{
diff --git a/dlls/gdiplus/image.c b/dlls/gdiplus/image.c
index e201973..9d91755 100644
--- a/dlls/gdiplus/image.c
+++ b/dlls/gdiplus/image.c
@@ -168,7 +168,7 @@ GpStatus WINGDIPAPI GdipBitmapLockBits(GpBitmap* bitmap, GDIPCONST GpRect* rect,
         return WrongState;
 
     hbm = bitmap->hbitmap;
-    IPicture_get_CurDC(bitmap->image.picture, &hdc);
+    hdc = bitmap->hdc;
     bm_is_selected = (hdc != 0);
 
     pbmi = GdipAlloc(sizeof(BITMAPINFOHEADER) + 256 * sizeof(RGBQUAD));
@@ -264,7 +264,7 @@ GpStatus WINGDIPAPI GdipBitmapUnlockBits(GpBitmap* bitmap,
     }
 
     hbm = bitmap->hbitmap;
-    IPicture_get_CurDC(bitmap->image.picture, &hdc);
+    hdc = bitmap->hdc;
     bm_is_selected = (hdc != 0);
 
     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)->height = ipicture_pixel_height((*bitmap)->image.picture);
     (*bitmap)->hbitmap = NULL;
+    (*bitmap)->hdc = NULL;
 
     DeleteObject(iinfo.hbmColor);
     DeleteObject(iinfo.hbmMask);
@@ -689,6 +690,7 @@ GpStatus WINGDIPAPI GdipCreateBitmapFromScan0(INT width, INT height, INT stride,
     (*bitmap)->height = height;
     (*bitmap)->format = format;
     IPicture_get_Handle((*bitmap)->image.picture, (OLE_HANDLE*)&(*bitmap)->hbitmap);
+    IPicture_get_CurDC((*bitmap)->image.picture, &(*bitmap)->hdc);
 
     return Ok;
 }
@@ -786,18 +788,17 @@ GpStatus WINGDIPAPI GdipEmfToWmfBits(HENHMETAFILE hemf, UINT cbData16,
 
 GpStatus WINGDIPAPI GdipDisposeImage(GpImage *image)
 {
-    HDC hdc;
-
     TRACE("%p\n", image);
 
     if(!image)
         return InvalidParameter;
 
-    IPicture_get_CurDC(image->picture, &hdc);
-    DeleteDC(hdc);
     IPicture_Release(image->picture);
     if (image->type == ImageTypeBitmap)
+    {
         GdipFree(((GpBitmap*)image)->bitmapbits);
+        DeleteDC(((GpBitmap*)image)->hdc);
+    }
     GdipFree(image);
 
     return Ok;
@@ -889,11 +890,12 @@ GpStatus WINGDIPAPI GdipGetImageGraphicsContext(GpImage *image,
         return NotImplemented;
     }
 
-    IPicture_get_CurDC(image->picture, &hdc);
+    hdc = ((GpBitmap*)image)->hdc;
 
     if(!hdc){
         hdc = CreateCompatibleDC(0);
-        IPicture_SelectPicture(image->picture, hdc, NULL, NULL);
+        SelectObject(hdc, ((GpBitmap*)image)->hbitmap);
+        ((GpBitmap*)image)->hdc = hdc;
     }
 
     return GdipCreateFromHDC(hdc, graphics);
@@ -1264,6 +1266,7 @@ static GpStatus decode_image_olepicture_bitmap(IStream* stream, REFCLSID clsid,
     IPicture_get_CurDC(pic, &hdc);
 
     (*((GpBitmap**) image))->hbitmap = hbm;
+    (*((GpBitmap**) image))->hdc = hdc;
 
     bmch = (BITMAPCOREHEADER*) (&pbmi->bmiHeader);
     bmch->bcSize = sizeof(BITMAPCOREHEADER);
@@ -1583,9 +1586,7 @@ GpStatus WINGDIPAPI GdipSaveImageToStream(GpImage *image, IStream* stream,
     hbmp = ((GpBitmap*)image)->hbitmap;
     if (!hbmp)
         return GenericError;
-    hr = IPicture_get_CurDC(image->picture, &hdc);
-    if (FAILED(hr))
-        return GenericError;
+    hdc = ((GpBitmap*)image)->hdc;
     bm_is_selected = (hdc != 0);
     if (!bm_is_selected) {
         hdc = CreateCompatibleDC(0);




More information about the wine-cvs mailing list