From: Connor McAdams cmcadams@codeweavers.com
Signed-off-by: Connor McAdams cmcadams@codeweavers.com --- dlls/d3dx10_43/texture.c | 40 +++++++++++++++++++++++++----------- dlls/d3dx9_36/d3dx_helpers.c | 18 ++++++++++++++++ dlls/d3dx9_36/d3dx_helpers.h | 4 ++++ 3 files changed, 50 insertions(+), 12 deletions(-)
diff --git a/dlls/d3dx10_43/texture.c b/dlls/d3dx10_43/texture.c index 1f9998ad27a..ed9cdd0e0f4 100644 --- a/dlls/d3dx10_43/texture.c +++ b/dlls/d3dx10_43/texture.c @@ -161,6 +161,9 @@ static D3DX10_IMAGE_FILE_FORMAT d3dx10_image_file_format_from_d3dx_image_file_fo case D3DX_IMAGE_FILE_FORMAT_JPG: return D3DX10_IFF_JPG; case D3DX_IMAGE_FILE_FORMAT_PNG: return D3DX10_IFF_PNG; case D3DX_IMAGE_FILE_FORMAT_DDS: return D3DX10_IFF_DDS; + case D3DX_IMAGE_FILE_FORMAT_TIFF: return D3DX10_IFF_TIFF; + case D3DX_IMAGE_FILE_FORMAT_GIF: return D3DX10_IFF_GIF; + case D3DX_IMAGE_FILE_FORMAT_WMP: return D3DX10_IFF_WMP; case D3DX_IMAGE_FILE_FORMAT_DDS_DXT10: return D3DX10_IFF_DDS; default: FIXME("No D3DX10_IMAGE_FILE_FORMAT for d3dx_image_file_format %d.\n", iff); @@ -522,20 +525,31 @@ static HRESULT d3dx10_image_info_from_d3dx_image(D3DX10_IMAGE_INFO *info, struct DXGI_FORMAT format;
memset(info, 0, sizeof(*info)); - if (image->image_file_format == D3DX_IMAGE_FILE_FORMAT_DDS_DXT10) - format = dxgi_format_from_d3dx_pixel_format_id(image->format); - else - format = dxgi_format_from_legacy_dds_d3dx_pixel_format_id(image->format); + switch (image->image_file_format) + { + case D3DX_IMAGE_FILE_FORMAT_DDS_DXT10: + format = dxgi_format_from_d3dx_pixel_format_id(image->format); + break; + + case D3DX_IMAGE_FILE_FORMAT_DDS: + format = dxgi_format_from_legacy_dds_d3dx_pixel_format_id(image->format); + break; + + default: + if (iff == D3DX10_IFF_FORCE_DWORD) + return E_FAIL; + + /* All other image file formats use the default format. */ + format = DXGI_FORMAT_R8G8B8A8_UNORM; + break; + }
if (format == DXGI_FORMAT_UNKNOWN) { - WARN("Tried to load DDS file with unsupported format %#x.\n", image->format); + WARN("Tried to load file with unsupported pixel format %#x.\n", image->format); return E_FAIL; }
- if (iff == D3DX10_IFF_FORCE_DWORD) - return E_FAIL; - switch (image->resource_type) { case D3DX_RESOURCE_TYPE_TEXTURE_2D: @@ -580,10 +594,12 @@ HRESULT get_image_info(const void *data, SIZE_T size, D3DX10_IMAGE_INFO *img_inf if (!data || !size) return E_FAIL;
- if (SUCCEEDED(d3dx_image_init(data, size, &image, 0, D3DX_IMAGE_INFO_ONLY | D3DX_IMAGE_SUPPORT_DXT10)) - && (image.image_file_format == D3DX_IMAGE_FILE_FORMAT_DDS - || (image.image_file_format == D3DX_IMAGE_FILE_FORMAT_DDS_DXT10))) - return d3dx10_image_info_from_d3dx_image(img_info, &image); + if (SUCCEEDED(d3dx_image_init(data, size, &image, 0, D3DX_IMAGE_INFO_ONLY | D3DX_IMAGE_SUPPORT_DXT10))) + { + hr = d3dx10_image_info_from_d3dx_image(img_info, &image); + if (SUCCEEDED(hr)) + return hr; + }
WICCreateImagingFactory_Proxy(WINCODEC_SDK_VERSION, &factory); IWICImagingFactory_CreateStream(factory, &stream); diff --git a/dlls/d3dx9_36/d3dx_helpers.c b/dlls/d3dx9_36/d3dx_helpers.c index b44ff3ce6c9..60394ca1d9b 100644 --- a/dlls/d3dx9_36/d3dx_helpers.c +++ b/dlls/d3dx9_36/d3dx_helpers.c @@ -526,6 +526,9 @@ static const GUID *wic_container_guid_from_d3dx_file_format(enum d3dx_image_file case D3DX_IMAGE_FILE_FORMAT_BMP: return &GUID_ContainerFormatBmp; case D3DX_IMAGE_FILE_FORMAT_JPG: return &GUID_ContainerFormatJpeg; case D3DX_IMAGE_FILE_FORMAT_PNG: return &GUID_ContainerFormatPng; + case D3DX_IMAGE_FILE_FORMAT_TIFF: return &GUID_ContainerFormatTiff; + case D3DX_IMAGE_FILE_FORMAT_GIF: return &GUID_ContainerFormatGif; + case D3DX_IMAGE_FILE_FORMAT_WMP: return &GUID_ContainerFormatWmp; default: assert(0 && "Unexpected file format."); return NULL; @@ -1002,6 +1005,12 @@ static const uint8_t ppm_raw_file_signature[] = { 'P', '6' }; static const uint8_t hdr_file_signature[] = { '#', '?', 'R', 'A', 'D', 'I', 'A', 'N', 'C', 'E', '\n' }; static const uint8_t pfm_color_file_signature[] = { 'P', 'F' }; static const uint8_t pfm_gray_file_signature[] = { 'P', 'f' }; +static const uint8_t tiff_le_file_signature[] = { 'I', 'I', 0x2a, 0x00 }; +static const uint8_t tiff_be_file_signature[] = { 'M', 'M', 0x00, 0x2a }; +static const uint8_t gif_87a_file_signature[] = { 'G', 'I', 'F', '8', '7', 'a' }; +static const uint8_t gif_89a_file_signature[] = { 'G', 'I', 'F', '8', '9', 'a' }; +static const uint8_t wmp_v0_file_signature[] = { 'I', 'I', 0xbc, 0x00 }; +static const uint8_t wmp_v1_file_signature[] = { 'I', 'I', 0xbc, 0x01 };
/* * If none of these match, the file is either DIB, TGA, or something we don't @@ -1025,6 +1034,12 @@ static const struct d3dx_file_format_signature file_format_signatures[] = { hdr_file_signature, sizeof(hdr_file_signature), D3DX_IMAGE_FILE_FORMAT_HDR }, { pfm_color_file_signature, sizeof(pfm_color_file_signature), D3DX_IMAGE_FILE_FORMAT_PFM }, { pfm_gray_file_signature, sizeof(pfm_gray_file_signature), D3DX_IMAGE_FILE_FORMAT_PFM }, + { tiff_le_file_signature, sizeof(tiff_le_file_signature), D3DX_IMAGE_FILE_FORMAT_TIFF }, + { tiff_be_file_signature, sizeof(tiff_be_file_signature), D3DX_IMAGE_FILE_FORMAT_TIFF }, + { gif_87a_file_signature, sizeof(gif_87a_file_signature), D3DX_IMAGE_FILE_FORMAT_GIF }, + { gif_89a_file_signature, sizeof(gif_89a_file_signature), D3DX_IMAGE_FILE_FORMAT_GIF }, + { wmp_v0_file_signature, sizeof(wmp_v0_file_signature), D3DX_IMAGE_FILE_FORMAT_WMP }, + { wmp_v1_file_signature, sizeof(wmp_v1_file_signature), D3DX_IMAGE_FILE_FORMAT_WMP }, };
static BOOL d3dx_get_image_file_format_from_file_signature(const void *src_data, uint32_t src_data_size, @@ -1768,6 +1783,9 @@ HRESULT d3dx_image_init(const void *src_data, uint32_t src_data_size, struct d3d case D3DX_IMAGE_FILE_FORMAT_BMP: case D3DX_IMAGE_FILE_FORMAT_JPG: case D3DX_IMAGE_FILE_FORMAT_PNG: + case D3DX_IMAGE_FILE_FORMAT_TIFF: + case D3DX_IMAGE_FILE_FORMAT_GIF: + case D3DX_IMAGE_FILE_FORMAT_WMP: hr = d3dx_initialize_image_from_wic(src_data, src_data_size, image, iff, flags); break;
diff --git a/dlls/d3dx9_36/d3dx_helpers.h b/dlls/d3dx9_36/d3dx_helpers.h index b7fc2186b35..8263d832bfa 100644 --- a/dlls/d3dx9_36/d3dx_helpers.h +++ b/dlls/d3dx9_36/d3dx_helpers.h @@ -149,6 +149,10 @@ enum d3dx_image_file_format D3DX_IMAGE_FILE_FORMAT_DIB = 6, D3DX_IMAGE_FILE_FORMAT_HDR = 7, D3DX_IMAGE_FILE_FORMAT_PFM = 8, + /* TIFF/GIF/WMP are only available on D3DX10/D3DX11. */ + D3DX_IMAGE_FILE_FORMAT_TIFF = 10, + D3DX_IMAGE_FILE_FORMAT_GIF = 11, + D3DX_IMAGE_FILE_FORMAT_WMP = 12, /* This is a Wine only file format value. */ D3DX_IMAGE_FILE_FORMAT_DDS_DXT10 = 100, D3DX_IMAGE_FILE_FORMAT_FORCE_DWORD = 0x7fffffff