|
|
@@ -3,6 +3,7 @@
|
|
|
* License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
|
|
|
*/
|
|
|
|
|
|
+#include <stdio.h>
|
|
|
#include <bx/allocator.h>
|
|
|
#include <bx/readerwriter.h>
|
|
|
#include <bx/endian.h>
|
|
|
@@ -10,6 +11,7 @@
|
|
|
#include <bgfx/bgfx.h>
|
|
|
|
|
|
#include "image.h"
|
|
|
+#include "image_decode.h"
|
|
|
|
|
|
#include <libsquish/squish.h>
|
|
|
#include <etc1/etc1.h>
|
|
|
@@ -23,50 +25,6 @@ extern "C" {
|
|
|
#include <iqa.h>
|
|
|
}
|
|
|
|
|
|
-#define LODEPNG_NO_COMPILE_ENCODER
|
|
|
-#define LODEPNG_NO_COMPILE_DISK
|
|
|
-#define LODEPNG_NO_COMPILE_ANCILLARY_CHUNKS
|
|
|
-#define LODEPNG_NO_COMPILE_ERROR_TEXT
|
|
|
-#define LODEPNG_NO_COMPILE_ALLOCATORS
|
|
|
-#define LODEPNG_NO_COMPILE_CPP
|
|
|
-#include <lodepng/lodepng.cpp>
|
|
|
-
|
|
|
-void* lodepng_malloc(size_t _size)
|
|
|
-{
|
|
|
- return ::malloc(_size);
|
|
|
-}
|
|
|
-
|
|
|
-void* lodepng_realloc(void* _ptr, size_t _size)
|
|
|
-{
|
|
|
- return ::realloc(_ptr, _size);
|
|
|
-}
|
|
|
-
|
|
|
-void lodepng_free(void* _ptr)
|
|
|
-{
|
|
|
- ::free(_ptr);
|
|
|
-}
|
|
|
-
|
|
|
-BX_PRAGMA_DIAGNOSTIC_PUSH();
|
|
|
-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")
|
|
|
-#define STBI_MALLOC(_size) lodepng_malloc(_size)
|
|
|
-#define STBI_REALLOC(_ptr, _size) lodepng_realloc(_ptr, _size)
|
|
|
-#define STBI_FREE(_ptr) lodepng_free(_ptr)
|
|
|
-#define STB_IMAGE_IMPLEMENTATION
|
|
|
-#include <stb/stb_image.c>
|
|
|
-BX_PRAGMA_DIAGNOSTIC_POP();
|
|
|
-
|
|
|
-BX_PRAGMA_DIAGNOSTIC_PUSH()
|
|
|
-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_MSVC(4100) // error C4100: '' : unreferenced formal parameter
|
|
|
-#define MINIZ_NO_STDIO
|
|
|
-#define TINYEXR_IMPLEMENTATION
|
|
|
-#include <tinyexr/tinyexr.h>
|
|
|
-BX_PRAGMA_DIAGNOSTIC_POP()
|
|
|
-
|
|
|
#if 0
|
|
|
# define BX_TRACE(_format, ...) fprintf(stderr, "" _format "\n", ##__VA_ARGS__)
|
|
|
#endif // DEBUG
|
|
|
@@ -78,142 +36,6 @@ BX_PRAGMA_DIAGNOSTIC_POP()
|
|
|
|
|
|
namespace bgfx
|
|
|
{
|
|
|
- bool imageParse(ImageContainer& _imageContainer, const void* _data, uint32_t _size, void** _out)
|
|
|
- {
|
|
|
- *_out = NULL;
|
|
|
- bool loaded = imageParse(_imageContainer, _data, _size);
|
|
|
- if (!loaded)
|
|
|
- {
|
|
|
- bgfx::TextureFormat::Enum format = bgfx::TextureFormat::RGBA8;
|
|
|
- uint32_t bpp = 32;
|
|
|
-
|
|
|
- uint32_t width = 0;
|
|
|
- uint32_t height = 0;
|
|
|
-
|
|
|
- uint8_t* out = NULL;
|
|
|
- static uint8_t pngMagic[] = { 0x89, 0x50, 0x4E, 0x47, 0x0d, 0x0a };
|
|
|
- if (0 == memcmp(_data, pngMagic, sizeof(pngMagic) ) )
|
|
|
- {
|
|
|
- unsigned error;
|
|
|
- LodePNGState state;
|
|
|
- lodepng_state_init(&state);
|
|
|
- state.decoder.color_convert = 0;
|
|
|
- error = lodepng_decode(&out, &width, &height, &state, (uint8_t*)_data, _size);
|
|
|
-
|
|
|
- if (0 == error)
|
|
|
- {
|
|
|
- *_out = out;
|
|
|
-
|
|
|
- switch (state.info_raw.bitdepth)
|
|
|
- {
|
|
|
- case 8:
|
|
|
- switch (state.info_raw.colortype)
|
|
|
- {
|
|
|
- case LCT_GREY:
|
|
|
- format = bgfx::TextureFormat::R8;
|
|
|
- bpp = 8;
|
|
|
- break;
|
|
|
-
|
|
|
- case LCT_GREY_ALPHA:
|
|
|
- format = bgfx::TextureFormat::RG8;
|
|
|
- bpp = 16;
|
|
|
- break;
|
|
|
-
|
|
|
- case LCT_RGB:
|
|
|
- format = bgfx::TextureFormat::RGB8;
|
|
|
- bpp = 24;
|
|
|
- break;
|
|
|
-
|
|
|
- case LCT_RGBA:
|
|
|
- format = bgfx::TextureFormat::RGBA8;
|
|
|
- bpp = 32;
|
|
|
- break;
|
|
|
-
|
|
|
- case LCT_PALETTE:
|
|
|
- break;
|
|
|
- }
|
|
|
- break;
|
|
|
-
|
|
|
- case 16:
|
|
|
- switch (state.info_raw.colortype)
|
|
|
- {
|
|
|
- case LCT_GREY:
|
|
|
- for (uint32_t ii = 0, num = width*height; ii < num; ++ii)
|
|
|
- {
|
|
|
- uint16_t* rgba = (uint16_t*)out + ii;
|
|
|
- rgba[0] = bx::toHostEndian(rgba[0], false);
|
|
|
- }
|
|
|
- format = bgfx::TextureFormat::R16;
|
|
|
- bpp = 16;
|
|
|
- break;
|
|
|
-
|
|
|
- case LCT_GREY_ALPHA:
|
|
|
- for (uint32_t ii = 0, num = width*height; ii < num; ++ii)
|
|
|
- {
|
|
|
- uint16_t* rgba = (uint16_t*)out + ii*2;
|
|
|
- rgba[0] = bx::toHostEndian(rgba[0], false);
|
|
|
- rgba[1] = bx::toHostEndian(rgba[1], false);
|
|
|
- }
|
|
|
- format = bgfx::TextureFormat::RG16;
|
|
|
- bpp = 32;
|
|
|
- break;
|
|
|
-
|
|
|
- case LCT_RGBA:
|
|
|
- for (uint32_t ii = 0, num = width*height; ii < num; ++ii)
|
|
|
- {
|
|
|
- uint16_t* rgba = (uint16_t*)out + ii*4;
|
|
|
- rgba[0] = bx::toHostEndian(rgba[0], false);
|
|
|
- rgba[1] = bx::toHostEndian(rgba[1], false);
|
|
|
- rgba[2] = bx::toHostEndian(rgba[2], false);
|
|
|
- rgba[3] = bx::toHostEndian(rgba[3], false);
|
|
|
- }
|
|
|
- format = bgfx::TextureFormat::RGBA16;
|
|
|
- bpp = 64;
|
|
|
- break;
|
|
|
-
|
|
|
- case LCT_RGB:
|
|
|
- case LCT_PALETTE:
|
|
|
- break;
|
|
|
- }
|
|
|
- break;
|
|
|
-
|
|
|
- default:
|
|
|
- break;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- lodepng_state_cleanup(&state);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- int comp = 0;
|
|
|
- *_out = stbi_load_from_memory( (uint8_t*)_data, _size, (int*)&width, (int*)&height, &comp, 4);
|
|
|
- }
|
|
|
-
|
|
|
- loaded = NULL != *_out;
|
|
|
-
|
|
|
- if (loaded)
|
|
|
- {
|
|
|
- _imageContainer.m_data = *_out;
|
|
|
- _imageContainer.m_size = width*height*bpp/8;
|
|
|
- _imageContainer.m_offset = 0;
|
|
|
- _imageContainer.m_width = width;
|
|
|
- _imageContainer.m_height = height;
|
|
|
- _imageContainer.m_depth = 1;
|
|
|
- _imageContainer.m_numLayers = 1;
|
|
|
- _imageContainer.m_format = format;
|
|
|
- _imageContainer.m_numMips = 1;
|
|
|
- _imageContainer.m_hasAlpha = true;
|
|
|
- _imageContainer.m_cubeMap = false;
|
|
|
- _imageContainer.m_ktx = false;
|
|
|
- _imageContainer.m_ktxLE = false;
|
|
|
- _imageContainer.m_srgb = false;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- return loaded;
|
|
|
- }
|
|
|
-
|
|
|
bool imageEncodeFromRgba8(void* _dst, const void* _src, uint32_t _width, uint32_t _height, uint8_t _format)
|
|
|
{
|
|
|
TextureFormat::Enum format = TextureFormat::Enum(_format);
|
|
|
@@ -262,7 +84,7 @@ namespace bgfx
|
|
|
|
|
|
for (uint32_t ii = 0; ii < 16; ++ii)
|
|
|
{ // BGRx
|
|
|
- memcpy(&block[ii*4], &ptr[(ii%4)*pitch + (ii&~3)], 4);
|
|
|
+ bx::memCopy(&block[ii*4], &ptr[(ii%4)*pitch + (ii&~3)], 4);
|
|
|
bx::xchg(block[ii*4+0], block[ii*4+2]);
|
|
|
}
|
|
|
|
|
|
@@ -301,7 +123,7 @@ namespace bgfx
|
|
|
return true;
|
|
|
|
|
|
case TextureFormat::RGBA8:
|
|
|
- memcpy(_dst, _src, _width*_height*4);
|
|
|
+ bx::memCopy(_dst, _src, _width*_height*4);
|
|
|
return true;
|
|
|
|
|
|
default:
|
|
|
@@ -569,22 +391,14 @@ int main(int _argc, const char* _argv[])
|
|
|
{
|
|
|
using namespace bgfx;
|
|
|
|
|
|
- uint8_t* decodedImage = NULL;
|
|
|
- ImageContainer input;
|
|
|
+ ImageContainer* input = imageParse(&allocator, inputData, inputSize);
|
|
|
|
|
|
- bool loaded = imageParse(input, inputData, inputSize, (void**)&decodedImage);
|
|
|
- if (NULL != decodedImage)
|
|
|
+ if (NULL != input)
|
|
|
{
|
|
|
BX_FREE(&allocator, inputData);
|
|
|
|
|
|
- inputData = (uint8_t*)input.m_data;
|
|
|
- inputSize = input.m_size;
|
|
|
- }
|
|
|
-
|
|
|
- if (loaded)
|
|
|
- {
|
|
|
const char* type = cmdLine.findOption('t');
|
|
|
- bgfx::TextureFormat::Enum format = input.m_format;
|
|
|
+ bgfx::TextureFormat::Enum format = input->m_format;
|
|
|
|
|
|
if (NULL != type)
|
|
|
{
|
|
|
@@ -600,7 +414,7 @@ int main(int _argc, const char* _argv[])
|
|
|
ImageContainer* output = NULL;
|
|
|
|
|
|
ImageMip mip;
|
|
|
- if (imageGetRawData(input, 0, 0, inputData, inputSize, mip) )
|
|
|
+ if (imageGetRawData(*input, 0, 0, input->m_data, input->m_size, mip) )
|
|
|
{
|
|
|
uint8_t numMips = mips
|
|
|
? imageGetNumMips(format, mip.m_width, mip.m_height)
|
|
|
@@ -682,7 +496,7 @@ int main(int _argc, const char* _argv[])
|
|
|
|
|
|
BX_FREE(&allocator, rgbaDst);
|
|
|
}
|
|
|
- else if (8 != getBlockInfo(input.m_format).rBits)
|
|
|
+ else if (8 != getBlockInfo(input->m_format).rBits)
|
|
|
{
|
|
|
output = imageAlloc(&allocator, format, mip.m_width, mip.m_height, 0, 1, false, mips);
|
|
|
|
|
|
@@ -782,7 +596,7 @@ int main(int _argc, const char* _argv[])
|
|
|
, TextureFormat::RGBA8
|
|
|
);
|
|
|
temp = BX_ALLOC(&allocator, size);
|
|
|
- memset(temp, 0, size);
|
|
|
+ bx::memSet(temp, 0, size);
|
|
|
uint8_t* rgba = (uint8_t*)temp;
|
|
|
|
|
|
imageDecodeToRgba8(rgba
|
|
|
@@ -797,7 +611,7 @@ int main(int _argc, const char* _argv[])
|
|
|
if (iqa)
|
|
|
{
|
|
|
ref = BX_ALLOC(&allocator, size);
|
|
|
- memcpy(ref, rgba, size);
|
|
|
+ bx::memCopy(ref, rgba, size);
|
|
|
}
|
|
|
|
|
|
imageEncodeFromRgba8(output->m_data, rgba, dstMip.m_width, dstMip.m_height, format);
|
|
|
@@ -879,8 +693,6 @@ int main(int _argc, const char* _argv[])
|
|
|
help("Failed to load input file.");
|
|
|
return EXIT_FAILURE;
|
|
|
}
|
|
|
-
|
|
|
- BX_FREE(&allocator, inputData);
|
|
|
}
|
|
|
|
|
|
return EXIT_SUCCESS;
|