mirror of
https://github.com/bkaradzic/bimg.git
synced 2026-02-17 20:52:38 +01:00
PNG: Fixed 1,2,4 bits palette support
This commit is contained in:
@@ -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
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user