gdiplus: Don't store stream reference in GpImage, it's done by IWICBitmapDecoder.

This commit is contained in:
Piotr Caban 2015-03-12 10:17:25 +01:00 committed by Alexandre Julliard
parent 531992c760
commit b3a9c698e8
2 changed files with 22 additions and 21 deletions

View File

@ -270,7 +270,6 @@ struct GpAdustableArrowCap{
struct GpImage{
IPicture *picture;
IStream *stream; /* source stream */
IWICBitmapDecoder *decoder;
ImageType type;
GUID format;

View File

@ -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");