196 lines
7.9 KiB
C#
196 lines
7.9 KiB
C#
using System;
|
|
using System.Drawing;
|
|
using System.Drawing.Drawing2D;
|
|
using System.Collections;
|
|
|
|
namespace Volian.Svg.Library
|
|
{
|
|
public abstract partial class SvgPart
|
|
{
|
|
public abstract void Draw(Graphics graphics, SvgScale scale, Svg mySvg, SvgPartInheritance myParent);
|
|
}
|
|
public partial class SvgPartInheritance : SvgPart
|
|
{
|
|
public override void Draw(System.Drawing.Graphics graphics, SvgScale scale, Svg mySvg, SvgPartInheritance myParent)
|
|
{
|
|
}
|
|
}
|
|
public partial class Svg : SvgGroup
|
|
{
|
|
public void Draw(Graphics graphics)
|
|
{
|
|
//SetupInheritance();
|
|
//Console.WriteLine("{0}, DPI {1}", graphics.VisibleClipBounds, graphics.DpiX);
|
|
SvgParts.Draw(graphics, new SvgScale(DeviceDPI(graphics), graphics.VisibleClipBounds, _Width, _Height, _ViewBox), this, this);
|
|
//SvgParts.Draw(graphics, new SvgScale(100, graphics.VisibleClipBounds, _Width, _Height, _ViewBox));
|
|
}
|
|
public static float DeviceDPI(Graphics g)
|
|
{
|
|
PointF[] tmp = { new PointF(g.DpiX, g.DpiY) };
|
|
g.TransformPoints(CoordinateSpace.World, CoordinateSpace.Device, tmp);
|
|
return (float)Math.Round((double)tmp[0].X, 0);
|
|
}
|
|
}
|
|
public partial class SvgArc : SvgShapePart
|
|
{
|
|
public override void Draw(System.Drawing.Graphics graphics, SvgScale scale, Svg mySvg, SvgPartInheritance myParent)
|
|
{
|
|
SetupInheritance(myParent.MyInheritedSettings);
|
|
//_MyLineSettings.Scale = scale.M(1F);
|
|
if (FillColor != Color.Transparent)
|
|
using (Brush brush = new SolidBrush(FillColor))
|
|
graphics.FillEllipse(brush, scale.X(CX - Radius), scale.Y(CY - Radius), scale.M(Radius * 2), scale.M(Radius * 2));
|
|
if (OutlineWidth.Value != 0F && OutlineColor != Color.Empty)
|
|
using (Pen pen = new Pen(OutlineColor, scale.M(OutlineWidth)))
|
|
graphics.DrawEllipse(pen, scale.X(CX - Radius), scale.Y(CY - Radius), scale.M(Radius * 2), scale.M(Radius * 2));
|
|
}
|
|
}
|
|
public partial class SvgCircle : SvgShapePart
|
|
{
|
|
public override void Draw(System.Drawing.Graphics graphics, SvgScale scale, Svg mySvg, SvgPartInheritance myParent)
|
|
{
|
|
SetupInheritance(myParent.MyInheritedSettings);
|
|
//_MyLineSettings.Scale = scale.M(1F);
|
|
if (FillColor != Color.Transparent)
|
|
using (Brush brush = new SolidBrush(FillColor))
|
|
graphics.FillEllipse(brush, scale.X(CX - Radius), scale.Y(CY - Radius), scale.M(Radius * 2), scale.M(Radius * 2));
|
|
if (OutlineWidth.Value != 0F && OutlineColor != Color.Empty)
|
|
using (Pen pen = new Pen(OutlineColor, scale.M(OutlineWidth)))
|
|
graphics.DrawEllipse(pen, scale.X(CX - Radius), scale.Y(CY - Radius), scale.M(Radius * 2), scale.M(Radius * 2));
|
|
}
|
|
}
|
|
public partial class SvgDefine : SvgGroup
|
|
{
|
|
public override void Draw(Graphics graphics, SvgScale myScale, Svg mySvg, SvgPartInheritance myParent)
|
|
{
|
|
// Don't draw
|
|
//_SvgParts.Draw(graphics, myScale);
|
|
}
|
|
}
|
|
public partial class SvgEllipse : SvgShapePart
|
|
{
|
|
public override void Draw(System.Drawing.Graphics graphics, SvgScale scale, Svg mySvg, SvgPartInheritance myParent)
|
|
{
|
|
SetupInheritance(myParent.MyInheritedSettings);
|
|
if (FillColor != Color.Transparent)
|
|
using (Brush brush = new SolidBrush(FillColor))
|
|
graphics.FillEllipse(brush, scale.X(CX - RX), scale.Y(CY - RY), scale.M(2 * RX), scale.M(2 * RY));
|
|
if (OutlineWidth.Value != 0F && OutlineColor != Color.Empty)
|
|
using (Pen pen = new Pen(OutlineColor, scale.M(OutlineWidth)))
|
|
graphics.DrawEllipse(pen, scale.X(CX - RX), scale.Y(CY - RY), scale.M(2 * RX), scale.M(2 * RY));
|
|
}
|
|
}
|
|
public partial class SvgGroup : SvgPartInheritance
|
|
{
|
|
public override void Draw(Graphics graphics, SvgScale myScale, Svg mySvg, SvgPartInheritance myParent)
|
|
{
|
|
SetupInheritance(myParent.MyInheritedSettings);
|
|
_SvgParts.Draw(graphics, myScale, mySvg, this);
|
|
}
|
|
}
|
|
public partial class SvgImage : SvgPart
|
|
{
|
|
public override void Draw(System.Drawing.Graphics graphics, SvgScale scale, Svg mySvg, SvgPartInheritance myParent)
|
|
{
|
|
SetupInheritance(myParent.MyInheritedSettings);
|
|
graphics.DrawImage(Image.FromFile(ImagePath), scale.X(X), scale.Y(Y), scale.M(Width), scale.M(Height));
|
|
}
|
|
}
|
|
public partial class SvgLine : SvgLinePart
|
|
{
|
|
public override void Draw(System.Drawing.Graphics graphics, SvgScale scale, Svg mySvg, SvgPartInheritance myParent)
|
|
{
|
|
SetupInheritance(myParent.MyInheritedSettings);
|
|
if (LineColor != Color.Empty)
|
|
{
|
|
Color myColor = AdjustColorForWidth(LineColor, scale.M(LineWidth));
|
|
using (Pen pen = new Pen(LineColor, scale.M(LineWidth)))
|
|
graphics.DrawLine(pen, scale.X(X1), scale.Y(Y1), scale.X(X2), scale.Y(Y2));
|
|
}
|
|
}
|
|
}
|
|
public partial class SvgParts : CollectionBase
|
|
{
|
|
public void Draw(Graphics graphics, SvgScale scale, Svg mySvg, SvgPartInheritance myParent)
|
|
{
|
|
foreach (SvgPart svgPart in List)
|
|
svgPart.Draw(graphics,scale,mySvg, myParent);
|
|
}
|
|
}
|
|
public partial class SvgRectangle : SvgShapePart
|
|
{
|
|
public override void Draw(System.Drawing.Graphics graphics, SvgScale scale, Svg mySvg, SvgPartInheritance myParent)
|
|
{
|
|
SetupInheritance(myParent.MyInheritedSettings);
|
|
if (FillColor != Color.Transparent)
|
|
using (Brush brush = new SolidBrush(FillColor))
|
|
graphics.FillRectangle(brush, scale.X(X),scale.Y(Y),scale.M(Width),scale.M(Height));
|
|
if (OutlineWidth.Value != 0F && OutlineColor != Color.Empty)
|
|
using (Pen pen = new Pen(OutlineColor, scale.M(OutlineWidth)))
|
|
graphics.DrawRectangle(pen, scale.X(X),scale.Y(Y), scale.M(Width), scale.M(Height));
|
|
}
|
|
}
|
|
//public partial class SvgRtf : SvgShapePart
|
|
//{
|
|
// //private static float _Factor = 1.085F; // 20 point Arial Font
|
|
// public override void Draw(System.Drawing.Graphics graphics, SvgScale scale, Svg mySvg, SvgPartInheritance myParent)
|
|
// {
|
|
// SetupInheritance(myParent.MyInheritedSettings);
|
|
// _MyFontSettings.Scale = scale.M(1F);
|
|
// }
|
|
// private float YAdjustment(Graphics gr, Font fnt)
|
|
// {
|
|
// int yAsc = fnt.FontFamily.GetCellAscent(fnt.Style);
|
|
// int yLS = fnt.FontFamily.GetLineSpacing(fnt.Style);
|
|
// float gth = fnt.GetHeight(gr);
|
|
// float fAsc = (yAsc * gth) / yLS;
|
|
// return -fAsc;
|
|
// }
|
|
//}
|
|
public partial class SvgText : SvgShapePart
|
|
{
|
|
//private static float _Factor = 1.085F; // 20 point Arial Font
|
|
public override void Draw(System.Drawing.Graphics graphics, SvgScale scale, Svg mySvg, SvgPartInheritance myParent)
|
|
{
|
|
SetupInheritance(myParent.MyInheritedSettings);
|
|
_MyFontSettings.Scale = scale.M(1F);
|
|
StringFormat stringFormat = StringFormat.GenericTypographic;
|
|
float YAdj = YAdjustment(graphics, Font);
|
|
using (Brush brush = new System.Drawing.SolidBrush(FillColor))
|
|
graphics.DrawString(Text, Font, brush, scale.X(X), scale.Y(Y) + YAdj, stringFormat);
|
|
SizeF sf = graphics.MeasureString(Text, Font, graphics.VisibleClipBounds.Size, stringFormat);
|
|
if (OutlineWidth.Value != 0 && OutlineColor != Color.Empty)
|
|
using (GraphicsPath path = GetStringPath(Text, Svg.DeviceDPI(graphics), new PointF(scale.X(X), scale.Y(Y) + YAdj), Font, stringFormat))
|
|
using (Pen myPen = new Pen(OutlineColor, scale.M(OutlineWidth)))
|
|
graphics.DrawPath(myPen, path);
|
|
}
|
|
GraphicsPath GetStringPath(string s, float dpi, PointF loc, Font font, StringFormat format)
|
|
{
|
|
GraphicsPath path = new GraphicsPath();
|
|
// Convert font size into appropriate coordinates
|
|
float emSize = dpi * font.SizeInPoints / 72;
|
|
path.AddString(s, font.FontFamily, (int)font.Style, emSize, loc, format);
|
|
return path;
|
|
}
|
|
private float YAdjustment(Graphics gr, Font fnt)
|
|
{
|
|
int yAsc = fnt.FontFamily.GetCellAscent(fnt.Style);
|
|
//int yDesc = fnt.FontFamily.GetCellDescent(fnt.Style);
|
|
//int yEm = fnt.FontFamily.GetEmHeight(fnt.Style);
|
|
int yLS = fnt.FontFamily.GetLineSpacing(fnt.Style);
|
|
float gth = fnt.GetHeight(gr);
|
|
float fh = fnt.Size;
|
|
float fAsc = (yAsc * gth) / yLS;
|
|
return -fAsc;
|
|
}
|
|
}
|
|
public partial class SvgUse : SvgPartInheritance
|
|
{
|
|
public override void Draw(System.Drawing.Graphics graphics, SvgScale scale, Svg mySvg, SvgPartInheritance myParent)
|
|
{
|
|
SetupInheritance(myParent.MyInheritedSettings);
|
|
mySvg[_UseID.Substring(1)].Draw(graphics, scale.AdjustOrigin(X, Y), mySvg, this);
|
|
}
|
|
}
|
|
}
|