From: Connor McAdams cmcadams@codeweavers.com
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=58060 Signed-off-by: Connor McAdams cmcadams@codeweavers.com --- dlls/d3dx9_36/d3dx9_private.h | 1 + dlls/d3dx9_36/surface.c | 20 ++++++++++++++++---- dlls/d3dx9_36/tests/surface.c | 23 ++++++++++------------- dlls/d3dx9_36/util.c | 1 + 4 files changed, 28 insertions(+), 17 deletions(-)
diff --git a/dlls/d3dx9_36/d3dx9_private.h b/dlls/d3dx9_36/d3dx9_private.h index dd254e03a98..c8f72562953 100644 --- a/dlls/d3dx9_36/d3dx9_private.h +++ b/dlls/d3dx9_36/d3dx9_private.h @@ -201,6 +201,7 @@ enum d3dx_pixel_format_id D3DX_PIXEL_FORMAT_R32G32_FLOAT, D3DX_PIXEL_FORMAT_R32G32B32A32_FLOAT, D3DX_PIXEL_FORMAT_P1_UINT, + D3DX_PIXEL_FORMAT_P2_UINT, D3DX_PIXEL_FORMAT_P4_UINT, D3DX_PIXEL_FORMAT_P8_UINT, D3DX_PIXEL_FORMAT_P8_UINT_A8_UNORM, diff --git a/dlls/d3dx9_36/surface.c b/dlls/d3dx9_36/surface.c index 52e305191cb..7ead6ae3e78 100644 --- a/dlls/d3dx9_36/surface.c +++ b/dlls/d3dx9_36/surface.c @@ -40,6 +40,7 @@ static const struct { { &GUID_WICPixelFormat8bppIndexed, D3DX_PIXEL_FORMAT_P8_UINT }, { &GUID_WICPixelFormat1bppIndexed, D3DX_PIXEL_FORMAT_P1_UINT }, + { &GUID_WICPixelFormat2bppIndexed, D3DX_PIXEL_FORMAT_P2_UINT }, { &GUID_WICPixelFormat4bppIndexed, D3DX_PIXEL_FORMAT_P4_UINT }, { &GUID_WICPixelFormat8bppGray, D3DX_PIXEL_FORMAT_L8_UNORM }, { &GUID_WICPixelFormat16bppBGR555, D3DX_PIXEL_FORMAT_B5G5R5X1_UNORM }, @@ -1331,11 +1332,20 @@ static HRESULT d3dx_initialize_image_from_wic(const void *src_data, uint32_t src goto exit;
image->format = d3dx_pixel_format_id_from_wic_pixel_format(&pixel_format); - if (image->format == D3DX_PIXEL_FORMAT_COUNT) + switch (image->format) { - WARN("Unsupported pixel format %s.\n", debugstr_guid(&pixel_format)); - hr = D3DXERR_INVALIDDATA; - goto exit; + case D3DX_PIXEL_FORMAT_P2_UINT: + if (image->image_file_format != D3DXIFF_BMP) + break; + /* Fall through. */ + + case D3DX_PIXEL_FORMAT_COUNT: + WARN("Unsupported pixel format %s.\n", debugstr_guid(&pixel_format)); + hr = D3DXERR_INVALIDDATA; + goto exit; + + default: + break; }
if (image_is_argb(bitmap_frame, image)) @@ -1720,6 +1730,7 @@ void d3dximage_info_from_d3dx_image(D3DXIMAGE_INFO *info, struct d3dx_image *ima switch (image->format) { case D3DX_PIXEL_FORMAT_P1_UINT: + case D3DX_PIXEL_FORMAT_P2_UINT: case D3DX_PIXEL_FORMAT_P4_UINT: info->Format = D3DFMT_P8; break; @@ -2784,6 +2795,7 @@ static HRESULT d3dx_pixels_unpack_index(struct d3dx_pixels *pixels, const struct switch (desc->format) { case D3DX_PIXEL_FORMAT_P1_UINT: + case D3DX_PIXEL_FORMAT_P2_UINT: case D3DX_PIXEL_FORMAT_P4_UINT: unpacked_desc = get_d3dx_pixel_format_info(D3DX_PIXEL_FORMAT_P8_UINT); break; diff --git a/dlls/d3dx9_36/tests/surface.c b/dlls/d3dx9_36/tests/surface.c index 4886951894a..b20d30914e6 100644 --- a/dlls/d3dx9_36/tests/surface.c +++ b/dlls/d3dx9_36/tests/surface.c @@ -3780,20 +3780,17 @@ static void test_D3DXLoadSurface(IDirect3DDevice9 *device) /* 2bpp. */ hr = D3DXLoadSurfaceFromFileInMemory(surf, NULL, NULL, png_2_2_2bpp_indexed, sizeof(png_2_2_2bpp_indexed), &rect, D3DX_FILTER_NONE, 0, &info); - todo_wine ok(hr == D3D_OK, "Unexpected hr %#lx.\n", hr); - if (SUCCEEDED(hr)) - { - check_image_info(&info, 2, 2, 1, 1, D3DFMT_P8, D3DRTYPE_TEXTURE, D3DXIFF_PNG, FALSE); + ok(hr == D3D_OK, "Unexpected hr %#lx.\n", hr); + check_image_info(&info, 2, 2, 1, 1, D3DFMT_P8, D3DRTYPE_TEXTURE, D3DXIFF_PNG, FALSE);
- hr = IDirect3DSurface9_LockRect(surf, &lockrect, NULL, D3DLOCK_READONLY); - ok(hr == D3D_OK, "Failed to lock surface, hr %#lx.\n", hr); - check_pixel_4bpp(&lockrect, 0, 0, 0xffff0000); - check_pixel_4bpp(&lockrect, 1, 0, 0xff00ff00); - check_pixel_4bpp(&lockrect, 0, 1, 0xff0000ff); - check_pixel_4bpp(&lockrect, 1, 1, 0xffffffff); - hr = IDirect3DSurface9_UnlockRect(surf); - ok(hr == D3D_OK, "Failed to unlock surface, hr %#lx.\n", hr); - } + hr = IDirect3DSurface9_LockRect(surf, &lockrect, NULL, D3DLOCK_READONLY); + ok(hr == D3D_OK, "Failed to lock surface, hr %#lx.\n", hr); + check_pixel_4bpp(&lockrect, 0, 0, 0xffff0000); + check_pixel_4bpp(&lockrect, 1, 0, 0xff00ff00); + check_pixel_4bpp(&lockrect, 0, 1, 0xff0000ff); + check_pixel_4bpp(&lockrect, 1, 1, 0xffffffff); + hr = IDirect3DSurface9_UnlockRect(surf); + ok(hr == D3D_OK, "Failed to unlock surface, hr %#lx.\n", hr);
/* 4bpp. */ hr = D3DXLoadSurfaceFromFileInMemory(surf, NULL, NULL, png_2_2_4bpp_indexed, sizeof(png_2_2_4bpp_indexed), &rect, diff --git a/dlls/d3dx9_36/util.c b/dlls/d3dx9_36/util.c index 89f66066eaa..c41a8eb7647 100644 --- a/dlls/d3dx9_36/util.c +++ b/dlls/d3dx9_36/util.c @@ -65,6 +65,7 @@ static const struct pixel_format_desc formats[] = {D3DX_PIXEL_FORMAT_R32G32_FLOAT, { 0, 32, 32, 0}, { 0, 0, 32, 0}, 8, 1, 1, 8, CTYPE_EMPTY, CTYPE_FLOAT, 0 }, {D3DX_PIXEL_FORMAT_R32G32B32A32_FLOAT, {32, 32, 32, 32}, {96, 0, 32, 64}, 16, 1, 1, 16, CTYPE_FLOAT, CTYPE_FLOAT, 0 }, {D3DX_PIXEL_FORMAT_P1_UINT, { 8, 8, 8, 8}, { 0, 0, 0, 0}, 1, 8, 1, 1, CTYPE_INDEX, CTYPE_INDEX, FMT_FLAG_INTERNAL}, + {D3DX_PIXEL_FORMAT_P2_UINT, { 8, 8, 8, 8}, { 0, 0, 0, 0}, 1, 4, 1, 1, CTYPE_INDEX, CTYPE_INDEX, FMT_FLAG_INTERNAL}, {D3DX_PIXEL_FORMAT_P4_UINT, { 8, 8, 8, 8}, { 0, 0, 0, 0}, 1, 2, 1, 1, CTYPE_INDEX, CTYPE_INDEX, FMT_FLAG_INTERNAL}, {D3DX_PIXEL_FORMAT_P8_UINT, { 8, 8, 8, 8}, { 0, 0, 0, 0}, 1, 1, 1, 1, CTYPE_INDEX, CTYPE_INDEX, 0 }, {D3DX_PIXEL_FORMAT_P8_UINT_A8_UNORM, { 8, 8, 8, 8}, { 8, 0, 0, 0}, 2, 1, 1, 2, CTYPE_UNORM, CTYPE_INDEX, 0 },