From 11f012e67ad0f3fb63bfb7986e6ed0cbe15d6077 Mon Sep 17 00:00:00 2001 From: Vincent Povirk Date: Mon, 10 Jan 2011 15:36:14 -0600 Subject: [PATCH 4/5] windowscodecs: Avoid an iface -> impl conversion from a non-method. --- dlls/windowscodecs/bmpdecode.c | 49 ++++++++++++++++++++----------- dlls/windowscodecs/icoformat.c | 6 ++- dlls/windowscodecs/wincodecs_private.h | 7 +++- 3 files changed, 40 insertions(+), 22 deletions(-) diff --git a/dlls/windowscodecs/bmpdecode.c b/dlls/windowscodecs/bmpdecode.c index 04e300d..bd0ace1 100644 --- a/dlls/windowscodecs/bmpdecode.c +++ b/dlls/windowscodecs/bmpdecode.c @@ -59,10 +59,9 @@ typedef struct { DWORD bc2AppData; } BITMAPCOREHEADER2; -struct BmpDecoder; -typedef HRESULT (*ReadDataFunc)(struct BmpDecoder* This); +typedef HRESULT (*ReadDataFunc)(BmpDecoder* This); -typedef struct BmpDecoder { +struct BmpDecoder { const IWICBitmapDecoderVtbl *lpVtbl; const IWICBitmapFrameDecodeVtbl *lpFrameVtbl; LONG ref; @@ -80,7 +79,7 @@ typedef struct BmpDecoder { CRITICAL_SECTION lock; /* must be held when initialized/imagedata is set or stream is accessed */ int packed; /* If TRUE, don't look for a file header and assume a packed DIB. */ int icoframe; /* If TRUE, this is a frame of a .ico file. */ -} BmpDecoder; +}; static inline BmpDecoder *impl_from_frame(IWICBitmapFrameDecode *iface) { @@ -1142,16 +1141,9 @@ static const IWICBitmapDecoderVtbl BmpDecoder_Vtbl = { BmpDecoder_GetFrame }; -static HRESULT BmpDecoder_Construct(int packed, int icoframe, IUnknown *pUnkOuter, REFIID iid, void** ppv) +static HRESULT BmpDecoder_Create(int packed, int icoframe, BmpDecoder **ppDecoder) { BmpDecoder *This; - HRESULT ret; - - TRACE("(%p,%s,%p)\n", pUnkOuter, debugstr_guid(iid), ppv); - - *ppv = NULL; - - if (pUnkOuter) return CLASS_E_NOAGGREGATION; This = HeapAlloc(GetProcessHeap(), 0, sizeof(BmpDecoder)); if (!This) return E_OUTOFMEMORY; @@ -1167,6 +1159,25 @@ static HRESULT BmpDecoder_Construct(int packed, int icoframe, IUnknown *pUnkOute This->packed = packed; This->icoframe = icoframe; + *ppDecoder = This; + + return S_OK; +} + +static HRESULT BmpDecoder_Construct(int packed, int icoframe, IUnknown *pUnkOuter, REFIID iid, void** ppv) +{ + BmpDecoder *This; + HRESULT ret; + + TRACE("(%p,%s,%p)\n", pUnkOuter, debugstr_guid(iid), ppv); + + *ppv = NULL; + + if (pUnkOuter) return CLASS_E_NOAGGREGATION; + + ret = BmpDecoder_Create(packed, icoframe, &This); + if (FAILED(ret)) return ret; + ret = IUnknown_QueryInterface((IUnknown*)This, iid, ppv); IUnknown_Release((IUnknown*)This); @@ -1183,17 +1194,19 @@ HRESULT DibDecoder_CreateInstance(IUnknown *pUnkOuter, REFIID iid, void** ppv) return BmpDecoder_Construct(TRUE, FALSE, pUnkOuter, iid, ppv); } -HRESULT IcoDibDecoder_CreateInstance(IUnknown *pUnkOuter, REFIID iid, void** ppv) +HRESULT IcoDibDecoder_CreateInstance(BmpDecoder **ppDecoder) { - return BmpDecoder_Construct(TRUE, TRUE, pUnkOuter, iid, ppv); + return BmpDecoder_Create(TRUE, TRUE, ppDecoder); } -/* Return the offset where the mask of an icon might be, or 0 for failure. */ -void BmpDecoder_FindIconMask(IWICBitmapDecoder *decoder, ULONG *mask_offset, int *topdown) +void BmpDecoder_GetWICDecoder(BmpDecoder *This, IWICBitmapDecoder **ppDecoder) { - BmpDecoder *This = (BmpDecoder*)decoder; + *ppDecoder = (IWICBitmapDecoder*)This; +} - assert(This->lpVtbl == &BmpDecoder_Vtbl); +/* Return the offset where the mask of an icon might be, or 0 for failure. */ +void BmpDecoder_FindIconMask(BmpDecoder *This, ULONG *mask_offset, int *topdown) +{ assert(This->stream != NULL); if (This->read_data_func == BmpFrameDecode_ReadUncompressed) diff --git a/dlls/windowscodecs/icoformat.c b/dlls/windowscodecs/icoformat.c index 1e939d7..de6ebe6 100644 --- a/dlls/windowscodecs/icoformat.c +++ b/dlls/windowscodecs/icoformat.c @@ -220,6 +220,7 @@ static inline void pixel_set_trans(DWORD* pixel, BOOL transparent) static HRESULT ReadIcoDib(IStream *stream, IcoFrameDecode *result) { HRESULT hr; + BmpDecoder *bmp_decoder; IWICBitmapDecoder *decoder; IWICBitmapFrameDecode *framedecode; WICPixelFormatGUID pixelformat; @@ -227,9 +228,10 @@ static HRESULT ReadIcoDib(IStream *stream, IcoFrameDecode *result) int has_alpha=FALSE; /* if TRUE, alpha data might be in the image data */ WICRect rc; - hr = IcoDibDecoder_CreateInstance(NULL, &IID_IWICBitmapDecoder, (void**)&decoder); + hr = IcoDibDecoder_CreateInstance(&bmp_decoder); if (SUCCEEDED(hr)) { + BmpDecoder_GetWICDecoder(bmp_decoder, &decoder); hr = IWICBitmapDecoder_Initialize(decoder, stream, WICDecodeMetadataCacheOnLoad); if (SUCCEEDED(hr)) @@ -317,7 +319,7 @@ static HRESULT ReadIcoDib(IStream *stream, IcoFrameDecode *result) LARGE_INTEGER seek; int topdown; - BmpDecoder_FindIconMask(decoder, &offset, &topdown); + BmpDecoder_FindIconMask(bmp_decoder, &offset, &topdown); if (offset) { diff --git a/dlls/windowscodecs/wincodecs_private.h b/dlls/windowscodecs/wincodecs_private.h index 3c416b0..fc2d17c 100644 --- a/dlls/windowscodecs/wincodecs_private.h +++ b/dlls/windowscodecs/wincodecs_private.h @@ -40,7 +40,6 @@ extern HRESULT JpegDecoder_CreateInstance(IUnknown *pUnkOuter, REFIID iid, void* extern HRESULT TiffDecoder_CreateInstance(IUnknown *pUnkOuter, REFIID iid, void** ppv); extern HRESULT IcnsEncoder_CreateInstance(IUnknown *pUnkOuter, REFIID iid, void** ppv); -extern HRESULT IcoDibDecoder_CreateInstance(IUnknown *pUnkOuter, REFIID iid, void** ppv); extern HRESULT TgaDecoder_CreateInstance(IUnknown *pUnkOuter, REFIID iid, void** ppv); extern HRESULT FlipRotator_Create(IWICBitmapFlipRotator **fliprotator); @@ -58,6 +57,10 @@ extern HRESULT CreatePropertyBag2(IPropertyBag2 **ppPropertyBag2); extern HRESULT CreateComponentInfo(REFCLSID clsid, IWICComponentInfo **ppIInfo); extern HRESULT CreateComponentEnumerator(DWORD componentTypes, DWORD options, IEnumUnknown **ppIEnumUnknown); -void BmpDecoder_FindIconMask(IWICBitmapDecoder *decoder, ULONG *mask_offset, int *topdown); +typedef struct BmpDecoder BmpDecoder; + +extern HRESULT IcoDibDecoder_CreateInstance(BmpDecoder **ppDecoder); +extern void BmpDecoder_GetWICDecoder(BmpDecoder *This, IWICBitmapDecoder **ppDecoder); +extern void BmpDecoder_FindIconMask(BmpDecoder *This, ULONG *mask_offset, int *topdown); #endif /* WINCODECS_PRIVATE_H */ -- 1.7.1