Exemplo n.º 1
0
        private static Bc2Block TryColors(RawBlock4X4Rgba32 rawBlock, ColorRgb565 color0, ColorRgb565 color1, out float error, float rWeight = 0.3f, float gWeight = 0.6f, float bWeight = 0.1f)
        {
            Bc2Block output = new Bc2Block();

            var pixels = rawBlock.AsSpan;

            output.color0 = color0;
            output.color1 = color1;

            var c0 = color0.ToColorRgb24();
            var c1 = color1.ToColorRgb24();

            ReadOnlySpan <ColorRgb24> colors = stackalloc ColorRgb24[] {
                c0,
                c1,
                c0 *(2.0 / 3.0) + c1 * (1.0 / 3.0),
                c0 *(1.0 / 3.0) + c1 * (2.0 / 3.0)
            };

            error = 0;
            for (int i = 0; i < 16; i++)
            {
                var color = pixels[i];
                output.SetAlpha(i, color.A);
                output[i] = ColorChooser.ChooseClosestColor4(colors, color, rWeight, gWeight, bWeight, out var e);
                error    += e;
            }

            return(output);
        }
Exemplo n.º 2
0
            internal static Bc2Block EncodeBlock(RawBlock4X4Rgba32 rawBlock)
            {
                var pixels = rawBlock.AsSpan;

                PcaVectors.Create(pixels, out var mean, out var principalAxis);
                PcaVectors.GetMinMaxColor565(pixels, mean, principalAxis, out var min, out var max);

                ColorRgb565 c0 = max;
                ColorRgb565 c1 = min;

                var output = TryColors(rawBlock, c0, c1, out var _);

                return(output);
            }
Exemplo n.º 3
0
        public static (ColorRgb565, ColorRgb565) Variate565(ColorRgb565 c0, ColorRgb565 c1, int i)
        {
            int idx    = i % varPatternEp0R.Length;
            var newEp0 = new ColorRgb565();
            var newEp1 = new ColorRgb565();

            newEp0.RawR = ByteHelper.ClampToByte(c0.RawR + varPatternEp0R[idx]);
            newEp0.RawG = ByteHelper.ClampToByte(c0.RawG + varPatternEp0G[idx]);
            newEp0.RawB = ByteHelper.ClampToByte(c0.RawB + varPatternEp0B[idx]);

            newEp1.RawR = ByteHelper.ClampToByte(c1.RawR + varPatternEp1R[idx]);
            newEp1.RawG = ByteHelper.ClampToByte(c1.RawG + varPatternEp1G[idx]);
            newEp1.RawB = ByteHelper.ClampToByte(c1.RawB + varPatternEp1B[idx]);

            return(newEp0, newEp1);
        }
Exemplo n.º 4
0
        public void Rgb565Test()
        {
            ColorRgb565 color = new ColorRgb565(255, 255, 255);

            Assert.Equal(255, color.R);
            Assert.Equal(255, color.G);
            Assert.Equal(255, color.B);

            color.R = 0;
            Assert.Equal(0, color.R);
            Assert.Equal(255, color.G);
            Assert.Equal(255, color.B);

            color.G = 0;
            Assert.Equal(0, color.R);
            Assert.Equal(0, color.G);
            Assert.Equal(255, color.B);

            color.B = 0;
            Assert.Equal(0, color.R);
            Assert.Equal(0, color.G);
            Assert.Equal(0, color.B);

            color = new ColorRgb565(255, 255, 255);

            color.B = 0;
            Assert.Equal(255, color.R);
            Assert.Equal(255, color.G);
            Assert.Equal(0, color.B);

            color.G = 0;
            Assert.Equal(255, color.R);
            Assert.Equal(0, color.G);
            Assert.Equal(0, color.B);

            color.R = 0;
            Assert.Equal(0, color.R);
            Assert.Equal(0, color.G);
            Assert.Equal(0, color.B);

            color = new ColorRgb565(127, 127, 127);

            Assert.Equal(123, color.R);
            Assert.Equal(125, color.G);
            Assert.Equal(123, color.B);
        }
Exemplo n.º 5
0
        private static Bc1Block TryColors(RawBlock4X4Rgba32 rawBlock, ColorRgb565 color0, ColorRgb565 color1, out float error, float rWeight = 0.3f, float gWeight = 0.6f, float bWeight = 0.1f)
        {
            Bc1Block output = new Bc1Block();

            var pixels = rawBlock.AsSpan;

            output.color0 = color0;
            output.color1 = color1;

            var c0 = color0.ToColorRgb24();
            var c1 = color1.ToColorRgb24();

            ReadOnlySpan <ColorRgb24> colors = output.HasAlphaOrBlack ?
                                               stackalloc ColorRgb24[] {
                c0,
                c1,
                c0 *(1.0 / 2.0) + c1 * (1.0 / 2.0),
                new ColorRgb24(0, 0, 0)
            } : stackalloc ColorRgb24[] {
Exemplo n.º 6
0
            internal static Bc3Block EncodeBlock(RawBlock4X4Rgba32 rawBlock)
            {
                var pixels = rawBlock.AsSpan;

                PcaVectors.Create(pixels, out var mean, out var principalAxis);
                PcaVectors.GetMinMaxColor565(pixels, mean, principalAxis, out var min, out var max);

                ColorRgb565 c0 = max;
                ColorRgb565 c1 = min;

                if (c0.data <= c1.data)
                {
                    var c = c0;
                    c0 = c1;
                    c1 = c;
                }

                var output = TryColors(rawBlock, c0, c1, out float _);

                output = FindAlphaValues(output, rawBlock, 3);

                return(output);
            }