private void DrawEllipse(PageEllipse pe, Graphics g, RectangleF r) { StyleInfo si = pe.SI; if (!si.BackgroundColor.IsEmpty) { g.FillEllipse(new SolidBrush(si.BackgroundColor), r); } if (si.BStyleTop != BorderStyleEnum.None) { Pen p = new Pen(si.BColorTop, si.BWidthTop); switch (si.BStyleTop) { case BorderStyleEnum.Dashed: p.DashStyle = DashStyle.Dash; break; case BorderStyleEnum.Dotted: p.DashStyle = DashStyle.Dot; break; case BorderStyleEnum.Double: case BorderStyleEnum.Groove: case BorderStyleEnum.Inset: case BorderStyleEnum.Solid: case BorderStyleEnum.Outset: case BorderStyleEnum.Ridge: case BorderStyleEnum.WindowInset: default: p.DashStyle = DashStyle.Solid; break; } g.DrawEllipse(p, r); } }
private void DoInstructions(Single Xp, Single Yp, Single Wid, Single Hgt, Brush b) { switch (b.GetType().Name) { case "SolidBrush": System.Drawing.SolidBrush theBrush = (System.Drawing.SolidBrush)b; Color col = theBrush.Color; PageEllipse pl = new PageEllipse(); pl.X = X + Xp * SCALEFACTOR; pl.Y = Y + Yp * SCALEFACTOR; pl.W = Wid * SCALEFACTOR; pl.H = Hgt * SCALEFACTOR; StyleInfo SI = new StyleInfo(); SI.BackgroundColor = col; pl.SI = SI; items.Add(pl); //Lines.AppendFormat("\r\n"); //CrLf //Lines.AppendFormat("q\t"); //Push graphics state onto stack //Lines.AppendFormat("{0} w\t", 1 * ScaleX); //set width of path //Lines.AppendFormat("{0} {1} {2} RG\t", Math.Round(theBrush.Color.R / 255.0, 3), Math.Round(theBrush.Color.G / 255.0, 3), Math.Round(theBrush.Color.B / 255.0, 3)); //Set RGB colours //Lines.AppendFormat("{0} {1} {2} rg\t", Math.Round(theBrush.Color.R / 255.0, 3), Math.Round(theBrush.Color.G / 255.0, 3), Math.Round(theBrush.Color.B / 255.0, 3)); //Set RGB colours ////Need some bezier curves to draw an ellipse.. we can't draw a circle, but we can get close. //Double k = 0.5522847498; //Double RadiusX = (Wid / 2.0) * ScaleX; //Double RadiusY = (Hgt / 2.0) * ScaleY; //Double Y4 = Y + Height - Yp * ScaleY; //Double X1 = Xp * ScaleX + X; //Double Y1 = Y4 - RadiusY; //Double X4 = X1 + RadiusX; //Lines.AppendFormat("{0} {1} m\t", X1, Y1);//FirstPoint.. //Double kRy = k * RadiusY; //Double kRx = k * RadiusX; ////Control Point 1 will be on the same X as point 1 and be -kRy Y //Double X2 = X1; //Double Y2 = Y1 + kRy; //Double X3 = X4 - kRx; //Double Y3 = Y4; //Lines.AppendFormat("{0} {1} {2} {3} {4} {5} c\t", X2, Y2, X3, Y3, X4, Y4); //Upper Left Quadrant //X1 += 2 * RadiusX; //X2 = X1; //X3 += 2 * kRx; //Lines.AppendFormat("{0} {1} {2} {3} {4} {5} c\t", X3, Y3, X2, Y2, X1, Y1); //Upper Right Quadrant //Y2 -= 2 * kRy; //Y3 -= 2 * RadiusY; //Y4 = Y3; //Lines.AppendFormat("{0} {1} {2} {3} {4} {5} c\t", X2, Y2, X3, Y3, X4, Y4); //Lower Right Quadrant //X1 -= 2 * RadiusX; //X2 = X1; //X3 -= 2 * kRx; //Lines.AppendFormat("{0} {1} {2} {3} {4} {5} c\t", X3, Y3, X2, Y2, X1, Y1); //Lower Right Quadrant //Lines.AppendFormat("f\t");//fill path //Lines.AppendFormat("Q\t");//Pop graphics state from stack break; } }
/// <summary> /// Render all the objects in a page /// </summary> private void processPage(Pages pages, IEnumerable page) { //loop thru the items in the page foreach (PageItem pageItem in page) { if (pageItem.SI.BackgroundImage != null) { //put out any background image PageImage backgroundImage = pageItem.SI.BackgroundImage; float imageWidth = RSize.PointsFromPixels(pages.G, backgroundImage.SamplesW); float imageHeight = RSize.PointsFromPixels(pages.G, backgroundImage.SamplesH); int repeatX = 0; int repeatY = 0; float itemWidth = pageItem.W - (pageItem.SI.PaddingLeft + pageItem.SI.PaddingRight); float itemHeight = pageItem.H - (pageItem.SI.PaddingTop + pageItem.SI.PaddingBottom); switch (backgroundImage.Repeat) { case ImageRepeat.Repeat: repeatX = (int)Math.Floor(itemWidth / imageWidth); repeatY = (int)Math.Floor(itemHeight / imageHeight); break; case ImageRepeat.RepeatX: repeatX = (int)Math.Floor(itemWidth / imageWidth); repeatY = 1; break; case ImageRepeat.RepeatY: repeatY = (int)Math.Floor(itemHeight / imageHeight); repeatX = 1; break; case ImageRepeat.NoRepeat: default: repeatX = repeatY = 1; break; } //make sure the image is drawn at least 1 times repeatX = Math.Max(repeatX, 1); repeatY = Math.Max(repeatY, 1); float currX = pageItem.X + pageItem.SI.PaddingLeft; float currY = pageItem.Y + pageItem.SI.PaddingTop; float startX = currX; float startY = currY; for (int i = 0; i < repeatX; i++) { for (int j = 0; j < repeatY; j++) { currX = startX + i * imageWidth; currY = startY + j * imageHeight; addImage(backgroundImage.SI, currX, currY, imageWidth, imageHeight, RectangleF.Empty, backgroundImage.ImageData, null, pageItem.Tooltip); } } } else if (pageItem is PageTextHtml) { PageTextHtml pageTextHtml = pageItem as PageTextHtml; pageTextHtml.Build(pages.G); processPage(pages, pageTextHtml); continue; } else if (pageItem is PageText) { PageText pageText = pageItem as PageText; float[] textwidth; string[] measureStrings = RenderUtility.MeasureString(pageText, pages.G, out textwidth); addText(pageText.X, pageText.Y, pageText.W, pageText.H, measureStrings, pageText.SI, textwidth, pageText.CanGrow, pageText.HyperLink, pageText.NoClip, pageText.Tooltip); continue; } else if (pageItem is PageLine) { PageLine pageLine = pageItem as PageLine; addLine(pageLine.X, pageLine.Y, pageLine.X2, pageLine.Y2, pageLine.SI); continue; } else if (pageItem is PageEllipse) { PageEllipse pageEllipse = pageItem as PageEllipse; addEllipse(pageEllipse.X, pageEllipse.Y, pageEllipse.W, pageEllipse.H, pageEllipse.SI, pageEllipse.HyperLink); continue; } else if (pageItem is PageImage) { PageImage pageImage = pageItem as PageImage; //Duc Phan added 20 Dec, 2007 to support sized image RectangleF r2 = new RectangleF(pageImage.X + pageImage.SI.PaddingLeft, pageImage.Y + pageImage.SI.PaddingTop, pageImage.W - pageImage.SI.PaddingLeft - pageImage.SI.PaddingRight, pageImage.H - pageImage.SI.PaddingTop - pageImage.SI.PaddingBottom); //work rectangle RectangleF adjustedRect; RectangleF clipRect = RectangleF.Empty; switch (pageImage.Sizing) { case ImageSizingEnum.AutoSize: adjustedRect = new RectangleF(r2.Left, r2.Top, r2.Width, r2.Height); break; case ImageSizingEnum.Clip: adjustedRect = new RectangleF(r2.Left, r2.Top, RSize.PointsFromPixels(pages.G, pageImage.SamplesW), RSize.PointsFromPixels(pages.G, pageImage.SamplesH)); clipRect = new RectangleF(r2.Left, r2.Top, r2.Width, r2.Height); break; case ImageSizingEnum.FitProportional: float height; float width; float ratioIm = (float)pageImage.SamplesH / pageImage.SamplesW; float ratioR = r2.Height / r2.Width; height = r2.Height; width = r2.Width; if (ratioIm > ratioR) { //this means the rectangle width must be corrected width = height * (1 / ratioIm); } else if (ratioIm < ratioR) { //this means the rectangle height must be corrected height = width * ratioIm; } adjustedRect = new RectangleF(r2.X, r2.Y, width, height); break; case ImageSizingEnum.Fit: default: adjustedRect = r2; break; } if (pageImage.ImgFormat != System.Drawing.Imaging.ImageFormat.Wmf && pageImage.ImgFormat != System.Drawing.Imaging.ImageFormat.Emf) { addImage(pageImage.SI, adjustedRect.X, adjustedRect.Y, adjustedRect.Width, adjustedRect.Height, clipRect, pageImage.ImageData, pageImage.HyperLink, pageImage.Tooltip); } continue; } else if (pageItem is PageRectangle) { PageRectangle pageRectangle = pageItem as PageRectangle; addRectangle(pageRectangle.X, pageRectangle.Y, pageRectangle.W, pageRectangle.H, pageItem.SI, pageItem.HyperLink, pageItem.Tooltip); continue; } else if (pageItem is PagePie) { PagePie pagePie = pageItem as PagePie; addPie(pagePie.X, pagePie.Y, pagePie.W, pagePie.H, pageItem.SI, pageItem.HyperLink, pageItem.Tooltip); continue; } else if (pageItem is PagePolygon) { PagePolygon pagePolygon = pageItem as PagePolygon; addPolygon(pagePolygon.Points, pageItem.SI, pageItem.HyperLink); continue; } else if (pageItem is PageCurve) { PageCurve pageCurve = pageItem as PageCurve; addCurve(pageCurve.Points, pageItem.SI); continue; } } }
private void ProcessPage(Graphics g, IEnumerable p) { foreach (PageItem pi in p) { if (pi is PageTextHtml) { // PageTextHtml is actually a composite object (just like a page) ProcessHtml(pi as PageTextHtml, g); continue; } if (pi is PageLine) { PageLine pl = pi as PageLine; DrawLine( pl.SI.BColorLeft, pl.SI.BStyleLeft, pl.SI.BWidthLeft, g, PixelsX(pl.X), PixelsY(pl.Y), PixelsX(pl.X2), PixelsY(pl.Y2) ); continue; } RectangleF rect = new RectangleF(PixelsX(pi.X), PixelsY(pi.Y), PixelsX(pi.W), PixelsY(pi.H)); if (pi.SI.BackgroundImage != null) { // put out any background image PageImage i = pi.SI.BackgroundImage; DrawImage(i, g, rect); } if (pi is PageText) { PageText pt = pi as PageText; DrawString(pt, g, rect); } else if (pi is PageImage) { PageImage i = pi as PageImage; DrawImage(i, g, rect); } else if (pi is PageRectangle) { this.DrawBackground(g, rect, pi.SI); } else if (pi is PageEllipse) { PageEllipse pe = pi as PageEllipse; DrawEllipse(pe, g, rect); } else if (pi is PagePie) { PagePie pp = pi as PagePie; DrawPie(pp, g, rect); } else if (pi is PagePolygon) { PagePolygon ppo = pi as PagePolygon; FillPolygon(ppo, g, rect); } else if (pi is PageCurve) { PageCurve pc = pi as PageCurve; DrawCurve(pc.SI.BColorLeft, pc.SI.BStyleLeft, pc.SI.BWidthLeft, g, pc.Points, pc.Offset, pc.Tension); } DrawBorder(pi, g, rect); } }
private void DoEllipse(Pen p, Single Xp, Single Yp, Single Wid, Single Hgt) { BorderStyleEnum ls = getLineStyle(p); Color col = Color.Black; if (p.Brush.GetType().Name.Equals("SolidBrush")) { System.Drawing.SolidBrush theBrush = (System.Drawing.SolidBrush)p.Brush; col = theBrush.Color; } PageEllipse pl = new PageEllipse(); pl.X = X + Xp * SCALEFACTOR; pl.Y = Y + Yp * SCALEFACTOR; pl.W = Wid * SCALEFACTOR; pl.H = Hgt * SCALEFACTOR; StyleInfo SI = new StyleInfo(); SI.Color = col; SI.BColorTop = col; SI.BStyleTop = ls; SI.BWidthTop = p.Width * SCALEFACTOR; pl.SI = SI; items.Add(pl); //Lines.AppendFormat("\r\n"); //CrLf //Lines.AppendFormat("q\t"); //Push graphics state onto stack //Lines.AppendFormat("{0} w\t", p.Width * ScaleX); //set width of path //Lines.AppendFormat("{0} \t", linestyle); //line style from pen... //Lines.AppendFormat("{0} {1} {2} RG\t", Math.Round(R / 255.0, 3), Math.Round(G / 255.0, 3), Math.Round(B / 255.0, 3)); //Set RGB colours //Lines.AppendFormat("{0} {1} {2} rg\t", Math.Round(R / 255.0, 3), Math.Round(G / 255.0, 3), Math.Round(B / 255.0, 3)); //Set RGB colours ////Need some bezier curves to draw an ellipse.. we can't draw a circle, but we can get close. //Double k = 0.5522847498; //Double RadiusX = (Wid / 2.0) * ScaleX; //Double RadiusY = (Hgt / 2.0) * ScaleY; //Double Y4 = Y + Height - Yp * ScaleY; //Double X1 = Xp * ScaleX + X; //Double Y1 = Y4 - RadiusY; //Double X4 = X1 + RadiusX; //Lines.AppendFormat("{0} {1} m\t", X1, Y1);//FirstPoint.. //Double kRy = k * RadiusY; //Double kRx = k * RadiusX; ////Control Point 1 will be on the same X as point 1 and be -kRy Y //Double X2 = X1; //Double Y2 = Y1 + kRy; //Double X3 = X4 - kRx; //Double Y3 = Y4; //Lines.AppendFormat("{0} {1} {2} {3} {4} {5} c\t", X2, Y2, X3, Y3, X4, Y4); //Upper Left Quadrant //X1 += 2 * RadiusX; //X2 = X1; //X3 += 2 * kRx; //Lines.AppendFormat("{0} {1} {2} {3} {4} {5} c\t", X3, Y3, X2, Y2, X1, Y1); //Upper Right Quadrant //Y2 -= 2 * kRy; //Y3 -= 2 * RadiusY; //Y4 = Y3; //Lines.AppendFormat("{0} {1} {2} {3} {4} {5} c\t", X2, Y2, X3, Y3, X4, Y4); //Lower Right Quadrant //X1 -= 2 * RadiusX; //X2 = X1; //X3 -= 2 * kRx; //Lines.AppendFormat("{0} {1} {2} {3} {4} {5} c\t", X3, Y3, X2, Y2, X1, Y1); //Lower Right Quadrant //Lines.AppendFormat("S\t");//Stroke path //Lines.AppendFormat("Q\t");//Pop graphics state from stack }