summaryrefslogtreecommitdiffstatshomepage
path: root/3rdparty/bimg/src/image_decode.cpp
diff options
context:
space:
mode:
Diffstat (limited to '3rdparty/bimg/src/image_decode.cpp')
-rw-r--r--3rdparty/bimg/src/image_decode.cpp169
1 files changed, 145 insertions, 24 deletions
diff --git a/3rdparty/bimg/src/image_decode.cpp b/3rdparty/bimg/src/image_decode.cpp
index 0ce4023e89a..dd391e5f8d1 100644
--- a/3rdparty/bimg/src/image_decode.cpp
+++ b/3rdparty/bimg/src/image_decode.cpp
@@ -1,6 +1,6 @@
/*
- * Copyright 2011-2018 Branimir Karadzic. All rights reserved.
- * License: https://github.com/bkaradzic/bimg#license-bsd-2-clause
+ * Copyright 2011-2022 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bimg/blob/master/LICENSE
*/
#include "bimg_p.h"
@@ -12,11 +12,10 @@ BX_PRAGMA_DIAGNOSTIC_IGNORED_CLANG_GCC("-Wtype-limits")
BX_PRAGMA_DIAGNOSTIC_IGNORED_CLANG_GCC("-Wunused-parameter")
BX_PRAGMA_DIAGNOSTIC_IGNORED_CLANG_GCC("-Wunused-value")
BX_PRAGMA_DIAGNOSTIC_IGNORED_CLANG("-Wdeprecated-declarations")
+BX_PRAGMA_DIAGNOSTIC_IGNORED_MSVC(4018) // warning C4018: '<': signed/unsigned mismatch
BX_PRAGMA_DIAGNOSTIC_IGNORED_MSVC(4100) // error C4100: '' : unreferenced formal parameter
+BX_PRAGMA_DIAGNOSTIC_IGNORED_MSVC(4389) // warning C4389 : '==' : signed / unsigned mismatch
BX_PRAGMA_DIAGNOSTIC_IGNORED_MSVC(4505) // warning C4505: 'tinyexr::miniz::def_realloc_func': unreferenced local function has been removed
-#if BX_PLATFORM_EMSCRIPTEN
-# include <compat/ctype.h>
-#endif // BX_PLATFORM_EMSCRIPTEN
#define MINIZ_NO_ARCHIVE_APIS
#define MINIZ_NO_STDIO
#define TINYEXR_IMPLEMENTATION
@@ -25,6 +24,8 @@ BX_PRAGMA_DIAGNOSTIC_POP()
BX_PRAGMA_DIAGNOSTIC_PUSH();
BX_PRAGMA_DIAGNOSTIC_IGNORED_MSVC(4127) // warning C4127: conditional expression is constant
+BX_PRAGMA_DIAGNOSTIC_IGNORED_MSVC(4267) // warning C4267: '=' : conversion from 'size_t' to 'unsigned short', possible loss of data
+BX_PRAGMA_DIAGNOSTIC_IGNORED_MSVC(4334) // warning C4334: '<<' : result of 32 - bit shift implicitly converted to 64 bits(was 64 - bit shift intended ? )
#define LODEPNG_NO_COMPILE_ENCODER
#define LODEPNG_NO_COMPILE_DISK
#define LODEPNG_NO_COMPILE_ANCILLARY_CHUNKS
@@ -49,9 +50,11 @@ void lodepng_free(void* _ptr)
}
BX_PRAGMA_DIAGNOSTIC_PUSH();
+BX_PRAGMA_DIAGNOSTIC_IGNORED_CLANG_GCC("-Wint-to-pointer-cast")
BX_PRAGMA_DIAGNOSTIC_IGNORED_CLANG_GCC("-Wmissing-field-initializers");
BX_PRAGMA_DIAGNOSTIC_IGNORED_CLANG_GCC("-Wshadow");
-BX_PRAGMA_DIAGNOSTIC_IGNORED_CLANG_GCC("-Wint-to-pointer-cast")
+BX_PRAGMA_DIAGNOSTIC_IGNORED_CLANG_GCC("-Wsign-compare");
+BX_PRAGMA_DIAGNOSTIC_IGNORED_GCC("-Wunused-but-set-variable");
BX_PRAGMA_DIAGNOSTIC_IGNORED_GCC("-Warray-bounds");
#if BX_COMPILER_GCC >= 60000
BX_PRAGMA_DIAGNOSTIC_IGNORED_GCC("-Wmisleading-indentation");
@@ -107,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;
@@ -140,6 +143,9 @@ namespace bimg
palette = true;
supported = true;
break;
+
+ case LCT_MAX_OCTET_VALUE:
+ break;
}
break;
@@ -194,6 +200,9 @@ namespace bimg
case LCT_PALETTE:
break;
+
+ case LCT_MAX_OCTET_VALUE:
+ break;
}
break;
@@ -206,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)
{
@@ -218,10 +230,6 @@ namespace bimg
dstFormat = bimg::TextureFormat::RGBA16;
copyData = NULL;
}
- else if (palette)
- {
- copyData = NULL;
- }
output = imageAlloc(_allocator
, dstFormat
@@ -234,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)
{
@@ -296,12 +345,77 @@ namespace bimg
dst[3] = UINT16_MAX;
}
}
- else if (palette)
+
+ switch (state.info_raw.colortype) //Check for alpha values
{
- 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);
- }
+ case LCT_GREY:
+ case LCT_RGB:
+ break;
+
+ case LCT_GREY_ALPHA:
+ if (8 == state.info_raw.bitdepth)
+ {
+ for (uint32_t ii = 0, num = width * height; ii < num; ++ii)
+ {
+ const uint8_t* rgba = (uint8_t*)data + ii * 2;
+ bool has_alpha = rgba[1] < UINT8_MAX;
+ if (has_alpha)
+ {
+ output->m_hasAlpha = has_alpha;
+ break;
+ }
+ }
+ }
+ else if(16 == state.info_raw.bitdepth)
+ {
+ for (uint32_t ii = 0, num = width * height; ii < num; ++ii)
+ {
+ const uint16_t* rgba = (uint16_t*)data + ii * 2;
+ bool has_alpha = rgba[1] < UINT16_MAX;
+ if (has_alpha)
+ {
+ output->m_hasAlpha = has_alpha;
+ break;
+ }
+ }
+ }
+ break;
+
+ case LCT_RGBA:
+ if (8 == state.info_raw.bitdepth)
+ {
+ for (uint32_t ii = 0, num = width * height; ii < num; ++ii)
+ {
+ const uint8_t* dst = (uint8_t*)output->m_data + ii * 4;
+ bool has_alpha = dst[3] < UINT8_MAX;
+ if (has_alpha)
+ {
+ output->m_hasAlpha = has_alpha;
+ break;
+ }
+ }
+ }
+ else if (16 == state.info_raw.bitdepth)
+ {
+ for (uint32_t ii = 0, num = width * height; ii < num; ++ii)
+ {
+ const uint16_t* dst = (uint16_t*)output->m_data + ii * 4;
+ bool has_alpha = dst[3] < UINT16_MAX;
+ if (has_alpha)
+ {
+ output->m_hasAlpha = has_alpha;
+ break;
+ }
+ }
+ }
+ break;
+
+ case LCT_PALETTE:
+ output->m_hasAlpha = lodepng_has_palette_alpha(&state.info_raw);
+ break;
+
+ case LCT_MAX_OCTET_VALUE:
+ break;
}
}
else
@@ -331,6 +445,8 @@ namespace bimg
uint32_t width = 0;
uint32_t height = 0;
+ bool hasAlpha = false;
+
uint8_t* data = NULL;
const char* err = NULL;
EXRHeader exrHeader;
@@ -375,7 +491,6 @@ namespace bimg
if (UINT8_MAX != idxR)
{
const bool asFloat = exrHeader.pixel_types[idxR] == TINYEXR_PIXELTYPE_FLOAT;
- uint32_t srcBpp = 32;
uint32_t dstBpp = asFloat ? 32 : 16;
format = asFloat ? TextureFormat::R32F : TextureFormat::R16F;
uint32_t stepR = 1;
@@ -385,7 +500,6 @@ namespace bimg
if (UINT8_MAX != idxG)
{
- srcBpp += 32;
dstBpp = asFloat ? 64 : 32;
format = asFloat ? TextureFormat::RG32F : TextureFormat::RG16F;
stepG = 1;
@@ -393,7 +507,6 @@ namespace bimg
if (UINT8_MAX != idxB)
{
- srcBpp += 32;
dstBpp = asFloat ? 128 : 64;
format = asFloat ? TextureFormat::RGBA32F : TextureFormat::RGBA16F;
stepB = 1;
@@ -401,7 +514,6 @@ namespace bimg
if (UINT8_MAX != idxA)
{
- srcBpp += 32;
dstBpp = asFloat ? 128 : 64;
format = asFloat ? TextureFormat::RGBA32F : TextureFormat::RGBA16F;
stepA = 1;
@@ -431,6 +543,8 @@ namespace bimg
};
bx::memCopy(&data[ii * bytesPerPixel], rgba, bytesPerPixel);
+ hasAlpha |= (hasAlpha || rgba[3] < 1.0f);
+
srcR += stepR;
srcG += stepG;
srcB += stepB;
@@ -457,6 +571,8 @@ namespace bimg
};
bx::memCopy(&data[ii * bytesPerPixel], rgba, bytesPerPixel);
+ hasAlpha |= (hasAlpha || rgba[3] < UINT16_MAX);
+
srcR += stepR;
srcG += stepG;
srcB += stepB;
@@ -512,8 +628,10 @@ namespace bimg
, data
);
BX_FREE(_allocator, data);
+ output->m_hasAlpha = hasAlpha;
}
+
return output;
}
@@ -647,7 +765,10 @@ namespace bimg
for (uint32_t ii = 0; err.isOk() && ii < numEntries; ++ii)
{
- // https://sno.phy.queensu.ca/~phil/exiftool/TagNames/EXIF.html
+ // Reference(s):
+ // - EXIF Tags
+ // https://web.archive.org/web/20190218005249/https://sno.phy.queensu.ca/~phil/exiftool/TagNames/EXIF.html
+ //
uint16_t tag;
bx::readHE(&reader, tag, littleEndian, &err);