#include "BC7Compressor.h" #include "TexComp.h" #include #include SCompressionSettings:: SCompressionSettings() : format(eCompressionFormat_BPTC) , bUseSIMD(false) , iNumThreads(1) {} static CompressionFunc ChooseFuncFromSettings(const SCompressionSettings &s) { switch(s.format) { case eCompressionFormat_BPTC: { if(s.bUseSIMD) { return BC7C::CompressImageBC7SIMD; } else { return BC7C::CompressImageBC7; } } break; } return NULL; } static void ReportError(const char *msg) { fprintf(stderr, "TexComp -- %s\n", msg); } CompressedImage * CompressImage( const ImageFile &img, const SCompressionSettings &settings ) { const unsigned int dataSz = img.GetWidth() * img.GetHeight() * 4; // Allocate data based on the compression method int cmpDataSz = 0; switch(settings.format) { case eCompressionFormat_DXT1: cmpDataSz = dataSz / 8; case eCompressionFormat_DXT5: cmpDataSz = dataSz / 4; case eCompressionFormat_BPTC: cmpDataSz = dataSz / 4; } if(cmpDataSz == 0) { ReportError("Unknown compression format"); return NULL; } CompressedImage *outImg = NULL; unsigned char *cmpData = new unsigned char[cmpDataSz]; CompressionFunc f = ChooseFuncFromSettings(settings); if(f) { (*f)(img.GetPixels(), cmpData, img.GetWidth(), img.GetHeight()); outImg = new CompressedImage(img.GetWidth(), img.GetHeight(), settings.format, cmpData); } else { ReportError("Could not find adequate compression function for specified settings"); delete [] cmpData; return NULL; } // Cleanup delete [] cmpData; return outImg; }