diff --git a/src/image_decode.cpp b/src/image_decode.cpp index 99d13c2..5959bdf 100644 --- a/src/image_decode.cpp +++ b/src/image_decode.cpp @@ -104,7 +104,9 @@ namespace bimg switch (state.info_raw.bitdepth) { case 1: - format = bimg::TextureFormat::R1; + case 2: + case 4: + format = bimg::TextureFormat::R8; palette = false; supported = true; break; @@ -203,10 +205,11 @@ namespace bimg const uint8_t* copyData = data; TextureFormat::Enum dstFormat = format; - if (1 == state.info_raw.bitdepth) + if (1 == state.info_raw.bitdepth + || 2 == state.info_raw.bitdepth + || 4 == state.info_raw.bitdepth) { - dstFormat = bimg::TextureFormat::R8; - copyData = NULL; + copyData = NULL; } else if (16 == state.info_raw.bitdepth && LCT_RGB == state.info_raw.colortype) @@ -234,16 +237,49 @@ namespace bimg { for (uint32_t ii = 0, num = width*height/8; ii < num; ++ii) { - uint8_t value = data[ii]; - uint8_t* dst = (uint8_t*)output->m_data + ii * 8; - dst[0] = value & 0x01 ? 255 : 0; - dst[1] = value & 0x02 ? 255 : 0; - dst[2] = value & 0x04 ? 255 : 0; - dst[3] = value & 0x08 ? 255 : 0; - dst[4] = value & 0x10 ? 255 : 0; - dst[5] = value & 0x20 ? 255 : 0; - dst[6] = value & 0x40 ? 255 : 0; - dst[7] = value & 0x80 ? 255 : 0; + uint8_t* src = (uint8_t*)data + ii; + uint8_t eightBits = src[0]; + + uint8_t* dst = (uint8_t*)output->m_data + ii*8; + dst[0] = uint8_t( (eightBits>>7)&0x1)*255; + dst[1] = uint8_t( (eightBits>>6)&0x1)*255; + dst[2] = uint8_t( (eightBits>>5)&0x1)*255; + dst[3] = uint8_t( (eightBits>>4)&0x1)*255; + dst[4] = uint8_t( (eightBits>>3)&0x1)*255; + dst[5] = uint8_t( (eightBits>>2)&0x1)*255; + dst[6] = uint8_t( (eightBits>>1)&0x1)*255; + dst[7] = uint8_t( (eightBits )&0x1)*255; + + } + } + else if (2 == state.info_raw.bitdepth) + { + for (uint32_t ii = 0, num = width*height/4; ii < num; ++ii) + { + uint8_t* src = (uint8_t*)data + ii; + uint8_t eightBits = src[0]; + + uint8_t* dst = (uint8_t*)output->m_data + ii*4; + // Note: not exactly precise. + // Correct way: dst[0] = uint8_t(float( (eightBits>>6)&0x3)*(255.0f/4.0f) ); + dst[0] = uint8_t(uint32_t(((eightBits>>6)&0x3)*64)&0xff); + dst[1] = uint8_t(uint32_t(((eightBits>>4)&0x3)*64)&0xff); + dst[2] = uint8_t(uint32_t(((eightBits>>2)&0x3)*64)&0xff); + dst[3] = uint8_t(uint32_t(((eightBits )&0x3)*64)&0xff); + } + } + else if (4 == state.info_raw.bitdepth) + { + for (uint32_t ii = 0, num = width*height/2; ii < num; ++ii) + { + uint8_t* src = (uint8_t*)data + ii; + uint8_t eightBits = src[0]; + + uint8_t* dst = (uint8_t*)output->m_data + ii*2; + // Note: not exactly precise. + // Correct way: dst[0] = uint8_t(float( (eightBits>>4)&0xf)*(255.0f/16.0f) ); + dst[0] = uint8_t(uint32_t(((eightBits>>4)&0xf)*16)&0xff); + dst[1] = uint8_t(uint32_t(((eightBits )&0xf)*16)&0xff); } } else if (16 == state.info_raw.bitdepth