34 Commits

Author SHA1 Message Date
Rich Geldreich ea9b8d8c00 Fixing emscripten docs 2017-01-09 14:38:39 -08:00
Rich Geldreich 66892464f6 Merged file 2017-01-09 14:37:37 -08:00
Rich Geldreich a1281e5b2a Improve default documentation
Conflicts:
	README.md
2017-01-09 14:17:29 -08:00
Rich Geldreich 7ae16dda71 clang is also on board (reverted from commit 0c95eb14d6) 2017-01-09 14:12:47 -08:00
Rich Geldreich d64212091e Change data type to match assigned one. (reverted from commit 133a78398f) 2017-01-09 13:57:00 -08:00
Rich Geldreich bf5e9d9c3b Linux fixes 2017-01-09 13:54:05 -08:00
Rich Geldreich 9f20c8c318 Merge pull request #8 from nwnk/master
readme: Update link to Compressonator
2017-01-09 13:44:40 -08:00
Rich Geldreich 0990cc8341 Merge pull request #9 from AnalyticalGraphicsInc/emcc
Compile to Javascript with Emscripten.
2017-01-09 13:42:09 -08:00
Dan Bagnell 1d3fcb59cd Update README with instructions for using Emscripten. 2017-01-09 15:04:52 -05:00
Dan Bagnell 0c22f98142 Rename crn.cpp -> crunch_lib.cpp. 2017-01-09 14:57:52 -05:00
Dan Bagnell a60ed487c5 Update crn.cpp license. 2017-01-09 14:17:31 -05:00
Dan Bagnell 8fbb07dc57 Add functions to export with emscripten. 2017-01-09 14:13:39 -05:00
Adam Jackson 3cae875fda readme: Update link to Compressonator
Signed-off-by: Adam Jackson <ajax@redhat.com>
2016-11-15 15:12:47 -05:00
Tomer Barletz e974687ae6 Update with crunch executable. 2016-07-11 18:32:16 -07:00
Tomer Barletz 75632ff47e Fix gcc name-lookup, which requires to use the 'this' qualifier. 2016-07-11 18:31:20 -07:00
Tomer Barletz 133a78398f Change data type to match assigned one. 2016-07-11 18:28:27 -07:00
Tomer Barletz 732cd33239 Fix return types from boolean/false to pointer/NULL. 2016-07-11 15:38:49 -07:00
Tomer Barletz a9653b88e7 Add build support for 64-bit with g++. 2016-07-11 15:37:15 -07:00
Tomer Barletz 001ba71348 Add .gitignore file. 2016-07-11 15:34:36 -07:00
Arvid Gerstmann 0c95eb14d6 clang is also on board 2016-06-29 23:07:41 +02:00
Arvid Gerstmann 1faffa9b1b fixes building 2016-06-29 22:56:37 +02:00
Jake 2ef76b99e5 docs(readme): Update copyright 2016-06-20 11:53:18 +02:00
Jake bf683690a9 Merge remote-tracking branch 'refs/remotes/upstream/master'
Conflicts:
	readme.txt
