Explorar o código

Fixing grayscale png loading.

Dario Manesku %!s(int64=8) %!d(string=hai) anos
pai
achega
009a74a681
Modificáronse 1 ficheiros con 50 adicións e 14 borrados
  1. 50 14
      src/image_decode.cpp

+ 50 - 14
src/image_decode.cpp

@@ -104,7 +104,9 @@ namespace bimg
 			switch (state.info_raw.bitdepth)
 			switch (state.info_raw.bitdepth)
 			{
 			{
 				case 1:
 				case 1:
-					format    = bimg::TextureFormat::R1;
+				case 2:
+				case 4:
+					format    = bimg::TextureFormat::R8;
 					palette   = false;
 					palette   = false;
 					supported = true;
 					supported = true;
 					break;
 					break;
@@ -203,10 +205,11 @@ namespace bimg
 				const uint8_t* copyData = data;
 				const uint8_t* copyData = data;
 
 
 				TextureFormat::Enum dstFormat = format;
 				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
 				else if (16      == state.info_raw.bitdepth
 					 &&  LCT_RGB == state.info_raw.colortype)
 					 &&  LCT_RGB == state.info_raw.colortype)
@@ -234,16 +237,49 @@ namespace bimg
 				{
 				{
 					for (uint32_t ii = 0, num = width*height/8; ii < num; ++ii)
 					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
 				else if (16      == state.info_raw.bitdepth