/********************************************************************************************* * Copyright 2005 - Volian Enterprises, Inc. All rights reserved. * Volian Enterprises - Proprietary Information - DO NOT COPY OR DISTRIBUTE * ------------------------------------------------------------------------------ * $Workfile: VG.cs $ $Revision: 2 $ * $Author: Jsj $ $Date: 2/28/06 1:33p $ * * $History: VG.cs $ * * ***************** Version 2 ***************** * User: Jsj Date: 2/28/06 Time: 1:33p * Updated in $/LibSource/VG * updated for X/Y Plots * * ***************** Version 1 ***************** * User: Kathy Date: 12/06/05 Time: 12:06p * Created in $/LibSource/VG * * ***************** Version 1 ***************** * User: Kathy Date: 12/06/05 Time: 12:01p * Created in $/LibSource/VG.root/VG *********************************************************************************************/ using System; using System.Xml; using System.Drawing; using System.Text; using C1.C1Pdf; namespace VG { /// /// VG is the class representing vector graphics. It provides objects for: /// Line, Rectangle, Text, Ellipse, Bitmaps, etc. /// VG provides constructors for these objects from coordinate system locations /// (such as starting x,y ending x,y, etc), xml and svg. /// VG provides output to PDF. (More can be added). /// VG data is stored in TWIPS (1440 per inch) /// // Temporary page class to store portrait/landscape, Left Margin, Vertical offset, etc public class Page { public bool portrait=true; public float LeftMargin=0f; public float VertOffset=0f; public Page(bool iport, float lm, float voff) { portrait=iport; LeftMargin=lm; VertOffset=voff; } } public class VG { // Values of vector graphics items are stored as twips (1440 twips in an inch) public int cx; public int cy; public int dx; public int dy; public float lnwid; public Page pg; public bool MoveAbsolute; // TODO: Not sure what to do with this. public VG() { cx = 0; cy = 0; dx = 0; dy = 0; MoveAbsolute = false; pg=null; } public VG(int sx, int sy, int ex, int ey, bool ima, Page ipg) { cx = sx; cy = sy; dx = ex; dy = ey; MoveAbsolute = ima; pg=ipg; } public float ToPoints(float twip) { float r = ((float)twip) * 0.05f; return r; } public void UpdatePageInfo(Page pa) { pg.LeftMargin=pa.LeftMargin; pg.portrait=pg.portrait; pg.VertOffset=pg.VertOffset; } public string AddRTFBUI(string origStr, string bold, string underline, string italics) { if (bold==""&&underline==""&&italics=="")return origStr; StringBuilder sb = new StringBuilder(); if (bold == "bold")sb.Append("{\\b"); if (underline == "underline")sb.Append("{\\u"); if (italics == "italics") sb.Append("{\\i"); sb.Append(" "); sb.Append(origStr); if (bold == "bold")sb.Append("}"); if (underline == "underline")sb.Append("}"); if (italics == "italics") sb.Append("}"); return sb.ToString(); } } public class VG_Line : VG { // Line is defined as starting & ending points. public VG_Line(int sx, int sy, int ex, int ey, int w, Page ipg) { cx = sx; cy = sy; dx = ex; dy = ey; lnwid = w; pg=ipg; } public VG_Line(XmlElement svg, Page ipg) { cx = System.Convert.ToInt32(svg.GetAttribute("x1")); cy = System.Convert.ToInt32(svg.GetAttribute("y1")); dx = System.Convert.ToInt32(svg.GetAttribute("x2")); dy = System.Convert.ToInt32(svg.GetAttribute("y2")); lnwid = System.Convert.ToInt32(svg.GetAttribute("stroke-width")); pg = ipg; } public void ToPdf(C1PdfDocument c1pdf) { float startx = pg.portrait ? (cx + pg.LeftMargin): (pg.VertOffset + cy); float starty = pg.portrait ? (cy + pg.VertOffset): (pg.LeftMargin - cx); float endx = pg.portrait ? (dx + pg.LeftMargin): (pg.VertOffset + dy); float endy = pg.portrait ? (dy + pg.VertOffset): (pg.LeftMargin - dx); Pen pn = new Pen(Brushes.Black,ToPoints(lnwid)); c1pdf.DrawLine(pn, ToPoints(startx), ToPoints(starty), ToPoints(endx), ToPoints(endy)); } } public class VG_Rect : VG { // Rectangle is defined as starting point & length/width public VG_Rect(int sx, int sy, int ex, int ey, int w, Page ipg) { cx = sx; cy = sy; dx = ex; dy = ey; lnwid = w; pg = ipg; } public VG_Rect(XmlElement svg, Page ipg) { cx = System.Convert.ToInt32(svg.GetAttribute("x")); cy = System.Convert.ToInt32(svg.GetAttribute("y")); dx = System.Convert.ToInt32(svg.GetAttribute("width")); dy = System.Convert.ToInt32(svg.GetAttribute("height")); lnwid = System.Convert.ToInt32(svg.GetAttribute("stroke-width")); pg = ipg; } public void ToPdf(C1PdfDocument c1pdf) { Pen pn = new Pen(Brushes.Black,ToPoints(lnwid)); float startx = pg.portrait ? (cx + pg.LeftMargin): (pg.VertOffset + cy) ; float starty = pg.portrait ? (cy + pg.VertOffset): (pg.LeftMargin - cx); float endx = pg.portrait ? dx: dy; float endy = pg.portrait ? dy: dx; RectangleF rc = new RectangleF(ToPoints(startx), ToPoints(starty), ToPoints(endx), ToPoints(endy)); c1pdf.DrawRectangle(pn,rc); } } public class VG_Image : VG { private int Scale; private string FileName; // Image is defined as starting point, scale factor (defaults to 1) & image file name public VG_Image(int sx, int sy, int iscale, string fname) { cx = sx; cy = sy; Scale = 1; FileName = fname; } public VG_Image(XmlElement svg, Page ipg) { cx = System.Convert.ToInt32(svg.GetAttribute("x")); cy = System.Convert.ToInt32(svg.GetAttribute("y")); Scale=1; if (svg.HasAttribute("scale")) Scale = System.Convert.ToInt32(svg.GetAttribute("scale")); FileName = svg.GetAttribute("bname"); pg = ipg; } public void ToPdf(C1PdfDocument c1pdf) { Pen pn = new Pen(Brushes.Black,lnwid); Bitmap bm = new Bitmap(FileName); RectangleF rc = new RectangleF(); rc.Height = ToPoints((bm.Height*Scale)*4.8f); rc.Width = ToPoints((bm.Width*Scale)*4.8f); rc.X = ToPoints(pg.LeftMargin+cx); rc.Y = ToPoints(pg.VertOffset+cy); c1pdf.DrawImage(bm, rc, ContentAlignment.MiddleCenter, ImageSizeModeEnum.Scale); } } public class VG_Ellipse : VG { // Ellipse (circle) is defined by a bounding rectangle specified by a coordinate pair, a width, and a height public VG_Ellipse(int sx, int sy, int ex, int ey, int w, Page ipg) { cx = sx; cy = sy; dx = ex; dy = ey; lnwid = w; pg = ipg; } public VG_Ellipse(XmlElement svg, Page ipg) { cx = System.Convert.ToInt32(svg.GetAttribute("cx")); cy = System.Convert.ToInt32(svg.GetAttribute("cy")); dx = System.Convert.ToInt32(svg.GetAttribute("rx")); dy = System.Convert.ToInt32(svg.GetAttribute("ry")); lnwid = System.Convert.ToInt32(svg.GetAttribute("stroke-width")); pg = ipg; } public void ToPdf(C1PdfDocument c1pdf) { Pen pn = new Pen(Brushes.Black,ToPoints(lnwid)); c1pdf.DrawEllipse(pn,ToPoints(pg.LeftMargin+cx), ToPoints(pg.VertOffset+cy), ToPoints(dx), ToPoints(dy)); } } public class VG_Text : VG { private string FontName; private int FontSize; private string Bold; private string Underline; private string Italics; private string Text; // Text is defined by a starting location, attributes & the string public VG_Text(int sx, int sy, int fs, string txt, string fn, string ibold, string iunder, string iitalics, Page ipg) { cx = sx; cy = sy; FontSize = fs; FontName = fn; Text = txt; Bold = ibold; Underline = iunder; Italics = iitalics; pg = ipg; // TODO: The following were in the 16-bit code - we may need to use these, wait and see // strokeWidth = stroke; // strokeWidthBold = strokebold; // ULOffset = UnderlineOffset; // ULWidth = UnderlineWidth; } public VG_Text(XmlElement svg, Page ipg) { cx = System.Convert.ToInt32(svg.GetAttribute("x")); cy = System.Convert.ToInt32(svg.GetAttribute("y")); FontSize = System.Convert.ToInt32(svg.GetAttribute("font-size")); Bold = svg.GetAttribute("font-weight"); Underline = svg.GetAttribute("text-decoration"); Italics = svg.GetAttribute("font-style"); FontName = svg.GetAttribute("font-family"); Text = svg.InnerText; pg = ipg; } public void ToPdf(C1PdfDocument c1pdf) { Font myfont = new Font(FontName,FontSize); RectangleF rc = new RectangleF(); // the returned value from c1 pdf code is already in points, // so need to convert the size. rc.Size = c1pdf.MeasureStringRtf(Text,myfont,500); // TODO: 500 or pagewidth, or what rc.X = ToPoints(pg.LeftMargin+cx); rc.Y = ToPoints(pg.VertOffset+cy)-FontSize; // add bold, underline & italics for entire object. string rtfout = AddRTFBUI(Text,Bold,Underline,Italics); c1pdf.DrawStringRtf(rtfout,myfont,Brushes.Black,rc); } } public class VG_Arc : VG { public Single sweepAngle; public Single startAngle; public float stX,stY; public float rWid,rHgt; #if DEBUG public static int iColor=0; public Color [] myColors={Color.Red,Color.Orange,Color.Yellow,Color.Green,Color.Blue,Color.BlueViolet,Color.Violet}; #endif // Arc is defined by a bounding rectangle specified by a coordinate pair, a width, and a height public VG_Arc(float sx, float sy, float width, float hight, float stAngle, float swpAngle, int w, Page ipg) { stX = sx; stY = sy; rWid = width; rHgt = hight; startAngle = stAngle; // startAngle = 90; sweepAngle = swpAngle; // sweepAngle = -45; lnwid = w; pg = ipg; } // public VG_Arc(XmlElement svg, Page ipg) // { // cx = System.Convert.ToInt32(svg.GetAttribute("cx")); // cy = System.Convert.ToInt32(svg.GetAttribute("cy")); // dx = System.Convert.ToInt32(svg.GetAttribute("rx")); // dy = System.Convert.ToInt32(svg.GetAttribute("ry")); // lnwid = System.Convert.ToInt32(svg.GetAttribute("stroke-width")); // pg = ipg; // } public void ToPdf(C1PdfDocument c1pdf) { // Pen pn = new Pen(Brushes.Black,ToPoints(lnwid)); #if DEBUG Pen pn = new Pen(myColors[iColor],ToPoints(lnwid)); iColor=(iColor+1)%myColors.Length; #else Pen pn = new Pen(Color.Black,ToPoints(lnwid)); #endif // PointF startpt = new PointF(stX,stY); // SizeF recsize = new SizeF(rWid,rHgt); // RectangleF rc = new RectangleF(startpt,recsize); float startx = pg.portrait ? (stX + pg.LeftMargin): (pg.VertOffset + stY); float starty = pg.portrait ? (stY + pg.VertOffset): (pg.LeftMargin - stX); RectangleF rc = new RectangleF(ToPoints(startx),ToPoints(starty),ToPoints(rWid),ToPoints(rHgt)); // c1pdf.DrawRectangle(pn,rc); //debug // c1pdf.DrawArc(new Pen(Color.Black,ToPoints(lnwid)),new RectangleF(stX,stY,rWid,rHgt),startAngle,sweepAngle); c1pdf.DrawArc(pn,rc,startAngle,sweepAngle); // c1pdf.DrawArc(new Pen(Color.Black, 4),rc,startAngle,sweepAngle); } } }