|
|
|
@ -21,10 +21,10 @@ |
|
|
|
|
// v1.01 - (stb) fix bug converting to RGB that messed up quality, thanks ryg & cbloom
|
|
|
|
|
// v1.00 - (stb) first release
|
|
|
|
|
//
|
|
|
|
|
// contributors:
|
|
|
|
|
// contributors:
|
|
|
|
|
// Kevin Schmidt (#defines for "freestanding" compilation)
|
|
|
|
|
// github:ppiastucki (BC4 support)
|
|
|
|
|
//
|
|
|
|
|
//
|
|
|
|
|
// LICENSE
|
|
|
|
|
//
|
|
|
|
|
// See end of file for license information.
|
|
|
|
@ -66,7 +66,7 @@ STBDDEF void stb_compress_bc5_block(unsigned char *dest, const unsigned char *sr |
|
|
|
|
// STB_DXT_USE_ROUNDING_BIAS
|
|
|
|
|
// use a rounding bias during color interpolation. this is closer to what "ideal"
|
|
|
|
|
// interpolation would do but doesn't match the S3TC/DX10 spec. old versions (pre-1.03)
|
|
|
|
|
// implicitly had this turned on.
|
|
|
|
|
// implicitly had this turned on.
|
|
|
|
|
//
|
|
|
|
|
// in case you're targeting a specific type of hardware (e.g. console programmers):
|
|
|
|
|
// NVidia and Intel GPUs (as of 2010) as well as DX9 ref use DXT decoders that are closer
|
|
|
|
@ -157,7 +157,7 @@ static void stb__PrepareOptTable(unsigned char *Table,const unsigned char *expan |
|
|
|
|
int mine = expand[mn]; |
|
|
|
|
int maxe = expand[mx]; |
|
|
|
|
int err = STBD_ABS(stb__Lerp13(maxe, mine) - i); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// DX10 spec says that interpolation must be within 3% of "correct" result,
|
|
|
|
|
// add this as error term. (normally we'd expect a random distribution of
|
|
|
|
|
// +-1.5% error, but nowhere in the spec does it say that the error has to be
|
|
|
|
@ -236,7 +236,7 @@ static unsigned int stb__MatchColorsBlock(unsigned char *block, unsigned char *c |
|
|
|
|
// relying on this 1d approximation isn't always optimal in terms of euclidean distance,
|
|
|
|
|
// but it's very close and a lot faster.
|
|
|
|
|
// http://cbloomrants.blogspot.com/2008/12/12-08-08-dxtc-summary.html
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
c0Point = (stops[1] + stops[3]) >> 1; |
|
|
|
|
halfPoint = (stops[3] + stops[2]) >> 1; |
|
|
|
|
c3Point = (stops[2] + stops[0]) >> 1; |
|
|
|
@ -488,11 +488,11 @@ static int stb__RefineBlock(unsigned char *block, unsigned short *pmax16, unsign |
|
|
|
|
fg = frb * 63.0f / 31.0f; |
|
|
|
|
|
|
|
|
|
// solve.
|
|
|
|
|
max16 = (unsigned short)(stb__sclamp((At1_r*yy - At2_r*xy)*frb+0.5f,0,31) << 11); |
|
|
|
|
max16 = (unsigned short)(stb__sclamp((At1_r*yy - At2_r*xy)*frb+0.5f,0,31) << 11); |
|
|
|
|
max16 |= (unsigned short)(stb__sclamp((At1_g*yy - At2_g*xy)*fg +0.5f,0,63) << 5); |
|
|
|
|
max16 |= (unsigned short)(stb__sclamp((At1_b*yy - At2_b*xy)*frb+0.5f,0,31) << 0); |
|
|
|
|
|
|
|
|
|
min16 = (unsigned short)(stb__sclamp((At2_r*xx - At1_r*xy)*frb+0.5f,0,31) << 11); |
|
|
|
|
min16 = (unsigned short)(stb__sclamp((At2_r*xx - At1_r*xy)*frb+0.5f,0,31) << 11); |
|
|
|
|
min16 |= (unsigned short)(stb__sclamp((At2_g*xx - At1_g*xy)*fg +0.5f,0,63) << 5); |
|
|
|
|
min16 |= (unsigned short)(stb__sclamp((At2_b*xx - At1_b*xy)*frb+0.5f,0,31) << 0); |
|
|
|
|
} |
|
|
|
@ -511,7 +511,7 @@ static void stb__CompressColorBlock(unsigned char *dest, unsigned char *block, i |
|
|
|
|
int refinecount; |
|
|
|
|
unsigned short max16, min16; |
|
|
|
|
unsigned char dblock[16*4],color[4*4]; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
dither = mode & STB_DXT_DITHER; |
|
|
|
|
refinecount = (mode & STB_DXT_HIGHQUAL) ? 2 : 1; |
|
|
|
|
|
|
|
|
@ -541,7 +541,7 @@ static void stb__CompressColorBlock(unsigned char *dest, unsigned char *block, i |
|
|
|
|
// third step: refine (multiple times if requested)
|
|
|
|
|
for (i=0;i<refinecount;i++) { |
|
|
|
|
unsigned int lastmask = mask; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (stb__RefineBlock(dither ? dblock : block,&max16,&min16,mask)) { |
|
|
|
|
if (max16 != min16) { |
|
|
|
|
stb__EvalColors(color,max16,min16); |
|
|
|
@ -551,7 +551,7 @@ static void stb__CompressColorBlock(unsigned char *dest, unsigned char *block, i |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if(mask == lastmask) |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
@ -605,7 +605,7 @@ static void stb__CompressAlphaBlock(unsigned char *dest,unsigned char *src, int |
|
|
|
|
bias = (dist < 8) ? (dist - 1) : (dist/2 + 2); |
|
|
|
|
bias -= mn * 7; |
|
|
|
|
bits = 0,mask=0; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for (i=0;i<16;i++) { |
|
|
|
|
int a = src[i*stride]*7 + bias; |
|
|
|
|
int ind,t; |
|
|
|
@ -614,7 +614,7 @@ static void stb__CompressAlphaBlock(unsigned char *dest,unsigned char *src, int |
|
|
|
|
t = (a >= dist4) ? -1 : 0; ind = t & 4; a -= dist4 & t; |
|
|
|
|
t = (a >= dist2) ? -1 : 0; ind += t & 2; a -= dist2 & t; |
|
|
|
|
ind += (a >= dist); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// turn linear scale into DXT index (0/1 are extremal pts)
|
|
|
|
|
ind = -ind & 7; |
|
|
|
|
ind ^= (2 > ind); |
|
|
|
@ -691,38 +691,38 @@ This software is available under 2 licenses -- choose whichever you prefer. |
|
|
|
|
------------------------------------------------------------------------------ |
|
|
|
|
ALTERNATIVE A - MIT License |
|
|
|
|
Copyright (c) 2017 Sean Barrett |
|
|
|
|
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
|
|
|
|
this software and associated documentation files (the "Software"), to deal in
|
|
|
|
|
the Software without restriction, including without limitation the rights to
|
|
|
|
|
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
|
|
|
|
of the Software, and to permit persons to whom the Software is furnished to do
|
|
|
|
|
Permission is hereby granted, free of charge, to any person obtaining a copy of |
|
|
|
|
this software and associated documentation files (the "Software"), to deal in |
|
|
|
|
the Software without restriction, including without limitation the rights to |
|
|
|
|
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies |
|
|
|
|
of the Software, and to permit persons to whom the Software is furnished to do |
|
|
|
|
so, subject to the following conditions: |
|
|
|
|
The above copyright notice and this permission notice shall be included in all
|
|
|
|
|
The above copyright notice and this permission notice shall be included in all |
|
|
|
|
copies or substantial portions of the Software. |
|
|
|
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
|
|
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
|
|
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
|
|
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
|
|
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
|
|
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
|
|
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
|
|
|
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
|
|
|
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
|
|
|
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
|
|
|
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
|
|
|
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
|
|
|
|
SOFTWARE. |
|
|
|
|
------------------------------------------------------------------------------ |
|
|
|
|
ALTERNATIVE B - Public Domain (www.unlicense.org) |
|
|
|
|
This is free and unencumbered software released into the public domain. |
|
|
|
|
Anyone is free to copy, modify, publish, use, compile, sell, or distribute this
|
|
|
|
|
software, either in source code form or as a compiled binary, for any purpose,
|
|
|
|
|
Anyone is free to copy, modify, publish, use, compile, sell, or distribute this |
|
|
|
|
software, either in source code form or as a compiled binary, for any purpose, |
|
|
|
|
commercial or non-commercial, and by any means. |
|
|
|
|
In jurisdictions that recognize copyright laws, the author or authors of this
|
|
|
|
|
software dedicate any and all copyright interest in the software to the public
|
|
|
|
|
domain. We make this dedication for the benefit of the public at large and to
|
|
|
|
|
the detriment of our heirs and successors. We intend this dedication to be an
|
|
|
|
|
overt act of relinquishment in perpetuity of all present and future rights to
|
|
|
|
|
In jurisdictions that recognize copyright laws, the author or authors of this |
|
|
|
|
software dedicate any and all copyright interest in the software to the public |
|
|
|
|
domain. We make this dedication for the benefit of the public at large and to |
|
|
|
|
the detriment of our heirs and successors. We intend this dedication to be an |
|
|
|
|
overt act of relinquishment in perpetuity of all present and future rights to |
|
|
|
|
this software under copyright law. |
|
|
|
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
|
|
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
|
|
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
|
|
|
AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
|
|
|
|
ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
|
|
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
|
|
|
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
|
|
|
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
|
|
|
|
AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN |
|
|
|
|
ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION |
|
|
|
|
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
|
|
|
|
------------------------------------------------------------------------------ |
|
|
|
|
*/ |
|
|
|
|