public override ColorBgra Apply(ColorBgra color) { //adjust saturation byte intensity = color.GetIntensityByte(); color.R = Utility.ClampToByte((intensity * 1024 + (color.R - intensity) * satFactor) >> 10); color.G = Utility.ClampToByte((intensity * 1024 + (color.G - intensity) * satFactor) >> 10); color.B = Utility.ClampToByte((intensity * 1024 + (color.B - intensity) * satFactor) >> 10); HsvColor hsvColor = HsvColor.FromColor(color.ToColor()); int hue = hsvColor.Hue; hue += hueDelta; while (hue < 0) { hue += 360; } while (hue > 360) { hue -= 360; } hsvColor.Hue = hue; ColorBgra newColor = ColorBgra.FromColor(hsvColor.ToColor()); newColor = blendOp.Apply(newColor); newColor.A = color.A; return(newColor); }
public Level() : this(ColorBgra.FromColor(Color.Black), ColorBgra.FromColor(Color.White), new float[] { 1, 1, 1 }, ColorBgra.FromColor(Color.Black), ColorBgra.FromColor(Color.White)) { }
public static Level AutoFromLoMdHi(ColorBgra lo, ColorBgra md, ColorBgra hi) { float[] gamma = new float[3]; for (int i = 0; i < 3; i++) { if (lo[i] < md[i] && md[i] < hi[i]) { gamma[i] = (float)Utility.Clamp(Math.Log(0.5, (float)(md[i] - lo[i]) / (float)(hi[i] - lo[i])), 0.1, 10.0); } else { gamma[i] = 1.0f; } } return(new Level(lo, hi, gamma, ColorBgra.FromColor(Color.Black), ColorBgra.FromColor(Color.White))); }
private void DrawToGraphics(Graphics g) { ColorBgra colorSolid = ColorBgra.FromColor(this.ForeColor); ColorBgra colorGuide = ColorBgra.FromColor(this.ForeColor); ColorBgra colorGrid = ColorBgra.FromColor(this.ForeColor); colorGrid.A = 128; colorGuide.A = 96; Pen penSolid = new Pen(colorSolid.ToColor(), 1); Pen penGrid = new Pen(colorGrid.ToColor(), 1); Pen penGuide = new Pen(colorGuide.ToColor(), 1); penGrid.DashStyle = DashStyle.Dash; g.Clear(this.BackColor); g.SmoothingMode = SmoothingMode.AntiAlias; Rectangle ourRect = ClientRectangle; ourRect.Inflate(-1, -1); if (lastMouseXY.Y >= 0) { g.DrawLine(penGuide, 0, lastMouseXY.Y, Width, lastMouseXY.Y); } if (lastMouseXY.X >= 0) { g.DrawLine(penGuide, lastMouseXY.X, 0, lastMouseXY.X, Height); } for (float f = 0.25f; f <= 0.75f; f += 0.25f) { float x = Utility.Lerp(ourRect.Left, ourRect.Right, f); float y = Utility.Lerp(ourRect.Top, ourRect.Bottom, f); g.DrawLine(penGrid, Point.Round(new PointF(x, ourRect.Top)), Point.Round(new PointF(x, ourRect.Bottom))); g.DrawLine(penGrid, Point.Round(new PointF(ourRect.Left, y)), Point.Round(new PointF(ourRect.Right, y))); } g.DrawLine(penGrid, ourRect.Left, ourRect.Bottom, ourRect.Right, ourRect.Top); float width = this.ClientRectangle.Width; float height = this.ClientRectangle.Height; for (int c = 0; c < channels; ++c) { SortedList <int, int> channelControlPoints = controlPoints[c]; int points = channelControlPoints.Count; ColorBgra color = GetVisualColor(c); ColorBgra colorSelected = ColorBgra.Blend(color, ColorBgra.White, 128); const float penWidthNonSelected = 1; const float penWidthSelected = 2; float penWidth = mask[c] ? penWidthSelected : penWidthNonSelected; Pen penSelected = new Pen(color.ToColor(), penWidth); color.A = 128; Pen pen = new Pen(color.ToColor(), penWidth); Brush brush = new SolidBrush(color.ToColor()); SolidBrush brushSelected = new SolidBrush(Color.White); SplineInterpolator interpolator = new SplineInterpolator(); IList <int> xa = channelControlPoints.Keys; IList <int> ya = channelControlPoints.Values; PointF[] line = new PointF[Entries]; for (int i = 0; i < points; ++i) { interpolator.Add(xa[i], ya[i]); } for (int i = 0; i < line.Length; ++i) { line[i].X = (float)i * (width - 1) / (entries - 1); line[i].Y = (float)(Utility.Clamp(entries - 1 - interpolator.Interpolate(i), 0, entries - 1)) * (height - 1) / (entries - 1); } pen.LineJoin = LineJoin.Round; g.DrawLines(pen, line); for (int i = 0; i < points; ++i) { int k = channelControlPoints.Keys[i]; float x = k * (width - 1) / (entries - 1); float y = (entries - 1 - channelControlPoints.Values[i]) * (height - 1) / (entries - 1); const float radiusSelected = 4; const float radiusNotSelected = 3; const float radiusUnMasked = 2; bool selected = (mask[c] && pointsNearMousePerChannel[c] == i); float size = selected ? radiusSelected : (mask[c] ? radiusNotSelected : radiusUnMasked); RectangleF rect = Utility.RectangleFromCenter(new PointF(x, y), size); g.FillEllipse(selected ? brushSelected : brush, rect.X, rect.Y, rect.Width, rect.Height); g.DrawEllipse(selected ? penSelected : pen, rect.X, rect.Y, rect.Width, rect.Height); } pen.Dispose(); } penSolid.Dispose(); penGrid.Dispose(); penGuide.Dispose(); }