/// <summary> /// Generate the pen for a GeometryDrawing /// </summary> private static void GeneratePen(StringBuilder result, GraphicPath graphicPath, int level) { if (graphicPath.StrokeBrush != null) { var indent1 = SourceFormatterHelper.GetTagIndent(level); var indent2 = SourceFormatterHelper.GetTagIndent(level + 1); bool strokeColorInExtendedProperties = false; result.Append(indent1); result.AppendLine("<GeometryDrawing.Pen>"); var tag = "Pen"; var indentPenProperty = SourceFormatterHelper.GetPropertyIndent(level + 1, tag); result.Append(indent2); result.Append(string.Format(CultureInfo.InvariantCulture, "<{0} Thickness=\"{1}\"", tag, DoubleUtilities.FormatString(graphicPath.StrokeThickness))); if (graphicPath.StrokeLineCap != GraphicLineCap.Flat) { result.AppendLine(); result.Append(indentPenProperty); result.AppendLine(string.Format(CultureInfo.InvariantCulture, "StartLineCap=\"{0}\" ", Converter.ConvertToWPF(graphicPath.StrokeLineCap).ToString())); result.Append(indentPenProperty); result.Append(string.Format(CultureInfo.InvariantCulture, "EndLineCap=\"{0}\" ", Converter.ConvertToWPF(graphicPath.StrokeLineCap).ToString())); } if (graphicPath.StrokeDashes != null) { if (graphicPath.StrokeLineCap != GraphicLineCap.Square) { result.AppendLine(); result.Append(indentPenProperty); result.Append(string.Format(CultureInfo.InvariantCulture, "DashCap=\"{0}\" ", Converter.ConvertToWPF(graphicPath.StrokeLineCap).ToString())); } } if (graphicPath.StrokeLineJoin != GraphicLineJoin.Miter) { result.AppendLine(); result.Append(indentPenProperty); result.Append(string.Format(CultureInfo.InvariantCulture, "LineJoin=\"{0}\" ", Converter.ConvertToWpf(graphicPath.StrokeLineJoin).ToString())); } else if (!DoubleUtilities.IsEqual(graphicPath.StrokeMiterLimit, 10)) { result.AppendLine(); result.Append(indentPenProperty); result.Append(string.Format(CultureInfo.InvariantCulture, "MiterLimit=\"{0}\"", DoubleUtilities.FormatString(graphicPath.StrokeMiterLimit))); } if (graphicPath.StrokeBrush is GraphicSolidColorBrush strokeColor) { result.AppendLine(); Color color = strokeColor.Color; result.Append(indentPenProperty); result.Append(string.Format("Brush=\"{0}\"", SourceFormatterHelper.FormatColorParamter(color))); } else { strokeColorInExtendedProperties = true; } if (strokeColorInExtendedProperties || graphicPath.StrokeDashes != null) { result.AppendLine(">"); if (graphicPath.StrokeDashes != null) { var indent3 = SourceFormatterHelper.GetTagIndent(level + 2); var indent4 = SourceFormatterHelper.GetTagIndent(level + 3); var tagDashStyle = "DashStyle"; result.Append(indent3); result.AppendLine($"<Pen.{tagDashStyle}>"); result.Append(indent4); result.Append($"<{tagDashStyle} Dashes=\""); for (int i = 0; i < graphicPath.StrokeDashes.Count; i++) { if (i != 0) { result.Append(" "); } result.Append(DoubleUtilities.FormatString(graphicPath.StrokeDashes[i])); } result.Append("\""); if (!DoubleUtilities.IsZero(graphicPath.StrokeDashOffset)) { var indentDashStyleProperty = SourceFormatterHelper.GetPropertyIndent(level + 3, tagDashStyle); result.AppendLine(); result.Append(indentDashStyleProperty); result.Append(string.Format(CultureInfo.InvariantCulture, "Offset=\"{0}\"", DoubleUtilities.FormatString(graphicPath.StrokeDashOffset))); } result.AppendLine("/>"); result.Append(indent3); result.AppendLine($"</Pen.{tagDashStyle}>"); } if (strokeColorInExtendedProperties) { BrushSourceGenerator.GenerateBrush(result, graphicPath.StrokeBrush, "Pen.Brush", level + 3); } result.AppendLine($"{indent2}</{tag}>"); } else { result.AppendLine(" />"); } result.Append(indent1); result.AppendLine("</GeometryDrawing.Pen>"); } }
/// <summary> /// Generate the XAML source code (a <Path/> for a single graphic path /// </summary> private static string GeneratePath(GraphicPath graphicPath, bool stretch, int level, GeometryGeneratorType geometryGeneratorType) { var tag = "Path"; var indentTag = SourceFormatterHelper.GetTagIndent(level); var indentProperty = SourceFormatterHelper.GetPropertyIndent(level, tag); StringBuilder result = new StringBuilder(); string stretchParam = stretch ? "Uniform" : "None"; result.Append($"{indentTag}<{tag} Stretch=\"{stretchParam}\""); bool fillColorInExtendedProperties = false; bool strokeColorInExtendedProperties = false; if (graphicPath.FillBrush != null) { if (graphicPath.FillBrush is GraphicSolidColorBrush solidFillColor) { result.AppendLine(); Color color = solidFillColor.Color; result.Append(indentProperty); result.Append(string.Format("Fill=\"{0}\"", SourceFormatterHelper.FormatColorParamter(color))); } else { fillColorInExtendedProperties = true; } } if (graphicPath.StrokeBrush != null) { if (graphicPath.StrokeBrush is GraphicSolidColorBrush solidStrokeColor) { result.AppendLine(); Color color = solidStrokeColor.Color; result.Append(indentProperty); result.Append(string.Format("Stroke=\"{0}\" ", SourceFormatterHelper.FormatColorParamter(color))); } else { strokeColorInExtendedProperties = true; } result.AppendLine(); result.Append(indentProperty); result.Append(string.Format(CultureInfo.InvariantCulture, "StrokeThickness=\"{0}\" ", DoubleUtilities.FormatString(graphicPath.StrokeThickness))); if (graphicPath.StrokeLineCap != GraphicLineCap.Flat) { result.AppendLine(); result.Append(indentProperty); result.AppendLine(string.Format(CultureInfo.InvariantCulture, "StrokeStartLineCap=\"{0}\" ", Converter.ConvertToWPF(graphicPath.StrokeLineCap).ToString())); result.Append(indentProperty); result.Append(string.Format(CultureInfo.InvariantCulture, "StrokeEndLineCap=\"{0}\" ", Converter.ConvertToWPF(graphicPath.StrokeLineCap).ToString())); } if (graphicPath.StrokeDashes != null) { if (graphicPath.StrokeLineCap != GraphicLineCap.Flat) { result.AppendLine(); result.Append(indentProperty); result.Append(string.Format(CultureInfo.InvariantCulture, "StrokeDashCap=\"{0}\" ", Converter.ConvertToWPF(graphicPath.StrokeLineCap).ToString())); } result.AppendLine(); result.Append(indentProperty); result.Append("StrokeDashArray=\""); for (int i = 0; i < graphicPath.StrokeDashes.Count; i++) { if (i != 0) { result.Append(" "); } result.Append(DoubleUtilities.FormatString(graphicPath.StrokeDashes[i])); } result.AppendLine("\""); if (!DoubleUtilities.IsZero(graphicPath.StrokeDashOffset)) { result.AppendLine(); result.Append(indentProperty); result.Append(string.Format(CultureInfo.InvariantCulture, "StrokeDashOffset=\"{0}\"", DoubleUtilities.FormatString(graphicPath.StrokeDashOffset))); } } if (graphicPath.StrokeLineJoin != GraphicLineJoin.Miter) { result.AppendLine(); result.Append(indentProperty); result.Append(string.Format(CultureInfo.InvariantCulture, "StrokeLineJoin=\"{0}\" ", Converter.ConvertToWpf(graphicPath.StrokeLineJoin).ToString())); } else if (!DoubleUtilities.IsEqual(graphicPath.StrokeMiterLimit, 10)) { result.AppendLine(); result.Append(indentProperty); result.Append(string.Format(CultureInfo.InvariantCulture, "MiterLimit=\"{0}\"", DoubleUtilities.FormatString(graphicPath.StrokeMiterLimit))); } } if (geometryGeneratorType == GeometryGeneratorType.Stream) { result.AppendLine(); result.Append(indentProperty); result.Append("Data=\""); result.Append(StreamSourceGenerator.GenerateStreamGeometry(graphicPath.Geometry)); result.Append("\""); } if (geometryGeneratorType == GeometryGeneratorType.PathGeometry || fillColorInExtendedProperties || strokeColorInExtendedProperties) { result.AppendLine(">"); if (geometryGeneratorType == GeometryGeneratorType.PathGeometry) { var indent1 = SourceFormatterHelper.GetTagIndent(level + 1); result.Append(indent1); result.AppendLine("<Path.Data>"); PathGeometrySourceGenerator.GeneratePathGeometry(result, graphicPath.Geometry, level + 2); result.Append(indent1); result.AppendLine("</Path.Data>"); } if (fillColorInExtendedProperties) { BrushSourceGenerator.GenerateBrush(result, graphicPath.FillBrush, "Path.Fill", level + 1); } if (strokeColorInExtendedProperties) { BrushSourceGenerator.GenerateBrush(result, graphicPath.StrokeBrush, "Path.Stroke", level + 1); } result.Append(indentTag); result.Append($"</{tag}>"); } else { result.Append(" />"); } return(result.ToString()); }
/// <summary> /// Generate path /// </summary> private static void GeneratePath(GraphicPath graphicPath, StringBuilder result, int level, GeometryGeneratorType geometryGeneratorType) { var tag = "GeometryDrawing"; var indentTag = SourceFormatterHelper.GetTagIndent(level); var indentProperty = SourceFormatterHelper.GetPropertyIndent(level, tag); result.Append($"{indentTag}<{tag}"); bool fillColorInExtendedProperties = false; bool firstAttributSet = false; if (graphicPath.FillBrush != null) { if (graphicPath.FillBrush is GraphicSolidColorBrush solidFillColor) { firstAttributSet = true; Color color = solidFillColor.Color; var brush = string.Format(" Brush=\"{0}\"", SourceFormatterHelper.FormatColorParamter(color)); result.Append(brush); } else { fillColorInExtendedProperties = true; } } if (geometryGeneratorType == GeometryGeneratorType.Stream) { if (firstAttributSet) { result.AppendLine(); result.Append(indentProperty); } else { result.Append(" "); } result.Append(string.Format("Geometry=\"")); var stream = StreamSourceGenerator.GenerateStreamGeometry(graphicPath.Geometry); result.Append(stream); result.Append("\""); } if (geometryGeneratorType == GeometryGeneratorType.PathGeometry || fillColorInExtendedProperties || graphicPath.StrokeBrush != null) { result.AppendLine(">"); if (geometryGeneratorType == GeometryGeneratorType.PathGeometry) { var indent1 = SourceFormatterHelper.GetTagIndent(level + 1); result.Append(indent1); result.AppendLine("<GeometryDrawing.Geometry>"); PathGeometrySourceGenerator.GeneratePathGeometry(result, graphicPath.Geometry, level + 2); result.Append(indent1); result.AppendLine("</GeometryDrawing.Geometry>"); } if (fillColorInExtendedProperties) { BrushSourceGenerator.GenerateBrush(result, graphicPath.FillBrush, "GeometryDrawing.Brush", level + 1); } if (graphicPath.StrokeBrush != null) { GeneratePen(result, graphicPath, level + 1); } result.Append(indentTag); result.AppendLine("</GeometryDrawing>"); } else { result.AppendLine("/>"); } }