Dmitry Timoshkov : gdiplus: Increase refcount of the source stream when loading a bitmap instead of cloning it .

Alexandre Julliard julliard at winehq.org
Thu Jun 28 13:55:16 CDT 2012


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

Author: Dmitry Timoshkov <dmitry at baikal.ru>
Date:   Wed Jun 27 14:29:08 2012 +0900

gdiplus: Increase refcount of the source stream when loading a bitmap instead of cloning it.

---

 dlls/gdiplus/gdiplus_private.h |    2 +-
 dlls/gdiplus/image.c           |   32 ++++++--------------------------
 dlls/gdiplus/tests/image.c     |    2 +-
 3 files changed, 8 insertions(+), 28 deletions(-)

diff --git a/dlls/gdiplus/gdiplus_private.h b/dlls/gdiplus/gdiplus_private.h
index 1f50c91..498465d 100644
--- a/dlls/gdiplus/gdiplus_private.h
+++ b/dlls/gdiplus/gdiplus_private.h
@@ -262,7 +262,7 @@ struct GpAdustableArrowCap{
 
 struct GpImage{
     IPicture *picture;
-    IStream *stream; /* a copy of the source stream */
+    IStream *stream; /* source stream */
     ImageType type;
     GUID format;
     UINT flags;
diff --git a/dlls/gdiplus/image.c b/dlls/gdiplus/image.c
index d6e2a8c..e676a4e 100644
--- a/dlls/gdiplus/image.c
+++ b/dlls/gdiplus/image.c
@@ -2775,6 +2775,8 @@ end:
         bitmap->image.frame_count = frame_count;
         bitmap->image.current_frame = active_frame;
         bitmap->image.stream = stream;
+        /* Pin the source stream */
+        IStream_AddRef(stream);
     }
 
     return status;
@@ -2842,7 +2844,7 @@ static GpStatus decode_image_olepicture_metafile(IStream* stream, REFCLSID clsid
     *image = GdipAlloc(sizeof(GpMetafile));
     if(!*image) return OutOfMemory;
     (*image)->type = ImageTypeMetafile;
-    (*image)->stream = stream;
+    (*image)->stream = NULL;
     (*image)->picture = pic;
     (*image)->flags   = ImageFlagsNone;
     (*image)->frame_count = 1;
@@ -3011,42 +3013,21 @@ GpStatus WINGDIPAPI GdipImageSelectActiveFrame(GpImage *image, GDIPCONST GUID *d
     return stat;
 }
 
-GpStatus WINGDIPAPI GdipLoadImageFromStream(IStream *source, GpImage **image)
+GpStatus WINGDIPAPI GdipLoadImageFromStream(IStream *stream, GpImage **image)
 {
     GpStatus stat;
     LARGE_INTEGER seek;
     HRESULT hr;
     const struct image_codec *codec=NULL;
-    IStream *stream;
-
-    hr = IStream_Clone(source, &stream);
-    if (FAILED(hr))
-    {
-        STATSTG statstg;
-
-        hr = IStream_Stat(source, &statstg, STATFLAG_NOOPEN);
-        if (FAILED(hr)) return hresult_to_status(hr);
-
-        stat = GdipCreateStreamOnFile(statstg.pwcsName, GENERIC_READ, &stream);
-        if(stat != Ok) return stat;
-    }
 
     /* choose an appropriate image decoder */
     stat = get_decoder_info(stream, &codec);
-    if (stat != Ok)
-    {
-        IStream_Release(stream);
-        return stat;
-    }
+    if (stat != Ok) return stat;
 
     /* seek to the start of the stream */
     seek.QuadPart = 0;
     hr = IStream_Seek(stream, seek, STREAM_SEEK_SET, NULL);
-    if (FAILED(hr))
-    {
-        IStream_Release(stream);
-        return hresult_to_status(hr);
-    }
+    if (FAILED(hr)) return hresult_to_status(hr);
 
     /* call on the image decoder to do the real work */
     stat = codec->decode_func(stream, &codec->info.Clsid, 0, image);
@@ -3058,7 +3039,6 @@ GpStatus WINGDIPAPI GdipLoadImageFromStream(IStream *source, GpImage **image)
         return Ok;
     }
 
-    IStream_Release(stream);
     return stat;
 }
 
diff --git a/dlls/gdiplus/tests/image.c b/dlls/gdiplus/tests/image.c
index 0285879..67d0a8b 100644
--- a/dlls/gdiplus/tests/image.c
+++ b/dlls/gdiplus/tests/image.c
@@ -2693,7 +2693,7 @@ static GpImage *load_image(const BYTE *image_data, UINT image_size)
 
     refcount = IStream_Release(stream);
     if (image_type == ImageTypeBitmap)
-        todo_wine ok(refcount >= 1, "expected stream refcount != 0\n");
+        ok(refcount >= 1, "expected stream refcount != 0\n");
     else
         ok(refcount == 0, "expected stream refcount 0, got %d\n", refcount);
 




More information about the wine-cvs mailing list