Dmitry Timoshkov : windowscodecs: Add a test for CreateBitmapFromHBITMAP.
Alexandre Julliard
julliard at winehq.org
Fri Jan 18 12:07:36 CST 2013
Module: wine
Branch: master
Commit: 89f044db1552df1e2e3ba7a59d30cc541b6e9c4e
URL: http://source.winehq.org/git/wine.git/?a=commit;h=89f044db1552df1e2e3ba7a59d30cc541b6e9c4e
Author: Dmitry Timoshkov <dmitry at baikal.ru>
Date: Fri Jan 18 17:59:48 2013 +0800
windowscodecs: Add a test for CreateBitmapFromHBITMAP.
---
dlls/windowscodecs/tests/bitmap.c | 188 +++++++++++++++++++++++++++++++++++++
include/wincodec.idl | 1 +
2 files changed, 189 insertions(+), 0 deletions(-)
diff --git a/dlls/windowscodecs/tests/bitmap.c b/dlls/windowscodecs/tests/bitmap.c
index fb7183b..742f45f 100644
--- a/dlls/windowscodecs/tests/bitmap.c
+++ b/dlls/windowscodecs/tests/bitmap.c
@@ -19,6 +19,7 @@
#include <stdarg.h>
#include <stdio.h>
+#include <assert.h>
#include <math.h>
#define COBJMACROS
@@ -42,6 +43,51 @@ static const char *debugstr_guid(const GUID *guid)
return buf;
}
+static HBITMAP create_dib(int width, int height, int bpp, LOGPALETTE *pal, const void *data)
+{
+ char bmibuf[sizeof(BITMAPINFO) + sizeof(RGBQUAD) * 255];
+ BITMAPINFO *bmi = (BITMAPINFO *)bmibuf;
+ void *bits;
+ HBITMAP hdib;
+ BITMAP bm;
+
+ memset(bmibuf, 0, sizeof(bmibuf));
+ bmi->bmiHeader.biSize = sizeof(bmi->bmiHeader);
+ bmi->bmiHeader.biWidth = width;
+ bmi->bmiHeader.biHeight = -height;
+ bmi->bmiHeader.biBitCount = bpp;
+ bmi->bmiHeader.biPlanes = 1;
+ bmi->bmiHeader.biCompression = BI_RGB;
+ if (pal)
+ {
+ WORD i;
+
+ assert(pal->palNumEntries <= 256);
+ for (i = 0; i < pal->palNumEntries; i++)
+ {
+ bmi->bmiColors[i].rgbRed = pal->palPalEntry[i].peRed;
+ bmi->bmiColors[i].rgbGreen = pal->palPalEntry[i].peGreen;
+ bmi->bmiColors[i].rgbBlue = pal->palPalEntry[i].peBlue;
+ bmi->bmiColors[i].rgbReserved = 0;
+ }
+
+ bmi->bmiHeader.biClrUsed = pal->palNumEntries;
+ bmi->bmiHeader.biClrImportant = pal->palNumEntries;
+ }
+ hdib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, &bits, NULL, 0);
+ ok(hdib != 0, "CreateDIBSection(%dx%d,%d bpp) failed\n", width, height, bpp);
+
+ GetObject(hdib, sizeof(bm), &bm);
+ ok(bm.bmWidth == width, "expected %d, got %d\n", width, bm.bmWidth);
+ ok(bm.bmHeight == height, "expected %d, got %d\n", height, bm.bmHeight);
+ ok(bm.bmPlanes == 1, "expected 1, got %d\n", bm.bmPlanes);
+ ok(bm.bmBitsPixel == bpp, "expected %d, got %d\n", bpp, bm.bmBitsPixel);
+
+ if (data) memcpy(bits, data, bm.bmWidthBytes * bm.bmHeight);
+
+ return hdib;
+}
+
static void test_createbitmap(void)
{
HRESULT hr;
@@ -582,6 +628,147 @@ static void test_CreateBitmapFromHICON(void)
IWICBitmap_Release(bitmap);
}
+static void test_CreateBitmapFromHBITMAP(void)
+{
+ /* 8 bpp data must be aligned to a DWORD boundary for a DIB */
+ static const BYTE data_8bpp_pal_dib[12] = { 0,1,2,0, 1,2,0,0, 2,1,0,0 };
+ static const BYTE data_8bpp_rgb_dib[12] = { 0xf0,0x0f,0xff,0, 0x0f,0xff,0xf0,0, 0xf0,0x0f,0xff,0 };
+ static const BYTE data_8bpp_pal_wic[12] = { 0xd,0xe,0x10,0, 0xe,0x10,0xd,0, 0x10,0xe,0xd,0 };
+ static const PALETTEENTRY pal_data[3] = { {0xff,0,0,0}, {0,0xff,0,0}, {0,0,0xff,0} };
+ char pal_buf[sizeof(LOGPALETTE) + sizeof(PALETTEENTRY) * 255];
+ LOGPALETTE *pal = (LOGPALETTE *)pal_buf;
+ HBITMAP hbmp;
+ HPALETTE hpal;
+ BYTE data[12];
+ HRESULT hr;
+ IWICBitmap *bitmap;
+ UINT width, height, i, count;
+ WICPixelFormatGUID format;
+ IWICPalette *palette;
+ WICBitmapPaletteType type;
+
+ /* 8 bpp without palette */
+ hbmp = create_dib(3, 3, 8, NULL, data_8bpp_rgb_dib);
+ ok(hbmp != 0, "failed to create bitmap\n");
+
+ hr = IWICImagingFactory_CreateBitmapFromHBITMAP(factory, 0, 0, WICBitmapCacheOnLoad, &bitmap);
+todo_wine
+ ok(hr == WINCODEC_ERR_WIN32ERROR || hr == 0x88980003 /*XP*/, "expected WINCODEC_ERR_WIN32ERROR, got %#x\n", hr);
+
+ hr = IWICImagingFactory_CreateBitmapFromHBITMAP(factory, hbmp, 0, WICBitmapCacheOnLoad, NULL);
+todo_wine
+ ok(hr == E_INVALIDARG, "expected E_INVALIDARG, got %#x\n", hr);
+
+ hr = IWICImagingFactory_CreateBitmapFromHBITMAP(factory, hbmp, 0, WICBitmapCacheOnLoad, &bitmap);
+todo_wine
+ ok(hr == S_OK, "CreateBitmapFromHBITMAP error %#x\n", hr);
+ if (hr != S_OK) return;
+
+ IWICBitmap_GetPixelFormat(bitmap, &format);
+ ok(IsEqualGUID(&format, &GUID_WICPixelFormat8bppIndexed),
+ "unexpected pixel format %s\n", debugstr_guid(&format));
+
+ hr = IWICBitmap_GetSize(bitmap, &width, &height);
+ ok(hr == S_OK, "IWICBitmap_GetSize error %#x\n", hr);
+ ok(width == 3, "expected 3, got %u\n", width);
+ ok(height == 3, "expected 3, got %u\n", height);
+
+ memset(data, 0, sizeof(data));
+ hr = IWICBitmap_CopyPixels(bitmap, NULL, 4, sizeof(data), data);
+ ok(hr == S_OK, "IWICBitmap_CopyPixels error %#x\n", hr);
+ for (i = 0; i < sizeof(data); i++)
+ ok(data[i] == data_8bpp_rgb_dib[i], "%u: expected %#x, got %#x\n", i, data_8bpp_rgb_dib[i], data[i]);
+
+ IWICBitmap_Release(bitmap);
+ DeleteObject(hbmp);
+
+ /* 8 bpp with a 3 entries palette */
+ memset(pal_buf, 0, sizeof(pal_buf));
+ pal->palVersion = 0x300;
+ pal->palNumEntries = 3;
+ memcpy(pal->palPalEntry, pal_data, sizeof(pal_data));
+ hpal = CreatePalette(pal);
+ ok(hpal != 0, "CreatePalette failed\n");
+
+ hbmp = create_dib(3, 3, 8, pal, data_8bpp_pal_dib);
+ hr = IWICImagingFactory_CreateBitmapFromHBITMAP(factory, hbmp, hpal, WICBitmapCacheOnLoad, &bitmap);
+ ok(hr == S_OK, "CreateBitmapFromHBITMAP error %#x\n", hr);
+
+ IWICBitmap_GetPixelFormat(bitmap, &format);
+ ok(IsEqualGUID(&format, &GUID_WICPixelFormat4bppIndexed),
+ "unexpected pixel format %s\n", debugstr_guid(&format));
+
+ hr = IWICBitmap_GetSize(bitmap, &width, &height);
+ ok(hr == S_OK, "IWICBitmap_GetSize error %#x\n", hr);
+ ok(width == 3, "expected 3, got %u\n", width);
+ ok(height == 3, "expected 3, got %u\n", height);
+
+ hr = IWICImagingFactory_CreatePalette(factory, &palette);
+ ok(hr == S_OK, "CreatePalette error %#x\n", hr);
+ hr = IWICBitmap_CopyPalette(bitmap, palette);
+ ok(hr == S_OK, "CopyPalette error %#x\n", hr);
+
+ hr = IWICPalette_GetType(palette, &type);
+ ok(hr == S_OK, "%u: GetType error %#x\n", i, hr);
+ ok(type == WICBitmapPaletteTypeCustom, "expected WICBitmapPaletteTypeCustom, got %#x\n", type);
+
+ hr = IWICPalette_GetColorCount(palette, &count);
+ ok(hr == S_OK, "GetColorCount error %#x\n", hr);
+ ok(count == 16, "expected 16, got %u\n", count);
+
+ IWICPalette_Release(palette);
+
+ IWICBitmap_Release(bitmap);
+ DeleteObject(hbmp);
+ DeleteObject(hpal);
+
+ /* 8 bpp with a 256 entries palette */
+ memset(pal_buf, 0, sizeof(pal_buf));
+ pal->palVersion = 0x300;
+ pal->palNumEntries = 256;
+ memcpy(pal->palPalEntry, pal_data, sizeof(pal_data));
+ hpal = CreatePalette(pal);
+ ok(hpal != 0, "CreatePalette failed\n");
+
+ hbmp = create_dib(3, 3, 8, pal, data_8bpp_pal_dib);
+ hr = IWICImagingFactory_CreateBitmapFromHBITMAP(factory, hbmp, hpal, WICBitmapCacheOnLoad, &bitmap);
+ ok(hr == S_OK, "CreateBitmapFromHBITMAP error %#x\n", hr);
+
+ IWICBitmap_GetPixelFormat(bitmap, &format);
+ ok(IsEqualGUID(&format, &GUID_WICPixelFormat8bppIndexed),
+ "unexpected pixel format %s\n", debugstr_guid(&format));
+
+ hr = IWICBitmap_GetSize(bitmap, &width, &height);
+ ok(hr == S_OK, "IWICBitmap_GetSize error %#x\n", hr);
+ ok(width == 3, "expected 3, got %u\n", width);
+ ok(height == 3, "expected 3, got %u\n", height);
+
+ hr = IWICImagingFactory_CreatePalette(factory, &palette);
+ ok(hr == S_OK, "CreatePalette error %#x\n", hr);
+ hr = IWICBitmap_CopyPalette(bitmap, palette);
+ ok(hr == S_OK, "CopyPalette error %#x\n", hr);
+
+ hr = IWICPalette_GetType(palette, &type);
+ ok(hr == S_OK, "%u: GetType error %#x\n", i, hr);
+ ok(type == WICBitmapPaletteTypeCustom, "expected WICBitmapPaletteTypeCustom, got %#x\n", type);
+
+ hr = IWICPalette_GetColorCount(palette, &count);
+ ok(hr == S_OK, "GetColorCount error %#x\n", hr);
+ ok(count == 256, "expected 256, got %u\n", count);
+
+ IWICPalette_Release(palette);
+
+ memset(data, 0, sizeof(data));
+ hr = IWICBitmap_CopyPixels(bitmap, NULL, 4, sizeof(data), data);
+ ok(hr == S_OK, "IWICBitmap_CopyPixels error %#x\n", hr);
+ for (i = 0; i < sizeof(data); i++)
+ ok(data[i] == data_8bpp_pal_wic[i], "%u: expected %#x, got %#x\n", i, data_8bpp_pal_wic[i], data[i]);
+
+ IWICBitmap_Release(bitmap);
+ DeleteObject(hbmp);
+ DeleteObject(hpal);
+}
+
START_TEST(bitmap)
{
HRESULT hr;
@@ -596,6 +783,7 @@ START_TEST(bitmap)
test_createbitmapfromsource();
test_CreateBitmapFromMemory();
test_CreateBitmapFromHICON();
+ test_CreateBitmapFromHBITMAP();
IWICImagingFactory_Release(factory);
diff --git a/include/wincodec.idl b/include/wincodec.idl
index c727bf3..ba58db7 100644
--- a/include/wincodec.idl
+++ b/include/wincodec.idl
@@ -219,6 +219,7 @@ cpp_quote("#define WINCODEC_ERR_BADMETADATAHEADER 0x88982f63")
cpp_quote("#define WINCODEC_ERR_UNSUPPORTEDPIXELFORMAT 0x88982f80")
cpp_quote("#define WINCODEC_ERR_UNSUPPORTEDOPERATION 0x88982f81")
cpp_quote("#define WINCODEC_ERR_INSUFFICIENTBUFFER 0x88982f8c")
+cpp_quote("#define WINCODEC_ERR_WIN32ERROR 0x88982f94")
interface IWICPalette;
More information about the wine-cvs
mailing list