Check for single color blocks in all compressors.
This commit is contained in:
parent
921ee354c0
commit
15e7125b4b
@ -4,6 +4,10 @@ NVIDIA Texture Tools version 2.1.0
|
|||||||
* Support alpha premultiplication by Charles Nicholson. See issue 30.
|
* Support alpha premultiplication by Charles Nicholson. See issue 30.
|
||||||
* Improved decompressor tool submitted by Amorilia. See issue 41.
|
* Improved decompressor tool submitted by Amorilia. See issue 41.
|
||||||
|
|
||||||
|
NVIDIA Texture Tools version 2.0.3
|
||||||
|
* More accurate DXT3 compressor. Fixes issue 38.
|
||||||
|
* Remove legacy compressors. Fix issue 34?
|
||||||
|
|
||||||
NVIDIA Texture Tools version 2.0.2
|
NVIDIA Texture Tools version 2.0.2
|
||||||
* Fix copy ctor error reported by Richard Sim.
|
* Fix copy ctor error reported by Richard Sim.
|
||||||
* Fix indexMirror error reported by Chris Lambert.
|
* Fix indexMirror error reported by Chris Lambert.
|
||||||
|
@ -114,9 +114,12 @@ void ColorBlock::splatY()
|
|||||||
/// Returns true if the block has a single color.
|
/// Returns true if the block has a single color.
|
||||||
bool ColorBlock::isSingleColor() const
|
bool ColorBlock::isSingleColor() const
|
||||||
{
|
{
|
||||||
for(int i = 1; i < 16; i++)
|
Color32 mask(0xFF, 0xFF, 0xFF, 0x00);
|
||||||
|
uint u = m_color[0].u & mask.u;
|
||||||
|
|
||||||
|
for (int i = 1; i < 16; i++)
|
||||||
{
|
{
|
||||||
if (m_color[0] != m_color[i])
|
if (u != (m_color[i].u & mask.u))
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -134,10 +137,13 @@ bool ColorBlock::isSingleColorNoAlpha() const
|
|||||||
{
|
{
|
||||||
if (m_color[i].a != 0) c = m_color[i];
|
if (m_color[i].a != 0) c = m_color[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Color32 mask(0xFF, 0xFF, 0xFF, 0x00);
|
||||||
|
uint u = c.u & mask.u;
|
||||||
|
|
||||||
for(; i < 16; i++)
|
for(; i < 16; i++)
|
||||||
{
|
{
|
||||||
if (c != m_color[i])
|
if (u != (m_color[i].u & mask.u))
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -237,7 +237,16 @@ void nv::compressDXT1a(const Image * image, const OutputOptions::Private & outpu
|
|||||||
|
|
||||||
rgba.init(image, x, y);
|
rgba.init(image, x, y);
|
||||||
|
|
||||||
if (rgba.isSingleColor())
|
bool anyAlpha = false;
|
||||||
|
bool allAlpha = true;
|
||||||
|
|
||||||
|
for (uint i = 0; i < 16; i++)
|
||||||
|
{
|
||||||
|
if (rgba.color(i).a < 128) anyAlpha = true;
|
||||||
|
else allAlpha = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((!anyAlpha && rgba.isSingleColor() || allAlpha))
|
||||||
{
|
{
|
||||||
OptimalCompress::compressDXT1a(rgba.color(0), &block);
|
OptimalCompress::compressDXT1a(rgba.color(0), &block);
|
||||||
}
|
}
|
||||||
@ -274,11 +283,18 @@ void nv::compressDXT3(const Image * image, const OutputOptions::Private & output
|
|||||||
|
|
||||||
// Compress explicit alpha.
|
// Compress explicit alpha.
|
||||||
OptimalCompress::compressDXT3A(rgba, &block.alpha);
|
OptimalCompress::compressDXT3A(rgba, &block.alpha);
|
||||||
|
|
||||||
// Compress color.
|
// Compress color.
|
||||||
squish::ColourSet colours((uint8 *)rgba.colors(), squish::kWeightColourByAlpha);
|
if (rgba.isSingleColor())
|
||||||
fit.SetColourSet(&colours, 0);
|
{
|
||||||
fit.Compress(&block.color);
|
OptimalCompress::compressDXT1(rgba.color(0), &block.color);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
squish::ColourSet colours((uint8 *)rgba.colors(), squish::kWeightColourByAlpha);
|
||||||
|
fit.SetColourSet(&colours, 0);
|
||||||
|
fit.Compress(&block.color);
|
||||||
|
}
|
||||||
|
|
||||||
if (outputOptions.outputHandler != NULL) {
|
if (outputOptions.outputHandler != NULL) {
|
||||||
outputOptions.outputHandler->writeData(&block, sizeof(block));
|
outputOptions.outputHandler->writeData(&block, sizeof(block));
|
||||||
@ -314,9 +330,16 @@ void nv::compressDXT5(const Image * image, const OutputOptions::Private & output
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Compress color.
|
// Compress color.
|
||||||
squish::ColourSet colours((uint8 *)rgba.colors(), squish::kWeightColourByAlpha);
|
if (rgba.isSingleColor())
|
||||||
fit.SetColourSet(&colours, 0);
|
{
|
||||||
fit.Compress(&block.color);
|
OptimalCompress::compressDXT1(rgba.color(0), &block.color);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
squish::ColourSet colours((uint8 *)rgba.colors(), squish::kWeightColourByAlpha);
|
||||||
|
fit.SetColourSet(&colours, 0);
|
||||||
|
fit.Compress(&block.color);
|
||||||
|
}
|
||||||
|
|
||||||
if (outputOptions.outputHandler != NULL) {
|
if (outputOptions.outputHandler != NULL) {
|
||||||
outputOptions.outputHandler->writeData(&block, sizeof(block));
|
outputOptions.outputHandler->writeData(&block, sizeof(block));
|
||||||
|
@ -481,7 +481,17 @@ void QuickCompress::compressDXT1(const ColorBlock & rgba, BlockDXT1 * dxtBlock)
|
|||||||
|
|
||||||
void QuickCompress::compressDXT1a(const ColorBlock & rgba, BlockDXT1 * dxtBlock)
|
void QuickCompress::compressDXT1a(const ColorBlock & rgba, BlockDXT1 * dxtBlock)
|
||||||
{
|
{
|
||||||
if (!rgba.hasAlpha())
|
bool hasAlpha = false;
|
||||||
|
|
||||||
|
for (uint i = 0; i < 16; i++)
|
||||||
|
{
|
||||||
|
if (rgba.color(i).a < 128) {
|
||||||
|
hasAlpha = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!hasAlpha)
|
||||||
{
|
{
|
||||||
compressDXT1(rgba, dxtBlock);
|
compressDXT1(rgba, dxtBlock);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user