Image code cleanup, preparing for split into new lib.

This commit is contained in:
Branimir Karadžić
2017-04-01 14:54:18 -07:00
parent f760941d86
commit e492eb5132
7 changed files with 62 additions and 239 deletions

View File

@@ -8,7 +8,7 @@
#include <bx/pixelformat.h>
#include <bgfx/bgfx.h>
#include "image.h"
#include "image_decode.h"
///
void* load(const char* _filePath, uint32_t* _size = NULL);

View File

@@ -24,23 +24,50 @@ BX_PRAGMA_DIAGNOSTIC_IGNORED_MSVC(4100) // error C4100: '' : unreferenced formal
#include <tinyexr/tinyexr.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 <lodepng/lodepng.h>
#include <lodepng/lodepng.cpp>
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 <stb/stb_image.c>
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

View File

@@ -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

View File

@@ -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 <lodepng/lodepng.cpp>
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 <lodepng/lodepng.h>
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 <stb/stb_image.c>
BX_PRAGMA_DIAGNOSTIC_POP();

View File

@@ -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"),

View File

@@ -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;

View File

@@ -24,7 +24,7 @@
#include <string>
namespace stl = tinystl;
#include "image.h"
#include "image_decode.h"
#include <bgfx/embedded_shader.h>