/// <summary> /// Renders a corner gradient between the given colors. Includes outColor in the gradient but not inColor. /// </summary> /// <param name="image">The image to render to.</param> /// <param name="reverseX">True to reverse the gradient in the x direction.</param> /// <param name="reverseY">True to reverse the gradient in the y direction.</param> /// <param name="area">The area to fill.</param> /// <param name="outColor">The "outer" color.</param> /// <param name="inColor">The "inner" color.</param> /// <param name="roundEdges">True to round the corner, false for square.</param> /// <param name="interp">The interpolation function to use.</param> private static void RenderCorner(Image image, bool reverseX, bool reverseY, Rectangle area, ARGB outColor, ARGB inColor, bool roundEdges, InterpFunction interp) { Rectangle clip = ShapeUtil.Overlap((Rectangle)image.Size, image.GetClip(), area); if(clip.IsValid()) { for(int i = clip.Min.X; i <= clip.Max.X; i++) { for(int j = clip.Min.Y; j <= clip.Max.Y; j++) { double dx; double dy; if(reverseX) dx = i - area.Min.X; else dx = area.Max.X - i; if(reverseY) dy = j - area.Min.Y; else dy = area.Max.Y - j; dx++; dx /= area.Width; dy++; dy /= area.Height; double mu; if(roundEdges) { mu = Math.Sqrt(dx * dx + dy * dy); }else { mu = Math.Max(Math.Abs(dx), Math.Abs(dy)); } mu = Util.Clip(mu, 0, 1); image[i, j] = ColorUtil.Interpolate(inColor, outColor, mu, interp); } } } }
/// <summary> /// Renders a y-oriented gradient between the given colors. Includes outColor in the gradient but not inColor. /// </summary> /// <param name="image">The image to render to.</param> /// <param name="reverse">True to reverse the gradient.</param> /// <param name="area">The area to fill.</param> /// <param name="outColor">The "outer" color.</param> /// <param name="inColor">The "inner" color.</param> /// <param name="interp">The interpolation function to use.</param> private static void RenderYSide(Image image, bool reverse, Rectangle area, ARGB outColor, ARGB inColor, InterpFunction interp) { Rectangle clip = ShapeUtil.Overlap((Rectangle)image.Size, image.GetClip(), area); if(clip.IsValid()) { for(int j = clip.Min.Y; j <= clip.Max.Y; j++) { double mu; if(reverse) mu = j - area.Min.Y; else mu = area.Max.Y - j; mu++; mu /= area.Height; mu = Util.Clip(mu, 0, 1); image.RenderSolid(new Rectangle{Min = new Point2D(clip.Min.X, j), Max = new Point2D(clip.Max.X, j)}, ColorUtil.Interpolate(inColor, outColor, mu, interp)); } } }