d3dx9: Implement conversion from D3DFORMAT to DDS pixel format for RGB pixel formats.

This commit is contained in:
Józef Kucia 2012-09-24 13:46:40 +02:00 committed by Alexandre Julliard
parent 94ab09a226
commit 934293c1ec
1 changed files with 39 additions and 32 deletions

View File

@ -166,17 +166,14 @@ static D3DFORMAT dds_fourcc_to_d3dformat(DWORD fourcc)
return D3DFMT_UNKNOWN;
}
static D3DFORMAT dds_rgb_to_d3dformat(const struct dds_pixel_format *pixel_format)
{
int i;
static const struct {
static const struct {
DWORD bpp;
DWORD rmask;
DWORD gmask;
DWORD bmask;
DWORD amask;
D3DFORMAT format;
} rgb_pixel_formats[] = {
} rgb_pixel_formats[] = {
{ 8, 0xe0, 0x1c, 0x03, 0, D3DFMT_R3G3B2 },
{ 16, 0xf800, 0x07e0, 0x001f, 0x0000, D3DFMT_R5G6B5 },
{ 16, 0x7c00, 0x03e0, 0x001f, 0x8000, D3DFMT_A1R5G5B5 },
@ -192,7 +189,11 @@ static D3DFORMAT dds_rgb_to_d3dformat(const struct dds_pixel_format *pixel_forma
{ 32, 0x0000ffff, 0xffff0000, 0x00000000, 0x00000000, D3DFMT_G16R16 },
{ 32, 0x000000ff, 0x0000ff00, 0x00ff0000, 0xff000000, D3DFMT_A8B8G8R8 },
{ 32, 0x000000ff, 0x0000ff00, 0x00ff0000, 0x00000000, D3DFMT_X8B8G8R8 },
};
};
static D3DFORMAT dds_rgb_to_d3dformat(const struct dds_pixel_format *pixel_format)
{
int i;
for (i = 0; i < sizeof(rgb_pixel_formats) / sizeof(rgb_pixel_formats[0]); i++)
{
@ -277,20 +278,26 @@ static D3DFORMAT dds_pixel_format_to_d3dformat(const struct dds_pixel_format *pi
static HRESULT d3dformat_to_dds_pixel_format(struct dds_pixel_format *pixel_format, D3DFORMAT d3dformat)
{
int i;
memset(pixel_format, 0, sizeof(*pixel_format));
pixel_format->size = sizeof(*pixel_format);
if (d3dformat == D3DFMT_R8G8B8)
for (i = 0; i < sizeof(rgb_pixel_formats) / sizeof(rgb_pixel_formats[0]); i++)
{
pixel_format->flags = DDS_PF_RGB;
pixel_format->bpp = 24;
pixel_format->rmask = 0xff0000;
pixel_format->gmask = 0x00ff00;
pixel_format->bmask = 0x0000ff;
pixel_format->amask = 0x000000;
if (rgb_pixel_formats[i].format == d3dformat)
{
pixel_format->flags |= DDS_PF_RGB;
pixel_format->bpp = rgb_pixel_formats[i].bpp;
pixel_format->rmask = rgb_pixel_formats[i].rmask;
pixel_format->gmask = rgb_pixel_formats[i].gmask;
pixel_format->bmask = rgb_pixel_formats[i].bmask;
pixel_format->amask = rgb_pixel_formats[i].amask;
if (pixel_format->amask) pixel_format->flags |= DDS_PF_ALPHA;
return D3D_OK;
}
}
WARN("Unknown pixel format %#x\n", d3dformat);
return E_NOTIMPL;