public void MemoryConsumption_Low_Success() { // Assign var encoding = new Rgba(8, 0, 0); var input = Enumerable.Range(0, 1024 * 1024 * 32).Select(x => (byte)(x % 256)).ToArray(); // Act var colors = encoding.Load(input, 1); // Assert var stopwatch = new Stopwatch(); stopwatch.Start(); Assert.IsTrue(colors.All(x => x == Color.FromArgb(255, 3, 0, 0))); stopwatch.Stop(); }
private IList <Color> ExpandTX4I(byte[] data, byte[] tx4iData, byte[] paletteData) { var palEnc = new Rgba(5, 5, 5, "BGR"); Color DecodeColor(byte[] cData) => palEnc.Load(cData, new EncodingLoadContext(new Size(1, 1), 1)).First(); var result = new List <Color>(); var clrBuffer = new byte[2]; for (var i = 0; i < data.Length; i += 4) { var texBlock = BinaryPrimitives.ReadUInt32LittleEndian(data.AsSpan(i, 4)); var tx4iBlock = BinaryPrimitives.ReadUInt16LittleEndian(tx4iData.AsSpan(i >> 1, 2)); var palOffset = (tx4iBlock & 0x3FFF) * 4; var mode = tx4iBlock >> 14; var c0Value = (uint)BinaryPrimitives.ReadUInt16LittleEndian(paletteData.AsSpan(palOffset, 2)); var c1Value = (uint)BinaryPrimitives.ReadUInt16LittleEndian(paletteData.AsSpan(palOffset + 2, 2)); var c0 = DecodeColor(paletteData.AsSpan(palOffset, 2).ToArray()); var c1 = DecodeColor(paletteData.AsSpan(palOffset + 2, 2).ToArray()); for (var j = 0; j < 16; j++) { var index = (texBlock >> (j * 2)) & 0x3; switch (index) { case 0: result.Add(c0); break; case 1: result.Add(c1); break; case 2: switch (mode) { case 0: case 2: result.Add(DecodeColor(paletteData.AsSpan(palOffset + 4, 2).ToArray())); break; case 1: result.Add(c0.InterpolateHalf(c1)); break; case 3: result.Add(c0.InterpolateEighth(c1, 5)); break; } break; case 3: switch (mode) { case 0: case 1: result.Add(Color.Transparent); break; case 2: result.Add(DecodeColor(paletteData.AsSpan(palOffset + 6, 2).ToArray())); break; case 3: result.Add(c0.InterpolateEighth(c1, 3)); break; } break; } } } return(result); }