public WindowAppearance(Color16 backColor, Color16 borderColor, Color16 titleTextColor, bool thinBorder = false) { BackColor = backColor; BorderColor = borderColor; TitleTextColor = titleTextColor; ThinBorder = thinBorder; }
public TextCell(char character, Color16 foreColor, Color16 backColor) { Character = Verify.VisibleAscii(character, nameof(character)); ForeColor = foreColor; BackColor = backColor; }
private Color16 Merge(Color16 reference, Color16 lower, Color16 higher) { Color16 result = reference; if (reference.A != lower.A || reference.A != higher.A) { return(result); } bool doMerge; if (Config.Resample.Deposterization.UsePerceptualColor && lower != higher && (lower == reference || higher == reference)) { doMerge = (lower == reference && ColorDifference(higher, reference) <= Threshold) || (higher == reference && ColorDifference(lower, reference) <= Threshold); } else { doMerge = reference.A == lower.A && reference.A == higher.A && Compare(reference.R, lower.R, higher.R) && Compare(reference.G, lower.G, higher.G) && Compare(reference.B, lower.B, higher.B); } if (doMerge) { result.R = (ushort)((lower.R.Value + higher.R.Value) >> 1); result.G = (ushort)((lower.G.Value + higher.G.Value) >> 1); result.B = (ushort)((lower.B.Value + higher.B.Value) >> 1); } return(result); }
internal static uint ColorDistance( bool useRedmean, bool gammaCorrected, bool hasAlpha, Color16 pix1, Color16 pix2, in YccConfig yccConfig
//====== ctors public BigDigitsScoreUI(IScoreStatus scoreStatus, Color16 foreColor = Color16.Teal) { this.scoreStatus = Verify.NotNull(scoreStatus, nameof(scoreStatus)); ForeColor = foreColor; lastScore = scoreStatus.Value; }
public void WriteTextCenter(int y, string message, Color16 foreColor, Color16 backColor) { int maxLineLength = message.Split(new string[] { "\r\n" }, StringSplitOptions.None).Max(x => x.Length); var position = new Point((Size.Width / 2) - (maxLineLength / 2), y); WriteText(position, message, foreColor, backColor); }
internal Color16 Delinearize(Color16 color) { return(new( Delinearize(color.R), Delinearize(color.G), Delinearize(color.B), color.A )); }
internal Color16 Linearize(Color16 color) { return(new( Linearize(color.R), Linearize(color.G), Linearize(color.B), color.A )); }
public void WriteText(Point position, string message, Color16 foreColor, Color16 backColor) { string[] lines = message.Split(new string[] { "\r\n" }, StringSplitOptions.None); for (int i = 0; i < lines.Length; i++) { WriteLine(position.AddToY(i), lines[i], foreColor, backColor); } }
internal uint ColorDistance(Color16 pix1, Color16 pix2) { return(Resample.Scalers.Common.ColorDistance( useRedmean: Configuration.UseRedmean, gammaCorrected: Configuration.GammaCorrected, hasAlpha: Configuration.HasAlpha, pix1: pix1, pix2: pix2, yccConfig: YccConfiguration )); }
internal Kernel3X3(Color16 _0, Color16 _1, Color16 _2, Color16 _3, Color16 _4, Color16 _5, Color16 _6, Color16 _7, Color16 _8) { Data[0] = _0.AsPacked; Data[1] = _1.AsPacked; Data[2] = _2.AsPacked; Data[3] = _3.AsPacked; Data[4] = _4.AsPacked; Data[5] = _5.AsPacked; Data[6] = _6.AsPacked; Data[7] = _7.AsPacked; Data[8] = _8.AsPacked; }
protected void AlphaBlend(int n, int m, ref Color16 dstRef, Color16 color) { //assert n < 256 : "possible overflow of (color & redMask) * N"; //assert m < 256 : "possible overflow of (color & redMask) * N + (dst & redMask) * (M - N)"; //assert 0 < n && n < m : "0 < N && N < M"; //this works because 8 upper bits are free var dst = dstRef; var a = BlendComponent(n, m, dst.A, color.A); var r = BlendComponent(n, m, dst.R, color.R); var g = BlendComponent(n, m, dst.G, color.G); var b = BlendComponent(n, m, dst.B, color.B); dstRef = new(r, g, b, a); }
private uint ColorDifference(Color16 pix1, Color16 pix2) { if (UseRedmean) { return(pix1.RedmeanDifference(pix2, linear: true, alpha: true )); } else { return(pix1.YccDifference(pix2, config: YccConfiguration, linear: true, alpha: true )); } }
private void WriteLine(Point position, string message, Color16 foreColor, Color16 backColor) { if (Size.AsRectangle.Contains(position.JustY) == false) { return; } for (int i = 0; i < message.Length; i++) // TODO: can be optimized, no need to draw not visible characters { Point letterPosition = position.AddToX(i); if (letterPosition.X >= Size.Width) { return; } Write(letterPosition, new TextCell(message[i], foreColor, backColor)); } }
internal static int SubMain(Options options, List <Argument> args) { var previewFile = options.Paths.FirstOrDefault(); if (previewFile is not null) { var fileData = Common.ReadFile(new Uri(previewFile), out var fileSize); SpriteData = Color16.Convert(fileData).ToArray(); // It doesn't appear as though the file data is premultiplied! SpriteMaster.Resample.Passes.PremultipliedAlpha.Apply(SpriteData, fileSize); SpriteSize = fileSize; } Application.EnableVisualStyles(); Application.Run(new PreviewWindow()); return(0); }
public void Frame(Rectangle area, Color16 foreColor, Color16 backColor, bool thin = false) { if (Size.AsRectangle.Intersect(area).Size.HasNoArea) { return; } TextCanvas?view = Slice(area); if (view.Size.Width < 2 || view.Size.Height < 2) { return; } var hLineCell = new TextCell(thin ? '─' : '═', foreColor, backColor); var vLineCell = new TextCell(thin ? '│' : '║', foreColor, backColor); var rect = view.Size.AsRectangle; if (rect.Size.Width > 2) { view.HLine(rect.TopLeft, rect.Size.Width, hLineCell); view.HLine(rect.BottomLeft, rect.Size.Width, hLineCell); } if (rect.Size.Height > 2) { view.VLine(rect.TopLeft, rect.Size.Height, vLineCell); view.VLine(rect.TopRight, rect.Size.Height, vLineCell); } view.Write(rect.TopLeft, new TextCell(thin ? '┌' : '╔', foreColor, backColor)); view.Write(rect.TopRight, new TextCell(thin ? '┐' : '╗', foreColor, backColor)); view.Write(rect.BottomLeft, new TextCell(thin ? '└' : '╚', foreColor, backColor)); view.Write(rect.BottomRight, new TextCell(thin ? '┘' : '╝', foreColor, backColor)); }
internal Kernel4X4( Color16 _0, Color16 _1, Color16 _2, Color16 _3, Color16 _4, Color16 _5, Color16 _6, Color16 _7, Color16 _8, Color16 _9, Color16 _10, Color16 _11, Color16 _12, Color16 _13, Color16 _14, Color16 _15 ) : this() { Data[0] = _0; Data[1] = _1; Data[2] = _2; Data[3] = _3; Data[4] = _4; Data[5] = _5; Data[6] = _6; Data[7] = _7; Data[8] = _8; Data[9] = _9; Data[10] = _10; Data[11] = _11; Data[12] = _12; Data[13] = _13; Data[14] = _14; Data[15] = _15; }
internal Kernel4X4( Color16 _0, Color16 _1, Color16 _2, Color16 _3, Color16 _4, Color16 _5, Color16 _6, Color16 _7, Color16 _8, Color16 _9, Color16 _10, Color16 _11, Color16 _12, Color16 _13, Color16 _14, Color16 _15 ) { Data[0] = _0.AsPacked; Data[1] = _1.AsPacked; Data[2] = _2.AsPacked; Data[3] = _3.AsPacked; Data[4] = _4.AsPacked; Data[5] = _5.AsPacked; Data[6] = _6.AsPacked; Data[7] = _7.AsPacked; Data[8] = _8.AsPacked; Data[9] = _9.AsPacked; Data[10] = _10.AsPacked; Data[11] = _11.AsPacked; Data[12] = _12.AsPacked; Data[13] = _13.AsPacked; Data[14] = _14.AsPacked; Data[15] = _15.AsPacked; }
internal abstract void BlendLineDiagonal(Color16 color, ref OutputMatrix matrix);
public Drawable(char symbol, Color16 color) { Symbol = symbol; Color = new ColorValue(color); }
public void ClearColor(Color16 backColor = Color16.Black) => Fill(new TextCell(' ', backColor, backColor));
//====== private methods private void WriteStatsLine(TextCanvas canvas, Point position, string key, string value, Color16 foreColor) { canvas.WriteText(position, key + ":", Color16.White, Appearance.BackColor); canvas.WriteText(position.AddToX(key.Length + 2), value, foreColor, Appearance.BackColor); }
internal abstract void BlendLineShallow(Color16 color, ref OutputMatrix matrix);
internal bool IsColorEqual(Color16 color1, Color16 color2) => ColorDistance(color1, color2) < Configuration.EqualColorTolerance;
public BigDigitsValueRenderer(int value, Color16 foreColor) { Value = Verify.InRange(value, 0, int.MaxValue, nameof(value)); ForeColor = foreColor; }
internal abstract void BlendCorner(Color16 color, ref OutputMatrix matrix);