Module: wine Branch: master Commit: 174b74bab29e5c83ab8a8d50d0b43b6fd1a13b53 URL: http://source.winehq.org/git/wine.git/?a=commit;h=174b74bab29e5c83ab8a8d50d0...
Author: Dmitry Timoshkov dmitry@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);