From e492eb5132091e5dd35672b707b06fe6945346a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Branimir=20Karad=C5=BEi=C4=87?= Date: Sat, 1 Apr 2017 14:54:18 -0700 Subject: [PATCH] Image code cleanup, preparing for split into new lib. --- examples/common/bgfx_utils.h | 2 +- .../common/{image.cpp => image_decode.cpp} | 42 +++- examples/common/{image.h => image_decode.h} | 18 +- examples/common/nanovg/nanovg.cpp | 25 +-- scripts/texturec.lua | 2 + tools/texturec/texturec.cpp | 210 +----------------- tools/texturev/texturev.cpp | 2 +- 7 files changed, 62 insertions(+), 239 deletions(-) rename examples/common/{image.cpp => image_decode.cpp} (89%) rename examples/common/{image.h => image_decode.h} (93%) diff --git a/examples/common/bgfx_utils.h b/examples/common/bgfx_utils.h index d2dde337d..6b3eefdf1 100644 --- a/examples/common/bgfx_utils.h +++ b/examples/common/bgfx_utils.h @@ -8,7 +8,7 @@ #include #include -#include "image.h" +#include "image_decode.h" /// void* load(const char* _filePath, uint32_t* _size = NULL); diff --git a/examples/common/image.cpp b/examples/common/image_decode.cpp similarity index 89% rename from examples/common/image.cpp rename to examples/common/image_decode.cpp index 11163f768..67140d84b 100644 --- a/examples/common/image.cpp +++ b/examples/common/image_decode.cpp @@ -24,23 +24,50 @@ BX_PRAGMA_DIAGNOSTIC_IGNORED_MSVC(4100) // error C4100: '' : unreferenced formal #include BX_PRAGMA_DIAGNOSTIC_POP() +BX_PRAGMA_DIAGNOSTIC_PUSH(); +BX_PRAGMA_DIAGNOSTIC_IGNORED_MSVC(4127) // warning C4127: conditional expression is constant #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 +#include +BX_PRAGMA_DIAGNOSTIC_POP(); -typedef unsigned char stbi_uc; -extern "C" int stbi_is_hdr_from_memory(stbi_uc const* _buffer, int _len); -extern "C" stbi_uc* stbi_load_from_memory(stbi_uc const* _buffer, int _len, int* _x, int* _y, int* _comp, int _req_comp); -extern "C" float* stbi_loadf_from_memory(stbi_uc const* _buffer, int _len, int* _x, int* _y, int* _comp, int _req_comp); -extern "C" void stbi_image_free(void* _ptr); -extern void lodepng_free(void* _ptr); +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") +#if BX_COMPILER_GCC >= 60000 +BX_PRAGMA_DIAGNOSTIC_IGNORED_GCC("-Wmisleading-indentation"); +BX_PRAGMA_DIAGNOSTIC_IGNORED_GCC("-Wshift-negative-value"); +#endif // BX_COMPILER_GCC >= 60000_ +#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 +BX_PRAGMA_DIAGNOSTIC_POP(); namespace bgfx { +#if !defined(BGFX_IMAGE_H_HEADER_GUARD) struct ImageMip { TextureFormat::Enum m_format; @@ -52,6 +79,7 @@ namespace bgfx bool m_hasAlpha; const uint8_t* m_data; }; +#endif // !defined(BGFX_IMAGE_H_HEADER_GUARD) uint32_t imageGetSize( TextureInfo* _info diff --git a/examples/common/image.h b/examples/common/image_decode.h similarity index 93% rename from examples/common/image.h rename to examples/common/image_decode.h index 5c8ac1468..a4c863cbd 100644 --- a/examples/common/image.h +++ b/examples/common/image_decode.h @@ -8,6 +8,7 @@ namespace bgfx { +#if !defined(BGFX_IMAGE_H_HEADER_GUARD) /// struct ImageContainer { @@ -30,14 +31,6 @@ namespace bgfx bool m_srgb; }; - /// - ImageContainer* imageParse( - bx::AllocatorI* _allocator - , const void* _data - , uint32_t _size - , TextureFormat::Enum _dstFormat = TextureFormat::Count - ); - /// ImageContainer* imageAlloc( bx::AllocatorI* _allocator @@ -56,6 +49,15 @@ namespace bgfx /// Converts format to string. const char* getName(TextureFormat::Enum _format); +#endif // !defined(BGFX_IMAGE_H_HEADER_GUARD) + + /// + ImageContainer* imageParse( + bx::AllocatorI* _allocator + , const void* _data + , uint32_t _size + , TextureFormat::Enum _dstFormat = TextureFormat::Count + ); } // namespace bgfx diff --git a/examples/common/nanovg/nanovg.cpp b/examples/common/nanovg/nanovg.cpp index 36a87ff7f..d0fa63fb4 100644 --- a/examples/common/nanovg/nanovg.cpp +++ b/examples/common/nanovg/nanovg.cpp @@ -37,31 +37,13 @@ BX_PRAGMA_DIAGNOSTIC_IGNORED_GCC("-Wunused-result"); #include "fontstash.h" BX_PRAGMA_DIAGNOSTIC_POP(); -BX_PRAGMA_DIAGNOSTIC_PUSH(); -BX_PRAGMA_DIAGNOSTIC_IGNORED_MSVC(4127) // warning C4127: conditional expression is constant #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 -BX_PRAGMA_DIAGNOSTIC_POP(); - -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); -} +#include BX_PRAGMA_DIAGNOSTIC_PUSH(); BX_PRAGMA_DIAGNOSTIC_IGNORED_CLANG_GCC("-Wmissing-field-initializers"); @@ -71,10 +53,7 @@ BX_PRAGMA_DIAGNOSTIC_IGNORED_CLANG_GCC("-Wint-to-pointer-cast") BX_PRAGMA_DIAGNOSTIC_IGNORED_GCC("-Wmisleading-indentation"); BX_PRAGMA_DIAGNOSTIC_IGNORED_GCC("-Wshift-negative-value"); #endif // BX_COMPILER_GCC >= 60000_ -#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 BX_PRAGMA_DIAGNOSTIC_POP(); diff --git a/scripts/texturec.lua b/scripts/texturec.lua index 07184ed7d..0811ebec3 100644 --- a/scripts/texturec.lua +++ b/scripts/texturec.lua @@ -14,9 +14,11 @@ project "texturec" path.join(BGFX_DIR, "3rdparty"), path.join(BGFX_DIR, "3rdparty/nvtt"), path.join(BGFX_DIR, "3rdparty/iqa/include"), + path.join(BGFX_DIR, "examples/common"), } files { + path.join(BGFX_DIR, "examples/common/image_decode.*"), path.join(BGFX_DIR, "src/image.*"), path.join(BGFX_DIR, "3rdparty/libsquish/**.cpp"), path.join(BGFX_DIR, "3rdparty/libsquish/**.h"), diff --git a/tools/texturec/texturec.cpp b/tools/texturec/texturec.cpp index 6fcb3f13c..43d4aec42 100644 --- a/tools/texturec/texturec.cpp +++ b/tools/texturec/texturec.cpp @@ -3,6 +3,7 @@ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause */ +#include #include #include #include @@ -10,6 +11,7 @@ #include #include "image.h" +#include "image_decode.h" #include #include @@ -23,50 +25,6 @@ extern "C" { #include } -#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 - -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 -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 -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; diff --git a/tools/texturev/texturev.cpp b/tools/texturev/texturev.cpp index 7c6d23970..dadbe1aee 100644 --- a/tools/texturev/texturev.cpp +++ b/tools/texturev/texturev.cpp @@ -24,7 +24,7 @@ #include namespace stl = tinystl; -#include "image.h" +#include "image_decode.h" #include