[2/5] windowscodecs: Add a stub IWICBitmap implementation.

Vincent Povirk madewokherd at gmail.com
Tue Aug 14 16:49:50 CDT 2012


-------------- next part --------------
From e94da35883faf776c213fe3e82e829002882f809 Mon Sep 17 00:00:00 2001
From: Vincent Povirk <vincent at codeweavers.com>
Date: Tue, 14 Aug 2012 13:39:15 -0500
Subject: [PATCH 02/12] windowscodecs: Add a stub IWICBitmap implementation.

---
 dlls/windowscodecs/Makefile.in         |    1 +
 dlls/windowscodecs/bitmap.c            |  188 ++++++++++++++++++++++++++++++++
 dlls/windowscodecs/imgfactory.c        |    4 +-
 dlls/windowscodecs/tests/bitmap.c      |   14 ++-
 dlls/windowscodecs/wincodecs_private.h |    3 +
 5 files changed, 202 insertions(+), 8 deletions(-)
 create mode 100644 dlls/windowscodecs/bitmap.c

diff --git a/dlls/windowscodecs/Makefile.in b/dlls/windowscodecs/Makefile.in
index acbb0e9..b462249 100644
--- a/dlls/windowscodecs/Makefile.in
+++ b/dlls/windowscodecs/Makefile.in
@@ -6,6 +6,7 @@ EXTRADEFS = -DENTRY_PREFIX=WIC_ -DPROXY_DELEGATION -DWINE_REGISTER_DLL -DWIDL_C_
 EXTRALIBS = @APPLICATIONSERVICESLIB@
 
 C_SRCS = \
+	bitmap.c \
 	bmpdecode.c \
 	bmpencode.c \
 	clsfactory.c \
