diff --git a/configure b/configure index 0af4b6bc545..3ede4fca5f9 100755 --- a/configure +++ b/configure @@ -27766,6 +27766,14 @@ ALL_MAKEFILE_DEPENDS="$ALL_MAKEFILE_DEPENDS dlls/windowscodecs/Makefile: dlls/windowscodecs/Makefile.in dlls/Makedll.rules" ac_config_files="$ac_config_files dlls/windowscodecs/Makefile" +ALL_MAKEFILES="$ALL_MAKEFILES \\ + dlls/windowscodecs/tests/Makefile" +test "x$enable_tests" != xno && ALL_TEST_DIRS="$ALL_TEST_DIRS \\ + windowscodecs/tests" +ALL_MAKEFILE_DEPENDS="$ALL_MAKEFILE_DEPENDS +dlls/windowscodecs/tests/Makefile: dlls/windowscodecs/tests/Makefile.in dlls/Maketest.rules" +ac_config_files="$ac_config_files dlls/windowscodecs/tests/Makefile" + ALL_MAKEFILES="$ALL_MAKEFILES \\ dlls/winealsa.drv/Makefile" test "x$enable_winealsa_drv" != xno && ALL_DLL_DIRS="$ALL_DLL_DIRS \\ @@ -29751,6 +29759,7 @@ do "dlls/winaspi.dll16/Makefile") CONFIG_FILES="$CONFIG_FILES dlls/winaspi.dll16/Makefile" ;; "dlls/windebug.dll16/Makefile") CONFIG_FILES="$CONFIG_FILES dlls/windebug.dll16/Makefile" ;; "dlls/windowscodecs/Makefile") CONFIG_FILES="$CONFIG_FILES dlls/windowscodecs/Makefile" ;; + "dlls/windowscodecs/tests/Makefile") CONFIG_FILES="$CONFIG_FILES dlls/windowscodecs/tests/Makefile" ;; "dlls/winealsa.drv/Makefile") CONFIG_FILES="$CONFIG_FILES dlls/winealsa.drv/Makefile" ;; "dlls/wineaudioio.drv/Makefile") CONFIG_FILES="$CONFIG_FILES dlls/wineaudioio.drv/Makefile" ;; "dlls/winecoreaudio.drv/Makefile") CONFIG_FILES="$CONFIG_FILES dlls/winecoreaudio.drv/Makefile" ;; diff --git a/configure.ac b/configure.ac index c696cb20727..6392039c124 100644 --- a/configure.ac +++ b/configure.ac @@ -2401,6 +2401,7 @@ WINE_CONFIG_MAKEFILE([dlls/win87em.dll16/Makefile],[dlls/Makedll.rules],[dlls],[ WINE_CONFIG_MAKEFILE([dlls/winaspi.dll16/Makefile],[dlls/Makedll.rules],[dlls],[ALL_DLL_DIRS],[enable_win16]) WINE_CONFIG_MAKEFILE([dlls/windebug.dll16/Makefile],[dlls/Makedll.rules],[dlls],[ALL_DLL_DIRS],[enable_win16]) WINE_CONFIG_MAKEFILE([dlls/windowscodecs/Makefile],[dlls/Makedll.rules],[dlls],[ALL_DLL_DIRS]) +WINE_CONFIG_MAKEFILE([dlls/windowscodecs/tests/Makefile],[dlls/Maketest.rules],[dlls],[ALL_TEST_DIRS],[enable_tests]) WINE_CONFIG_MAKEFILE([dlls/winealsa.drv/Makefile],[dlls/Makedll.rules],[dlls],[ALL_DLL_DIRS]) WINE_CONFIG_MAKEFILE([dlls/wineaudioio.drv/Makefile],[dlls/Makedll.rules],[dlls],[ALL_DLL_DIRS]) WINE_CONFIG_MAKEFILE([dlls/winecoreaudio.drv/Makefile],[dlls/Makedll.rules],[dlls],[ALL_DLL_DIRS]) diff --git a/dlls/Makefile.in b/dlls/Makefile.in index b600c3ac83b..a55d7158ceb 100644 --- a/dlls/Makefile.in +++ b/dlls/Makefile.in @@ -212,6 +212,7 @@ IMPORT_LIBS = \ uxtheme/libuxtheme.$(IMPLIBEXT) \ vdmdbg/libvdmdbg.$(IMPLIBEXT) \ version/libversion.$(IMPLIBEXT) \ + windowscodecs/libwindowscodecs.$(IMPLIBEXT) \ wined3d/libwined3d.$(IMPLIBEXT) \ winhttp/libwinhttp.$(IMPLIBEXT) \ wininet/libwininet.$(IMPLIBEXT) \ @@ -355,6 +356,7 @@ CROSS_IMPLIBS = \ uxtheme/libuxtheme.a \ vdmdbg/libvdmdbg.a \ version/libversion.a \ + windowscodecs/libwindowscodecs.a \ wined3d/libwined3d.a \ winhttp/libwinhttp.a \ wininet/libwininet.a \ @@ -752,6 +754,9 @@ vdmdbg/libvdmdbg.def vdmdbg/libvdmdbg.a: vdmdbg/vdmdbg.spec $(WINEBUILD) version/libversion.def version/libversion.a: version/version.spec $(WINEBUILD) @cd version && $(MAKE) `basename $@` +windowscodecs/libwindowscodecs.def windowscodecs/libwindowscodecs.a: windowscodecs/windowscodecs.spec $(WINEBUILD) + @cd windowscodecs && $(MAKE) `basename $@` + wined3d/libwined3d.def wined3d/libwined3d.a: wined3d/wined3d.spec $(WINEBUILD) @cd wined3d && $(MAKE) `basename $@` diff --git a/dlls/windowscodecs/Makefile.in b/dlls/windowscodecs/Makefile.in index 9cd6ee1b699..939a2bf32af 100644 --- a/dlls/windowscodecs/Makefile.in +++ b/dlls/windowscodecs/Makefile.in @@ -3,6 +3,7 @@ TOPOBJDIR = ../.. SRCDIR = @srcdir@ VPATH = @srcdir@ MODULE = windowscodecs.dll +IMPORTLIB = windowscodecs IMPORTS = uuid ole32 advapi32 kernel32 C_SRCS = \ diff --git a/dlls/windowscodecs/tests/Makefile.in b/dlls/windowscodecs/tests/Makefile.in new file mode 100644 index 00000000000..829bbdde9d4 --- /dev/null +++ b/dlls/windowscodecs/tests/Makefile.in @@ -0,0 +1,13 @@ +TOPSRCDIR = @top_srcdir@ +TOPOBJDIR = ../../.. +SRCDIR = @srcdir@ +VPATH = @srcdir@ +TESTDLL = windowscodecs.dll +IMPORTS = kernel32 ole32 + +CTESTS = \ + bmpformat.c + +@MAKE_TEST_RULES@ + +@DEPENDENCIES@ # everything below this line is overwritten by make depend diff --git a/dlls/windowscodecs/tests/bmpformat.c b/dlls/windowscodecs/tests/bmpformat.c new file mode 100644 index 00000000000..05c34e97924 --- /dev/null +++ b/dlls/windowscodecs/tests/bmpformat.c @@ -0,0 +1,151 @@ +/* + * Copyright 2009 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 + +#define COBJMACROS + +#include "windef.h" +#include "initguid.h" +#include "objbase.h" +#include "wincodec.h" +#include "wine/test.h" + +static const char testbmp_24bpp[] = { + /* BITMAPFILEHEADER */ + 66,77, /* "BM" */ + 50,0,0,0, /* file size */ + 0,0,0,0, /* reserved */ + 26,0,0,0, /* offset to bits */ + /* BITMAPCOREHEADER */ + 12,0,0,0, /* header size */ + 2,0, /* width */ + 3,0, /* height */ + 1,0, /* planes */ + 24,0, /* bit count */ + /* bits */ + 0,0,0, 0,255,0, 0,0, + 255,0,0, 255,255,0, 0,0, + 255,0,255, 255,255,255, 0,0 +}; + +static void test_decode_24bpp(void) +{ + IWICBitmapDecoder *decoder, *decoder2; + IWICBitmapFrameDecode *framedecode; + HRESULT hr; + HGLOBAL hbmpdata; + char *bmpdata; + IStream *bmpstream; + DWORD capability=0; + GUID guidresult; + UINT count=0, width=0, height=0; + double dpiX, dpiY; + + hr = CoCreateInstance(&CLSID_WICBmpDecoder, NULL, CLSCTX_INPROC_SERVER, + &IID_IWICBitmapDecoder, (void**)&decoder); + ok(SUCCEEDED(hr), "CoCreateInstance failed, hr=%x\n", hr); + if (!SUCCEEDED(hr)) return; + + hbmpdata = GlobalAlloc(GMEM_MOVEABLE, sizeof(testbmp_24bpp)); + ok(hbmpdata != 0, "GlobalAlloc failed\n"); + if (hbmpdata) + { + bmpdata = GlobalLock(hbmpdata); + memcpy(bmpdata, testbmp_24bpp, sizeof(testbmp_24bpp)); + GlobalUnlock(hbmpdata); + + hr = CreateStreamOnHGlobal(hbmpdata, FALSE, &bmpstream); + ok(SUCCEEDED(hr), "CreateStreamOnHGlobal failed, hr=%x\n", hr); + if (SUCCEEDED(hr)) + { + hr = IWICBitmapDecoder_Initialize(decoder, bmpstream, WICDecodeMetadataCacheOnLoad); + ok(hr == S_OK, "Initialize failed, hr=%x\n", hr); + + hr = IWICBitmapDecoder_GetContainerFormat(decoder, &guidresult); + ok(SUCCEEDED(hr), "GetContainerFormat failed, hr=%x\n", hr); + ok(IsEqualGUID(&guidresult, &GUID_ContainerFormatBmp), "unexpected container format\n"); + + hr = IWICBitmapDecoder_GetFrameCount(decoder, &count); + ok(SUCCEEDED(hr), "GetFrameCount failed, hr=%x\n", hr); + ok(count == 1, "unexpected count %u\n", count); + + hr = IWICBitmapDecoder_GetFrame(decoder, 1, &framedecode); + ok(hr == E_INVALIDARG, "expected E_INVALIDARG, got %x\n", hr); + + hr = IWICBitmapDecoder_GetFrame(decoder, 0, &framedecode); + ok(SUCCEEDED(hr), "GetFrame failed, hr=%x\n", hr); + if (SUCCEEDED(hr)) + { + hr = IWICBitmapFrameDecode_GetSize(framedecode, &width, &height); + ok(SUCCEEDED(hr), "GetSize failed, hr=%x\n", hr); + ok(width == 2, "expected width=2, got %u\n", width); + ok(height == 3, "expected height=2, got %u\n", height); + + hr = IWICBitmapFrameDecode_GetResolution(framedecode, &dpiX, &dpiY); + ok(SUCCEEDED(hr), "GetResolution failed, hr=%x\n", hr); + ok(dpiX == 96.0, "expected dpiX=96.0, got %f\n", dpiX); + ok(dpiY == 96.0, "expected dpiY=96.0, got %f\n", dpiY); + + IWICBitmapFrameDecode_Release(framedecode); + } + + /* cannot initialize twice */ + hr = IWICBitmapDecoder_Initialize(decoder, bmpstream, WICDecodeMetadataCacheOnLoad); + ok(hr == WINCODEC_ERR_WRONGSTATE, "expected WINCODEC_ERR_WRONGSTATE, hr=%x\n", hr); + + /* cannot querycapability after initialize */ + hr = IWICBitmapDecoder_QueryCapability(decoder, bmpstream, &capability); + todo_wine ok(hr == WINCODEC_ERR_WRONGSTATE, "expected WINCODEC_ERR_WRONGSTATE, hr=%x\n", hr); + + hr = CoCreateInstance(&CLSID_WICBmpDecoder, NULL, CLSCTX_INPROC_SERVER, + &IID_IWICBitmapDecoder, (void**)&decoder2); + ok(SUCCEEDED(hr), "CoCreateInstance failed, hr=%x\n", hr); + if (SUCCEEDED(hr)) + { + hr = IWICBitmapDecoder_QueryCapability(decoder2, bmpstream, &capability); + todo_wine ok(hr == S_OK, "QueryCapability failed, hr=%x\n", hr); + todo_wine ok(capability == (WICBitmapDecoderCapabilityCanDecodeAllImages), + "unexpected capabilities: %x\n", capability); + + /* cannot initialize after querycapability */ + hr = IWICBitmapDecoder_Initialize(decoder2, bmpstream, WICDecodeMetadataCacheOnLoad); + todo_wine ok(hr == WINCODEC_ERR_WRONGSTATE, "expected WINCODEC_ERR_WRONGSTATE, hr=%x\n", hr); + + /* cannot querycapability twice */ + hr = IWICBitmapDecoder_QueryCapability(decoder2, bmpstream, &capability); + todo_wine ok(hr == WINCODEC_ERR_WRONGSTATE, "expected WINCODEC_ERR_WRONGSTATE, hr=%x\n", hr); + } + + IStream_Release(bmpstream); + } + + GlobalFree(hbmpdata); + } + + IWICBitmapDecoder_Release(decoder); +} + +START_TEST(bmpformat) +{ + CoInitializeEx(NULL, COINIT_APARTMENTTHREADED); + + test_decode_24bpp(); + + CoUninitialize(); +}