diff --git a/3rdparty/.editorconfig b/3rdparty/.editorconfig index 544a568d..901bf58d 100644 --- a/3rdparty/.editorconfig +++ b/3rdparty/.editorconfig @@ -1,21 +1,25 @@ root = true +[etc1/*] +indent_style = space +indent_size = 4 + [fcpp/*] indent_style = space indent_size = 2 +[libsquish/*] +indent_style = tab +indent_size = 4 + [ocornut-imgui/*] indent_style = space indent_size = 4 +[pvrtc/*] +indent_style = space +indent_size = 4 + [remotery/*] indent_style = space indent_size = 4 - -[libsquish/*] -indent_style = tab -indent_size = 4 - -[pvrtc/*] -indent_style = space -indent_size = 4 diff --git a/3rdparty/etc1/etc1.cpp b/3rdparty/etc1/etc1.cpp index 874e1c82..0953f989 100644 --- a/3rdparty/etc1/etc1.cpp +++ b/3rdparty/etc1/etc1.cpp @@ -547,7 +547,11 @@ int etc1_encode_image(const etc1_byte* pIn, etc1_uint32 width, etc1_uint32 heigh etc1_byte* q = block + (cy * 4) * 3; const etc1_byte* p = pIn + pixelSize * x + stride * (y + cy); if (pixelSize >= 3) { - memcpy(q, p, xEnd * 3); + for (etc1_uint32 cx = 0; cx < xEnd; cx++) { + memcpy(q, p, 3); + q += 3; + p += pixelSize; + } } else { for (etc1_uint32 cx = 0; cx < xEnd; cx++) { int pixel = (p[1] << 8) | p[0]; @@ -600,7 +604,11 @@ int etc1_decode_image(const etc1_byte* pIn, etc1_byte* pOut, const etc1_byte* q = block + (cy * 4) * 3; etc1_byte* p = pOut + pixelSize * x + stride * (y + cy); if (pixelSize >= 3) { - memcpy(p, q, xEnd * 3); + for (etc1_uint32 cx = 0; cx < xEnd; cx++) { + memcpy(p, q, 3); + q += 3; + p += pixelSize; + } } else { for (etc1_uint32 cx = 0; cx < xEnd; cx++) { etc1_byte r = *q++; diff --git a/3rdparty/libsquish/squish.cpp b/3rdparty/libsquish/squish.cpp index 916f604d..cd91f874 100644 --- a/3rdparty/libsquish/squish.cpp +++ b/3rdparty/libsquish/squish.cpp @@ -151,7 +151,7 @@ int GetStorageRequirements( int width, int height, int flags ) // compute the storage requirements int blockcount = ( ( width + 3 )/4 ) * ( ( height + 3 )/4 ); int blocksize = ( ( flags & ( kDxt1 | kBc4 ) ) != 0 ) ? 8 : 16; - return blockcount*blocksize; + return blockcount*blocksize; } void CompressImage( u8 const* rgba, int width, int height, void* blocks, int flags, float* metric ) diff --git a/tools/texturec/texturec.cpp b/tools/texturec/texturec.cpp index 34fb35cb..82f04b6f 100644 --- a/tools/texturec/texturec.cpp +++ b/tools/texturec/texturec.cpp @@ -17,6 +17,9 @@ #include <pvrtc/PvrTcEncoder.h> #include <tinyexr/tinyexr.h> +#define STB_IMAGE_IMPLEMENTATION +#include <stb/stb_image.c> + #if 0 # define BX_TRACE(_format, ...) fprintf(stderr, "" _format "\n", ##__VA_ARGS__) #endif // DEBUG @@ -36,6 +39,15 @@ namespace bgfx return mem; } + const Memory* makeRef(const void* _data, uint32_t _size, ReleaseFn _releaseFn, void* _userData) + { + BX_UNUSED(_releaseFn, _userData); + Memory* mem = (Memory*)::realloc(NULL, sizeof(Memory) ); + mem->size = _size; + mem->data = (uint8_t*)_data; + return mem; + } + void release(const Memory* _mem) { Memory* mem = const_cast<Memory*>(_mem); @@ -54,11 +66,11 @@ namespace bgfx case TextureFormat::BC4: case TextureFormat::BC5: squish::CompressImage(_src, _width, _height, _dst - , format == TextureFormat::BC1 ? squish::kDxt1 - : format == TextureFormat::BC2 ? squish::kDxt3 + , format == TextureFormat::BC2 ? squish::kDxt3 : format == TextureFormat::BC3 ? squish::kDxt5 : format == TextureFormat::BC4 ? squish::kBc4 - : squish::kBc5 + : format == TextureFormat::BC5 ? squish::kBc5 + : squish::kDxt1 ); break; @@ -111,6 +123,10 @@ namespace bgfx case TextureFormat::PTC24: break; + case TextureFormat::RGBA8: + memcpy(_dst, _src, _width*_height*4); + break; + default: break; } @@ -214,6 +230,11 @@ int main(int _argc, const char* _argv[]) { format = TextureFormat::PTC14A; } + else + { + help("Invalid format specified."); + return EXIT_FAILURE; + } } uint32_t size = (uint32_t)bx::getSize(&reader); @@ -221,31 +242,60 @@ int main(int _argc, const char* _argv[]) bx::read(&reader, mem->data, mem->size); bx::close(&reader); + uint8_t* decodedImage = NULL; ImageContainer imageContainer; bool loaded = imageParse(imageContainer, mem->data, mem->size); if (!loaded) { + int width = 0; + int height = 0; + int comp = 0; + decodedImage = stbi_load_from_memory( (uint8_t*)mem->data, mem->size, &width, &height, &comp, 4); + loaded = NULL != decodedImage; + + if (loaded) + { + release(mem); + + mem = makeRef(decodedImage, width*height*4); + + imageContainer.m_data = mem->data; + imageContainer.m_size = mem->size; + imageContainer.m_offset = 0; + imageContainer.m_width = width; + imageContainer.m_height = height; + imageContainer.m_depth = 1; + imageContainer.m_format = bgfx::TextureFormat::RGBA8; + imageContainer.m_numMips = 1; + imageContainer.m_hasAlpha = true; + imageContainer.m_cubeMap = false; + imageContainer.m_ktx = false; + imageContainer.m_ktxLE = false; + imageContainer.m_srgb = false; + } } BX_UNUSED(mips); if (loaded) { bx::CrtAllocator allocator; - uint8_t* output = NULL; + const Memory* output = NULL; ImageMip mip; if (imageGetRawData(imageContainer, 0, 0, mem->data, mem->size, mip) ) { - uint8_t* rgba = (uint8_t*)BX_ALLOC(&allocator, imageGetSize(TextureFormat::RGBA8, mip.m_width, mip.m_height) ); + uint32_t size = imageGetSize(TextureFormat::RGBA8, mip.m_width, mip.m_height); + uint8_t* rgba = (uint8_t*)BX_ALLOC(&allocator, size); imageDecodeToRgba8(rgba, mip.m_data, mip.m_width, mip.m_height, mip.m_width*mip.m_bpp/8, mip.m_format); - output = (uint8_t*)BX_ALLOC(&allocator, imageGetSize(format, mip.m_width, mip.m_height) ); - + imageContainer.m_size = imageGetSize(format, mip.m_width, mip.m_height); imageContainer.m_format = format; - imageEncodeFromRgba8(output, rgba, mip.m_width, mip.m_height, format); + output = alloc(imageContainer.m_size); + + imageEncodeFromRgba8(output->data, rgba, mip.m_width, mip.m_height, format); BX_FREE(&allocator, rgba); } @@ -257,13 +307,13 @@ int main(int _argc, const char* _argv[]) { if (NULL != bx::stristr(outputFileName, ".ktx") ) { - imageWriteKtx(&writer, imageContainer, mem->data, mem->size); + imageWriteKtx(&writer, imageContainer, output->data, output->size); } bx::close(&writer); } - BX_FREE(&allocator, output); + release(output); } }