private void SetClosestIndex(Color color) { ColorMine.ColorSpaces.Rgb rgbColorStop = new ColorMine.ColorSpaces.Rgb() { R = color.R, G = color.G, B = color.B }; Tuple <Color, double, int>[] colorWeights = new Tuple <Color, double, int> [Width]; // Create a color weight for every cell compared to the color stop for (int x = 0; x < Width; x++) { ColorMine.ColorSpaces.Rgb rgbColor = new ColorMine.ColorSpaces.Rgb() { R = this[x, 0].Foreground.R, G = this[x, 0].Foreground.G, B = this[x, 0].Foreground.B }; ColorMine.ColorSpaces.Cmy cmyColor = rgbColor.To <ColorMine.ColorSpaces.Cmy>(); colorWeights[x] = new Tuple <Color, double, int>(this[x, 0].Foreground, rgbColorStop.Compare(cmyColor, new ColorMine.ColorSpaces.Comparisons.Cie1976Comparison()), x); } var foundColor = colorWeights.OrderBy(t => t.Item2).First(); _selectedPosition = foundColor.Item3; this.IsDirty = true; }
private void SetClosestIndex(Color color) { ColorMine.ColorSpaces.Rgb rgbColorStop = new ColorMine.ColorSpaces.Rgb() { R = color.R, G = color.G, B = color.B }; Tuple <Color, double, int>[] colorWeights = new Tuple <Color, double, int> [TextSurface.Cells.Length]; // Create a color weight for every cell compared to the color stop for (int x = 0; x < TextSurface.Cells.Length; x++) { ColorMine.ColorSpaces.Rgb rgbColor = new ColorMine.ColorSpaces.Rgb() { R = this[x].Background.R, G = this[x].Background.G, B = this[x].Background.B }; ColorMine.ColorSpaces.Cmy cmyColor = rgbColor.To <ColorMine.ColorSpaces.Cmy>(); colorWeights[x] = new Tuple <Color, double, int>(this[x].Background, rgbColorStop.Compare(cmyColor, new ColorMine.ColorSpaces.Comparisons.Cie1976Comparison()), x); } var foundColor = colorWeights.OrderBy(t => t.Item2).First(); this[_selectedColorPosition.X, _selectedColorPosition.Y].Glyph = 0; _selectedColorPosition = SadConsole.Surfaces.BasicSurface.GetPointFromIndex(foundColor.Item3, Width); this[_selectedColorPosition.X, _selectedColorPosition.Y].Glyph = 4; this.IsDirty = true; }
/// <inheritdoc /> public override void UpdateAndDraw(ControlBase control, TimeSpan time) { if (!(control is HueBarControl bar)) { return; } if (!bar.IsDirty) { return; } control.Surface.Fill(Color.White, Color.Black, 0, null); bar._positions = control.Width; ColorGradient gradient = new ColorGradient(Color.Red, Color.Yellow, Color.Green, Color.Turquoise, Color.Blue, Color.Purple, Color.Red); for (int x = 0; x < control.Width; x++) { control.Surface[x, 0].Glyph = 219; control.Surface[x, 0].Foreground = gradient.Lerp((float)x / (float)(control.Width - 1)); } control.Surface[bar.SelectedPosition, 1].Glyph = 30; control.Surface[bar.SelectedPosition, 1].Foreground = Color.LightGray;//this[_selectedPosition, 0].Foreground; // Build an array of all the colors Color[] colors = new Color[control.Width]; for (int x = 0; x < control.Width; x++) { colors[x] = control.Surface[x, 0].Foreground; } List <int> colorIndexesFinished = new List <int>(control.Width); foreach (var stop in gradient.Stops) { ColorMine.ColorSpaces.Rgb rgbColorStop = new ColorMine.ColorSpaces.Rgb() { R = stop.Color.R, G = stop.Color.G, B = stop.Color.B }; Tuple <Color, double, int>[] colorWeights = new Tuple <Color, double, int> [control.Width]; // Create a color weight for every cell compared to the color stop for (int x = 0; x < control.Width; x++) { if (!colorIndexesFinished.Contains(x)) { ColorMine.ColorSpaces.Rgb rgbColor = new ColorMine.ColorSpaces.Rgb() { R = colors[x].R, G = colors[x].G, B = colors[x].B }; ColorMine.ColorSpaces.Cmy cmyColor = rgbColor.To <ColorMine.ColorSpaces.Cmy>(); colorWeights[x] = new Tuple <Color, double, int>(colors[x], rgbColorStop.Compare(cmyColor, new ColorMine.ColorSpaces.Comparisons.Cie1976Comparison()), x); } else { colorWeights[x] = new Tuple <Color, double, int>(colors[x], 10000, x); } } var foundColor = colorWeights.OrderBy(t => t.Item2).First(); control.Surface[foundColor.Item3, 0].Foreground = stop.Color; colorIndexesFinished.Add(foundColor.Item3); } control.IsDirty = false; }