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