mirror of
https://github.com/yuzu-emu/FasTC
synced 2024-11-22 04:23:33 +00:00
Add support for decoding void extent blocks in the ASTC decoder.
Fixes #25
This commit is contained in:
parent
0b9db85b82
commit
82daf5b32b
1 changed files with 46 additions and 2 deletions
|
@ -41,7 +41,8 @@ namespace ASTCC {
|
|||
bool m_bDualPlane;
|
||||
uint32 m_MaxWeight;
|
||||
bool m_bError;
|
||||
bool m_bVoidExtent;
|
||||
bool m_bVoidExtentLDR;
|
||||
bool m_bVoidExtentHDR;
|
||||
|
||||
TexelWeightParams() {
|
||||
memset(this, 0, sizeof(*this));
|
||||
|
@ -74,7 +75,17 @@ namespace ASTCC {
|
|||
|
||||
// Does this match the void extent block mode?
|
||||
if((modeBits & 0x01FF) == 0x1FC) {
|
||||
params.m_bVoidExtent = true;
|
||||
if (modeBits & 0x200) {
|
||||
params.m_bVoidExtentHDR = true;
|
||||
} else {
|
||||
params.m_bVoidExtentLDR = true;
|
||||
}
|
||||
|
||||
// Next two bits must be one.
|
||||
if (!(modeBits & 0x400) || !strm.ReadBit()) {
|
||||
params.m_bError = true;
|
||||
}
|
||||
|
||||
return params;
|
||||
}
|
||||
|
||||
|
@ -256,6 +267,28 @@ namespace ASTCC {
|
|||
return params;
|
||||
}
|
||||
|
||||
void FillVoidExtentLDR(BitStreamReadOnly& strm, uint32* const outBuf,
|
||||
uint32 blockWidth, uint32 blockHeight) {
|
||||
// Don't actually care about the void extent, just read the bits...
|
||||
for (int i = 0; i < 4; ++i) {
|
||||
strm.ReadBits(13);
|
||||
}
|
||||
|
||||
// Decode the RGBA components and renormalize them to the range [0, 255]
|
||||
uint16 r = strm.ReadBits(16);
|
||||
uint16 g = strm.ReadBits(16);
|
||||
uint16 b = strm.ReadBits(16);
|
||||
uint16 a = strm.ReadBits(16);
|
||||
|
||||
uint32 rgba = (r >> 8) | (g & 0xFF00) | (static_cast<uint32>(b) & 0xFF00) << 8
|
||||
| (static_cast<uint32>(a) & 0xFF00) << 16;
|
||||
|
||||
for (uint32 j = 0; j < blockHeight; j++)
|
||||
for (uint32 i = 0; i < blockWidth; i++) {
|
||||
outBuf[j * blockWidth + i] = rgba;
|
||||
}
|
||||
}
|
||||
|
||||
void FillError(uint32 *outBuf, uint32 blockWidth, uint32 blockHeight) {
|
||||
for(uint32 j = 0; j < blockHeight; j++)
|
||||
for(uint32 i = 0; i < blockWidth; i++) {
|
||||
|
@ -758,6 +791,17 @@ namespace ASTCC {
|
|||
return;
|
||||
}
|
||||
|
||||
if (weightParams.m_bVoidExtentLDR) {
|
||||
FillVoidExtentLDR(strm, outBuf, blockWidth, blockHeight);
|
||||
return;
|
||||
}
|
||||
|
||||
if (weightParams.m_bVoidExtentHDR) {
|
||||
assert(!"HDR void extent blocks are unsupported!");
|
||||
FillError(outBuf, blockWidth, blockHeight);
|
||||
return;
|
||||
}
|
||||
|
||||
if(weightParams.m_Width > blockWidth) {
|
||||
assert(!"Texel weight grid width should be smaller than block width");
|
||||
FillError(outBuf, blockWidth, blockHeight);
|
||||
|
|
Loading…
Reference in a new issue