Skip to content

Commit b4863dc

Browse files
committed
Use less pointers in AstcDecoder
1 parent d416ad0 commit b4863dc

1 file changed

Lines changed: 32 additions & 34 deletions

File tree

AssetRipper.TextureDecoder/Astc/AstcDecoder.cs

Lines changed: 32 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ private unsafe static int DecodeASTC(byte* input, int width, int height, int blo
3434
int bcw = (width + blockWidth - 1) / blockWidth;
3535
int bch = (height + blockHeight - 1) / blockHeight;
3636
int clen_last = (width + blockWidth - 1) % blockWidth + 1;
37-
uint* buf = stackalloc uint[blockWidth * blockHeight];
37+
Span<uint> buf = stackalloc uint[blockWidth * blockHeight];
3838
int inputOffset = 0;
3939
for (int t = 0; t < bch; t++)
4040
{
@@ -43,23 +43,21 @@ private unsafe static int DecodeASTC(byte* input, int width, int height, int blo
4343
DecodeBlock(input + inputOffset, blockWidth, blockHeight, buf);
4444
int clen = s < bcw - 1 ? blockWidth : clen_last;
4545
uint* outputPtr = (uint*)(output + (t * blockHeight * 4 * width + s * 4 * blockWidth));
46-
uint* bufPtr = buf;
4746
for (int i = 0, y = t * blockHeight; i < blockHeight && y < height; i++, y++)
4847
{
4948
for (int j = 0; j < clen; j++)
5049
{
51-
outputPtr[j] = bufPtr[j];
50+
outputPtr[j] = buf[j + i * blockWidth];
5251
}
5352

5453
outputPtr += width;
55-
bufPtr += blockWidth;
5654
}
5755
}
5856
}
5957
return inputOffset;
6058
}
6159

62-
private unsafe static void DecodeBlock(byte* input, int blockWidth, int blockHeight, uint* output)
60+
private unsafe static void DecodeBlock(byte* input, int blockWidth, int blockHeight, Span<uint> output)
6361
{
6462
if (input[0] == 0xfc && (input[1] & 1) == 1)
6563
{
@@ -82,7 +80,7 @@ private unsafe static void DecodeBlock(byte* input, int blockWidth, int blockHei
8280
{
8381
SelectPartition(input, blockPtr);
8482
}
85-
ApplicateColor(blockPtr, output);
83+
ApplicateColor(blockData, output);
8684
}
8785
}
8886

@@ -680,56 +678,56 @@ private unsafe static void SelectPartition(byte* input, BlockData* block)
680678
}
681679
}
682680

