Piotr Caban : gdiplus: Don't store stream reference in GpImage, it' s done by IWICBitmapDecoder.
Alexandre Julliard
julliard at wine.codeweavers.com
Fri Mar 13 08:44:24 CDT 2015
Module: wine
Branch: master
Commit: b3a9c698e855d7212f37400a6bb3bf1988e5ad94
URL: http://source.winehq.org/git/wine.git/?a=commit;h=b3a9c698e855d7212f37400a6bb3bf1988e5ad94
Author: Piotr Caban <piotr at codeweavers.com>
Date: Thu Mar 12 10:17:25 2015 +0100
gdiplus: Don't store stream reference in GpImage, it's done by IWICBitmapDecoder.
---
dlls/gdiplus/gdiplus_private.h | 1 -
dlls/gdiplus/image.c | 42 ++++++++++++++++++++++--------------------
2 files changed, 22 insertions(+), 21 deletions(-)
diff --git a/dlls/gdiplus/gdiplus_private.h b/dlls/gdiplus/gdiplus_private.h
index 1d53da1..0d62eef 100644
--- a/dlls/gdiplus/gdiplus_private.h
+++ b/dlls/gdiplus/gdiplus_private.h
@@ -270,7 +270,6 @@ struct GpAdustableArrowCap{
struct GpImage{
IPicture *picture;
- IStream *stream; /* source stream */
IWICBitmapDecoder *decoder;
ImageType type;
GUID format;
diff --git a/dlls/gdiplus/image.c b/dlls/gdiplus/image.c
index 07eb07e..36502d7 100644
--- a/dlls/gdiplus/image.c
+++ b/dlls/gdiplus/image.c
@@ -1871,7 +1871,6 @@ GpStatus WINGDIPAPI GdipCreateBitmapFromScan0(INT width, INT height, INT stride,
(*bitmap)->height = height;
(*bitmap)->format = format;
(*bitmap)->image.picture = NULL;
- (*bitmap)->image.stream = NULL;
(*bitmap)->image.decoder = NULL;
(*bitmap)->hbitmap = hbitmap;
(*bitmap)->hdc = NULL;
@@ -2089,9 +2088,6 @@ static void move_bitmap(GpBitmap *dst, GpBitmap *src, BOOL clobber_palette)
GdipFree(dst->prop_item);
dst->prop_item = src->prop_item;
dst->prop_count = src->prop_count;
- if (dst->image.stream)
- IStream_Release(dst->image.stream);
- dst->image.stream = src->image.stream;
if (dst->image.decoder)
IWICBitmapDecoder_Release(dst->image.decoder);
dst->image.decoder = src->image.decoder;
@@ -2140,8 +2136,6 @@ static GpStatus free_image_data(GpImage *image)
}
if (image->picture)
IPicture_Release(image->picture);
- if (image->stream)
- IStream_Release(image->stream);
if (image->decoder)
IWICBitmapDecoder_Release(image->decoder);
GdipFree(image->palette);
@@ -3427,7 +3421,7 @@ static GpStatus initialize_decoder_wic(IStream *stream, REFGUID container, IWICB
typedef void (*metadata_reader_func)(GpBitmap *bitmap, IWICBitmapDecoder *decoder, UINT frame);
-static GpStatus decode_frame_wic(IStream *stream, IWICBitmapDecoder *decoder,
+static GpStatus decode_frame_wic(IWICBitmapDecoder *decoder,
UINT active_frame, metadata_reader_func metadata_reader, GpImage **image)
{
GpStatus status=Ok;
@@ -3556,7 +3550,6 @@ static GpStatus decode_frame_wic(IStream *stream, IWICBitmapDecoder *decoder,
bitmap->image.flags |= ImageFlagsReadOnly|ImageFlagsHasRealPixelSize|ImageFlagsHasRealDPI|ImageFlagsColorSpaceRGB;
bitmap->image.frame_count = frame_count;
bitmap->image.current_frame = active_frame;
- bitmap->image.stream = stream;
bitmap->image.decoder = decoder;
IWICBitmapDecoder_AddRef(decoder);
if (palette)
@@ -3569,8 +3562,6 @@ static GpStatus decode_frame_wic(IStream *stream, IWICBitmapDecoder *decoder,
if (IsEqualGUID(&wic_format, &GUID_WICPixelFormatBlackWhite))
bitmap->image.palette->Flags = 0;
}
- /* Pin the source stream */
- IStream_AddRef(stream);
TRACE("=> %p\n", *image);
}
@@ -3587,7 +3578,7 @@ static GpStatus decode_image_wic(IStream *stream, REFGUID container,
if(status != Ok)
return status;
- status = decode_frame_wic(stream, decoder, 0, metadata_reader, image);
+ status = decode_frame_wic(decoder, 0, metadata_reader, image);
IWICBitmapDecoder_Release(decoder);
return status;
}
@@ -3597,7 +3588,7 @@ static GpStatus select_frame_wic(GpImage *image, UINT active_frame)
GpImage *new_image;
GpStatus status;
- status = decode_frame_wic(image->stream, image->decoder, active_frame, NULL, &new_image);
+ status = decode_frame_wic(image->decoder, active_frame, NULL, &new_image);
if(status != Ok)
return status;
@@ -3617,7 +3608,7 @@ static GpStatus select_frame_gif(GpImage *image, UINT active_frame)
GpImage *new_image;
GpStatus status;
- status = decode_frame_wic(image->stream, image->decoder, active_frame, gif_metadata_reader, &new_image);
+ status = decode_frame_wic(image->decoder, active_frame, gif_metadata_reader, &new_image);
if(status != Ok)
return status;
@@ -3782,6 +3773,23 @@ static GpStatus get_decoder_info(IStream* stream, const struct image_codec **res
return GenericError;
}
+static GpStatus get_decoder_info_from_image(GpImage *image, const struct image_codec **result)
+{
+ int i;
+
+ for (i = 0; i < NUM_CODECS; i++) {
+ if ((codecs[i].info.Flags & ImageCodecFlagsDecoder) &&
+ IsEqualIID(&codecs[i].info.FormatID, &image->format))
+ {
+ *result = &codecs[i];
+ return Ok;
+ }
+ }
+
+ TRACE("no match for format: %s\n", wine_dbgstr_guid(&image->format));
+ return GenericError;
+}
+
GpStatus WINGDIPAPI GdipImageSelectActiveFrame(GpImage *image, GDIPCONST GUID *dimensionID,
UINT frame)
{
@@ -3808,12 +3816,6 @@ GpStatus WINGDIPAPI GdipImageSelectActiveFrame(GpImage *image, GDIPCONST GUID *d
if (image->current_frame == frame)
return Ok;
- if (!image->stream)
- {
- TRACE("image doesn't have an associated stream\n");
- return Ok;
- }
-
if (!image->decoder)
{
TRACE("image doesn't have an associated decoder\n");
@@ -3821,7 +3823,7 @@ GpStatus WINGDIPAPI GdipImageSelectActiveFrame(GpImage *image, GDIPCONST GUID *d
}
/* choose an appropriate image decoder */
- stat = get_decoder_info(image->stream, &codec);
+ stat = get_decoder_info_from_image(image, &codec);
if (stat != Ok)
{
WARN("can't find decoder info\n");
More information about the wine-cvs
mailing list