366 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			366 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| /*********************************************************************************************
 | |
|  * 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
 | |
| {
 | |
| 	/// <summary>
 | |
| 	/// 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)
 | |
| 	/// </summary>
 | |
| 	
 | |
| 	// 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);
 | |
| 		}
 | |
| 	}
 | |
| }
 | |
| 
 |