Fixed legacy DDS writer.

This commit is contained in:
Branimir Karadžić
2017-05-25 15:08:46 -07:00
parent 279ec6a2f3
commit 878ea6f9e0

View File

@@ -1974,23 +1974,25 @@ namespace bimg
struct TranslateDdsPixelFormat
{
uint32_t m_bitCount;
uint32_t m_flags;
uint32_t m_bitmask[4];
TextureFormat::Enum m_textureFormat;
};
static const TranslateDdsPixelFormat s_translateDdsPixelFormat[] =
{
{ 8, { 0x000000ff, 0x00000000, 0x00000000, 0x00000000 }, TextureFormat::R8 },
{ 16, { 0x0000ffff, 0x00000000, 0x00000000, 0x00000000 }, TextureFormat::R16U },
{ 16, { 0x00000f00, 0x000000f0, 0x0000000f, 0x0000f000 }, TextureFormat::RGBA4 },
{ 16, { 0x0000f800, 0x000007e0, 0x0000001f, 0x00000000 }, TextureFormat::R5G6B5 },
{ 16, { 0x00007c00, 0x000003e0, 0x0000001f, 0x00008000 }, TextureFormat::RGB5A1 },
{ 24, { 0x00ff0000, 0x0000ff00, 0x000000ff, 0x00000000 }, TextureFormat::RGB8 },
{ 32, { 0x00ff0000, 0x0000ff00, 0x000000ff, 0xff000000 }, TextureFormat::BGRA8 },
{ 32, { 0x00ff0000, 0x0000ff00, 0x000000ff, 0x00000000 }, TextureFormat::BGRA8 },
{ 32, { 0x000003ff, 0x000ffc00, 0x3ff00000, 0xc0000000 }, TextureFormat::RGB10A2 },
{ 32, { 0x0000ffff, 0xffff0000, 0x00000000, 0x00000000 }, TextureFormat::RG16 },
{ 32, { 0xffffffff, 0x00000000, 0x00000000, 0x00000000 }, TextureFormat::R32U },
{ 8, DDPF_LUMINANCE, { 0x000000ff, 0x00000000, 0x00000000, 0x00000000 }, TextureFormat::R8 },
{ 16, DDPF_RGB, { 0x0000ffff, 0x00000000, 0x00000000, 0x00000000 }, TextureFormat::R16U },
{ 16, DDPF_RGB|DDPF_ALPHAPIXELS, { 0x00000f00, 0x000000f0, 0x0000000f, 0x0000f000 }, TextureFormat::RGBA4 },
{ 16, DDPF_RGB, { 0x0000f800, 0x000007e0, 0x0000001f, 0x00000000 }, TextureFormat::R5G6B5 },
{ 16, DDPF_RGB, { 0x00007c00, 0x000003e0, 0x0000001f, 0x00008000 }, TextureFormat::RGB5A1 },
{ 24, DDPF_RGB, { 0x00ff0000, 0x0000ff00, 0x000000ff, 0x00000000 }, TextureFormat::RGB8 },
{ 32, DDPF_RGB|DDPF_ALPHAPIXELS, { 0x000000ff, 0x0000ff00, 0x00ff0000, 0xff000000 }, TextureFormat::RGBA8 },
{ 32, DDPF_RGB|DDPF_ALPHAPIXELS, { 0x00ff0000, 0x0000ff00, 0x000000ff, 0xff000000 }, TextureFormat::BGRA8 }, // D3DFMT_A8R8G8B8
{ 32, DDPF_RGB|DDPF_ALPHAPIXELS, { 0x00ff0000, 0x0000ff00, 0x000000ff, 0x00000000 }, TextureFormat::BGRA8 }, // D3DFMT_X8R8G8B8
{ 32, DDPF_RGB|DDPF_ALPHAPIXELS, { 0x000003ff, 0x000ffc00, 0x3ff00000, 0xc0000000 }, TextureFormat::RGB10A2 },
{ 32, DDPF_RGB, { 0x0000ffff, 0xffff0000, 0x00000000, 0x00000000 }, TextureFormat::RG16 },
{ 32, DDPF_RGB, { 0xffffffff, 0x00000000, 0x00000000, 0x00000000 }, TextureFormat::R32U },
};
bool imageParseDds(ImageContainer& _imageContainer, bx::ReaderSeekerI* _reader, bx::Error* _err)
@@ -3256,20 +3258,34 @@ namespace bimg
{
BX_ERROR_SCOPE(_err);
uint32_t dxgiFormat = 0;
for (uint32_t ii = 0; ii < BX_COUNTOF(s_translateDxgiFormat); ++ii)
uint32_t ddspf = UINT32_MAX;
uint32_t dxgiFormat = UINT32_MAX;
for (uint32_t ii = 0; ii < BX_COUNTOF(s_translateDdsPixelFormat); ++ii)
{
if (s_translateDxgiFormat[ii].m_textureFormat == _format)
if (s_translateDdsPixelFormat[ii].m_textureFormat == _format)
{
dxgiFormat = s_translateDxgiFormat[ii].m_format;
ddspf = ii;
break;
}
}
if (0 == dxgiFormat)
if (UINT32_MAX == ddspf)
{
BX_ERROR_SET(_err, BIMG_ERROR, "DDS: DXGI format not supported.");
return 0;
for (uint32_t ii = 0; ii < BX_COUNTOF(s_translateDxgiFormat); ++ii)
{
if (s_translateDxgiFormat[ii].m_textureFormat == _format)
{
dxgiFormat = s_translateDxgiFormat[ii].m_format;
break;
}
}
if (UINT32_MAX == dxgiFormat)
{
BX_ERROR_SET(_err, BIMG_ERROR, "DDS: DXGI format not supported.");
return 0;
}
}
const uint32_t bpp = getBitsPerPixel(_format);
@@ -3303,10 +3319,24 @@ namespace bimg
total += bx::writeRep(_writer, 0, 44, _err); // reserved1
total += bx::write(_writer, uint32_t(8*sizeof(uint32_t) ), _err); // pixelFormatSize
total += bx::write(_writer, uint32_t(DDPF_FOURCC), _err);
total += bx::write(_writer, uint32_t(DDS_DX10), _err);
total += bx::writeRep(_writer, 0, 5*sizeof(uint32_t), _err); // bitmask
if (UINT32_MAX != ddspf)
{
const TranslateDdsPixelFormat& pf = s_translateDdsPixelFormat[ddspf];
total += bx::write(_writer, uint32_t(8*sizeof(uint32_t) ), _err); // pixelFormatSize
total += bx::write(_writer, pf.m_flags, _err);
total += bx::write(_writer, uint32_t(0), _err);
total += bx::write(_writer, pf.m_bitCount, _err);
total += bx::write(_writer, pf.m_bitmask, _err);
}
else
{
total += bx::write(_writer, uint32_t(8*sizeof(uint32_t) ), _err); // pixelFormatSize
total += bx::write(_writer, uint32_t(DDPF_FOURCC), _err);
total += bx::write(_writer, uint32_t(DDS_DX10), _err);
total += bx::write(_writer, uint32_t(0), _err); // bitCount
total += bx::writeRep(_writer, 0, 4*sizeof(uint32_t), _err); // bitmask
}
uint32_t caps[4] =
{
@@ -3325,18 +3355,21 @@ namespace bimg
, DDS_HEADER_SIZE
);
total += bx::write(_writer, dxgiFormat);
total += bx::write(_writer, uint32_t(1 < _depth ? DDS_DX10_DIMENSION_TEXTURE3D : DDS_DX10_DIMENSION_TEXTURE2D), _err); // dims
total += bx::write(_writer, uint32_t(_cubeMap ? DDS_DX10_MISC_TEXTURECUBE : 0), _err); // miscFlags
total += bx::write(_writer, uint32_t(1), _err); // arraySize
total += bx::write(_writer, uint32_t(0), _err); // miscFlags2
if (UINT32_MAX != dxgiFormat)
{
total += bx::write(_writer, dxgiFormat);
total += bx::write(_writer, uint32_t(1 < _depth ? DDS_DX10_DIMENSION_TEXTURE3D : DDS_DX10_DIMENSION_TEXTURE2D), _err); // dims
total += bx::write(_writer, uint32_t(_cubeMap ? DDS_DX10_MISC_TEXTURECUBE : 0), _err); // miscFlags
total += bx::write(_writer, uint32_t(1), _err); // arraySize
total += bx::write(_writer, uint32_t(0), _err); // miscFlags2
BX_WARN(total-headerStart == DDS_HEADER_SIZE+20
, "DDS: Failed to write header size %d (expected: %d)."
, total-headerStart
, DDS_HEADER_SIZE+20
);
BX_UNUSED(headerStart);
BX_WARN(total-headerStart == DDS_HEADER_SIZE+20
, "DDS: Failed to write header size %d (expected: %d)."
, total-headerStart
, DDS_HEADER_SIZE+20
);
BX_UNUSED(headerStart);
}
return total;
}