683-
private unsafe static void ApplicateColor(BlockData* block, uint* output)
681+
private unsafe static void ApplicateColor(BlockData block, Span<uint> output)
684682
{
685-
if (block->dual_plane != 0)
683+
if (block.dual_plane != 0)
686684
{
687-
int* ps = stackalloc int[] { 0, 0, 0, 0 };
688-
ps[block->plane_selector] = 1;
689-
if (block->part_num > 1)
685+
Span<int> ps = stackalloc int[] { 0, 0, 0, 0 };
686+
ps[block.plane_selector] = 1;
687+
if (block.part_num > 1)
690688
{
691-
for (int i = 0; i < block->bw * block->bh; i++)
689+
for (int i = 0; i < block.bw * block.bh; i++)
692690
{
693-
int p = block->partition[i];
694-
byte r = SelectColor(block->endpoints[p * 8 + 0], block->endpoints[p * 8 + 4], block->weights[i * 2 + ps[0]]);
695-
byte g = SelectColor(block->endpoints[p * 8 + 1], block->endpoints[p * 8 + 5], block->weights[i * 2 + ps[1]]);
696-
byte b = SelectColor(block->endpoints[p * 8 + 2], block->endpoints[p * 8 + 6], block->weights[i * 2 + ps[2]]);
697-
byte a = SelectColor(block->endpoints[p * 8 + 3], block->endpoints[p * 8 + 7], block->weights[i * 2 + ps[3]]);
691+
int p = block.partition[i];
692+
byte r = SelectColor(block.endpoints[p * 8 + 0], block.endpoints[p * 8 + 4], block.weights[i * 2 + ps[0]]);
693+
byte g = SelectColor(block.endpoints[p * 8 + 1], block.endpoints[p * 8 + 5], block.weights[i * 2 + ps[1]]);
694+
byte b = SelectColor(block.endpoints[p * 8 + 2], block.endpoints[p * 8 + 6], block.weights[i * 2 + ps[2]]);
695+
byte a = SelectColor(block.endpoints[p * 8 + 3], block.endpoints[p * 8 + 7], block.weights[i * 2 + ps[3]]);
698696
output[i] = Color(r, g, b, a);
699697
}
700698
}
701699
else
702700
{
703-
for (int i = 0; i < block->bw * block->bh; i++)
701+
for (int i = 0; i < block.bw * block.bh; i++)
704702
{
705-
byte r = SelectColor(block->endpoints[0], block->endpoints[4], block->weights[i * 2 + ps[0]]);
706-
byte g = SelectColor(block->endpoints[1], block->endpoints[5], block->weights[i * 2 + ps[1]]);
707-
byte b = SelectColor(block->endpoints[2], block->endpoints[6], block->weights[i * 2 + ps[2]]);
708-
byte a = SelectColor(block->endpoints[3], block->endpoints[7], block->weights[i * 2 + ps[3]]);
703+
byte r = SelectColor(block.endpoints[0], block.endpoints[4], block.weights[i * 2 + ps[0]]);
704+
byte g = SelectColor(block.endpoints[1], block.endpoints[5], block.weights[i * 2 + ps[1]]);
705+
byte b = SelectColor(block.endpoints[2], block.endpoints[6], block.weights[i * 2 + ps[2]]);
706+
byte a = SelectColor(block.endpoints[3], block.endpoints[7], block.weights[i * 2 + ps[3]]);
709707
output[i] = Color(r, g, b, a);
710708
}
711709
}
712710
}
713-
else if (block->part_num > 1)
711+
else if (block.part_num > 1)
714712
{
715-
for (int i = 0; i < block->bw * block->bh; i++)
713+
for (int i = 0; i < block.bw * block.bh; i++)
716714
{
717-
int p = block->partition[i];
718-
byte r = SelectColor(block->endpoints[p * 8 + 0], block->endpoints[p * 8 + 4], block->weights[i * 2]);
719-
byte g = SelectColor(block->endpoints[p * 8 + 1], block->endpoints[p * 8 + 5], block->weights[i * 2]);
720-
byte b = SelectColor(block->endpoints[p * 8 + 2], block->endpoints[p * 8 + 6], block->weights[i * 2]);
721-
byte a = SelectColor(block->endpoints[p * 8 + 3], block->endpoints[p * 8 + 7], block->weights[i * 2]);
715+
int p = block.partition[i];
716+
byte r = SelectColor(block.endpoints[p * 8 + 0], block.endpoints[p * 8 + 4], block.weights[i * 2]);
717+
byte g = SelectColor(block.endpoints[p * 8 + 1], block.endpoints[p * 8 + 5], block.weights[i * 2]);
718+
byte b = SelectColor(block.endpoints[p * 8 + 2], block.endpoints[p * 8 + 6], block.weights[i * 2]);
719+
byte a = SelectColor(block.endpoints[p * 8 + 3], block.endpoints[p * 8 + 7], block.weights[i * 2]);
722720
output[i] = Color(r, g, b, a);
723721
}
724722
}
725723
else
726724
{
727-
for (int i = 0; i < block->bw * block->bh; i++)
725+
for (int i = 0; i < block.bw * block.bh; i++)
728726
{
729-
byte r = SelectColor(block->endpoints[0], block->endpoints[4], block->weights[i * 2]);
730-
byte g = SelectColor(block->endpoints[1], block->endpoints[5], block->weights[i * 2]);
731-
byte b = SelectColor(block->endpoints[2], block->endpoints[6], block->weights[i * 2]);
732-
byte a = SelectColor(block->endpoints[3], block->endpoints[7], block->weights[i * 2]);
727+
byte r = SelectColor(block.endpoints[0], block.endpoints[4], block.weights[i * 2]);
728+
byte g = SelectColor(block.endpoints[1], block.endpoints[5], block.weights[i * 2]);
729+
byte b = SelectColor(block.endpoints[2], block.endpoints[6], block.weights[i * 2]);
730+
byte a = SelectColor(block.endpoints[3], block.endpoints[7], block.weights[i * 2]);
733731
output[i] = Color(r, g, b, a);
734732
}
735733
}

0 commit comments

Comments
 (0)