2016-06-20 11:51:19 +02:00
Rich Geldreich 0aea5beeb2 Fixing copyright 2016-06-16 20:08:40 -07:00
Jake 8f29f0fd75 docs: Add changelog
Moved the version info in top of readme to a changelog. Converted the
version identifiers to more semantic versioning, but it is easy to
change if semantic versioning is not interesting, or my conversion
doesn't make sense.
2016-06-16 09:22:38 +02:00
Jake 9e7a5e80c7 docs(readme): Convert to Markdown
Includes small tweaks to the original text for a nicer look.
2016-06-16 09:20:43 +02:00
Rich Geldreich 97b8233acc Adding URL 2016-06-15 23:25:15 -07:00
Rich Geldreich e647680ef9 Updating github URL 2016-06-15 23:21:39 -07:00
Rich Geldreich eeeeba7e40 Updating license/copyright 2016-06-15 23:03:05 -07:00
Rich Geldreich d2a3948ab9 Updating license/copyright/email contact info 2016-06-15 22:59:25 -07:00
Rich Geldreich dbc9ddb2cd updating readme 2015-11-19 19:34:40 -08:00
Rich Geldreich 6bde5a95b1 checking in new windows execs 2015-11-19 19:14:06 -08:00
Rich Geldreich 0fddd12519 Removing linux/mingw executables 2015-11-19 19:13:44 -08:00
Rich Geldreich 91fbf1fcc4 Fixing integer overflow problem, which can rarely cause serious artifacts. 2015-11-19 18:55:22 -08:00
20 changed files with 480 additions and 347 deletions
+2
View File
@@ -0,0 +1,2 @@
*.o
crnlib/crunch
+17
View File
@@ -0,0 +1,17 @@
# Change Log
## [0.1.4] - 2012-11-24
### Added
* KTX file format
* Basic ETC1 support
* Simple makefile
### Fixed
* Various DDS format fixes
## [0.1.3] - 2012-04-26
### Added
* Ported to Linux (tested on Ubuntu x86 w/Codeblocks). Note that a few features of the cmd line tool don't work yet (eg. -timestamp)
[0.1.4]: https://github.com/BinomialLLC/crunch
[0.1.3]: https://github.com/BinomialLLC/crunch
+307 -307
View File
@@ -1,307 +1,307 @@
crunch/crnlib v1.04 - Advanced DXTn texture compression library crunch/crnlib v1.04 - Advanced DXTn texture compression library
Copyright (C) 2010-2012 Rich Geldreich and Tenacious Software LLC Copyright (C) 2010-2017 Richard Geldreich, Jr. and Binomial LLC http://binomial.info
For bugs or support contact Rich Geldreich <richgel99@gmail.com>. For bugs or support contact Binomial <info@binomial.info>.
This software uses the ZLIB license, which is located in license.txt. This software uses the ZLIB license, which is located in license.txt.
http://opensource.org/licenses/Zlib http://opensource.org/licenses/Zlib
Portions of this software make use of public domain code originally Portions of this software make use of public domain code originally
written by Igor Pavlov (LZMA), RYG (crn_ryg_dxt*), and Sean Barrett (stb_image.c). written by Igor Pavlov (LZMA), RYG (crn_ryg_dxt*), and Sean Barrett (stb_image.c).
If you use this software in a product, an acknowledgment in the product If you use this software in a product, an acknowledgment in the product
documentation would be highly appreciated but is not required. documentation would be highly appreciated but is not required.
New for v1.04 [11/24/12]: KTX file format, basic ETC1 support, DDS format fixes, simple makefile Note: crunch originally used to live on Google Code: https://code.google.com/p/crunch/
------------------------------------------------
## Overview
Lots of higher level changes to get crnlib into a state where I can carry it forward to
support other file and texture compression formats. No major codec-level changes. crnlib is a lossy texture compression library for developers that ship
I've regression tested the codec writing .CRN and RDO .DDS files at various bitrates. content using the DXT1/5/N or 3DC compressed color/normal map/cubemap
Everything seems OK, but with all the changes I made to support KTX and other formats like ETC1 mipmapped texture formats. It was written by the same author as the open
I'm still worried about bugs. source [LZHAM compression library](http://code.google.com/p/lzham/).
New for v1.03 [4/26/12]: crnlib more portable, Linux Port It can compress mipmapped 2D textures, normal maps, and cubemaps to
------------------------------------------------ approx. 1-1.25 bits/texel, and normal maps to 1.75-2 bits/texel. The
actual bitrate depends on the complexity of the texture itself, the
v1.03 has been ported to Linux. It's still a work in progress. A few features specified quality factor/target bitrate, and ultimately on the desired
of the command line tool don't work under Linux yet (such as -timestamp), quality needed for a particular texture.
but the core functionality (compression/decompression/transcoding) should work
OK. I'm currently testing crnlib/crunch with Codeblocks 10.05 under Ubuntu x86. crnlib's differs significantly from other approaches because its
compressed texture data format was carefully designed to be quickly
Overview transcodable directly to DXTn with no intermediate recompression step.
-------- The typical (single threaded) transcode to DXTn rate is generally
between 100-250 megatexels/sec. The current library supports PC
crnlib is a lossy texture compression library for developers that ship (Win32/x64) and Xbox 360. Fast random access to individual mipmap levels
content using the DXT1/5/N or 3DC compressed color/normal map/cubemap is supported.
mipmapped texture formats. It was written by the same author as the open
source LZHAM lossless data compression library: crnlib can also generates standard .DDS files at specified quality
http://code.google.com/p/lzham/ setting, which results in files that are much more compressible by
LZMA/Deflate/etc. compared to files generated by standard DXTn texture
It can compress mipmapped 2D textures, normal maps, and cubemaps to tools (see below). This feature allows easy integration into any engine
approx. 1-1.25 bits/texel, and normal maps to 1.75-2 bits/texel. The or graphics library that already supports .DDS files.
actual bitrate depends on the complexity of the texture itself, the
specified quality factor/target bitrate, and ultimately on the desired The .CRN file format supports the following core DXTn texture formats:
quality needed for a particular texture. DXT1 (but not DXT1A), DXT5, DXT5A, and DXN/3DC
crnlib's differs significantly from other approaches because its It also supports several popular swizzled variants (several are
compressed texture data format was carefully designed to be quickly also supported by AMD's Compressonator):
transcodable directly to DXTn with no intermediate recompression step. DXT5_XGBR, DXT5_xGxR, DXT5_AGBR, and DXT5_CCxY (experimental luma-chroma YCoCg).
The typical (single threaded) transcode to DXTn rate is generally
between 100-250 megatexels/sec. The current library supports PC ## Recommended Software
(Win32/x64) and Xbox 360. Fast random access to individual mipmap levels
is supported. AMD's [Compressonator tool](https://github.com/GPUOpen-Tools/Compressonator)
is recommended to view the .DDS files created by the crunch tool and the included example projects.
crnlib can also generates standard .DDS files at specified quality
setting, which results in files that are much more compressible by Note: Some of the swizzled DXTn .DDS output formats (such as DXT5_xGBR)
LZMA/Deflate/etc. compared to files generated by standard DXTn texture read/written by the crunch tool or examples deviate from the DX9 DDS
tools (see below). This feature allows easy integration into any engine standard, so DXSDK tools such as DXTEX.EXE won't load them at all or
or graphics library that already supports .DDS files. they won't be properly displayed.
The .CRN file format supports the following core DXTn texture formats: ## Compression Algorithm Details
DXT1 (but not DXT1A), DXT5, DXT5A, and DXN/3DC
The compression process employed in creating both .CRN and
It also supports several popular swizzled variants (several are clustered .DDS files utilizes a very high quality, scalable DXTn
also supported by AMD's Compressonator): endpoint optimizer capable of processing any number of pixels (instead
DXT5_XGBR, DXT5_xGxR, DXT5_AGBR, and DXT5_CCxY (experimental luma-chroma YCoCg). of the typical hard coded 16), optional adaptive switching between
several macroblock sizes/configurations (currently any combination of
Recommended Software 4x4, 8x4, 4x8, and 8x8 pixel blocks), endpoint clusterization using
-------------------- top-down cluster analysis, vector quantization (VQ) of the selector
indices, and several custom algorithms for compressing the resulting
AMD's Compressonator tool is recommended to view the .DDS files created by endpoint/selector codebooks and macroblock indices. Multiple feedback
the crunch tool and the included example projects: passes are performed between the clusterization and VQ steps to optimize
quality, and several steps use a brute force refinement approach to improve
http://developer.amd.com/gpu/compressonator/pages/default.aspx quality. The majority of compression steps are multithreaded.
Note: Some of the swizzled DXTn .DDS output formats (such as DXT5_xGBR) The .CRN format currently utilizes canonical Huffman coding for speed
read/written by the crunch tool or examples deviate from the DX9 DDS (similar to Deflate but with much larger tables), but the next major
standard, so DXSDK tools such as DXTEX.EXE won't load them at all or version will also utilize adaptive binary arithmetic coding and higher
they won't be properly displayed. order context modeling using already developed tech from the my LZHAM
compression library.
Compression Algorithm Details
----------------------------- ## Supported File Formats
The compression process employed in creating both .CRN and crnlib supports two compressed texture file formats. The first
clustered .DDS files utilizes a very high quality, scalable DXTn format (clustered .DDS) is simple to integrate into an existing project
endpoint optimizer capable of processing any number of pixels (instead (typically, no code changes are required), but it doesn't offer the
of the typical hard coded 16), optional adaptive switching between highest quality/compression ratio that crnlib is capable of. Integrating
several macroblock sizes/configurations (currently any combination of the second, higher quality custom format (.CRN) requires a few
4x4, 8x4, 4x8, and 8x8 pixel blocks), endpoint clusterization using typically straightforward engine modifications to integrate the
top-down cluster analysis, vector quantization (VQ) of the selector .CRN->DXTn transcoder header file library into your tools/engine.
indices, and several custom algorithms for compressing the resulting
endpoint/selector codebooks and macroblock indices. Multiple feedback ### .DDS
passes are performed between the clusterization and VQ steps to optimize
quality, and several steps use a brute force refinement approach to improve crnlib can compress textures to standard DX9-style .DDS files using
quality. The majority of compression steps are multithreaded. clustered DXTn compression, which is a subset of the approach used to
create .CRN files.(For completeness, crnlib also supports vanilla, block
The .CRN format currently utilizes canonical Huffman coding for speed by block DXTn compression too, but that's not very interesting.)
(similar to Deflate but with much larger tables), but the next major Clustered DXTn compressed .DDS files are much more compressible than
version will also utilize adaptive binary arithmetic coding and higher files created by other libraries/tools. Apart from increased
order context modeling using already developed tech from the my LZHAM compressibility, the .DDS files generated by this process are completely
compression library. standard so they should be fairly easy to add to a project with little
to no code changes.
Supported File Formats
---------------------- To actually benefit from clustered DXTn .DDS files, your engine needs to
further losslessly compress the .DDS data generated by crnlib using a
crnlib supports two compressed texture file formats. The first lossless codec such as zlib, lzo, LZMA, LZHAM, etc. Most likely, your
format (clustered .DDS) is simple to integrate into an existing project engine does this already. (If not, you definitely should because DXTn
(typically, no code changes are required), but it doesn't offer the compressed textures generally contain a large amount of highly redundant
highest quality/compression ratio that crnlib is capable of. Integrating data.)
the second, higher quality custom format (.CRN) requires a few
typically straightforward engine modifications to integrate the Clustered .DDS files are intended to be the simplest/fastest way to
.CRN->DXTn transcoder header file library into your tools/engine. integrate crnlib's tech into a project.
.DDS ### .CRN
crnlib can compress textures to standard DX9-style .DDS files using
clustered DXTn compression, which is a subset of the approach used to The second, better, option is to compress your textures to .CRN files
create .CRN files.(For completeness, crnlib also supports vanilla, block using crnlib. To read the resulting .CRN data, you must add the .CRN
by block DXTn compression too, but that's not very interesting.) transcoder library (located in the included single file, stand-alone
Clustered DXTn compressed .DDS files are much more compressible than header file library inc/crn_decomp.h) into your application. .CRN files
files created by other libraries/tools. Apart from increased provide noticeably higher quality at the same effective bitrate compared
compressibility, the .DDS files generated by this process are completely to clustered DXTn compressed .DDS files. Also, .CRN files don't require
standard so they should be fairly easy to add to a project with little further lossless compression because they're already highly compressed.
to no code changes.
.CRN files are a bit more difficult/risky to integrate into a project, but
To actually benefit from clustered DXTn .DDS files, your engine needs to the resulting compression ratio and quality is superior vs. clustered .DDS files.
further losslessly compress the .DDS data generated by crnlib using a
lossless codec such as zlib, lzo, LZMA, LZHAM, etc. Most likely, your ### .KTX
engine does this already. (If not, you definitely should because DXTn
compressed textures generally contain a large amount of highly redundant crnlib and crunch can read/write the .KTX file format in various pixel formats.
data.) Rate distortion optimization (clustered DXTc compression) is not yet supported
when writing .KTX files.
Clustered .DDS files are intended to be the simplest/fastest way to
integrate crnlib's tech into a project. The .KTX file format is just like .DDS, except it's a fairly well specified
standard created by the Khronos Group. Unfortunately, almost all of the tools I've
.CRN found that support .KTX are fairly (to very) buggy, or are limited to only a handful
The second, better, option is to compress your textures to .CRN files of pixel formats, so there's no guarantee that the .KTX files written by crnlib can
using crnlib. To read the resulting .CRN data, you must add the .CRN be reliably read by other tools.
transcoder library (located in the included single file, stand-alone
header file library inc/crn_decomp.h) into your application. .CRN files ## Building the Examples
provide noticeably higher quality at the same effective bitrate compared
to clustered DXTn compressed .DDS files. Also, .CRN files don't require This release contains the source code and projects for three simple
further lossless compression because they're already highly compressed. example projects:
.CRN files are a bit more difficult/risky to integrate into a project, but crn_examples.2008.sln is a Visual Studio 2008 (VC9) solution file
the resulting compression ratio and quality is superior vs. clustered .DDS files. containing projects for Win32 and x64. crnlib itself also builds with
VS2005, VS2010, and gcc 4.5.0 (TDM GCC+MinGW). A codeblocks 10.05
.KTX workspace and project file is also included, but compiling crnlib this
way hasn't been tested much.
crnlib and crunch can read/write the .KTX file format in various pixel formats.
Rate distortion optimization (clustered DXTc compression) is not yet supported ### example1
when writing .KTX files.
Demonstrates how to use crnlib's high-level C-helper
The .KTX file format is just like .DDS, except it's a fairly well specified compression/decompression/transcoding functions in inc/crnlib.h. It's a
standard created by the Khronos Group. Unfortunately, almost all of the tools I've fairly complete example of crnlib's functionality.
found that support .KTX are fairly (to very) buggy, or are limited to only a handful
of pixel formats, so there's no guarantee that the .KTX files written by crnlib can ### example2
be reliably read by other tools. Shows how to transcodec .CRN files to .DDS using **only**
the functionality in inc/crn_decomp.h. It does not link against against
Building the Examples crnlib.lib or depend on it in any way. (Note: The complete source code,
--------------------- approx. 4800 lines, to the CRN transcoder is included in inc/crn_decomp.h.)
This release contains the source code and projects for three simple example2 is intended to show how simple it is to integrate CRN textures
example projects: into your application.
crn_examples.2008.sln is a Visual Studio 2008 (VC9) solution file ### example3
containing projects for Win32 and x64. crnlib itself also builds with Shows how to use the regular, low-level DXTn block compressor
VS2005, VS2010, and gcc 4.5.0 (TDM GCC+MinGW). A codeblocks 10.05 functions in inc/crnlib.h. This functionality is included for
workspace and project file is also included, but compiling crnlib this completeness. (Your engine or toolchain most likely already has its own
way hasn't been tested much. DXTn compressor. crnlib's compressor is typically very competitive or
superior to most available closed and open source CPU-based
example1: Demonstrates how to use crnlib's high-level C-helper compressors.)
compression/decompression/transcoding functions in inc/crnlib.h. It's a
fairly complete example of crnlib's functionality. ## Creating Compressed Textures from the Command Line (crunch.exe)
example2: Shows how to transcodec .CRN files to .DDS using *only* The simplest way to create compressed textures using crnlib is to
the functionality in inc/crn_decomp.h. It does not link against against integrate the bin\crunch.exe or bin\crunch_x64.exe) command line tool
crnlib.lib or depend on it in any way. (Note: The complete source code, into your texture build toolchain or export process. It can write DXTn
approx. 4800 lines, to the CRN transcoder is included in inc/crn_decomp.h.) compressed 2D/cubemap textures to regular DXTn compressed .DDS,
clustered (or reduced entropy) DXTn compressed .DDS, or .CRN files. It
example2 is intended to show how simple it is to integrate CRN textures can also transcode or decompress files to several standard image
into your application. formats, such as TGA or BMP. Run crunch.exe with no options for help.
example3: Shows how to use the regular, low-level DXTn block compressor The .CRN files created by crunch.exe can be efficiently transcoded to
functions in inc/crnlib.h. This functionality is included for DXTn using the included CRN transcoding library, located in full source
completeness. (Your engine or toolchain most likely already has its own form under inc/crn_decomp.h.
DXTn compressor. crnlib's compressor is typically very competitive or
superior to most available closed and open source CPU-based Here are a few example crunch.exe command lines:
compressors.)
1. Compress blah.tga to blah.dds using normal DXT1 compression:
Creating Compressed Textures from the Command Line (crunch.exe) * `crunch -file blah.tga -fileformat dds -dxt1`
---------------------------------------------------------------
2. Compress blah.tga to blah.dds using clustered DXT1 at an effective bitrate of 1.5 bits/texel, display image statistic:
The simplest way to create compressed textures using crnlib is to * `crunch -file blah.tga -fileformat dds -dxt1 -bitrate 1.5 -imagestats`
integrate the bin\crunch.exe or bin\crunch_x64.exe) command line tool
into your texture build toolchain or export process. It can write DXTn 3. Compress blah.tga to blah.dds using clustered DXT1 at quality level 100 (from [0,255]), with no mipmaps, display LZMA statistics:
compressed 2D/cubemap textures to regular DXTn compressed .DDS, * `crunch -file blah.tga -fileformat dds -dxt1 -quality 100 -mipmode none -lzmastats`
clustered (or reduced entropy) DXTn compressed .DDS, or .CRN files. It
can also transcode or decompress files to several standard image 3. Compress blah.tga to blah.crn using clustered DXT1 at a bitrate of 1.2 bits/texel, no mipmaps:
formats, such as TGA or BMP. Run crunch.exe with no options for help. * `crunch -file blah.tga -dxt1 -bitrate 1.2 -mipmode none`
The .CRN files created by crunch.exe can be efficiently transcoded to 4. Decompress blah.dds to a .tga file:
DXTn using the included CRN transcoding library, located in full source * `crunch -file blah.dds -fileformat tga`
form under inc/crn_decomp.h.
5. Transcode blah.crn to a .dds file:
Here are a few example crunch.exe command lines: * `crunch -file blah.crn`
1. Compress blah.tga to blah.dds using normal DXT1 compression: 6. Decompress blah.crn, writing each mipmap level to a separate .tga file:
crunch -file blah.tga -fileformat dds -dxt1 * `crunch -split -file blah.crn -fileformat tga`
2. Compress blah.tga to blah.dds using clustered DXT1 at an effective bitrate of 1.5 bits/texel, display image statistic: crunch.exe can do a lot more, like rescale/crop images before
crunch -file blah.tga -fileformat dds -dxt1 -bitrate 1.5 -imagestats compression, convert images from one file format to another, compare
images, process multiple images, etc.
3. Compress blah.tga to blah.dds using clustered DXT1 at quality level 100 (from [0,255]), with no mipmaps, display LZMA statistics:
crunch -file blah.tga -fileformat dds -dxt1 -quality 100 -mipmode none -lzmastats Note: I would have included the full source to crunch.exe, but it still
has some low-level dependencies to crnlib internals which I didn't have
3. Compress blah.tga to blah.crn using clustered DXT1 at a bitrate of 1.2 bits/texel, no mipmaps: time to address. This version of crunch.exe has some reduced
crunch -file blah.tga -dxt1 -bitrate 1.2 -mipmode none functionality compared to an earlier eval release. For example, XML file
support is not included in this version.
4. Decompress blah.dds to a .tga file:
crunch -file blah.dds -fileformat tga ## Using crnlib
5. Transcode blah.crn to a .dds file: The most flexible and powerful way of using crnlib is to integrate the
crunch -file blah.crn library into your editor/toolchain/etc. and directly supply it your
raw/source texture bits. See the C-style API's and comments in
6. Decompress blah.crn, writing each mipmap level to a separate .tga file: inc/crnlib.h.
crunch -split -file blah.crn -fileformat tga
To compress, you basically fill in a few structs in and call one function:
crunch.exe can do a lot more, like rescale/crop images before
compression, convert images from one file format to another, compare ```c
images, process multiple images, etc. void *crn_compress( const crn_comp_params &comp_params,
crn_uint32 &compressed_size,
Note: I would have included the full source to crunch.exe, but it still crn_uint32 *pActual_quality_level = NULL,
has some low-level dependencies to crnlib internals which I didn't have float *pActual_bitrate = NULL);
time to address. This version of crunch.exe has some reduced ```
functionality compared to an earlier eval release. For example, XML file
support is not included in this version. Or, if you want crnlib to also generate mipmaps, you call this function:
Using crnlib ```c
------------ void *crn_compress( const crn_comp_params &comp_params,
const crn_mipmap_params &mip_params,
The most flexible and powerful way of using crnlib is to integrate the crn_uint32 &compressed_size,
library into your editor/toolchain/etc. and directly supply it your crn_uint32 *pActual_quality_level = NULL,
raw/source texture bits. See the C-style API's and comments in float *pActual_bitrate = NULL);
inc/crnlib.h. ```
To compress, you basically fill in a few structs in and call one function: You can also transcode/uncompress .DDS/.CRN files to raw 32bpp images
using `crn_decompress_crn_to_dds()` and `crn_decompress_dds_to_images()`.
void *crn_compress(const crn_comp_params &comp_params, crn_uint32 &compressed_size, crn_uint32 *pActual_quality_level = NULL, float *pActual_bitrate = NULL);
Internally, crnlib just uses inc/crn_decomp.h to transcode textures to
Or, if you want crnlib to also generate mipmaps, you call this function: DXTn. If you only need to transcode .CRN format files to raw DXTn bits
at runtime (and not compress), you don't actually need to compile or
void *crn_compress(const crn_comp_params &comp_params, const crn_mipmap_params &mip_params, crn_uint32 &compressed_size, crn_uint32 *pActual_quality_level = NULL, float *pActual_bitrate = NULL); link against crnlib at all. Just include inc/crn_decomp.h, which
contains a completely self-contained CRN transcoder in the "crnd"
You can also transcode/uncompress .DDS/.CRN files to raw 32bpp images namespace. The `crnd_get_texture_info()`, `crnd_unpack_begin()`,
using crn_decompress_crn_to_dds() and crn_decompress_dds_to_images(). `crnd_unpack_level()`, etc. functions are all you need to efficiently get
at the raw DXTn bits, which can be directly supplied to whatever API or
Internally, crnlib just uses inc/crn_decomp.h to transcode textures to GPU you're using. (See example2.)
DXTn. If you only need to transcode .CRN format files to raw DXTn bits
at runtime (and not compress), you don't actually need to compile or Important note: When compiling under native client, be sure to define
link against crnlib at all. Just include inc/crn_decomp.h, which the `PLATFORM_NACL` macro before including the `inc/crn_decomp.h` header file library.
contains a completely self-contained CRN transcoder in the "crnd"
namespace. The crnd_get_texture_info(), crnd_unpack_begin(), ## Known Issues/Bugs
crnd_unpack_level(), etc. functions are all you need to efficiently get
at the raw DXTn bits, which can be directly supplied to whatever API or * crnlib currently assumes you'll be further losslessly compressing its
GPU you're using. (See example2.) output .DDS files using LZMA. However, some engines use weaker codecs
such as LZO, zlib, or custom codecs, so crnlib's bitrate measurements
Important note: When compiling under native client, be sure to define will be inaccurate. It should be easy to allow the caller to plug-in
the PLATFORM_NACL macro before including the inc/crn_decomp.h header file library. custom lossless compressors for bitrate measurement.
Known Issues/Bugs * Compressing to a desired bitrate can be time consuming, especially when
----------------- processing large (2k or 4k) images to the .CRN format. There are several
high-level optimizations employed when compressing to clustered DXTn .DDS
* crnlib currently assumes you'll be further losslessly compressing its files using multiple trials, but not so for .CRN.
output .DDS files using LZMA. However, some engines use weaker codecs
such as LZO, zlib, or custom codecs, so crnlib's bitrate measurements * The .CRN compressor does not currently use 3 color (transparent) DXT1
will be inaccurate. It should be easy to allow the caller to plug-in blocks at all, only 4 color blocks. So it doesn't support DXT1A
custom lossless compressors for bitrate measurement. transparency, and its output quality suffers a little due to this
limitation. (Note that the clustered DXTn compressor used when
* Compressing to a desired bitrate can be time consuming, especially when writing clustered .DDS files does *not* have this limitation.)
processing large (2k or 4k) images to the .CRN format. There are several
high-level optimizations employed when compressing to clustered DXTn .DDS * Clustered DXT5/DXT5A compressor is able to group DXT5A blocks into
files using multiple trials, but not so for .CRN. clusters only if they use absolute (black/white) selector indices. This
hurts performance at very low bitrates, because too many bits are
* The .CRN compressor does not currently use 3 color (transparent) DXT1 effectively given to alpha.
blocks at all, only 4 color blocks. So it doesn't support DXT1A
transparency, and its output quality suffers a little due to this * DXT3 is not supported when writing .CRN or clustered DXTn DDS files.
limitation. (Note that the clustered DXTn compressor used when (DXT3 is supported by crnlib's when compressing to regular DXTn DDS
writing clustered .DDS files does *not* have this limitation.) files.) You'll get DXT5 files if you request DXT3. However, DXT3 is
supported by the regular DXTn block compressor. (DXT3's 4bpp fixed alpha
* Clustered DXT5/DXT5A compressor is able to group DXT5A blocks into sucks verses DXT5 alpha blocks, so I don't see this as a bug deal.)
clusters only if they use absolute (black/white) selector indices. This
hurts performance at very low bitrates, because too many bits are * The DXT5_CCXY format uses a simple YCoCg encoding that is workable but
effectively given to alpha. hasn't been tuned for max. quality yet.
* DXT3 is not supported when writing .CRN or clustered DXTn DDS files. * Clustered (or rate distortion optimized) DXTc compression is only
(DXT3 is supported by crnlib's when compressing to regular DXTn DDS supported when writing to .DDS, not .KTX. Also, only plain block by block
files.) You'll get DXT5 files if you request DXT3. However, DXT3 is compression is supported when writing to ETC1, and .CRN does not support ETC1.
supported by the regular DXTn block compressor. (DXT3's 4bpp fixed alpha
sucks verses DXT5 alpha blocks, so I don't see this as a bug deal.) ## Compile to Javascript with Emscripten
* The DXT5_CCXY format uses a simple YCoCg encoding that is workable but Download and install Emscripten:
hasn't been tuned for max. quality yet. http://kripken.github.io/emscripten-site/docs/getting_started/downloads.html
* Clustered (or rate distortion optimized) DXTc compression is only From the root directory, run:
supported when writing to .DDS, not .KTX. Also, only plain block by block ```c
compression is supported when writing to ETC1, and .CRN does not support ETC1. emcc -O3 emscripten/crn.cpp -I./inc -s EXPORTED_FUNCTIONS="['_malloc', '_free', '_crn_get_width', '_crn_get_height', '_crn_get_levels', '_crn_get_dxt_format', '_crn_get_bytes_per_block', '_crn_get_uncompressed_size', '_crn_decompress']" -s NO_EXIT_RUNTIME=1 -s NO_FILESYSTEM=1 -s ELIMINATE_DUPLICATE_FUNCTIONS=1 -s ALLOW_MEMORY_GROWTH=1 --memory-init-file 0 -o crunch.js
```
BIN
View File
Binary file not shown.
Binary file not shown.
BIN
View File
Binary file not shown.
Binary file not shown.
+1 -1
View File
@@ -8,7 +8,7 @@
namespace crnlib namespace crnlib
{ {
const char *g_copyright_str = "Copyright (c) 2010-2012 Rich Geldreich and Tenacious Software LLC"; const char *g_copyright_str = "Copyright (c) 2010-2016 Richard Geldreich, Jr. and Binomial LLC";
const char *g_sig_str = "C8cfRlaorj0wLtnMSxrBJxTC85rho2L9hUZKHcBL"; const char *g_sig_str = "C8cfRlaorj0wLtnMSxrBJxTC85rho2L9hUZKHcBL";
} // namespace crnlib } // namespace crnlib
+14 -14
View File
@@ -112,9 +112,9 @@ namespace crnlib
uint weight = m_unique_colors[i].m_weight; uint weight = m_unique_colors[i].m_weight;
total_weight += weight; total_weight += weight;
tot_r += m_unique_colors[i].m_color.r * weight; tot_r += m_unique_colors[i].m_color.r * static_cast<uint64>(weight);
tot_g += m_unique_colors[i].m_color.g * weight; tot_g += m_unique_colors[i].m_color.g * static_cast<uint64>(weight);
tot_b += m_unique_colors[i].m_color.b * weight; tot_b += m_unique_colors[i].m_color.b * static_cast<uint64>(weight);
} }
const uint half_total_weight = total_weight >> 1; const uint half_total_weight = total_weight >> 1;
@@ -494,7 +494,7 @@ namespace crnlib
ll[2] = (ll[0]*2+ll[1])/3; ll[2] = (ll[0]*2+ll[1])/3;
ll[3] = (ll[0]+ll[1]*2)/3; ll[3] = (ll[0]+ll[1]*2)/3;
uint error_to_beat = 0; uint64 error_to_beat = 0;
uint min_color_weight = 0; uint min_color_weight = 0;
uint max_color_weight = 0; uint max_color_weight = 0;
for (uint i = 0; i < m_unique_colors.size(); i++) for (uint i = 0; i < m_unique_colors.size(); i++)
@@ -503,7 +503,7 @@ namespace crnlib
uint w = m_unique_colors[i].m_weight; uint w = m_unique_colors[i].m_weight;
int delta = ll[m_best_solution.m_selectors[i]] - c; int delta = ll[m_best_solution.m_selectors[i]] - c;
error_to_beat += (int)w * (delta * delta); error_to_beat += static_cast<int64>(w) * (delta * delta);
if (c == min_color[comp_index]) if (c == min_color[comp_index])
min_color_weight += w; min_color_weight += w;
@@ -561,11 +561,11 @@ namespace crnlib
tl[2] = (tl[0]*2+tl[1])/3; tl[2] = (tl[0]*2+tl[1])/3;
tl[3] = (tl[0]+tl[1]*2)/3; tl[3] = (tl[0]+tl[1]*2)/3;
uint trial_error = 0; uint64 trial_error = 0;
for (uint i = 0; i < m_unique_colors.size(); i++) for (uint i = 0; i < m_unique_colors.size(); i++)
{ {
int delta = tl[m_best_solution.m_selectors[i]] - m_unique_colors[i].m_color[comp_index]; int delta = tl[m_best_solution.m_selectors[i]] - m_unique_colors[i].m_color[comp_index];
trial_error += m_unique_colors[i].m_weight * (delta * delta); trial_error += static_cast<int64>(m_unique_colors[i].m_weight) * (delta * delta);
if (trial_error >= error_to_beat) if (trial_error >= error_to_beat)
break; break;
} }
@@ -599,7 +599,7 @@ namespace crnlib
for (uint i = 0; i < m_unique_colors.size(); i++) for (uint i = 0; i < m_unique_colors.size(); i++)
{ {
int delta = tl[m_best_solution.m_selectors[i]] - m_unique_colors[i].m_color[comp_index]; int delta = tl[m_best_solution.m_selectors[i]] - m_unique_colors[i].m_color[comp_index];
error_to_beat += m_unique_colors[i].m_weight * (delta * delta); error_to_beat += static_cast<int64>(m_unique_colors[i].m_weight) * (delta * delta);
} }
} // better } // better
@@ -1582,7 +1582,7 @@ namespace crnlib
err = color_distance(true, c, colors[3], false); err = color_distance(true, c, colors[3], false);
if (err < best_error) { best_error = err; best_color_index = 3; } if (err < best_error) { best_error = err; best_color_index = 3; }
trial_error += best_error * m_unique_colors[unique_color_index].m_weight; trial_error += best_error * static_cast<uint64>(m_unique_colors[unique_color_index].m_weight);
if (trial_error >= solution.m_error) if (trial_error >= solution.m_error)
break; break;
@@ -1607,7 +1607,7 @@ namespace crnlib
err = color_distance(false, c, colors[3], false); err = color_distance(false, c, colors[3], false);
if (err < best_error) { best_error = err; best_color_index = 3; } if (err < best_error) { best_error = err; best_color_index = 3; }
trial_error += best_error * m_unique_colors[unique_color_index].m_weight; trial_error += best_error * static_cast<uint64>(m_unique_colors[unique_color_index].m_weight);
if (trial_error >= solution.m_error) if (trial_error >= solution.m_error)
break; break;
@@ -1634,7 +1634,7 @@ namespace crnlib
err = color_distance(true, c, colors[2], false); err = color_distance(true, c, colors[2], false);
if (err < best_error) { best_error = err; best_color_index = 2; } if (err < best_error) { best_error = err; best_color_index = 2; }
trial_error += best_error * m_unique_colors[unique_color_index].m_weight; trial_error += best_error * static_cast<uint64>(m_unique_colors[unique_color_index].m_weight);
if (trial_error >= solution.m_error) if (trial_error >= solution.m_error)
break; break;
@@ -1656,7 +1656,7 @@ namespace crnlib
err = color_distance(false, c, colors[2], false); err = color_distance(false, c, colors[2], false);
if (err < best_error) { best_error = err; best_color_index = 2; } if (err < best_error) { best_error = err; best_color_index = 2; }
trial_error += best_error * m_unique_colors[unique_color_index].m_weight; trial_error += best_error * static_cast<uint64>(m_unique_colors[unique_color_index].m_weight);
if (trial_error >= solution.m_error) if (trial_error >= solution.m_error)
break; break;
@@ -1781,7 +1781,7 @@ namespace crnlib
uint best_error = color_distance(m_perceptual, c, colors[best_color_index], false); uint best_error = color_distance(m_perceptual, c, colors[best_color_index], false);
trial_error += best_error * m_unique_colors[unique_color_index].m_weight; trial_error += best_error * static_cast<uint64>(m_unique_colors[unique_color_index].m_weight);
if (trial_error >= solution.m_error) if (trial_error >= solution.m_error)
break; break;
@@ -1814,7 +1814,7 @@ namespace crnlib
uint best_error = color_distance(m_perceptual, c, colors[best_color_index], false); uint best_error = color_distance(m_perceptual, c, colors[best_color_index], false);
trial_error += best_error * m_unique_colors[unique_color_index].m_weight; trial_error += best_error * static_cast<uint64>(m_unique_colors[unique_color_index].m_weight);
if (trial_error >= solution.m_error) if (trial_error >= solution.m_error)
break; break;
+1 -1
View File
@@ -1305,7 +1305,7 @@ namespace crnlib
*pActualComps = 0; *pActualComps = 0;
if ((req_comps < 1) || (req_comps > 4)) if ((req_comps < 1) || (req_comps > 4))
return false; return NULL;
mipmapped_texture tex; mipmapped_texture tex;
+6 -6
View File
@@ -355,7 +355,7 @@ namespace crnlib
inline T* alloc_group(bool nofail = false) inline T* alloc_group(bool nofail = false)
{ {
T* p = static_cast<T*>(alloc_space(N * sizeof(T))); T* p = static_cast<T*>(sparse_array_traits<T, Log2N>::alloc_space(N * sizeof(T)));
if (!p) if (!p)
{ {
@@ -365,7 +365,7 @@ namespace crnlib
CRNLIB_FAIL("Out of memory"); CRNLIB_FAIL("Out of memory");
} }
construct_group(p); sparse_array_traits<T, Log2N>::construct_group(p);
m_num_active_groups++; m_num_active_groups++;
@@ -379,20 +379,20 @@ namespace crnlib
CRNLIB_ASSERT(m_num_active_groups); CRNLIB_ASSERT(m_num_active_groups);
m_num_active_groups--; m_num_active_groups--;
destruct_group(p); sparse_array_traits<T, Log2N>::destruct_group(p);
free_space(p); sparse_array_traits<T, Log2N>::free_space(p);
} }
} }
inline void init_default() inline void init_default()
{ {
construct_element(reinterpret_cast<T*>(m_default)); sparse_array_traits<T, Log2N>::construct_element(reinterpret_cast<T*>(m_default));
} }
inline void deinit_default() inline void deinit_default()
{ {
destruct_element(reinterpret_cast<T*>(m_default)); sparse_array_traits<T, Log2N>::destruct_element(reinterpret_cast<T*>(m_default));
} }
}; };
+3 -3
View File
@@ -172,7 +172,7 @@ void *crn_compress(const crn_comp_params &comp_params, crn_uint32 &compressed_si
if (pActual_bitrate) *pActual_bitrate = 0.0f; if (pActual_bitrate) *pActual_bitrate = 0.0f;
if (!comp_params.check()) if (!comp_params.check())
return false; return NULL;
crnlib::vector<uint8> crn_file_data; crnlib::vector<uint8> crn_file_data;
if (!create_compressed_texture(comp_params, crn_file_data, pActual_quality_level, pActual_bitrate)) if (!create_compressed_texture(comp_params, crn_file_data, pActual_quality_level, pActual_bitrate))
@@ -189,7 +189,7 @@ void *crn_compress(const crn_comp_params &comp_params, const crn_mipmap_params &
if (pActual_bitrate) *pActual_bitrate = 0.0f; if (pActual_bitrate) *pActual_bitrate = 0.0f;
if ((!comp_params.check()) || (!mip_params.check())) if ((!comp_params.check()) || (!mip_params.check()))
return false; return NULL;
crnlib::vector<uint8> crn_file_data; crnlib::vector<uint8> crn_file_data;
if (!create_compressed_texture(comp_params, mip_params, crn_file_data, pActual_quality_level, pActual_bitrate)) if (!create_compressed_texture(comp_params, mip_params, crn_file_data, pActual_quality_level, pActual_bitrate))
@@ -456,4 +456,4 @@ bool crn_decompress_block(const void *pSrc_block, crn_uint32 *pDst_pixels_u32, c
} }
return true; return true;
} }
+3 -3
View File
@@ -176,7 +176,7 @@ public:
console::printf("-%s", pixel_format_helpers::get_pixel_format_string(fmt)); console::printf("-%s", pixel_format_helpers::get_pixel_format_string(fmt));
} }
console::printf("\nFor bugs, support, or feedback: richgel99@gmail.com"); console::printf("\nFor bugs, support, or feedback: info@binomial.info");
} }
bool convert(const char* pCommand_line) bool convert(const char* pCommand_line)
@@ -1253,8 +1253,8 @@ static bool check_for_option(int argc, char *argv[], const char *pOption)
static void print_title() static void print_title()
{ {
console::printf("crunch: Advanced DXTn Texture Compressor - http://code.google.com/p/crunch"); console::printf("crunch: Advanced DXTn Texture Compressor - https://github.com/BinomialLLC/crunch");
console::printf("Copyright (c) 2010-2012 Rich Geldreich and Tenacious Software LLC"); console::printf("Copyright (c) 2010-2016 Richard Geldreich, Jr. and Binomial LLC");
console::printf("crnlib version v%u.%02u %s Built %s, %s", CRNLIB_VERSION / 100U, CRNLIB_VERSION % 100U, crnlib_is_x64() ? "x64" : "x86", __DATE__, __TIME__); console::printf("crnlib version v%u.%02u %s Built %s, %s", CRNLIB_VERSION / 100U, CRNLIB_VERSION % 100U, crnlib_is_x64() ? "x64" : "x86", __DATE__, __TIME__);
console::printf(""); console::printf("");
} }
+110
View File
@@ -0,0 +1,110 @@
/* Copyright (c) 2013, Evan Parker, Brandon Jones. All rights reserved.
Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */
#define PLATFORM_NACL // This disables use of 64 bit integers, among other things.
#include <stddef.h> // For NULL, size_t
#include <cstring> // for malloc etc
#include "crn_decomp.h"
extern "C" {
unsigned int crn_get_width(void *src, unsigned int src_size);
unsigned int crn_get_height(void *src, unsigned int src_size);
unsigned int crn_get_levels(void *src, unsigned int src_size);
unsigned int crn_get_dxt_format(void *src, unsigned int src_size);
unsigned int crn_get_bytes_per_block(void *src, unsigned int src_size);
unsigned int crn_get_uncompressed_size(void *p, unsigned int size, unsigned int level);
void crn_decompress(void *src, unsigned int src_size, void *dst, unsigned int dst_size, unsigned int firstLevel, unsigned int levelCount);
}
unsigned int crn_get_width(void *src, unsigned int src_size) {
crnd::crn_texture_info tex_info;
crnd::crnd_get_texture_info(static_cast<crn_uint8*>(src), src_size, &tex_info);
return tex_info.m_width;
}
unsigned int crn_get_height(void *src, unsigned int src_size) {
crnd::crn_texture_info tex_info;
crnd::crnd_get_texture_info(static_cast<crn_uint8*>(src), src_size, &tex_info);
return tex_info.m_height;
}
unsigned int crn_get_levels(void *src, unsigned int src_size) {
crnd::crn_texture_info tex_info;
crnd::crnd_get_texture_info(static_cast<crn_uint8*>(src), src_size, &tex_info);
return tex_info.m_levels;
}
unsigned int crn_get_dxt_format(void *src, unsigned int src_size) {
crnd::crn_texture_info tex_info;
crnd::crnd_get_texture_info(static_cast<crn_uint8*>(src), src_size, &tex_info);
return tex_info.m_format;
}
unsigned int crn_get_bytes_per_block(void *src, unsigned int src_size) {
crnd::crn_texture_info tex_info;
crnd::crnd_get_texture_info(static_cast<crn_uint8*>(src), src_size, &tex_info);
return crnd::crnd_get_bytes_per_dxt_block(tex_info.m_format);
}
unsigned int crn_get_uncompressed_size(void *src, unsigned int src_size, unsigned int level) {
crnd::crn_texture_info tex_info;
crnd::crnd_get_texture_info(static_cast<crn_uint8*>(src), src_size, &tex_info);
const crn_uint32 width = tex_info.m_width >> level;
const crn_uint32 height = tex_info.m_height >> level;
const crn_uint32 blocks_x = (width + 3) >> 2;
const crn_uint32 blocks_y = (height + 3) >> 2;
const crn_uint32 row_pitch = blocks_x * crnd::crnd_get_bytes_per_dxt_block(tex_info.m_format);
const crn_uint32 total_face_size = row_pitch * blocks_y;
return total_face_size;
}
void crn_decompress(void *src, unsigned int src_size, void *dst, unsigned int dst_size, unsigned int firstLevel, unsigned int levelCount) {
crnd::crn_texture_info tex_info;
crnd::crnd_get_texture_info(static_cast<crn_uint8*>(src), src_size, &tex_info);
crn_uint32 width = tex_info.m_width >> firstLevel;
crn_uint32 height = tex_info.m_height >> firstLevel;
crn_uint32 bytes_per_block = crnd::crnd_get_bytes_per_dxt_block(tex_info.m_format);
void *pDecomp_images[1];
pDecomp_images[0] = dst;
crnd::crnd_unpack_context pContext =
crnd::crnd_unpack_begin(static_cast<crn_uint8*>(src), src_size);
for (int i = firstLevel; i < firstLevel + levelCount; ++i) {
crn_uint32 blocks_x = (width + 3) >> 2;
crn_uint32 blocks_y = (height + 3) >> 2;
crn_uint32 row_pitch = blocks_x * bytes_per_block;
crn_uint32 total_level_size = row_pitch * blocks_y;
crnd::crnd_unpack_level(pContext, pDecomp_images, total_level_size, row_pitch, i);
pDecomp_images[0] = (char*)pDecomp_images[0] + total_level_size;
width = width >> 1;
height = height >> 1;
}
crnd::crnd_unpack_end(pContext);
}
+1 -1
View File
@@ -33,7 +33,7 @@ const int cDefaultCRNQualityLevel = 128;
static int print_usage() static int print_usage()
{ {
printf("Description: Simple crnlib API example program.\n"); printf("Description: Simple crnlib API example program.\n");
printf("Copyright (c) 2010-2011 Tenacious Software LLC\n"); printf("Copyright (c) 2010-2016 Richard Geldreich, Jr. and Binomial LLC\n");
printf("Usage: example1 [mode: i/c/d] [source_file] [options]\n"); printf("Usage: example1 [mode: i/c/d] [source_file] [options]\n");
printf("\nModes:\n"); printf("\nModes:\n");
printf("c: Compress to .DDS or .CRN using the crn_compress() func. in crnlib.h\n"); printf("c: Compress to .DDS or .CRN using the crn_compress() func. in crnlib.h\n");
+1 -1
View File
@@ -24,7 +24,7 @@ using namespace crnlib;
static int print_usage() static int print_usage()
{ {
printf("Description: Transcodes .CRN to .DDS files using crn_decomp.h.\n"); printf("Description: Transcodes .CRN to .DDS files using crn_decomp.h.\n");
printf("Copyright (c) 2010-2011 Tenacious Software LLC\n"); printf("Copyright (c) 2010-2016 Richard Geldreich, Jr. and Binomial LLC\n");
printf("Usage: example2 [source_file] [options]\n"); printf("Usage: example2 [source_file] [options]\n");
printf("\nOptions:\n"); printf("\nOptions:\n");
printf("-out filename - Force output filename.\n"); printf("-out filename - Force output filename.\n");
+1 -1
View File
@@ -29,7 +29,7 @@ const uint cDXTBlockSize = 4;
static int print_usage() static int print_usage()
{ {
printf("Description: Simple .DDS DXTn block compression using crnlib.\n"); printf("Description: Simple .DDS DXTn block compression using crnlib.\n");
printf("Copyright (c) 2010-2011 Tenacious Software LLC\n"); printf("Copyright (c) 2010-2016 Binomial LLC\n");
printf("Usage: example3 [source_file] [options]\n"); printf("Usage: example3 [source_file] [options]\n");
printf("\n"); printf("\n");
printf("Note: This simple example is not multithreaded, so it's not going to be\n"); printf("Note: This simple example is not multithreaded, so it's not going to be\n");
+10 -6
View File
@@ -1,5 +1,5 @@
// File: crn_decomp.h - Fast CRN->DXTc texture transcoder header file library // File: crn_decomp.h - Fast CRN->DXTc texture transcoder header file library
// Copyright (c) 2010-2012 Rich Geldreich and Tenacious Software LLC // Copyright (c) 2010-2016 Richard Geldreich, Jr. and Binomial LLC
// See Copyright Notice and license at the end of this file. // See Copyright Notice and license at the end of this file.
// //
// This single header file contains *all* of the code necessary to unpack .CRN files to raw DXTn bits. // This single header file contains *all* of the code necessary to unpack .CRN files to raw DXTn bits.
@@ -377,7 +377,11 @@ namespace crnd
#ifdef _WIN64 #ifdef _WIN64
typedef uint64 ptr_bits; typedef uint64 ptr_bits;
#else #else
typedef uint32 ptr_bits; #ifdef __x86_64__
typedef uint64 ptr_bits;
#else
typedef uint32 ptr_bits;
#endif
#endif #endif
template<typename T> struct int_traits { enum { cMin = crnd::cINT32_MIN, cMax = crnd::cINT32_MAX, cSigned = true }; }; template<typename T> struct int_traits { enum { cMin = crnd::cINT32_MIN, cMax = crnd::cINT32_MAX, cSigned = true }; };
@@ -2819,15 +2823,15 @@ namespace crnd
*pSize = 0; *pSize = 0;
if ((!pData) || (data_size < cCRNHeaderMinSize)) if ((!pData) || (data_size < cCRNHeaderMinSize))
return false; return NULL;
crn_header tmp_header; crn_header tmp_header;
const crn_header* pHeader = crnd_get_header(tmp_header, pData, data_size); const crn_header* pHeader = crnd_get_header(tmp_header, pData, data_size);
if (!pHeader) if (!pHeader)
return false; return NULL;
if (level_index >= pHeader->m_levels) if (level_index >= pHeader->m_levels)
return false; return NULL;
uint32 cur_level_ofs = pHeader->m_level_ofs[level_index]; uint32 cur_level_ofs = pHeader->m_level_ofs[level_index];
@@ -4812,7 +4816,7 @@ namespace crnd
// crn_decomp.h uses the ZLIB license: // crn_decomp.h uses the ZLIB license:
// http://opensource.org/licenses/Zlib // http://opensource.org/licenses/Zlib
// //
// Copyright (c) 2010-2012 Rich Geldreich and Tenacious Software LLC // Copyright (c) 2010-2016 Richard Geldreich, Jr. and Binomial LLC
// //
// This software is provided 'as-is', without any express or implied // This software is provided 'as-is', without any express or implied
// warranty. In no event will the authors be held liable for any damages // warranty. In no event will the authors be held liable for any damages
+2 -2
View File
@@ -1,5 +1,5 @@
// File: crnlib.h - Advanced DXTn texture compression library. // File: crnlib.h - Advanced DXTn texture compression library.
// Copyright (c) 2010-2012 Rich Geldreich and Tenacious Software LLC // Copyright (c) 2010-2016 Richard Geldreich, Jr. and Binomial LLC
// See copyright notice and license at the end of this file. // See copyright notice and license at the end of this file.
// //
// This header file contains the public crnlib declarations for DXTn, // This header file contains the public crnlib declarations for DXTn,
@@ -619,7 +619,7 @@ bool crn_decompress_block(const void *pSrc_block, crn_uint32 *pDst_pixels, crn_f
// crnlib uses the ZLIB license: // crnlib uses the ZLIB license:
// http://opensource.org/licenses/Zlib // http://opensource.org/licenses/Zlib
// //
// Copyright (c) 2010-2012 Rich Geldreich and Tenacious Software LLC // Copyright (c) 2010-2016 Richard Geldreich, Jr. and Binomial LLC
// //
// This software is provided 'as-is', without any express or implied // This software is provided 'as-is', without any express or implied
// warranty. In no event will the authors be held liable for any damages // warranty. In no event will the authors be held liable for any damages
+1 -1
View File
@@ -1,7 +1,7 @@
crunch/crnlib uses the ZLIB license: crunch/crnlib uses the ZLIB license:
http://opensource.org/licenses/Zlib http://opensource.org/licenses/Zlib
Copyright (c) 2010-2012 Rich Geldreich and Tenacious Software LLC Copyright (c) 2010-2016 Richard Geldreich, Jr. and Binomial LLC
This software is provided 'as-is', without any express or implied This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages warranty. In no event will the authors be held liable for any damages