parent
72646ac4ae
commit
c70479c47b
72
stb_dxt.h
72
stb_dxt.h
@ -21,10 +21,10 @@
|
|||||||
// v1.01 - (stb) fix bug converting to RGB that messed up quality, thanks ryg & cbloom
|
// v1.01 - (stb) fix bug converting to RGB that messed up quality, thanks ryg & cbloom
|
||||||
// v1.00 - (stb) first release
|
// v1.00 - (stb) first release
|
||||||
//
|
//
|
||||||
// contributors:
|
// contributors:
|
||||||
// Kevin Schmidt (#defines for "freestanding" compilation)
|
// Kevin Schmidt (#defines for "freestanding" compilation)
|
||||||
// github:ppiastucki (BC4 support)
|
// github:ppiastucki (BC4 support)
|
||||||
//
|
//
|
||||||
// LICENSE
|
// LICENSE
|
||||||
//
|
//
|
||||||
// See end of file for license information.
|
// 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
|
// STB_DXT_USE_ROUNDING_BIAS
|
||||||
// use a rounding bias during color interpolation. this is closer to what "ideal"
|
// 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)
|
// 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):
|
// 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
|
// 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 mine = expand[mn];
|
||||||
int maxe = expand[mx];
|
int maxe = expand[mx];
|
||||||
int err = STBD_ABS(stb__Lerp13(maxe, mine) - i);
|
int err = STBD_ABS(stb__Lerp13(maxe, mine) - i);
|
||||||
|
|
||||||
// DX10 spec says that interpolation must be within 3% of "correct" result,
|
// 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
|
// 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
|
// +-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,
|
// relying on this 1d approximation isn't always optimal in terms of euclidean distance,
|
||||||
// but it's very close and a lot faster.
|
// but it's very close and a lot faster.
|
||||||
// http://cbloomrants.blogspot.com/2008/12/12-08-08-dxtc-summary.html
|
// http://cbloomrants.blogspot.com/2008/12/12-08-08-dxtc-summary.html
|
||||||
|
|
||||||
c0Point = (stops[1] + stops[3]) >> 1;
|
c0Point = (stops[1] + stops[3]) >> 1;
|
||||||
halfPoint = (stops[3] + stops[2]) >> 1;
|
halfPoint = (stops[3] + stops[2]) >> 1;
|
||||||
c3Point = (stops[2] + stops[0]) >> 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;
|
fg = frb * 63.0f / 31.0f;
|
||||||
|
|
||||||
// solve.
|
// 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_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);
|
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_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);
|
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;
|
int refinecount;
|
||||||
unsigned short max16, min16;
|
unsigned short max16, min16;
|
||||||
unsigned char dblock[16*4],color[4*4];
|
unsigned char dblock[16*4],color[4*4];
|
||||||
|
|
||||||
dither = mode & STB_DXT_DITHER;
|
dither = mode & STB_DXT_DITHER;
|
||||||
refinecount = (mode & STB_DXT_HIGHQUAL) ? 2 : 1;
|
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)
|
// third step: refine (multiple times if requested)
|
||||||
for (i=0;i<refinecount;i++) {
|
for (i=0;i<refinecount;i++) {
|
||||||
unsigned int lastmask = mask;
|
unsigned int lastmask = mask;
|
||||||
|
|
||||||
if (stb__RefineBlock(dither ? dblock : block,&max16,&min16,mask)) {
|
if (stb__RefineBlock(dither ? dblock : block,&max16,&min16,mask)) {
|
||||||
if (max16 != min16) {
|
if (max16 != min16) {
|
||||||
stb__EvalColors(color,max16,min16);
|
stb__EvalColors(color,max16,min16);
|
||||||
@ -551,7 +551,7 @@ static void stb__CompressColorBlock(unsigned char *dest, unsigned char *block, i
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(mask == lastmask)
|
if(mask == lastmask)
|
||||||
break;
|
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 = (dist < 8) ? (dist - 1) : (dist/2 + 2);
|
||||||
bias -= mn * 7;
|
bias -= mn * 7;
|
||||||
bits = 0,mask=0;
|
bits = 0,mask=0;
|
||||||
|
|
||||||
for (i=0;i<16;i++) {
|
for (i=0;i<16;i++) {
|
||||||
int a = src[i*stride]*7 + bias;
|
int a = src[i*stride]*7 + bias;
|
||||||
int ind,t;
|
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 >= dist4) ? -1 : 0; ind = t & 4; a -= dist4 & t;
|
||||||
t = (a >= dist2) ? -1 : 0; ind += t & 2; a -= dist2 & t;
|
t = (a >= dist2) ? -1 : 0; ind += t & 2; a -= dist2 & t;
|
||||||
ind += (a >= dist);
|
ind += (a >= dist);
|
||||||
|
|
||||||
// turn linear scale into DXT index (0/1 are extremal pts)
|
// turn linear scale into DXT index (0/1 are extremal pts)
|
||||||
ind = -ind & 7;
|
ind = -ind & 7;
|
||||||
ind ^= (2 > ind);
|
ind ^= (2 > ind);
|
||||||
@ -691,38 +691,38 @@ This software is available under 2 licenses -- choose whichever you prefer.
|
|||||||
------------------------------------------------------------------------------
|
------------------------------------------------------------------------------
|
||||||
ALTERNATIVE A - MIT License
|
ALTERNATIVE A - MIT License
|
||||||
Copyright (c) 2017 Sean Barrett
|
Copyright (c) 2017 Sean Barrett
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
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
|
this software and associated documentation files (the "Software"), to deal in
|
||||||
the Software without restriction, including without limitation the rights to
|
the Software without restriction, including without limitation the rights to
|
||||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
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
|
of the Software, and to permit persons to whom the Software is furnished to do
|
||||||
so, subject to the following conditions:
|
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.
|
copies or substantial portions of the Software.
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
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
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
SOFTWARE.
|
SOFTWARE.
|
||||||
------------------------------------------------------------------------------
|
------------------------------------------------------------------------------
|
||||||
ALTERNATIVE B - Public Domain (www.unlicense.org)
|
ALTERNATIVE B - Public Domain (www.unlicense.org)
|
||||||
This is free and unencumbered software released into the public domain.
|
This is free and unencumbered software released into the public domain.
|
||||||
Anyone is free to copy, modify, publish, use, compile, sell, or distribute this
|
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,
|
software, either in source code form or as a compiled binary, for any purpose,
|
||||||
commercial or non-commercial, and by any means.
|
commercial or non-commercial, and by any means.
|
||||||
In jurisdictions that recognize copyright laws, the author or authors of this
|
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
|
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
|
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
|
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
|
overt act of relinquishment in perpetuity of all present and future rights to
|
||||||
this software under copyright law.
|
this software under copyright law.
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
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
|
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
|
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.
|
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
------------------------------------------------------------------------------
|
------------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
|
Loading…
Reference in New Issue
Block a user