diff --git a/dlls/windowscodecs/bitmap.c b/dlls/windowscodecs/bitmap.c
new file mode 100644
index 0000000..fe32d48
--- /dev/null
+++ b/dlls/windowscodecs/bitmap.c
@@ -0,0 +1,188 @@
+/*
+ * Copyright 2012 Vincent Povirk for CodeWeavers
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include "config.h"
+
+#include <stdarg.h>
+
+#define COBJMACROS
+
+#include "windef.h"
+#include "winbase.h"
+#include "objbase.h"
+#include "wincodec.h"
+
+#include "wincodecs_private.h"
+
+#include "wine/debug.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(wincodecs);
+
+typedef struct BitmapImpl {
+    IWICBitmap IWICBitmap_iface;
+    LONG ref;
+} BitmapImpl;
+
+static inline BitmapImpl *impl_from_IWICBitmap(IWICBitmap *iface)
+{
+    return CONTAINING_RECORD(iface, BitmapImpl, IWICBitmap_iface);
+}
+
+static HRESULT WINAPI BitmapImpl_QueryInterface(IWICBitmap *iface, REFIID iid,
+    void **ppv)
+{
+    BitmapImpl *This = impl_from_IWICBitmap(iface);
+    TRACE("(%p,%s,%p)\n", iface, debugstr_guid(iid), ppv);
+
+    if (!ppv) return E_INVALIDARG;
+
+    if (IsEqualIID(&IID_IUnknown, iid) ||
+        IsEqualIID(&IID_IWICBitmapSource, iid) ||
+        IsEqualIID(&IID_IWICBitmap, iid))
+    {
+        *ppv = &This->IWICBitmap_iface;
+    }
+    else
+    {
+        *ppv = NULL;
+        return E_NOINTERFACE;
+    }
+
+    IUnknown_AddRef((IUnknown*)*ppv);
+    return S_OK;
+}
+
+static ULONG WINAPI BitmapImpl_AddRef(IWICBitmap *iface)
+{
+    BitmapImpl *This = impl_from_IWICBitmap(iface);
+    ULONG ref = InterlockedIncrement(&This->ref);
+
+    TRACE("(%p) refcount=%u\n", iface, ref);
+
+    return ref;
+}
+
+static ULONG WINAPI BitmapImpl_Release(IWICBitmap *iface)
+{
+    BitmapImpl *This = impl_from_IWICBitmap(iface);
+    ULONG ref = InterlockedDecrement(&This->ref);
+
+    TRACE("(%p) refcount=%u\n", iface, ref);
+
+    if (ref == 0)
+    {
+        HeapFree(GetProcessHeap(), 0, This);
+    }
+
+    return ref;
+}
+
+static HRESULT WINAPI BitmapImpl_GetSize(IWICBitmap *iface,
+    UINT *puiWidth, UINT *puiHeight)
+{
+    FIXME("(%p,%p,%p)\n", iface, puiWidth, puiHeight);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI BitmapImpl_GetPixelFormat(IWICBitmap *iface,
+    WICPixelFormatGUID *pPixelFormat)
+{
+    FIXME("(%p,%p)\n", iface, pPixelFormat);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI BitmapImpl_GetResolution(IWICBitmap *iface,
+    double *pDpiX, double *pDpiY)
+{
+    FIXME("(%p,%p,%p)\n", iface, pDpiX, pDpiY);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI BitmapImpl_CopyPalette(IWICBitmap *iface,
+    IWICPalette *pIPalette)
+{
+    FIXME("(%p,%p)\n", iface, pIPalette);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI BitmapImpl_CopyPixels(IWICBitmap *iface,
+    const WICRect *prc, UINT cbStride, UINT cbBufferSize, BYTE *pbBuffer)
+{
+    FIXME("(%p,%p,%u,%u,%p)\n", iface, prc, cbStride, cbBufferSize, pbBuffer);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI BitmapImpl_Lock(IWICBitmap *iface, const WICRect *prcLock,
+    DWORD flags, IWICBitmapLock **ppILock)
+{
+    FIXME("(%p,%p,%x,%p)\n", iface, prcLock, flags, ppILock);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI BitmapImpl_SetPalette(IWICBitmap *iface, IWICPalette *pIPalette)
+{
+    FIXME("(%p,%p)\n", iface, pIPalette);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI BitmapImpl_SetResolution(IWICBitmap *iface,
+    double dpiX, double dpiY)
+{
+    FIXME("(%p,%f,%f)\n", iface, dpiX, dpiY);
+
+    return E_NOTIMPL;
+}
+
+static const IWICBitmapVtbl BitmapImpl_Vtbl = {
+    BitmapImpl_QueryInterface,
+    BitmapImpl_AddRef,
+    BitmapImpl_Release,
+    BitmapImpl_GetSize,
+    BitmapImpl_GetPixelFormat,
+    BitmapImpl_GetResolution,
+    BitmapImpl_CopyPalette,
+    BitmapImpl_CopyPixels,
+    BitmapImpl_Lock,
+    BitmapImpl_SetPalette,
+    BitmapImpl_SetResolution
+};
+
+HRESULT BitmapImpl_Create(UINT uiWidth, UINT uiHeight,
+    REFWICPixelFormatGUID pixelFormat, WICBitmapCreateCacheOption option,
+    IWICBitmap **ppIBitmap)
+{
+    BitmapImpl *This;
+
+    This = HeapAlloc(GetProcessHeap(), 0, sizeof(BitmapImpl));
+    if (!This) return E_OUTOFMEMORY;
+
+    This->IWICBitmap_iface.lpVtbl = &BitmapImpl_Vtbl;
+    This->ref = 1;
+
+    *ppIBitmap = &This->IWICBitmap_iface;
+
+    return S_OK;
+}
+
diff --git a/dlls/windowscodecs/imgfactory.c b/dlls/windowscodecs/imgfactory.c
index ea6df28..a739662 100644
--- a/dlls/windowscodecs/imgfactory.c
+++ b/dlls/windowscodecs/imgfactory.c
@@ -457,9 +457,9 @@ static HRESULT WINAPI ComponentFactory_CreateBitmap(IWICComponentFactory *iface,
     UINT uiWidth, UINT uiHeight, REFWICPixelFormatGUID pixelFormat,
     WICBitmapCreateCacheOption option, IWICBitmap **ppIBitmap)
 {
-    FIXME("(%p,%u,%u,%s,%u,%p): stub\n", iface, uiWidth, uiHeight,
+    TRACE("(%p,%u,%u,%s,%u,%p)\n", iface, uiWidth, uiHeight,
         debugstr_guid(pixelFormat), option, ppIBitmap);
-    return E_NOTIMPL;
+    return BitmapImpl_Create(uiWidth, uiHeight, pixelFormat, option, ppIBitmap);
 }
 
 static HRESULT WINAPI ComponentFactory_CreateBitmapFromSource(IWICComponentFactory *iface,
diff --git a/dlls/windowscodecs/tests/bitmap.c b/dlls/windowscodecs/tests/bitmap.c
index 8c8d7e4..69840be 100644
--- a/dlls/windowscodecs/tests/bitmap.c
+++ b/dlls/windowscodecs/tests/bitmap.c
@@ -52,7 +52,7 @@ void test_createbitmap(void)
 
     hr = IWICImagingFactory_CreateBitmap(factory, 3, 3, &GUID_WICPixelFormat24bppBGR,
         WICBitmapCacheOnLoad, &bitmap);
-    todo_wine ok(hr == S_OK, "IWICImagingFactory_CreateBitmap failed hr=%x\n", hr);
+    ok(hr == S_OK, "IWICImagingFactory_CreateBitmap failed hr=%x\n", hr);
 
     if (FAILED(hr))
         return;
@@ -62,34 +62,35 @@ void test_createbitmap(void)
 
     /* Palette is unavailable until explicitly set */
     hr = IWICBitmap_CopyPalette(bitmap, palette);
