Exemple #1
0
        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();
        }
Exemple #2
0
        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);
        }