private void ChartAppearanceChange() { // Enable/disable appearance controls ForeColorCom.Enabled = (HatchStyle.SelectedIndex != 0 || Gradient.SelectedIndex != 0); BorderColor.Enabled = (BorderDashStyle.SelectedIndex != 0); BorderSizeCom.Enabled = (BorderDashStyle.SelectedIndex != 0); // Set Back Color Chart1.BackColor = Color.FromName(BackColorCom.GetItemText(BackColorCom.SelectedItem)); // Set Back Gradient End Color Chart1.BackSecondaryColor = Color.FromName(ForeColorCom.GetItemText(ForeColorCom.SelectedItem)); // Set Gradient Type if (Gradient.SelectedItem != null) { Chart1.BackGradientStyle = (GradientStyle)GradientStyle.Parse(typeof(GradientStyle), Gradient.GetItemText(Gradient.SelectedItem)); } // Set Gradient Type if (HatchStyle.SelectedItem != null) { Chart1.BackHatchStyle = (ChartHatchStyle)ChartHatchStyle.Parse(typeof(ChartHatchStyle), HatchStyle.GetItemText(HatchStyle.SelectedItem)); } // Set background image if (!ShowImageCheck.Checked) { Chart1.BackImage = ""; ImageAlign.Enabled = false; ImageMode.Enabled = false; } else { ImageMode.Enabled = true; ImageAlign.Enabled = (ImageMode.SelectedIndex == 5); // Set chart image MainForm mainForm = (MainForm)this.ParentForm; string imageFileName = mainForm.CurrentSamplePath; imageFileName += "\\Flag.gif"; Chart1.BackImage = imageFileName; Chart1.BackImageTransparentColor = Color.Red; // Set Image Mode if (ImageMode.SelectedItem != null) { Chart1.BackImageWrapMode = (ChartImageWrapMode)ChartImageWrapMode.Parse(typeof(ChartImageWrapMode), ImageMode.SelectedItem.ToString()); } // Set Image Alignment if (ImageAlign.SelectedItem != null) { Chart1.BackImageAlignment = (ChartImageAlignmentStyle)ChartImageAlignmentStyle.Parse(typeof(ChartImageAlignmentStyle), ImageAlign.SelectedItem.ToString()); } } // Set Border Width if (BorderSizeCom.SelectedItem != null) { Chart1.BorderWidth = int.Parse(BorderSizeCom.GetItemText(BorderSizeCom.SelectedItem)); } // Set Border Style if (BorderDashStyle.SelectedItem != null) { Chart1.BorderDashStyle = (ChartDashStyle)ChartDashStyle.Parse(typeof(ChartDashStyle), BorderDashStyle.GetItemText(BorderDashStyle.SelectedItem)); } // Set Border Color Chart1.BorderColor = Color.FromName(BorderColor.GetItemText(BorderColor.SelectedItem)); }
/// <summary> /// Draws 3D border. /// </summary> /// <param name="graph">Graphics to draw the border on.</param> /// <param name="borderSkin">Border skin object.</param> /// <param name="rect">Rectangle of the border.</param> /// <param name="backColor">Color of rectangle</param> /// <param name="backHatchStyle">Hatch style</param> /// <param name="backImage">Back Image</param> /// <param name="backImageWrapMode">Image mode</param> /// <param name="backImageTransparentColor">Image transparent color.</param> /// <param name="backImageAlign">Image alignment</param> /// <param name="backGradientStyle">Gradient type</param> /// <param name="backSecondaryColor">Gradient End Color</param> /// <param name="borderColor">Border Color</param> /// <param name="borderWidth">Border Width</param> /// <param name="borderDashStyle">Border Style</param> public virtual void DrawBorder( ChartGraphics graph, BorderSkin borderSkin, SKRect rect, SKColor backColor, ChartHatchStyle backHatchStyle, string backImage, ChartImageWrapMode backImageWrapMode, SKColor backImageTransparentColor, ChartImageAlignmentStyle backImageAlign, GradientStyle backGradientStyle, SKColor backSecondaryColor, SKColor borderColor, int borderWidth, ChartDashStyle borderDashStyle) { SKRect absolute = ChartGraphics.Round(rect); // Calculate shadow colors (0.2 - 0.6) float colorDarkeningIndex = 0.2f + (0.4f * (borderSkin.PageColor.Red + borderSkin.PageColor.Green + borderSkin.PageColor.Blue) / 765f); SKColor shadowColor = new( (byte)(borderSkin.PageColor.Red * colorDarkeningIndex), (byte)(borderSkin.PageColor.Green * colorDarkeningIndex), (byte)(borderSkin.PageColor.Blue * colorDarkeningIndex)); if (borderSkin.PageColor == SKColors.Transparent) { shadowColor = new(0, 0, 0, 60); } colorDarkeningIndex += 0.2f; SKColor shadowLightColor = new( (byte)(borderSkin.PageColor.Red * colorDarkeningIndex), (byte)(borderSkin.PageColor.Green * colorDarkeningIndex), (byte)(borderSkin.PageColor.Blue * colorDarkeningIndex)); // Calculate rounded rect radius float radius = defaultRadiusSize; radius = Math.Max(radius, 2f * resolution / 96.0f); radius = Math.Min(radius, rect.Width / 2f); radius = Math.Min(radius, rect.Height / 2f); radius = (float)Math.Ceiling(radius); // Fill page background color using (SKPaint brush = new() { Style = SKPaintStyle.Fill, Color = borderSkin.PageColor }) { graph.FillRectangle(brush, rect); } // Top/Left shadow SKRect shadowRect = absolute; shadowRect.Right -= radius * .3f; shadowRect.Bottom -= radius * .3f; graph.DrawRoundedRectShadowAbs(shadowRect, cornerRadius, radius + 1 * resolution / 96.0f, shadowLightColor, borderSkin.PageColor, 1.4f); // Bottom/Right shadow shadowRect = absolute; shadowRect.Left = absolute.Left + radius / 3f; shadowRect.Top = absolute.Top + radius / 3f; shadowRect.Right -= radius / 3.5f; shadowRect.Bottom -= radius / 3.5f; graph.DrawRoundedRectShadowAbs(shadowRect, cornerRadius, radius, shadowColor, borderSkin.PageColor, 1.3f); // Draw Background shadowRect = absolute; shadowRect.Left = absolute.Left + 3f * resolution / 96.0f; shadowRect.Top = absolute.Top + 3f * resolution / 96.0f; shadowRect.Right -= radius * .75f; shadowRect.Bottom -= radius * .75f; SKPath path = ChartGraphics.CreateRoundedRectPath(shadowRect, cornerRadius); graph.DrawPathAbs( path, backColor, backHatchStyle, backImage, backImageWrapMode, backImageTransparentColor, backImageAlign, backGradientStyle, backSecondaryColor, borderColor, borderWidth, borderDashStyle, PenAlignment.Inset); // Dispose Graphic path if (path != null) { path.Dispose(); } // Bottom/Right inner shadow SKRegion innerShadowRegion = new( ChartGraphics.CreateRoundedRectPath( new SKRect( shadowRect.Left - radius, shadowRect.Top - radius, shadowRect.Width + radius - radius * 0.25f, shadowRect.Height + radius - radius * 0.25f), cornerRadius)); innerShadowRegion.Op(ChartGraphics.CreateRoundedRectPath(shadowRect, cornerRadius), SKRegionOperation.Difference); graph.Clip = innerShadowRegion; graph.DrawRoundedRectShadowAbs( shadowRect, cornerRadius, radius, SKColors.Transparent, new(SKColors.Gray.Red, SKColors.Gray.Green, SKColors.Gray.Blue, 128), .5f); graph.Clip = new(); }
/// <summary> /// Draws 3D border /// </summary> /// <param name="graph">Graphics to draw the border on.</param> /// <param name="borderSkin">Border skin object.</param> /// <param name="rect">Rectangle of the border.</param> /// <param name="backColor">Color of rectangle</param> /// <param name="backHatchStyle">Hatch style</param> /// <param name="backImage">Back Image</param> /// <param name="backImageWrapMode">Image mode</param> /// <param name="backImageTransparentColor">Image transparent color.</param> /// <param name="backImageAlign">Image alignment</param> /// <param name="backGradientStyle">Gradient type</param> /// <param name="backSecondaryColor">Gradient End Color</param> /// <param name="borderColor">Border Color</param> /// <param name="borderWidth">Border Width</param> /// <param name="borderDashStyle">Border Style</param> public virtual void DrawBorder( ChartGraphics graph, BorderSkin borderSkin, RectangleF rect, Color backColor, ChartHatchStyle backHatchStyle, string backImage, ChartImageWrapMode backImageWrapMode, Color backImageTransparentColor, ChartImageAlignmentStyle backImageAlign, GradientStyle backGradientStyle, Color backSecondaryColor, Color borderColor, int borderWidth, ChartDashStyle borderDashStyle) { RectangleF absolute = graph.Round(rect); RectangleF shadowRect = absolute; // Calculate shadow colors (0.2 - 0.6) float colorDarkeningIndex = 0.3f + (0.4f * (borderSkin.PageColor.R + borderSkin.PageColor.G + borderSkin.PageColor.B) / 765f); Color shadowColor = Color.FromArgb( (int)(backColor.R * colorDarkeningIndex), (int)(backColor.G * colorDarkeningIndex), (int)(backColor.B * colorDarkeningIndex)); colorDarkeningIndex += 0.2f; Color shadowLightColor = Color.FromArgb( (int)(borderSkin.PageColor.R * colorDarkeningIndex), (int)(borderSkin.PageColor.G * colorDarkeningIndex), (int)(borderSkin.PageColor.B * colorDarkeningIndex)); if (borderSkin.PageColor == Color.Transparent) { shadowLightColor = Color.FromArgb(60, 0, 0, 0); } // Calculate rounded rect radius float radius = defaultRadiusSize; radius = (float)Math.Max(radius, 2f * resolution / 96.0f); radius = (float)Math.Min(radius, rect.Width / 2f); radius = (float)Math.Min(radius, rect.Height / 2f); radius = (float)Math.Ceiling(radius); // Fill page background color using (Brush brush = new SolidBrush(borderSkin.PageColor)) { graph.FillRectangle(brush, rect); } if (drawOutsideTopLeftShadow) { // Top/Left outside shadow shadowRect = absolute; shadowRect.X -= radius * 0.3f; shadowRect.Y -= radius * 0.3f; shadowRect.Width -= radius * .3f; shadowRect.Height -= radius * .3f; graph.DrawRoundedRectShadowAbs(shadowRect, cornerRadius, radius, Color.FromArgb(128, Color.Black), borderSkin.PageColor, outsideShadowRate); } // Bottom/Right outside shadow shadowRect = absolute; shadowRect.X += radius * 0.3f; shadowRect.Y += radius * 0.3f; shadowRect.Width -= radius * .3f; shadowRect.Height -= radius * .3f; graph.DrawRoundedRectShadowAbs(shadowRect, cornerRadius, radius, shadowLightColor, borderSkin.PageColor, outsideShadowRate); // Background shadowRect = absolute; shadowRect.Width -= radius * .3f; shadowRect.Height -= radius * .3f; GraphicsPath path = graph.CreateRoundedRectPath(shadowRect, cornerRadius); graph.DrawPathAbs( path, backColor, backHatchStyle, backImage, backImageWrapMode, backImageTransparentColor, backImageAlign, backGradientStyle, backSecondaryColor, borderColor, borderWidth, borderDashStyle, PenAlignment.Inset); // Dispose Graphic path if (path != null) { path.Dispose(); } // Draw ----s imitation in the corners of the farame if (drawScrews) { // Left/Top ---- RectangleF screwRect = RectangleF.Empty; float offset = radius * 0.4f; screwRect.X = shadowRect.X + offset; screwRect.Y = shadowRect.Y + offset; screwRect.Width = radius * 0.55f; screwRect.Height = screwRect.Width; DrawScrew(graph, screwRect); // Right/Top ---- screwRect.X = shadowRect.Right - offset - screwRect.Width; DrawScrew(graph, screwRect); // Right/Bottom ---- screwRect.X = shadowRect.Right - offset - screwRect.Width; screwRect.Y = shadowRect.Bottom - offset - screwRect.Height; DrawScrew(graph, screwRect); // Left/Bottom ---- screwRect.X = shadowRect.X + offset; screwRect.Y = shadowRect.Bottom - offset - screwRect.Height; DrawScrew(graph, screwRect); } // Bottom/Right inner shadow Region innerShadowRegion = null; if (drawBottomShadow) { shadowRect = absolute; shadowRect.Width -= radius * .3f; shadowRect.Height -= radius * .3f; innerShadowRegion = new Region( graph.CreateRoundedRectPath( new RectangleF( shadowRect.X - radius, shadowRect.Y - radius, shadowRect.Width + 0.5f * radius, shadowRect.Height + 0.5f * radius), cornerRadius)); innerShadowRegion.Complement(graph.CreateRoundedRectPath(shadowRect, cornerRadius)); graph.Clip = innerShadowRegion; shadowRect.X -= 0.5f * radius; shadowRect.Width += 0.5f * radius; shadowRect.Y -= 0.5f * radius; shadowRect.Height += 0.5f * radius; graph.DrawRoundedRectShadowAbs( shadowRect, cornerRadius, radius, Color.Transparent, Color.FromArgb(175, (sunken) ? Color.White : shadowColor), 1.0f); graph.Clip = new Region(); } // Top/Left inner shadow shadowRect = absolute; shadowRect.Width -= radius * .3f; shadowRect.Height -= radius * .3f; innerShadowRegion = new Region( graph.CreateRoundedRectPath( new RectangleF( shadowRect.X + radius * .5f, shadowRect.Y + radius * .5f, shadowRect.Width - .2f * radius, shadowRect.Height - .2f * radius), cornerRadius)); RectangleF shadowWithOffset = shadowRect; shadowWithOffset.Width += radius; shadowWithOffset.Height += radius; innerShadowRegion.Complement(graph.CreateRoundedRectPath(shadowWithOffset, cornerRadius)); innerShadowRegion.Intersect(graph.CreateRoundedRectPath(shadowRect, cornerRadius)); graph.Clip = innerShadowRegion; graph.DrawRoundedRectShadowAbs( shadowWithOffset, cornerRadius, radius, Color.Transparent, Color.FromArgb(175, (sunken) ? shadowColor : Color.White), 1.0f); graph.Clip = new Region(); }
/// <summary> /// Draws 3D border. /// </summary> /// <param name="graph">Graphics to draw the border on.</param> /// <param name="borderSkin">Border skin object.</param> /// <param name="rect">Rectangle of the border.</param> /// <param name="backColor">Color of rectangle</param> /// <param name="backHatchStyle">Hatch style</param> /// <param name="backImage">Back Image</param> /// <param name="backImageWrapMode">Image mode</param> /// <param name="backImageTransparentColor">Image transparent color.</param> /// <param name="backImageAlign">Image alignment</param> /// <param name="backGradientStyle">Gradient type</param> /// <param name="backSecondaryColor">Gradient End Color</param> /// <param name="borderColor">Border Color</param> /// <param name="borderWidth">Border Width</param> /// <param name="borderDashStyle">Border Style</param> public override void DrawBorder( ChartGraphics graph, BorderSkin borderSkin, RectangleF rect, Color backColor, ChartHatchStyle backHatchStyle, string backImage, ChartImageWrapMode backImageWrapMode, Color backImageTransparentColor, ChartImageAlignmentStyle backImageAlign, GradientStyle backGradientStyle, Color backSecondaryColor, Color borderColor, int borderWidth, ChartDashStyle borderDashStyle) { drawBottomShadow = true; sunken = false; outsideShadowRate = .9f; drawOutsideTopLeftShadow = false; bool oldScrewsFlag = this.drawScrews; this.drawScrews = false; base.DrawBorder( graph, borderSkin, rect, borderSkin.BackColor, borderSkin.BackHatchStyle, borderSkin.BackImage, borderSkin.BackImageWrapMode, borderSkin.BackImageTransparentColor, borderSkin.BackImageAlignment, borderSkin.BackGradientStyle, borderSkin.BackSecondaryColor, borderSkin.BorderColor, borderSkin.BorderWidth, borderSkin.BorderDashStyle); this.drawScrews = oldScrewsFlag; rect.X += sizeLeftTop.Width; rect.Y += sizeLeftTop.Height; rect.Width -= sizeRightBottom.Width + sizeLeftTop.Width; rect.Height -= sizeRightBottom.Height + sizeLeftTop.Height; if (rect.Width > 0 && rect.Height > 0) { float[] oldCorners = new float[8]; oldCorners = (float[])cornerRadius.Clone(); cornerRadius = innerCorners; drawBottomShadow = false; sunken = true; drawOutsideTopLeftShadow = true; outsideShadowRate = 1.4f; Color oldPageColor = borderSkin.PageColor; borderSkin.PageColor = Color.Transparent; base.DrawBorder( graph, borderSkin, rect, backColor, backHatchStyle, backImage, backImageWrapMode, backImageTransparentColor, backImageAlign, backGradientStyle, backSecondaryColor, borderColor, borderWidth, borderDashStyle); borderSkin.PageColor = oldPageColor; cornerRadius = oldCorners; } }
protected void Page_Load(object sender, System.EventArgs e) { if (!this.IsPostBack) { // Add Hatch styles to control. foreach (string colorName in Enum.GetNames(typeof(ChartHatchStyle))) { HatchStyle.Items.Add(colorName); } HatchStyle.Items[0].Selected = true; // Add Chart Gradient types to control. foreach (string colorName in Enum.GetNames(typeof(GradientStyle))) { Gradient.Items.Add(colorName); } // Add Chart Line styles to control. foreach (string colorName in Enum.GetNames(typeof(ChartDashStyle))) { BorderDashStyle.Items.Add(colorName); } BorderDashStyle.Items.FindByValue("Solid").Selected = true; // Add Image Mode foreach (string item in Enum.GetNames(typeof(ChartImageWrapMode))) { ImageMode.Items.Add(item); } ImageMode.SelectedIndex = 5; // Add Image Aligne foreach (string item in Enum.GetNames(typeof(ChartImageAlignmentStyle))) { ImageAlign1.Items.Add(item); } ImageAlign1.SelectedIndex = 2; } // Set Back Color Chart1.BackColor = Color.FromName(BackColor.SelectedItem.Value); // Set Back Gradient End Color Chart1.BackSecondaryColor = Color.FromName(ForeColor.SelectedItem.Value); // Set Hatch Style Chart1.BackHatchStyle = (ChartHatchStyle)ChartHatchStyle.Parse(typeof(ChartHatchStyle), HatchStyle.SelectedItem.Text); // Set Gradient Type Chart1.BackGradientStyle = (GradientStyle)GradientStyle.Parse(typeof(GradientStyle), Gradient.SelectedItem.Text); // Set Border Color Chart1.BorderColor = Color.FromName(BorderColor.SelectedItem.Value); // Set Border Style Chart1.BorderlineDashStyle = (ChartDashStyle)ChartDashStyle.Parse(typeof(ChartDashStyle), BorderDashStyle.SelectedItem.Text); // Set Border Width Chart1.BorderWidth = int.Parse(BorderSize.SelectedItem.Value); // Chart Image Mode Chart1.BackImageWrapMode = (ChartImageWrapMode)ChartImageWrapMode.Parse(typeof(ChartImageWrapMode), ImageMode.SelectedItem.Text); // Chart Image Align Chart1.BackImageAlignment = (ChartImageAlignmentStyle)ChartImageAlignmentStyle.Parse(typeof(ChartImageAlignmentStyle), ImageAlign1.SelectedItem.Text); // Disable secondary back color if gradient and hatching are not used ForeColor.Enabled = (HatchStyle.SelectedIndex != 0 || Gradient.SelectedIndex != 0); // Set Image ImageAlign1.Enabled = false; ImageMode.Enabled = Image1.Checked; if (Image1.Checked) { Chart1.BackImage = "Flag.gif"; Chart1.BackImageTransparentColor = Color.White; if (ImageMode.SelectedItem.Value == "Unscaled") { ImageAlign1.Enabled = true; } } else { Chart1.BackImage = ""; } // Enable/disable border attributes BorderColor.Enabled = (BorderDashStyle.SelectedIndex != 0); BorderSize.Enabled = (BorderDashStyle.SelectedIndex != 0); }
/// <summary> /// Draws 3D border. /// </summary> /// <param name="graph">Graphics to draw the border on.</param> /// <param name="borderSkin">Border skin object.</param> /// <param name="rect">Rectangle of the border.</param> /// <param name="backColor">Color of rectangle</param> /// <param name="backHatchStyle">Hatch style</param> /// <param name="backImage">Back Image</param> /// <param name="backImageWrapMode">Image mode</param> /// <param name="backImageTransparentColor">Image transparent color.</param> /// <param name="backImageAlign">Image alignment</param> /// <param name="backGradientStyle">Gradient type</param> /// <param name="backSecondaryColor">Gradient End Color</param> /// <param name="borderColor">Border Color</param> /// <param name="borderWidth">Border Width</param> /// <param name="borderDashStyle">Border Style</param> public virtual void DrawBorder( ChartGraphics graph, BorderSkin borderSkin, RectangleF rect, Color backColor, ChartHatchStyle backHatchStyle, string backImage, ChartImageWrapMode backImageWrapMode, Color backImageTransparentColor, ChartImageAlignmentStyle backImageAlign, GradientStyle backGradientStyle, Color backSecondaryColor, Color borderColor, int borderWidth, ChartDashStyle borderDashStyle) { RectangleF absolute = graph.Round(rect); RectangleF shadowRect = absolute; // Calculate shadow colors (0.2 - 0.6) float colorDarkeningIndex = 0.2f + (0.4f * (borderSkin.PageColor.R + borderSkin.PageColor.G + borderSkin.PageColor.B) / 765f); Color shadowColor = Color.FromArgb( (int)(borderSkin.PageColor.R * colorDarkeningIndex), (int)(borderSkin.PageColor.G * colorDarkeningIndex), (int)(borderSkin.PageColor.B * colorDarkeningIndex)); if (borderSkin.PageColor == Color.Transparent) { shadowColor = Color.FromArgb(60, 0, 0, 0); } colorDarkeningIndex += 0.2f; Color shadowLightColor = Color.FromArgb( (int)(borderSkin.PageColor.R * colorDarkeningIndex), (int)(borderSkin.PageColor.G * colorDarkeningIndex), (int)(borderSkin.PageColor.B * colorDarkeningIndex)); // Calculate rounded rect radius float radius = defaultRadiusSize; radius = (float)Math.Max(radius, 2f * resolution / 96.0f); radius = (float)Math.Min(radius, rect.Width / 2f); radius = (float)Math.Min(radius, rect.Height / 2f); radius = (float)Math.Ceiling(radius); // Fill page background color using (Brush brush = new SolidBrush(borderSkin.PageColor)) { graph.FillRectangle(brush, rect); } // Top/Left shadow shadowRect = absolute; shadowRect.Width -= radius * .3f; shadowRect.Height -= radius * .3f; graph.DrawRoundedRectShadowAbs(shadowRect, cornerRadius, radius + 1 * resolution / 96.0f, shadowLightColor, borderSkin.PageColor, 1.4f); // Bottom/Right shadow shadowRect = absolute; shadowRect.X = absolute.X + radius / 3f; shadowRect.Y = absolute.Y + radius / 3f; shadowRect.Width -= radius / 3.5f; shadowRect.Height -= radius / 3.5f; graph.DrawRoundedRectShadowAbs(shadowRect, cornerRadius, radius, shadowColor, borderSkin.PageColor, 1.3f); // Draw Background shadowRect = absolute; shadowRect.X = absolute.X + 3f * resolution / 96.0f; shadowRect.Y = absolute.Y + 3f * resolution / 96.0f; shadowRect.Width -= radius * .75f; shadowRect.Height -= radius * .75f; GraphicsPath path = graph.CreateRoundedRectPath(shadowRect, cornerRadius); graph.DrawPathAbs( path, backColor, backHatchStyle, backImage, backImageWrapMode, backImageTransparentColor, backImageAlign, backGradientStyle, backSecondaryColor, borderColor, borderWidth, borderDashStyle, PenAlignment.Inset); // Dispose Graphic path if (path != null) { path.Dispose(); } // Bottom/Right inner shadow Region innerShadowRegion = new Region( graph.CreateRoundedRectPath( new RectangleF( shadowRect.X - radius, shadowRect.Y - radius, shadowRect.Width + radius - radius * 0.25f, shadowRect.Height + radius - radius * 0.25f), cornerRadius)); innerShadowRegion.Complement(graph.CreateRoundedRectPath(shadowRect, cornerRadius)); graph.Clip = innerShadowRegion; graph.DrawRoundedRectShadowAbs( shadowRect, cornerRadius, radius, Color.Transparent, Color.FromArgb(128, Color.Gray), .5f); graph.Clip = new Region(); }
/// <summary> /// Draws 3D border /// </summary> /// <param name="graph">Graphics to draw the border on.</param> /// <param name="borderSkin">Border skin object.</param> /// <param name="rect">Rectangle of the border.</param> /// <param name="backColor">Color of rectangle</param> /// <param name="backHatchStyle">Hatch style</param> /// <param name="backImage">Back Image</param> /// <param name="backImageWrapMode">Image mode</param> /// <param name="backImageTransparentColor">Image transparent color.</param> /// <param name="backImageAlign">Image alignment</param> /// <param name="backGradientStyle">Gradient type</param> /// <param name="backSecondaryColor">Gradient End Color</param> /// <param name="borderColor">Border Color</param> /// <param name="borderWidth">Border Width</param> /// <param name="borderDashStyle">Border Style</param> public virtual void DrawBorder( ChartGraphics graph, BorderSkin borderSkin, SKRect rect, SKColor backColor, ChartHatchStyle backHatchStyle, string backImage, ChartImageWrapMode backImageWrapMode, SKColor backImageTransparentColor, ChartImageAlignmentStyle backImageAlign, GradientStyle backGradientStyle, SKColor backSecondaryColor, SKColor borderColor, int borderWidth, ChartDashStyle borderDashStyle) { SKRect absolute = ChartGraphics.Round(rect); // Calculate shadow colors (0.2 - 0.6) float colorDarkeningIndex = 0.3f + (0.4f * (borderSkin.PageColor.Red + borderSkin.PageColor.Green + borderSkin.PageColor.Blue) / 765f); SKColor shadowColor = new( (byte)(backColor.Red * colorDarkeningIndex), (byte)(backColor.Green * colorDarkeningIndex), (byte)(backColor.Blue * colorDarkeningIndex)); colorDarkeningIndex += 0.2f; SKColor shadowLightColor = new( (byte)(borderSkin.PageColor.Red * colorDarkeningIndex), (byte)(borderSkin.PageColor.Green * colorDarkeningIndex), (byte)(borderSkin.PageColor.Blue * colorDarkeningIndex)); if (borderSkin.PageColor == SKColors.Transparent) { shadowLightColor = new SKColor(0, 0, 0, 60); } // Calculate rounded rect radius float radius = defaultRadiusSize; radius = Math.Max(radius, 2f * resolution / 96.0f); radius = Math.Min(radius, rect.Width / 2f); radius = Math.Min(radius, rect.Height / 2f); radius = (float)Math.Ceiling(radius); // Fill page background color using (SKPaint brush = new() { Color = borderSkin.PageColor, Style = SKPaintStyle.Fill }) { graph.FillRectangle(brush, rect); } SKRect shadowRect; if (drawOutsideTopLeftShadow) { // Top/Left outside shadow shadowRect = absolute; shadowRect.Left -= radius * 0.3f; shadowRect.Top -= radius * 0.3f; shadowRect.Right -= radius * .3f; shadowRect.Bottom -= radius * .3f; graph.DrawRoundedRectShadowAbs(shadowRect, cornerRadius, radius, Color.FromArgb(128, SKColors.Black), borderSkin.PageColor, outsideShadowRate); } // Bottom/Right outside shadow shadowRect = absolute; shadowRect.Left += radius * 0.3f; shadowRect.Top += radius * 0.3f; shadowRect.Right -= radius * .3f; shadowRect.Bottom -= radius * .3f; graph.DrawRoundedRectShadowAbs(shadowRect, cornerRadius, radius, shadowLightColor, borderSkin.PageColor, outsideShadowRate); // Background shadowRect = absolute; shadowRect.Right -= radius * .3f; shadowRect.Bottom -= radius * .3f; SKPath path = ChartGraphics.CreateRoundedRectPath(shadowRect, cornerRadius); graph.DrawPathAbs( path, backColor, backHatchStyle, backImage, backImageWrapMode, backImageTransparentColor, backImageAlign, backGradientStyle, backSecondaryColor, borderColor, borderWidth, borderDashStyle, PenAlignment.Inset); // Dispose Graphic path if (path != null) { path.Dispose(); } // Draw screws imitation in the corners of the farame if (drawScrews) { // Left/Top screw SKRect screwRect = SKRect.Empty; float offset = radius * 0.4f; screwRect.Left = shadowRect.Left + offset; screwRect.Top = shadowRect.Top + offset; screwRect.Size = new(radius * 0.55f, screwRect.Width); DrawScrew(graph, screwRect); // Right/Top screw screwRect.Left = shadowRect.Right - offset - screwRect.Width; DrawScrew(graph, screwRect); // Right/Bottom screw screwRect.Left = shadowRect.Right - offset - screwRect.Width; screwRect.Top = shadowRect.Bottom - offset - screwRect.Height; DrawScrew(graph, screwRect); // Left/Bottom screw screwRect.Left = shadowRect.Left + offset; screwRect.Top = shadowRect.Bottom - offset - screwRect.Height; DrawScrew(graph, screwRect); } // Bottom/Right inner shadow SKRegion innerShadowRegion; if (drawBottomShadow) { shadowRect = absolute; shadowRect.Right -= radius * .3f; shadowRect.Bottom -= radius * .3f; innerShadowRegion = new SKRegion( ChartGraphics.CreateRoundedRectPath( new SKRect( shadowRect.Left - radius, shadowRect.Top - radius, shadowRect.Width + 0.5f * radius, shadowRect.Height + 0.5f * radius), cornerRadius)); // TODO: innerShadowRegion.Complement(graph.CreateRoundedRectPath(shadowRect, cornerRadius)); graph.Clip = innerShadowRegion; shadowRect.Left -= 0.5f * radius; shadowRect.Top -= 0.5f * radius; shadowRect.Right += 0.5f * radius; shadowRect.Bottom += 0.5f * radius; graph.DrawRoundedRectShadowAbs( shadowRect, cornerRadius, radius, SKColors.Transparent, Color.FromArgb(175, (sunken) ? SKColors.White : shadowColor), 1.0f); graph.Clip = new SKRegion(); } // Top/Left inner shadow shadowRect = absolute; shadowRect.Right -= radius * .3f; shadowRect.Bottom -= radius * .3f; innerShadowRegion = new( ChartGraphics.CreateRoundedRectPath( new SKRect( shadowRect.Left + radius * .5f, shadowRect.Top + radius * .5f, shadowRect.Width - .2f * radius, shadowRect.Height - .2f * radius), cornerRadius)); SKRect shadowWithOffset = shadowRect; shadowWithOffset.Right += radius; shadowWithOffset.Bottom += radius; // TODO: innerShadowRegion.Complement(graph.CreateRoundedRectPath(shadowWithOffset, cornerRadius)); innerShadowRegion.SetPath(ChartGraphics.CreateRoundedRectPath(shadowRect, cornerRadius), innerShadowRegion); graph.Clip = innerShadowRegion; graph.DrawRoundedRectShadowAbs( shadowWithOffset, cornerRadius, radius, SKColors.Transparent, Color.FromArgb(175, (sunken) ? shadowColor : SKColors.White), 1.0f); graph.Clip = new(); }