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); }
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); }
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); }
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); }
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[] {
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); }