Vincent Povirk : gdiplus: Always provide image data in the format requested by image encoders.
Alexandre Julliard
julliard at winehq.org
Tue Sep 24 03:22:02 CDT 2013
Module: wine
Branch: master
Commit: 12586f76e34c64a0b33d5e4626d67d6a07ebaeff
URL: http://source.winehq.org/git/wine.git/?a=commit;h=12586f76e34c64a0b33d5e4626d67d6a07ebaeff
Author: Vincent Povirk <vincent at codeweavers.com>
Date: Wed Aug 14 15:04:13 2013 -0500
gdiplus: Always provide image data in the format requested by image encoders.
---
dlls/gdiplus/image.c | 25 +++++++++++++++++++++++--
1 files changed, 23 insertions(+), 2 deletions(-)
diff --git a/dlls/gdiplus/image.c b/dlls/gdiplus/image.c
index 98c0bd0..0f97fd7 100644
--- a/dlls/gdiplus/image.c
+++ b/dlls/gdiplus/image.c
@@ -4002,6 +4002,7 @@ static GpStatus encode_image_WIC(GpImage *image, IStream* stream,
HRESULT hr;
UINT width, height;
PixelFormat gdipformat=0;
+ const WICPixelFormatGUID *desired_wicformat;
WICPixelFormatGUID wicformat;
GpRect rc;
BitmapData lockeddata;
@@ -4054,20 +4055,40 @@ static GpStatus encode_image_WIC(GpImage *image, IStream* stream,
{
if (pixel_formats[i].gdip_format == bitmap->format)
{
- memcpy(&wicformat, pixel_formats[i].wic_format, sizeof(GUID));
+ desired_wicformat = pixel_formats[i].wic_format;
gdipformat = bitmap->format;
break;
}
}
if (!gdipformat)
{
- memcpy(&wicformat, &GUID_WICPixelFormat32bppBGRA, sizeof(GUID));
+ desired_wicformat = &GUID_WICPixelFormat32bppBGRA;
gdipformat = PixelFormat32bppARGB;
}
+ memcpy(&wicformat, desired_wicformat, sizeof(GUID));
hr = IWICBitmapFrameEncode_SetPixelFormat(frameencode, &wicformat);
}
+ if (SUCCEEDED(hr) && !IsEqualGUID(desired_wicformat, &wicformat))
+ {
+ /* Encoder doesn't support this bitmap's format. */
+ gdipformat = 0;
+ for (i=0; pixel_formats[i].wic_format; i++)
+ {
+ if (IsEqualGUID(&wicformat, pixel_formats[i].wic_format))
+ {
+ gdipformat = bitmap->format;
+ break;
+ }
+ }
+ if (!gdipformat)
+ {
+ ERR("Cannot support encoder format %s\n", debugstr_guid(&wicformat));
+ hr = E_FAIL;
+ }
+ }
+
if (SUCCEEDED(hr))
{
stat = GdipBitmapLockBits(bitmap, &rc, ImageLockModeRead, gdipformat,
More information about the wine-cvs
mailing list