Initial checkin of v1.04 - KTX file format support, basic ETC1 compression/decompression, Linux makefile with proper gcc options, lots of high-level improvements to get crnlib into a state where I can more easily add additional formats.
This commit is contained in:
+6
-3
@@ -8,15 +8,16 @@
|
||||
// Note: This is a single file, stand-alone C++ library which is controlled by the use of two macros:
|
||||
// If CRND_INCLUDE_CRND_H is NOT defined, the header is included.
|
||||
// If CRND_HEADER_FILE_ONLY is NOT defined, the implementation is included.
|
||||
|
||||
//
|
||||
// Important: If compiling with gcc, be sure strict aliasing is disabled: -fno-strict-aliasing
|
||||
#ifndef CRND_INCLUDE_CRND_H
|
||||
#define CRND_INCLUDE_CRND_H
|
||||
|
||||
// Include crnlib.h (only to bring in some basic CRN-related types).
|
||||
#include "crnlib.h"
|
||||
|
||||
#define CRND_LIB_VERSION 103
|
||||
#define CRND_VERSION_STRING "01.03"
|
||||
#define CRND_LIB_VERSION 104
|
||||
#define CRND_VERSION_STRING "01.04"
|
||||
|
||||
#ifdef _DEBUG
|
||||
#define CRND_BUILD_DEBUG
|
||||
@@ -2624,6 +2625,7 @@ namespace crnd
|
||||
case cCRNFmtDXT5_xGxR: return CRND_FOURCC('x', 'G', 'x', 'R');
|
||||
case cCRNFmtDXT5_xGBR: return CRND_FOURCC('x', 'G', 'B', 'R');
|
||||
case cCRNFmtDXT5_AGBR: return CRND_FOURCC('A', 'G', 'B', 'R');
|
||||
case cCRNFmtETC1: return CRND_FOURCC('E', 'T', 'C', '1');
|
||||
default: break;
|
||||
}
|
||||
CRND_ASSERT(false);
|
||||
@@ -2650,6 +2652,7 @@ namespace crnd
|
||||
{
|
||||
case cCRNFmtDXT1:
|
||||
case cCRNFmtDXT5A:
|
||||
case cCRNFmtETC1:
|
||||
return 4;
|
||||
case cCRNFmtDXT3:
|
||||
case cCRNFmtDXT5:
|
||||
|
||||
+16
-3
@@ -10,6 +10,7 @@
|
||||
// The crn_decomp.h header file library contains all the code necessary for
|
||||
// decompression.
|
||||
//
|
||||
// Important: If compiling with gcc, be sure strict aliasing is disabled: -fno-strict-aliasing
|
||||
#ifndef CRNLIB_H
|
||||
#define CRNLIB_H
|
||||
|
||||
@@ -17,7 +18,7 @@
|
||||
#pragma warning (disable: 4127) // conditional expression is constant
|
||||
#endif
|
||||
|
||||
#define CRNLIB_VERSION 103
|
||||
#define CRNLIB_VERSION 104
|
||||
|
||||
#define CRNLIB_SUPPORT_ATI_COMPRESS 0
|
||||
#define CRNLIB_SUPPORT_SQUISH 0
|
||||
@@ -71,6 +72,8 @@ enum crn_format
|
||||
// DXT5 alpha blocks only
|
||||
cCRNFmtDXT5A,
|
||||
|
||||
cCRNFmtETC1,
|
||||
|
||||
cCRNFmtTotal,
|
||||
|
||||
cCRNFmtForceDWORD = 0xFFFFFFFF
|
||||
@@ -168,13 +171,14 @@ enum crn_dxt_quality
|
||||
// Which DXTn compressor to use when compressing to plain (non-clustered) .DDS.
|
||||
enum crn_dxt_compressor_type
|
||||
{
|
||||
cCRNDXTCompressorCRN, // Use crnlib's DXTc block compressor (default, highest quality, comparable or better than ati_compress or squish)
|
||||
cCRNDXTCompressorCRN, // Use crnlib's ETC1 or DXTc block compressor (default, highest quality, comparable or better than ati_compress or squish, and crnlib's ETC1 is a lot fasterw with similiar quality to Erricson's)
|
||||
cCRNDXTCompressorCRNF, // Use crnlib's "fast" DXTc block compressor
|
||||
cCRNDXTCompressorRYG, // Use RYG's DXTc block compressor (low quality, but very fast)
|
||||
|
||||
#if CRNLIB_SUPPORT_ATI_COMPRESS
|
||||
cCRNDXTCompressorATI,
|
||||
#endif
|
||||
|
||||
#if CRNLIB_SUPPORT_SQUISH
|
||||
cCRNDXTCompressorSquish,
|
||||
#endif
|
||||
@@ -588,17 +592,26 @@ const char* crn_get_dxt_quality_string(crn_dxt_quality q);
|
||||
typedef void *crn_block_compressor_context_t;
|
||||
|
||||
// Create a DXTn block compressor.
|
||||
// Notes this function only supports the basic/nonswizzled DXTn formats (DXT1, DXT3, DXT5, DXT5A, DXN_XY and DXN_YX).
|
||||
// This function only supports the basic/nonswizzled "fundamental" formats: DXT1, DXT3, DXT5, DXT5A, DXN_XY and DXN_YX.
|
||||
// Avoid calling this multiple times if you intend on compressing many blocks, because it allocates some memory.
|
||||
crn_block_compressor_context_t crn_create_block_compressor(const crn_comp_params ¶ms);
|
||||
|
||||
// Compresses a block of 16 pixels to the destination DXTn block.
|
||||
// pDst_block should be 8 (for DXT1/DXT5A) or 16 bytes (all the others).
|
||||
// pPixels should be an array of 16 crn_uint32's. Each crn_uint32 must be r,g,b,a (r is always first) in memory.
|
||||
void crn_compress_block(crn_block_compressor_context_t pContext, const crn_uint32 *pPixels, void *pDst_block);
|
||||
|
||||
// Frees a DXTn block compressor.
|
||||
void crn_free_block_compressor(crn_block_compressor_context_t pContext);
|
||||
|
||||
// Unpacks a compressed block to pDst_pixels.
|
||||
// pSrc_block should be 8 (for DXT1/DXT5A) or 16 bytes (all the others).
|
||||
// pDst_pixel should be an array of 16 crn_uint32's. Each uint32 will be r,g,b,a (r is always first) in memory.
|
||||
// crn_fmt should be one of the "fundamental" formats: DXT1, DXT3, DXT5, DXT5A, DXN_XY and DXN_YX.
|
||||
// The various swizzled DXT5 formats (such as cCRNFmtDXT5_xGBR, etc.) will be unpacked as if they where plain DXT5.
|
||||
// Returns false if the crn_fmt is invalid.
|
||||
bool crn_decompress_block(const void *pSrc_block, crn_uint32 *pDst_pixels, crn_format crn_fmt);
|
||||
|
||||
#endif // CRNLIB_H
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
+4
-3
@@ -22,13 +22,14 @@ namespace crnlib
|
||||
PIXEL_FMT_DXN = CRNLIB_PIXEL_FMT_FOURCC('A', '2', 'X', 'Y'), // DXN_XY
|
||||
PIXEL_FMT_DXT5A = CRNLIB_PIXEL_FMT_FOURCC('A', 'T', 'I', '1'), // ATI1N, http://developer.amd.com/media/gpu_assets/Radeon_X1x00_Programming_Guide.pdf
|
||||
|
||||
// Non-standard, crnlib-specific pixel formats (some of these are supported by ATI's compressonator)
|
||||
// Non-standard, crnlib-specific pixel formats (some of these are supported by ATI's Compressonator)
|
||||
PIXEL_FMT_DXT5_CCxY = CRNLIB_PIXEL_FMT_FOURCC('C', 'C', 'x', 'Y'),
|
||||
PIXEL_FMT_DXT5_xGxR = CRNLIB_PIXEL_FMT_FOURCC('x', 'G', 'x', 'R'),
|
||||
PIXEL_FMT_DXT5_xGBR = CRNLIB_PIXEL_FMT_FOURCC('x', 'G', 'B', 'R'),
|
||||
PIXEL_FMT_DXT5_AGBR = CRNLIB_PIXEL_FMT_FOURCC('A', 'G', 'B', 'R'),
|
||||
|
||||
PIXEL_FMT_DXT1A = CRNLIB_PIXEL_FMT_FOURCC('D', 'X', '1', 'A'),
|
||||
PIXEL_FMT_ETC1 = CRNLIB_PIXEL_FMT_FOURCC('E', 'T', 'C', '1'),
|
||||
|
||||
PIXEL_FMT_R8G8B8 = CRNLIB_PIXEL_FMT_FOURCC('R', 'G', 'B', 'x'),
|
||||
PIXEL_FMT_L8 = CRNLIB_PIXEL_FMT_FOURCC('L', 'x', 'x', 'x'),
|
||||
@@ -56,7 +57,7 @@ namespace crnlib
|
||||
crn_uint32 dwSize;
|
||||
crn_uint32 dwFlags;
|
||||
crn_uint32 dwFourCC;
|
||||
crn_uint32 dwRGBBitCount; // ATI compressonator and crnlib sometimes place a FOURCC code here
|
||||
crn_uint32 dwRGBBitCount; // ATI compressonator and crnlib will place a FOURCC code here for swizzled/cooked DXTn formats
|
||||
crn_uint32 dwRBitMask;
|
||||
crn_uint32 dwGBitMask;
|
||||
crn_uint32 dwBBitMask;
|
||||
@@ -121,7 +122,7 @@ namespace crnlib
|
||||
const crn_uint32 DDSD_FVF = 0x00200000;
|
||||
const crn_uint32 DDSD_SRCVBHANDLE = 0x00400000;
|
||||
const crn_uint32 DDSD_DEPTH = 0x00800000;
|
||||
|
||||
|
||||
const crn_uint32 DDSD_ALL = 0x00fff9ee;
|
||||
|
||||
const crn_uint32 DDPF_ALPHAPIXELS = 0x00000001;
|
||||
|
||||
Reference in New Issue
Block a user