diff --git a/src/image_decode.cpp b/src/image_decode.cpp index deb3cd4..d7213ae 100644 --- a/src/image_decode.cpp +++ b/src/image_decode.cpp @@ -110,8 +110,8 @@ namespace bimg case 1: case 2: case 4: - format = bimg::TextureFormat::R8; - palette = false; + palette = LCT_PALETTE == state.info_raw.colortype; + format = palette ? bimg::TextureFormat::RGBA8 : bimg::TextureFormat::R8; supported = true; break; @@ -215,7 +215,10 @@ namespace bimg const uint8_t* copyData = data; TextureFormat::Enum dstFormat = format; - if (1 == state.info_raw.bitdepth + if (palette) { + copyData = NULL; + } + else if (1 == state.info_raw.bitdepth || 2 == state.info_raw.bitdepth || 4 == state.info_raw.bitdepth) { @@ -227,10 +230,6 @@ namespace bimg dstFormat = bimg::TextureFormat::RGBA16; copyData = NULL; } - else if (palette) - { - copyData = NULL; - } output = imageAlloc(_allocator , dstFormat @@ -243,7 +242,48 @@ namespace bimg , copyData ); - if (1 == state.info_raw.bitdepth) + if (palette) + { + if (1 == state.info_raw.bitdepth) { + for (uint32_t ii = 0, num = width*height/8; ii < num; ++ii) + { + uint8_t* dst = (uint8_t*)output->m_data + ii*32; + bx::memCopy(dst, state.info_raw.palette + ( (data[ii]>>7)&0x1)*4, 4); + bx::memCopy(dst + 4, state.info_raw.palette + ( (data[ii]>>6)&0x1)*4, 4); + bx::memCopy(dst + 8, state.info_raw.palette + ( (data[ii]>>5)&0x1)*4, 4); + bx::memCopy(dst + 12, state.info_raw.palette + ( (data[ii]>>4)&0x1)*4, 4); + bx::memCopy(dst + 16, state.info_raw.palette + ( (data[ii]>>3)&0x1)*4, 4); + bx::memCopy(dst + 20, state.info_raw.palette + ( (data[ii]>>2)&0x1)*4, 4); + bx::memCopy(dst + 24, state.info_raw.palette + ( (data[ii]>>1)&0x1)*4, 4); + bx::memCopy(dst + 28, state.info_raw.palette + ( data[ii] &0x1)*4, 4); + } + } + else if (2 == state.info_raw.bitdepth) { + for (uint32_t ii = 0, num = width*height/4; ii < num; ++ii) + { + uint8_t* dst = (uint8_t*)output->m_data + ii*16; + bx::memCopy(dst, state.info_raw.palette + ( (data[ii]>>6)&0x3)*4, 4); + bx::memCopy(dst + 4, state.info_raw.palette + ( (data[ii]>>4)&0x3)*4, 4); + bx::memCopy(dst + 8, state.info_raw.palette + ( (data[ii]>>2)&0x3)*4, 4); + bx::memCopy(dst + 12, state.info_raw.palette + ( data[ii] &0x3)*4, 4); + } + } + else if (4 == state.info_raw.bitdepth) { + for (uint32_t ii = 0, num = width*height/2; ii < num; ++ii) + { + uint8_t* dst = (uint8_t*)output->m_data + ii*8; + bx::memCopy(dst, state.info_raw.palette + ( (data[ii]>>4)&0xf)*4, 4); + bx::memCopy(dst + 4, state.info_raw.palette + ( data[ii] &0xf)*4, 4); + } + } + else { + for (uint32_t ii = 0, num = width*height; ii < num; ++ii) + { + bx::memCopy( (uint8_t*)output->m_data + ii*4, state.info_raw.palette + data[ii]*4, 4); + } + } + } + else if (1 == state.info_raw.bitdepth) { for (uint32_t ii = 0, num = width*height/8; ii < num; ++ii) { @@ -305,13 +345,6 @@ namespace bimg dst[3] = UINT16_MAX; } } - else if (palette) - { - for (uint32_t ii = 0, num = width*height; ii < num; ++ii) - { - bx::memCopy( (uint8_t*)output->m_data + ii*4, state.info_raw.palette + data[ii]*4, 4); - } - } switch (state.info_raw.colortype) //Check for alpha values {