From: Connor McAdams cmcadams@codeweavers.com
Signed-off-by: Connor McAdams cmcadams@codeweavers.com --- dlls/d3dx9_36/d3dx9_private.h | 60 +++++++++- dlls/d3dx9_36/surface.c | 32 ++--- dlls/d3dx9_36/texture.c | 7 +- dlls/d3dx9_36/util.c | 219 +++++++++++++++++++++++++--------- dlls/d3dx9_36/volume.c | 2 +- 5 files changed, 242 insertions(+), 78 deletions(-)
diff --git a/dlls/d3dx9_36/d3dx9_private.h b/dlls/d3dx9_36/d3dx9_private.h index d01682cc51e..2946731e74a 100644 --- a/dlls/d3dx9_36/d3dx9_private.h +++ b/dlls/d3dx9_36/d3dx9_private.h @@ -90,6 +90,56 @@ static inline void set_volume_struct(struct volume *volume, uint32_t width, uint volume->depth = depth; }
+/* These values act as indexes into the pixel_format_desc table. */ +enum d3dx_pixel_format_id +{ + D3DX_PIXEL_FORMAT_B8G8R8_UNORM, + D3DX_PIXEL_FORMAT_B8G8R8A8_UNORM, + D3DX_PIXEL_FORMAT_B8G8R8X8_UNORM, + D3DX_PIXEL_FORMAT_R8G8B8A8_UNORM, + D3DX_PIXEL_FORMAT_R8G8B8X8_UNORM, + D3DX_PIXEL_FORMAT_B5G6R5_UNORM, + D3DX_PIXEL_FORMAT_B5G5R5X1_UNORM, + D3DX_PIXEL_FORMAT_B5G5R5A1_UNORM, + D3DX_PIXEL_FORMAT_B2G3R3_UNORM, + D3DX_PIXEL_FORMAT_B2G3R3A8_UNORM, + D3DX_PIXEL_FORMAT_B4G4R4A4_UNORM, + D3DX_PIXEL_FORMAT_B4G4R4X4_UNORM, + D3DX_PIXEL_FORMAT_B10G10R10A2_UNORM, + D3DX_PIXEL_FORMAT_R10G10B10A2_UNORM, + D3DX_PIXEL_FORMAT_R16G16B16A16_UNORM, + D3DX_PIXEL_FORMAT_R16G16_UNORM, + D3DX_PIXEL_FORMAT_A8_UNORM, + D3DX_PIXEL_FORMAT_L8A8_UNORM, + D3DX_PIXEL_FORMAT_L4A4_UNORM, + D3DX_PIXEL_FORMAT_L8_UNORM, + D3DX_PIXEL_FORMAT_L16_UNORM, + D3DX_PIXEL_FORMAT_DXT1_UNORM, + D3DX_PIXEL_FORMAT_DXT2_UNORM, + D3DX_PIXEL_FORMAT_DXT3_UNORM, + D3DX_PIXEL_FORMAT_DXT4_UNORM, + D3DX_PIXEL_FORMAT_DXT5_UNORM, + D3DX_PIXEL_FORMAT_R16_FLOAT, + D3DX_PIXEL_FORMAT_R16G16_FLOAT, + D3DX_PIXEL_FORMAT_R16G16B16A16_FLOAT, + D3DX_PIXEL_FORMAT_R32_FLOAT, + D3DX_PIXEL_FORMAT_R32G32_FLOAT, + D3DX_PIXEL_FORMAT_R32G32B32A32_FLOAT, + D3DX_PIXEL_FORMAT_P8_UINT, + D3DX_PIXEL_FORMAT_P8_UINT_A8_UNORM, + D3DX_PIXEL_FORMAT_U8V8W8Q8_SNORM, + D3DX_PIXEL_FORMAT_U16V16W16Q16_SNORM, + D3DX_PIXEL_FORMAT_U8V8_SNORM, + D3DX_PIXEL_FORMAT_U16V16_SNORM, + D3DX_PIXEL_FORMAT_U8V8_SNORM_L8X8_UNORM, + D3DX_PIXEL_FORMAT_U10V10W10_SNORM_A2_UNORM, + D3DX_PIXEL_FORMAT_R8G8_B8G8_UNORM, + D3DX_PIXEL_FORMAT_G8R8_G8B8_UNORM, + D3DX_PIXEL_FORMAT_UYVY, + D3DX_PIXEL_FORMAT_YUY2, + D3DX_PIXEL_FORMAT_COUNT, +}; + /* for internal use */ enum component_type { @@ -108,7 +158,7 @@ enum format_flag };
struct pixel_format_desc { - D3DFORMAT format; + enum d3dx_pixel_format_id format; BYTE bits[4]; BYTE shift[4]; UINT bytes_per_pixel; @@ -185,7 +235,7 @@ extern const struct ID3DXIncludeVtbl d3dx_include_from_file_vtbl;
static inline BOOL is_unknown_format(const struct pixel_format_desc *format) { - return (format->format == D3DFMT_UNKNOWN); + return (format->format == D3DX_PIXEL_FORMAT_COUNT); }
static inline BOOL is_index_format(const struct pixel_format_desc *format) @@ -232,6 +282,8 @@ HRESULT load_resource_into_memory(HMODULE module, HRSRC resinfo, void **buffer,
HRESULT write_buffer_to_file(const WCHAR *filename, ID3DXBuffer *buffer);
+D3DFORMAT d3dformat_from_d3dx_pixel_format_id(enum d3dx_pixel_format_id format); +const struct pixel_format_desc *get_d3dx_pixel_format_info(enum d3dx_pixel_format_id format); const struct pixel_format_desc *get_format_info(D3DFORMAT format); const struct pixel_format_desc *get_format_info_idx(int idx);
@@ -256,8 +308,8 @@ HRESULT lock_surface(IDirect3DSurface9 *surface, const RECT *surface_rect, D3DLO HRESULT unlock_surface(IDirect3DSurface9 *surface, const RECT *surface_rect, IDirect3DSurface9 *temp_surface, BOOL update); HRESULT d3dx_pixels_init(const void *data, uint32_t row_pitch, uint32_t slice_pitch, - const PALETTEENTRY *palette, D3DFORMAT format, uint32_t left, uint32_t top, uint32_t right, uint32_t bottom, - uint32_t front, uint32_t back, struct d3dx_pixels *pixels); + const PALETTEENTRY *palette, enum d3dx_pixel_format_id format, uint32_t left, uint32_t top, uint32_t right, + uint32_t bottom, uint32_t front, uint32_t back, struct d3dx_pixels *pixels); HRESULT d3dx_load_pixels_from_pixels(struct d3dx_pixels *dst_pixels, const struct pixel_format_desc *dst_desc, struct d3dx_pixels *src_pixels, const struct pixel_format_desc *src_desc, uint32_t filter_flags, uint32_t color_key); diff --git a/dlls/d3dx9_36/surface.c b/dlls/d3dx9_36/surface.c index dcffab5e5ce..a0601119873 100644 --- a/dlls/d3dx9_36/surface.c +++ b/dlls/d3dx9_36/surface.c @@ -1100,12 +1100,14 @@ static HRESULT d3dx_image_tga_decode(const void *src_data, uint32_t src_data_siz * PALETTEENTRY is RGBA. */ src_desc = get_format_info(d3dx_get_tga_format_for_bpp(header->color_map_entrysize)); - hr = d3dx_calculate_pixels_size(src_desc->format, header->color_map_length, 1, &src_row_pitch, &src_slice_pitch); + hr = d3dx_calculate_pixels_size(d3dformat_from_d3dx_pixel_format_id(src_desc->format), header->color_map_length, + 1, &src_row_pitch, &src_slice_pitch); if (FAILED(hr)) goto exit;
dst_desc = get_format_info(D3DFMT_A8B8G8R8); - d3dx_calculate_pixels_size(dst_desc->format, 256, 1, &dst_row_pitch, &dst_slice_pitch); + d3dx_calculate_pixels_size(d3dformat_from_d3dx_pixel_format_id(dst_desc->format), 256, 1, &dst_row_pitch, + &dst_slice_pitch); convert_argb_pixels(src_palette, src_row_pitch, src_slice_pitch, &image_map_size, src_desc, (BYTE *)palette, dst_row_pitch, dst_slice_pitch, &image_map_size, dst_desc, 0, NULL);
@@ -2203,17 +2205,17 @@ static HRESULT d3dx_pixels_decompress(struct d3dx_pixels *pixels, const struct p
switch (desc->format) { - case D3DFMT_DXT1: + case D3DX_PIXEL_FORMAT_DXT1_UNORM: uncompressed_desc = get_format_info(D3DFMT_A8B8G8R8); fetch_dxt_texel = fetch_2d_texel_rgba_dxt1; break; - case D3DFMT_DXT2: - case D3DFMT_DXT3: + case D3DX_PIXEL_FORMAT_DXT2_UNORM: + case D3DX_PIXEL_FORMAT_DXT3_UNORM: uncompressed_desc = get_format_info(D3DFMT_A8B8G8R8); fetch_dxt_texel = fetch_2d_texel_rgba_dxt3; break; - case D3DFMT_DXT4: - case D3DFMT_DXT5: + case D3DX_PIXEL_FORMAT_DXT4_UNORM: + case D3DX_PIXEL_FORMAT_DXT5_UNORM: uncompressed_desc = get_format_info(D3DFMT_A8B8G8R8); fetch_dxt_texel = fetch_2d_texel_rgba_dxt5; break; @@ -2278,10 +2280,10 @@ exit: }
HRESULT d3dx_pixels_init(const void *data, uint32_t row_pitch, uint32_t slice_pitch, - const PALETTEENTRY *palette, D3DFORMAT format, uint32_t left, uint32_t top, uint32_t right, uint32_t bottom, - uint32_t front, uint32_t back, struct d3dx_pixels *pixels) + const PALETTEENTRY *palette, enum d3dx_pixel_format_id format, uint32_t left, uint32_t top, uint32_t right, + uint32_t bottom, uint32_t front, uint32_t back, struct d3dx_pixels *pixels) { - const struct pixel_format_desc *fmt_desc = get_format_info(format); + const struct pixel_format_desc *fmt_desc = get_d3dx_pixel_format_info(format); const BYTE *ptr = data; RECT unaligned_rect;
@@ -2429,15 +2431,15 @@ HRESULT d3dx_load_pixels_from_pixels(struct d3dx_pixels *dst_pixels, TRACE("Compressing DXTn surface.\n"); switch (dst_desc->format) { - case D3DFMT_DXT1: + case D3DX_PIXEL_FORMAT_DXT1_UNORM: gl_format = GL_COMPRESSED_RGBA_S3TC_DXT1_EXT; break; - case D3DFMT_DXT2: - case D3DFMT_DXT3: + case D3DX_PIXEL_FORMAT_DXT2_UNORM: + case D3DX_PIXEL_FORMAT_DXT3_UNORM: gl_format = GL_COMPRESSED_RGBA_S3TC_DXT3_EXT; break; - case D3DFMT_DXT4: - case D3DFMT_DXT5: + case D3DX_PIXEL_FORMAT_DXT4_UNORM: + case D3DX_PIXEL_FORMAT_DXT5_UNORM: gl_format = GL_COMPRESSED_RGBA_S3TC_DXT5_EXT; break; default: diff --git a/dlls/d3dx9_36/texture.c b/dlls/d3dx9_36/texture.c index fda6d44fe5a..6e220e39203 100644 --- a/dlls/d3dx9_36/texture.c +++ b/dlls/d3dx9_36/texture.c @@ -274,17 +274,20 @@ static HRESULT check_texture_requirements(struct IDirect3DDevice9 *device, UINT { unsigned int curchannels = !!curfmt->bits[0] + !!curfmt->bits[1] + !!curfmt->bits[2] + !!curfmt->bits[3]; + D3DFORMAT cur_d3dfmt; int score;
i++;
+ if ((cur_d3dfmt = d3dformat_from_d3dx_pixel_format_id(curfmt->format)) == D3DFMT_UNKNOWN) + continue; if (curchannels < channels) continue; if (curfmt->bytes_per_pixel == 3 && !allow_24bits) continue;
hr = IDirect3D9_CheckDeviceFormat(d3d, params.AdapterOrdinal, params.DeviceType, - mode.Format, usage, resource_type, curfmt->format); + mode.Format, usage, resource_type, cur_d3dfmt); if (FAILED(hr)) continue;
@@ -302,7 +305,7 @@ static HRESULT check_texture_requirements(struct IDirect3DDevice9 *device, UINT if (score > bestscore) { bestscore = score; - usedformat = curfmt->format; + usedformat = cur_d3dfmt; bestfmt = curfmt; } } diff --git a/dlls/d3dx9_36/util.c b/dlls/d3dx9_36/util.c index 31b6bdaeb8a..7126b4779dc 100644 --- a/dlls/d3dx9_36/util.c +++ b/dlls/d3dx9_36/util.c @@ -30,55 +30,162 @@ WINE_DEFAULT_DEBUG_CHANNEL(d3dx); */ static const struct pixel_format_desc formats[] = { - /* format bpc shifts bpp blocks alpha type rgb type flags */ - {D3DFMT_R8G8B8, { 0, 8, 8, 8}, { 0, 16, 8, 0}, 3, 1, 1, 3, CTYPE_EMPTY, CTYPE_UNORM, 0 }, - {D3DFMT_A8R8G8B8, { 8, 8, 8, 8}, {24, 16, 8, 0}, 4, 1, 1, 4, CTYPE_UNORM, CTYPE_UNORM, 0 }, - {D3DFMT_X8R8G8B8, { 0, 8, 8, 8}, { 0, 16, 8, 0}, 4, 1, 1, 4, CTYPE_EMPTY, CTYPE_UNORM, 0 }, - {D3DFMT_A8B8G8R8, { 8, 8, 8, 8}, {24, 0, 8, 16}, 4, 1, 1, 4, CTYPE_UNORM, CTYPE_UNORM, 0 }, - {D3DFMT_X8B8G8R8, { 0, 8, 8, 8}, { 0, 0, 8, 16}, 4, 1, 1, 4, CTYPE_EMPTY, CTYPE_UNORM, 0 }, - {D3DFMT_R5G6B5, { 0, 5, 6, 5}, { 0, 11, 5, 0}, 2, 1, 1, 2, CTYPE_EMPTY, CTYPE_UNORM, 0 }, - {D3DFMT_X1R5G5B5, { 0, 5, 5, 5}, { 0, 10, 5, 0}, 2, 1, 1, 2, CTYPE_EMPTY, CTYPE_UNORM, 0 }, - {D3DFMT_A1R5G5B5, { 1, 5, 5, 5}, {15, 10, 5, 0}, 2, 1, 1, 2, CTYPE_UNORM, CTYPE_UNORM, 0 }, - {D3DFMT_R3G3B2, { 0, 3, 3, 2}, { 0, 5, 2, 0}, 1, 1, 1, 1, CTYPE_EMPTY, CTYPE_UNORM, 0 }, - {D3DFMT_A8R3G3B2, { 8, 3, 3, 2}, { 8, 5, 2, 0}, 2, 1, 1, 2, CTYPE_UNORM, CTYPE_UNORM, 0 }, - {D3DFMT_A4R4G4B4, { 4, 4, 4, 4}, {12, 8, 4, 0}, 2, 1, 1, 2, CTYPE_UNORM, CTYPE_UNORM, 0 }, - {D3DFMT_X4R4G4B4, { 0, 4, 4, 4}, { 0, 8, 4, 0}, 2, 1, 1, 2, CTYPE_EMPTY, CTYPE_UNORM, 0 }, - {D3DFMT_A2R10G10B10, { 2, 10, 10, 10}, {30, 20, 10, 0}, 4, 1, 1, 4, CTYPE_UNORM, CTYPE_UNORM, 0 }, - {D3DFMT_A2B10G10R10, { 2, 10, 10, 10}, {30, 0, 10, 20}, 4, 1, 1, 4, CTYPE_UNORM, CTYPE_UNORM, 0 }, - {D3DFMT_A16B16G16R16, {16, 16, 16, 16}, {48, 0, 16, 32}, 8, 1, 1, 8, CTYPE_UNORM, CTYPE_UNORM, 0 }, - {D3DFMT_G16R16, { 0, 16, 16, 0}, { 0, 0, 16, 0}, 4, 1, 1, 4, CTYPE_EMPTY, CTYPE_UNORM, 0 }, - {D3DFMT_A8, { 8, 0, 0, 0}, { 0, 0, 0, 0}, 1, 1, 1, 1, CTYPE_UNORM, CTYPE_EMPTY, 0 }, - {D3DFMT_A8L8, { 8, 8, 0, 0}, { 8, 0, 0, 0}, 2, 1, 1, 2, CTYPE_UNORM, CTYPE_LUMA, 0 }, - {D3DFMT_A4L4, { 4, 4, 0, 0}, { 4, 0, 0, 0}, 1, 1, 1, 1, CTYPE_UNORM, CTYPE_LUMA, 0 }, - {D3DFMT_L8, { 0, 8, 0, 0}, { 0, 0, 0, 0}, 1, 1, 1, 1, CTYPE_EMPTY, CTYPE_LUMA, 0 }, - {D3DFMT_L16, { 0, 16, 0, 0}, { 0, 0, 0, 0}, 2, 1, 1, 2, CTYPE_EMPTY, CTYPE_LUMA, 0 }, - {D3DFMT_DXT1, { 0, 0, 0, 0}, { 0, 0, 0, 0}, 1, 4, 4, 8, CTYPE_UNORM, CTYPE_UNORM, FMT_FLAG_DXT}, - {D3DFMT_DXT2, { 0, 0, 0, 0}, { 0, 0, 0, 0}, 1, 4, 4, 16, CTYPE_UNORM, CTYPE_UNORM, FMT_FLAG_DXT}, - {D3DFMT_DXT3, { 0, 0, 0, 0}, { 0, 0, 0, 0}, 1, 4, 4, 16, CTYPE_UNORM, CTYPE_UNORM, FMT_FLAG_DXT}, - {D3DFMT_DXT4, { 0, 0, 0, 0}, { 0, 0, 0, 0}, 1, 4, 4, 16, CTYPE_UNORM, CTYPE_UNORM, FMT_FLAG_DXT}, - {D3DFMT_DXT5, { 0, 0, 0, 0}, { 0, 0, 0, 0}, 1, 4, 4, 16, CTYPE_UNORM, CTYPE_UNORM, FMT_FLAG_DXT}, - {D3DFMT_R16F, { 0, 16, 0, 0}, { 0, 0, 0, 0}, 2, 1, 1, 2, CTYPE_EMPTY, CTYPE_FLOAT, 0 }, - {D3DFMT_G16R16F, { 0, 16, 16, 0}, { 0, 0, 16, 0}, 4, 1, 1, 4, CTYPE_EMPTY, CTYPE_FLOAT, 0 }, - {D3DFMT_A16B16G16R16F, {16, 16, 16, 16}, {48, 0, 16, 32}, 8, 1, 1, 8, CTYPE_FLOAT, CTYPE_FLOAT, 0 }, - {D3DFMT_R32F, { 0, 32, 0, 0}, { 0, 0, 0, 0}, 4, 1, 1, 4, CTYPE_EMPTY, CTYPE_FLOAT, 0 }, - {D3DFMT_G32R32F, { 0, 32, 32, 0}, { 0, 0, 32, 0}, 8, 1, 1, 8, CTYPE_EMPTY, CTYPE_FLOAT, 0 }, - {D3DFMT_A32B32G32R32F, {32, 32, 32, 32}, {96, 0, 32, 64}, 16, 1, 1, 16, CTYPE_FLOAT, CTYPE_FLOAT, 0 }, - {D3DFMT_P8, { 8, 8, 8, 8}, { 0, 0, 0, 0}, 1, 1, 1, 1, CTYPE_INDEX, CTYPE_INDEX, 0 }, - {D3DFMT_A8P8, { 8, 8, 8, 8}, { 8, 0, 0, 0}, 2, 1, 1, 2, CTYPE_UNORM, CTYPE_INDEX, 0 }, - {D3DFMT_Q8W8V8U8, { 8, 8, 8, 8}, {24, 0, 8, 16}, 4, 1, 1, 4, CTYPE_SNORM, CTYPE_SNORM, 0 }, - {D3DFMT_Q16W16V16U16, {16, 16, 16, 16}, {48, 0, 16, 32}, 8, 1, 1, 8, CTYPE_SNORM, CTYPE_SNORM, 0 }, - {D3DFMT_V8U8, { 0, 8, 8, 0}, { 0, 0, 8, 0}, 2, 1, 1, 2, CTYPE_EMPTY, CTYPE_SNORM, 0 }, - {D3DFMT_V16U16, { 0, 16, 16, 0}, { 0, 0, 16, 0}, 4, 1, 1, 4, CTYPE_EMPTY, CTYPE_SNORM, 0 }, - {D3DFMT_X8L8V8U8, { 8, 8, 8, 0}, {16, 0, 8, 0}, 4, 1, 1, 4, CTYPE_UNORM, CTYPE_SNORM, 0 }, - {D3DFMT_A2W10V10U10, { 2, 10, 10, 10}, {30, 0, 10, 20}, 4, 1, 1, 4, CTYPE_UNORM, CTYPE_SNORM, 0 }, - {D3DFMT_R8G8_B8G8, { 0, 0, 0, 0}, { 0, 0, 0, 0}, 1, 2, 1, 4, CTYPE_EMPTY, CTYPE_UNORM, FMT_FLAG_PACKED}, - {D3DFMT_G8R8_G8B8, { 0, 0, 0, 0}, { 0, 0, 0, 0}, 1, 2, 1, 4, CTYPE_EMPTY, CTYPE_UNORM, FMT_FLAG_PACKED}, - {D3DFMT_UYVY, { 0, 0, 0, 0}, { 0, 0, 0, 0}, 1, 2, 1, 4, CTYPE_EMPTY, CTYPE_UNORM, FMT_FLAG_PACKED}, - {D3DFMT_YUY2, { 0, 0, 0, 0}, { 0, 0, 0, 0}, 1, 2, 1, 4, CTYPE_EMPTY, CTYPE_UNORM, FMT_FLAG_PACKED}, + /* format bpc shifts bpp blocks alpha type rgb type flags */ + {D3DX_PIXEL_FORMAT_B8G8R8_UNORM, { 0, 8, 8, 8}, { 0, 16, 8, 0}, 3, 1, 1, 3, CTYPE_EMPTY, CTYPE_UNORM, 0 }, + {D3DX_PIXEL_FORMAT_B8G8R8A8_UNORM, { 8, 8, 8, 8}, {24, 16, 8, 0}, 4, 1, 1, 4, CTYPE_UNORM, CTYPE_UNORM, 0 }, + {D3DX_PIXEL_FORMAT_B8G8R8X8_UNORM, { 0, 8, 8, 8}, { 0, 16, 8, 0}, 4, 1, 1, 4, CTYPE_EMPTY, CTYPE_UNORM, 0 }, + {D3DX_PIXEL_FORMAT_R8G8B8A8_UNORM, { 8, 8, 8, 8}, {24, 0, 8, 16}, 4, 1, 1, 4, CTYPE_UNORM, CTYPE_UNORM, 0 }, + {D3DX_PIXEL_FORMAT_R8G8B8X8_UNORM, { 0, 8, 8, 8}, { 0, 0, 8, 16}, 4, 1, 1, 4, CTYPE_EMPTY, CTYPE_UNORM, 0 }, + {D3DX_PIXEL_FORMAT_B5G6R5_UNORM, { 0, 5, 6, 5}, { 0, 11, 5, 0}, 2, 1, 1, 2, CTYPE_EMPTY, CTYPE_UNORM, 0 }, + {D3DX_PIXEL_FORMAT_B5G5R5X1_UNORM, { 0, 5, 5, 5}, { 0, 10, 5, 0}, 2, 1, 1, 2, CTYPE_EMPTY, CTYPE_UNORM, 0 }, + {D3DX_PIXEL_FORMAT_B5G5R5A1_UNORM, { 1, 5, 5, 5}, {15, 10, 5, 0}, 2, 1, 1, 2, CTYPE_UNORM, CTYPE_UNORM, 0 }, + {D3DX_PIXEL_FORMAT_B2G3R3_UNORM, { 0, 3, 3, 2}, { 0, 5, 2, 0}, 1, 1, 1, 1, CTYPE_EMPTY, CTYPE_UNORM, 0 }, + {D3DX_PIXEL_FORMAT_B2G3R3A8_UNORM, { 8, 3, 3, 2}, { 8, 5, 2, 0}, 2, 1, 1, 2, CTYPE_UNORM, CTYPE_UNORM, 0 }, + {D3DX_PIXEL_FORMAT_B4G4R4A4_UNORM, { 4, 4, 4, 4}, {12, 8, 4, 0}, 2, 1, 1, 2, CTYPE_UNORM, CTYPE_UNORM, 0 }, + {D3DX_PIXEL_FORMAT_B4G4R4X4_UNORM, { 0, 4, 4, 4}, { 0, 8, 4, 0}, 2, 1, 1, 2, CTYPE_EMPTY, CTYPE_UNORM, 0 }, + {D3DX_PIXEL_FORMAT_B10G10R10A2_UNORM, { 2, 10, 10, 10}, {30, 20, 10, 0}, 4, 1, 1, 4, CTYPE_UNORM, CTYPE_UNORM, 0 }, + {D3DX_PIXEL_FORMAT_R10G10B10A2_UNORM, { 2, 10, 10, 10}, {30, 0, 10, 20}, 4, 1, 1, 4, CTYPE_UNORM, CTYPE_UNORM, 0 }, + {D3DX_PIXEL_FORMAT_R16G16B16A16_UNORM, {16, 16, 16, 16}, {48, 0, 16, 32}, 8, 1, 1, 8, CTYPE_UNORM, CTYPE_UNORM, 0 }, + {D3DX_PIXEL_FORMAT_R16G16_UNORM, { 0, 16, 16, 0}, { 0, 0, 16, 0}, 4, 1, 1, 4, CTYPE_EMPTY, CTYPE_UNORM, 0 }, + {D3DX_PIXEL_FORMAT_A8_UNORM, { 8, 0, 0, 0}, { 0, 0, 0, 0}, 1, 1, 1, 1, CTYPE_UNORM, CTYPE_EMPTY, 0 }, + {D3DX_PIXEL_FORMAT_L8A8_UNORM, { 8, 8, 0, 0}, { 8, 0, 0, 0}, 2, 1, 1, 2, CTYPE_UNORM, CTYPE_LUMA, 0 }, + {D3DX_PIXEL_FORMAT_L4A4_UNORM, { 4, 4, 0, 0}, { 4, 0, 0, 0}, 1, 1, 1, 1, CTYPE_UNORM, CTYPE_LUMA, 0 }, + {D3DX_PIXEL_FORMAT_L8_UNORM, { 0, 8, 0, 0}, { 0, 0, 0, 0}, 1, 1, 1, 1, CTYPE_EMPTY, CTYPE_LUMA, 0 }, + {D3DX_PIXEL_FORMAT_L16_UNORM, { 0, 16, 0, 0}, { 0, 0, 0, 0}, 2, 1, 1, 2, CTYPE_EMPTY, CTYPE_LUMA, 0 }, + {D3DX_PIXEL_FORMAT_DXT1_UNORM, { 0, 0, 0, 0}, { 0, 0, 0, 0}, 1, 4, 4, 8, CTYPE_UNORM, CTYPE_UNORM, FMT_FLAG_DXT}, + {D3DX_PIXEL_FORMAT_DXT2_UNORM, { 0, 0, 0, 0}, { 0, 0, 0, 0}, 1, 4, 4, 16, CTYPE_UNORM, CTYPE_UNORM, FMT_FLAG_DXT}, + {D3DX_PIXEL_FORMAT_DXT3_UNORM, { 0, 0, 0, 0}, { 0, 0, 0, 0}, 1, 4, 4, 16, CTYPE_UNORM, CTYPE_UNORM, FMT_FLAG_DXT}, + {D3DX_PIXEL_FORMAT_DXT4_UNORM, { 0, 0, 0, 0}, { 0, 0, 0, 0}, 1, 4, 4, 16, CTYPE_UNORM, CTYPE_UNORM, FMT_FLAG_DXT}, + {D3DX_PIXEL_FORMAT_DXT5_UNORM, { 0, 0, 0, 0}, { 0, 0, 0, 0}, 1, 4, 4, 16, CTYPE_UNORM, CTYPE_UNORM, FMT_FLAG_DXT}, + {D3DX_PIXEL_FORMAT_R16_FLOAT, { 0, 16, 0, 0}, { 0, 0, 0, 0}, 2, 1, 1, 2, CTYPE_EMPTY, CTYPE_FLOAT, 0 }, + {D3DX_PIXEL_FORMAT_R16G16_FLOAT, { 0, 16, 16, 0}, { 0, 0, 16, 0}, 4, 1, 1, 4, CTYPE_EMPTY, CTYPE_FLOAT, 0 }, + {D3DX_PIXEL_FORMAT_R16G16B16A16_FLOAT, {16, 16, 16, 16}, {48, 0, 16, 32}, 8, 1, 1, 8, CTYPE_FLOAT, CTYPE_FLOAT, 0 }, + {D3DX_PIXEL_FORMAT_R32_FLOAT, { 0, 32, 0, 0}, { 0, 0, 0, 0}, 4, 1, 1, 4, CTYPE_EMPTY, CTYPE_FLOAT, 0 }, + {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_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 }, + {D3DX_PIXEL_FORMAT_U8V8W8Q8_SNORM, { 8, 8, 8, 8}, {24, 0, 8, 16}, 4, 1, 1, 4, CTYPE_SNORM, CTYPE_SNORM, 0 }, + {D3DX_PIXEL_FORMAT_U16V16W16Q16_SNORM, {16, 16, 16, 16}, {48, 0, 16, 32}, 8, 1, 1, 8, CTYPE_SNORM, CTYPE_SNORM, 0 }, + {D3DX_PIXEL_FORMAT_U8V8_SNORM, { 0, 8, 8, 0}, { 0, 0, 8, 0}, 2, 1, 1, 2, CTYPE_EMPTY, CTYPE_SNORM, 0 }, + {D3DX_PIXEL_FORMAT_U16V16_SNORM, { 0, 16, 16, 0}, { 0, 0, 16, 0}, 4, 1, 1, 4, CTYPE_EMPTY, CTYPE_SNORM, 0 }, + {D3DX_PIXEL_FORMAT_U8V8_SNORM_L8X8_UNORM, { 8, 8, 8, 0}, {16, 0, 8, 0}, 4, 1, 1, 4, CTYPE_UNORM, CTYPE_SNORM, 0 }, + {D3DX_PIXEL_FORMAT_U10V10W10_SNORM_A2_UNORM, { 2, 10, 10, 10}, {30, 0, 10, 20}, 4, 1, 1, 4, CTYPE_UNORM, CTYPE_SNORM, 0 }, + {D3DX_PIXEL_FORMAT_R8G8_B8G8_UNORM, { 0, 0, 0, 0}, { 0, 0, 0, 0}, 1, 2, 1, 4, CTYPE_EMPTY, CTYPE_UNORM, FMT_FLAG_PACKED}, + {D3DX_PIXEL_FORMAT_G8R8_G8B8_UNORM, { 0, 0, 0, 0}, { 0, 0, 0, 0}, 1, 2, 1, 4, CTYPE_EMPTY, CTYPE_UNORM, FMT_FLAG_PACKED}, + {D3DX_PIXEL_FORMAT_UYVY, { 0, 0, 0, 0}, { 0, 0, 0, 0}, 1, 2, 1, 4, CTYPE_EMPTY, CTYPE_UNORM, FMT_FLAG_PACKED}, + {D3DX_PIXEL_FORMAT_YUY2, { 0, 0, 0, 0}, { 0, 0, 0, 0}, 1, 2, 1, 4, CTYPE_EMPTY, CTYPE_UNORM, FMT_FLAG_PACKED}, /* marks last element */ - {D3DFMT_UNKNOWN, { 0, 0, 0, 0}, { 0, 0, 0, 0}, 0, 1, 1, 0, CTYPE_EMPTY, CTYPE_EMPTY, 0 }, + {D3DX_PIXEL_FORMAT_COUNT, { 0, 0, 0, 0}, { 0, 0, 0, 0}, 0, 1, 1, 0, CTYPE_EMPTY, CTYPE_EMPTY, 0 }, };
+D3DFORMAT d3dformat_from_d3dx_pixel_format_id(enum d3dx_pixel_format_id format) +{ + switch (format) + { + case D3DX_PIXEL_FORMAT_B8G8R8_UNORM: return D3DFMT_R8G8B8; + case D3DX_PIXEL_FORMAT_B8G8R8A8_UNORM: return D3DFMT_A8R8G8B8; + case D3DX_PIXEL_FORMAT_B8G8R8X8_UNORM: return D3DFMT_X8R8G8B8; + case D3DX_PIXEL_FORMAT_R8G8B8A8_UNORM: return D3DFMT_A8B8G8R8; + case D3DX_PIXEL_FORMAT_R8G8B8X8_UNORM: return D3DFMT_X8B8G8R8; + case D3DX_PIXEL_FORMAT_B5G6R5_UNORM: return D3DFMT_R5G6B5; + case D3DX_PIXEL_FORMAT_B5G5R5X1_UNORM: return D3DFMT_X1R5G5B5; + case D3DX_PIXEL_FORMAT_B5G5R5A1_UNORM: return D3DFMT_A1R5G5B5; + case D3DX_PIXEL_FORMAT_B2G3R3_UNORM: return D3DFMT_R3G3B2; + case D3DX_PIXEL_FORMAT_B2G3R3A8_UNORM: return D3DFMT_A8R3G3B2; + case D3DX_PIXEL_FORMAT_B4G4R4A4_UNORM: return D3DFMT_A4R4G4B4; + case D3DX_PIXEL_FORMAT_B4G4R4X4_UNORM: return D3DFMT_X4R4G4B4; + case D3DX_PIXEL_FORMAT_B10G10R10A2_UNORM: return D3DFMT_A2R10G10B10; + case D3DX_PIXEL_FORMAT_R10G10B10A2_UNORM: return D3DFMT_A2B10G10R10; + case D3DX_PIXEL_FORMAT_R16G16B16A16_UNORM: return D3DFMT_A16B16G16R16; + case D3DX_PIXEL_FORMAT_R16G16_UNORM: return D3DFMT_G16R16; + case D3DX_PIXEL_FORMAT_A8_UNORM: return D3DFMT_A8; + case D3DX_PIXEL_FORMAT_L8A8_UNORM: return D3DFMT_A8L8; + case D3DX_PIXEL_FORMAT_L4A4_UNORM: return D3DFMT_A4L4; + case D3DX_PIXEL_FORMAT_L8_UNORM: return D3DFMT_L8; + case D3DX_PIXEL_FORMAT_L16_UNORM: return D3DFMT_L16; + case D3DX_PIXEL_FORMAT_DXT1_UNORM: return D3DFMT_DXT1; + case D3DX_PIXEL_FORMAT_DXT2_UNORM: return D3DFMT_DXT2; + case D3DX_PIXEL_FORMAT_DXT3_UNORM: return D3DFMT_DXT3; + case D3DX_PIXEL_FORMAT_DXT4_UNORM: return D3DFMT_DXT4; + case D3DX_PIXEL_FORMAT_DXT5_UNORM: return D3DFMT_DXT5; + case D3DX_PIXEL_FORMAT_R16_FLOAT: return D3DFMT_R16F; + case D3DX_PIXEL_FORMAT_R16G16_FLOAT: return D3DFMT_G16R16F; + case D3DX_PIXEL_FORMAT_R16G16B16A16_FLOAT: return D3DFMT_A16B16G16R16F; + case D3DX_PIXEL_FORMAT_R32_FLOAT: return D3DFMT_R32F; + case D3DX_PIXEL_FORMAT_R32G32_FLOAT: return D3DFMT_G32R32F; + case D3DX_PIXEL_FORMAT_R32G32B32A32_FLOAT: return D3DFMT_A32B32G32R32F; + case D3DX_PIXEL_FORMAT_P8_UINT: return D3DFMT_P8; + case D3DX_PIXEL_FORMAT_P8_UINT_A8_UNORM: return D3DFMT_A8P8; + case D3DX_PIXEL_FORMAT_U8V8W8Q8_SNORM: return D3DFMT_Q8W8V8U8; + case D3DX_PIXEL_FORMAT_U8V8_SNORM: return D3DFMT_V8U8; + case D3DX_PIXEL_FORMAT_U16V16_SNORM: return D3DFMT_V16U16; + case D3DX_PIXEL_FORMAT_U8V8_SNORM_L8X8_UNORM: return D3DFMT_X8L8V8U8; + case D3DX_PIXEL_FORMAT_U10V10W10_SNORM_A2_UNORM: return D3DFMT_A2W10V10U10; + case D3DX_PIXEL_FORMAT_U16V16W16Q16_SNORM: return D3DFMT_Q16W16V16U16; + case D3DX_PIXEL_FORMAT_G8R8_G8B8_UNORM: return D3DFMT_G8R8_G8B8; + case D3DX_PIXEL_FORMAT_R8G8_B8G8_UNORM: return D3DFMT_R8G8_B8G8; + case D3DX_PIXEL_FORMAT_UYVY: return D3DFMT_UYVY; + case D3DX_PIXEL_FORMAT_YUY2: return D3DFMT_YUY2; + default: + FIXME("Unknown d3dx_pixel_format_id %u.\n", format); + return D3DFMT_UNKNOWN; + } +} + +static enum d3dx_pixel_format_id d3dx_pixel_format_id_from_d3dformat(D3DFORMAT format) +{ + switch (format) + { + case D3DFMT_R8G8B8: return D3DX_PIXEL_FORMAT_B8G8R8_UNORM; + case D3DFMT_A8R8G8B8: return D3DX_PIXEL_FORMAT_B8G8R8A8_UNORM; + case D3DFMT_X8R8G8B8: return D3DX_PIXEL_FORMAT_B8G8R8X8_UNORM; + case D3DFMT_A8B8G8R8: return D3DX_PIXEL_FORMAT_R8G8B8A8_UNORM; + case D3DFMT_X8B8G8R8: return D3DX_PIXEL_FORMAT_R8G8B8X8_UNORM; + case D3DFMT_R5G6B5: return D3DX_PIXEL_FORMAT_B5G6R5_UNORM; + case D3DFMT_X1R5G5B5: return D3DX_PIXEL_FORMAT_B5G5R5X1_UNORM; + case D3DFMT_A1R5G5B5: return D3DX_PIXEL_FORMAT_B5G5R5A1_UNORM; + case D3DFMT_R3G3B2: return D3DX_PIXEL_FORMAT_B2G3R3_UNORM; + case D3DFMT_A8R3G3B2: return D3DX_PIXEL_FORMAT_B2G3R3A8_UNORM; + case D3DFMT_A4R4G4B4: return D3DX_PIXEL_FORMAT_B4G4R4A4_UNORM; + case D3DFMT_X4R4G4B4: return D3DX_PIXEL_FORMAT_B4G4R4X4_UNORM; + case D3DFMT_A2R10G10B10: return D3DX_PIXEL_FORMAT_B10G10R10A2_UNORM; + case D3DFMT_A2B10G10R10: return D3DX_PIXEL_FORMAT_R10G10B10A2_UNORM; + case D3DFMT_A16B16G16R16: return D3DX_PIXEL_FORMAT_R16G16B16A16_UNORM; + case D3DFMT_G16R16: return D3DX_PIXEL_FORMAT_R16G16_UNORM; + case D3DFMT_A8: return D3DX_PIXEL_FORMAT_A8_UNORM; + case D3DFMT_A8L8: return D3DX_PIXEL_FORMAT_L8A8_UNORM; + case D3DFMT_A4L4: return D3DX_PIXEL_FORMAT_L4A4_UNORM; + case D3DFMT_L8: return D3DX_PIXEL_FORMAT_L8_UNORM; + case D3DFMT_L16: return D3DX_PIXEL_FORMAT_L16_UNORM; + case D3DFMT_DXT1: return D3DX_PIXEL_FORMAT_DXT1_UNORM; + case D3DFMT_DXT2: return D3DX_PIXEL_FORMAT_DXT2_UNORM; + case D3DFMT_DXT3: return D3DX_PIXEL_FORMAT_DXT3_UNORM; + case D3DFMT_DXT4: return D3DX_PIXEL_FORMAT_DXT4_UNORM; + case D3DFMT_DXT5: return D3DX_PIXEL_FORMAT_DXT5_UNORM; + case D3DFMT_R16F: return D3DX_PIXEL_FORMAT_R16_FLOAT; + case D3DFMT_G16R16F: return D3DX_PIXEL_FORMAT_R16G16_FLOAT; + case D3DFMT_A16B16G16R16F: return D3DX_PIXEL_FORMAT_R16G16B16A16_FLOAT; + case D3DFMT_R32F: return D3DX_PIXEL_FORMAT_R32_FLOAT; + case D3DFMT_G32R32F: return D3DX_PIXEL_FORMAT_R32G32_FLOAT; + case D3DFMT_A32B32G32R32F: return D3DX_PIXEL_FORMAT_R32G32B32A32_FLOAT; + case D3DFMT_P8: return D3DX_PIXEL_FORMAT_P8_UINT; + case D3DFMT_A8P8: return D3DX_PIXEL_FORMAT_P8_UINT_A8_UNORM; + case D3DFMT_Q8W8V8U8: return D3DX_PIXEL_FORMAT_U8V8W8Q8_SNORM; + case D3DFMT_V8U8: return D3DX_PIXEL_FORMAT_U8V8_SNORM; + case D3DFMT_V16U16: return D3DX_PIXEL_FORMAT_U16V16_SNORM; + case D3DFMT_X8L8V8U8: return D3DX_PIXEL_FORMAT_U8V8_SNORM_L8X8_UNORM; + case D3DFMT_A2W10V10U10: return D3DX_PIXEL_FORMAT_U10V10W10_SNORM_A2_UNORM; + case D3DFMT_Q16W16V16U16: return D3DX_PIXEL_FORMAT_U16V16W16Q16_SNORM; + case D3DFMT_R8G8_B8G8: return D3DX_PIXEL_FORMAT_R8G8_B8G8_UNORM; + case D3DFMT_G8R8_G8B8: return D3DX_PIXEL_FORMAT_G8R8_G8B8_UNORM; + case D3DFMT_UYVY: return D3DX_PIXEL_FORMAT_UYVY; + case D3DFMT_YUY2: return D3DX_PIXEL_FORMAT_YUY2; + default: + FIXME("No d3dx_pixel_format_id for D3DFORMAT %s.\n", debugstr_fourcc(format)); + return D3DX_PIXEL_FORMAT_COUNT; + } +}
/************************************************************ * map_view_of_file @@ -185,12 +292,16 @@ HRESULT write_buffer_to_file(const WCHAR *dst_filename, ID3DXBuffer *buffer) return hr; }
+const struct pixel_format_desc *get_d3dx_pixel_format_info(enum d3dx_pixel_format_id format) +{ + return &formats[min(format, D3DX_PIXEL_FORMAT_COUNT)]; +}
/************************************************************ * get_format_info * * Returns information about the specified format. - * If the format is unsupported, it's filled with the D3DFMT_UNKNOWN desc. + * If the format is unsupported, it's filled with the D3DX_PIXEL_FORMAT_COUNT desc. * * PARAMS * format [I] format whose description is queried @@ -198,20 +309,16 @@ HRESULT write_buffer_to_file(const WCHAR *dst_filename, ID3DXBuffer *buffer) */ const struct pixel_format_desc *get_format_info(D3DFORMAT format) { - unsigned int i = 0; - while(formats[i].format != format && formats[i].format != D3DFMT_UNKNOWN) i++; - if (formats[i].format == D3DFMT_UNKNOWN) + const struct pixel_format_desc *fmt_desc = &formats[d3dx_pixel_format_id_from_d3dformat(format)]; + + if (is_unknown_format(fmt_desc)) FIXME("Unknown format %s.\n", debugstr_fourcc(format)); - return &formats[i]; + return fmt_desc; }
const struct pixel_format_desc *get_format_info_idx(int idx) { - if(idx >= ARRAY_SIZE(formats)) - return NULL; - if(formats[idx].format == D3DFMT_UNKNOWN) - return NULL; - return &formats[idx]; + return idx < D3DX_PIXEL_FORMAT_COUNT ? &formats[idx] : NULL; }
#define WINE_D3DX_TO_STR(x) case x: return #x diff --git a/dlls/d3dx9_36/volume.c b/dlls/d3dx9_36/volume.c index 0d7fe4a7870..46a30bfeba1 100644 --- a/dlls/d3dx9_36/volume.c +++ b/dlls/d3dx9_36/volume.c @@ -136,7 +136,7 @@ HRESULT WINAPI D3DXLoadVolumeFromMemory(IDirect3DVolume9 *dst_volume, }
hr = d3dx_pixels_init(src_memory, src_row_pitch, src_slice_pitch, - src_palette, src_format, src_box->Left, src_box->Top, src_box->Right, src_box->Bottom, + src_palette, src_format_desc->format, src_box->Left, src_box->Top, src_box->Right, src_box->Bottom, src_box->Front, src_box->Back, &src_pixels); if (FAILED(hr)) return hr;