-    ok(hr == WINCODEC_ERR_PALETTEUNAVAILABLE, "IWICBitmap_CopyPalette failed hr=%x\n", hr);
+    todo_wine ok(hr == WINCODEC_ERR_PALETTEUNAVAILABLE, "IWICBitmap_CopyPalette failed hr=%x\n", hr);
 
     hr = IWICPalette_InitializePredefined(palette, WICBitmapPaletteTypeFixedGray256, FALSE);
     ok(hr == S_OK, "IWICPalette_InitializePredefined failed hr=%x\n", hr);
 
     hr = IWICBitmap_SetPalette(bitmap, palette);
-    ok(hr == S_OK, "IWICBitmap_SetPalette failed hr=%x\n", hr);
+    todo_wine ok(hr == S_OK, "IWICBitmap_SetPalette failed hr=%x\n", hr);
 
     hr = IWICPalette_InitializePredefined(palette, WICBitmapPaletteTypeFixedGray4, FALSE);
     ok(hr == S_OK, "IWICPalette_InitializePredefined failed hr=%x\n", hr);
 
     hr = IWICBitmap_CopyPalette(bitmap, palette);
-    ok(hr == S_OK, "IWICBitmap_CopyPalette failed hr=%x\n", hr);
+    todo_wine ok(hr == S_OK, "IWICBitmap_CopyPalette failed hr=%x\n", hr);
 
     hr = IWICPalette_GetType(palette, &palettetype);
     ok(hr == S_OK, "IWICPalette_GetType failed hr=%x\n", hr);
-    ok(palettetype == WICBitmapPaletteTypeFixedGray256,
+    todo_wine ok(palettetype == WICBitmapPaletteTypeFixedGray256,
         "expected WICBitmapPaletteTypeFixedGray256, got %x\n", palettetype);
 
     IWICPalette_Release(palette);
 
     /* pixel data is initially zeroed */
     hr = IWICBitmap_CopyPixels(bitmap, NULL, 9, 27, returned_data);
-    ok(hr == S_OK, "IWICBitmap_CopyPixels failed hr=%x\n", hr);
+    todo_wine ok(hr == S_OK, "IWICBitmap_CopyPixels failed hr=%x\n", hr);
 
     for (i=0; i<27; i++)
         ok(returned_data[i] == 0, "returned_data[%i] == %i\n", i, returned_data[i]);
 
+todo_wine {
     /* Invalid lock rects */
     rc.X = rc.Y = 0;
     rc.Width = 4;
@@ -257,6 +258,7 @@ void test_createbitmap(void)
     ok(hr == S_OK, "IWICBitmap_GetSize failed hr=%x\n", hr);
     ok(width == 3, "got %d, expected 3\n", width);
     ok(height == 3, "got %d, expected 3\n", height);
+}
 
     IWICBitmap_Release(bitmap);
 }
diff --git a/dlls/windowscodecs/wincodecs_private.h b/dlls/windowscodecs/wincodecs_private.h
index a3a7548..0bee818 100644
--- a/dlls/windowscodecs/wincodecs_private.h
+++ b/dlls/windowscodecs/wincodecs_private.h
@@ -44,6 +44,9 @@ extern HRESULT IcnsEncoder_CreateInstance(IUnknown *pUnkOuter, REFIID iid, void*
 
 extern HRESULT TgaDecoder_CreateInstance(IUnknown *pUnkOuter, REFIID iid, void** ppv) DECLSPEC_HIDDEN;
 
+extern HRESULT BitmapImpl_Create(UINT uiWidth, UINT uiHeight,
+    REFWICPixelFormatGUID pixelFormat, WICBitmapCreateCacheOption option,
+    IWICBitmap **ppIBitmap) DECLSPEC_HIDDEN;
 extern HRESULT BitmapScaler_Create(IWICBitmapScaler **scaler) DECLSPEC_HIDDEN;
 extern HRESULT FlipRotator_Create(IWICBitmapFlipRotator **fliprotator) DECLSPEC_HIDDEN;
 extern HRESULT PaletteImpl_Create(IWICPalette **palette) DECLSPEC_HIDDEN;
-- 
1.7.9.5


More information about the wine-patches mailing list