// --------------------------------------------------------------------------- /** * Draws a series of Bezier curves * @param cb the canvas to which the curves have to be drawn * @param x0 X coordinate of the start point * @param y0 Y coordinate of the start point * @param x1 X coordinate of the first control point * @param y1 Y coordinate of the first control point * @param x2 X coordinate of the second control point * @param y2 Y coordinate of the second control point * @param x3 X coordinate of the end point * @param y3 Y coordinate of the end point * @param distance the distance between the curves */ public void createBezierCurves(PdfContentByte cb, float x0, float y0, float x1, float y1, float x2, float y2, float x3, float y3, float distance) { cb.MoveTo(x0, y0); cb.LineTo(x1, y1); cb.MoveTo(x2, y2); cb.LineTo(x3, y3); cb.MoveTo(x0, y0); cb.CurveTo(x1, y1, x2, y2, x3, y3); x0 += distance; x1 += distance; x2 += distance; x3 += distance; cb.MoveTo(x2, y2); cb.LineTo(x3, y3); cb.MoveTo(x0, y0); cb.CurveTo(x2, y2, x3, y3); x0 += distance; x1 += distance; x2 += distance; x3 += distance; cb.MoveTo(x0, y0); cb.LineTo(x1, y1); cb.MoveTo(x0, y0); cb.CurveTo(x1, y1, x3, y3); cb.Stroke(); }
public void CurveTo(Vector1D x2, Vector1D y2, Vector1D x3, Vector1D y3) { cb.CurveTo( (float)x2.Value(UnitsOfMeasure.Points), (float)y2.Value(UnitsOfMeasure.Points), (float)x3.Value(UnitsOfMeasure.Points), (float)y3.Value(UnitsOfMeasure.Points)); }
void DrawElement(PdfContentByte cb) { try { IList <PathItem> translatedItems = Translate(path.PathItems); //loop over the items in the path foreach (PathItem item in translatedItems) { IList <float> numbers = item.Coordinates; if (item.IsMoveTo()) { cb.MoveTo(numbers[0], numbers[1]); } else if (item.IsLineTo()) { cb.LineTo(numbers[0], numbers[1]); } else if (item.IsCubicBezier()) { cb.CurveTo(numbers[0], numbers[1], numbers[2], numbers[3], numbers[4], numbers[5]); } else if (item.IsQuadraticBezier()) { cb.CurveTo(numbers[0], numbers[1], numbers[2], numbers[3]); } else if (item.IsArcTo()) { DrawArc(cb, numbers); } else if (item.IsClosePath()) { cb.ClosePath(); } else { //System.out.Println(item); } } } catch { //TODO } }
//copied this because of the moveTo public void Arc(float x1, float y1, float x2, float y2, float startAng, float extent, PdfContentByte cb) { List <float[]> ar = PdfContentByte.BezierArc(x1, y1, x2, y2, startAng, extent); if (ar.Count == 0) { return; } float[] pt = ar[0]; //moveTo(pt[0], pt[1]); for (int k = 0; k < ar.Count; ++k) { pt = ar[k]; cb.CurveTo(pt[2], pt[3], pt[4], pt[5], pt[6], pt[7]); } }
private static void createCircle(PdfContentByte canvas, float x, float y, float r, bool clockwise) { var b = 0.5523f; if (clockwise) { canvas.MoveTo(x + r, y); canvas.CurveTo(x + r, y - r * b, x + r * b, y - r, x, y - r); canvas.CurveTo(x - r * b, y - r, x - r, y - r * b, x - r, y); canvas.CurveTo(x - r, y + r * b, x - r * b, y + r, x, y + r); canvas.CurveTo(x + r * b, y + r, x + r, y + r * b, x + r, y); } else { canvas.MoveTo(x + r, y); canvas.CurveTo(x + r, y + r * b, x + r * b, y + r, x, y + r); canvas.CurveTo(x - r * b, y + r, x - r, y + r * b, x - r, y); canvas.CurveTo(x - r, y - r * b, x - r * b, y - r, x, y - r); canvas.CurveTo(x + r * b, y - r, x + r, y - r * b, x + r, y); } }
/// <summary> /// Convert curve to PDF /// </summary> /// <param name="curve"></param> /// <param name="cb"></param> private void CurveToPDF(Dyn.Curve curve, PdfContentByte cb) { if (curve.GetType() == typeof(Dyn.Line)) { Dyn.Line line = Geometry as Dyn.Line; cb.MoveTo(line.StartPoint.X, line.StartPoint.Y); cb.LineTo(line.EndPoint.X, line.EndPoint.Y); } else if (Geometry.GetType() == typeof(Dyn.Arc)) { Dyn.Arc arc = Geometry as Dyn.Arc; cb.MoveTo(arc.StartPoint.X, arc.EndPoint.Y); cb.CurveTo(arc.PointAtParameter(0.5).X, arc.PointAtParameter(0.5).Y, arc.EndPoint.X, arc.EndPoint.Y); } else { cb.MoveTo(curve.StartPoint.X, curve.StartPoint.Y); cb.LineTo(curve.EndPoint.X, curve.EndPoint.Y); } }
/// <summary> /// Add curve /// </summary> private void addCurve(float x1, float y1, float x2, float y2, float x3, float y3, float x4, float y4, StyleInfo styleInfo, string url) { if (styleInfo.BStyleTop != BorderStyleEnum.None) { switch (styleInfo.BStyleTop) { case BorderStyleEnum.Dashed: pdfContent.SetLineDash(new float[] { '3', '2' }, 0); break; case BorderStyleEnum.Dotted: pdfContent.SetLineDash(new float[] { '2' }, 0); break; case BorderStyleEnum.Solid: default: pdfContent.SetLineDash(new float[] { }, 0); break; } pdfContent.SetRGBColorStroke(styleInfo.BColorTop.R, styleInfo.BColorTop.G, styleInfo.BColorTop.B); } if (!styleInfo.BackgroundColor.IsEmpty) { pdfContent.SetRGBColorStrokeF(styleInfo.BackgroundColor.R, styleInfo.BackgroundColor.G, styleInfo.BackgroundColor.B); } pdfContent.CurveTo(x1, pageHeight - y1, x2, pageHeight - y1, x3, pageHeight - y3); if (styleInfo.BackgroundColor.IsEmpty) { pdfContent.ClosePathStroke(); } else { pdfContent.ClosePathFillStroke(); } }
//25072008 GJL Draw a bezier curve private void iAddCurve(float X1, float Y1, float X2, float Y2, float X3, float Y3, float X4, float Y4, StyleInfo si, string url) { if (si.BStyleTop != BorderStyleEnum.None) { switch (si.BStyleTop) { case BorderStyleEnum.Dashed: _contentByte.SetLineDash(new float[] { '3', '2' }, 0); break; case BorderStyleEnum.Dotted: _contentByte.SetLineDash(new float[] { '2' }, 0); break; case BorderStyleEnum.Solid: default: _contentByte.SetLineDash(new float[] { }, 0); break; } _contentByte.SetRgbColorStroke(si.BColorTop.R, si.BColorTop.G, si.BColorTop.B); } if (!si.BackgroundColor.IsEmpty) { _contentByte.SetRgbColorStrokeF(si.BackgroundColor.R, si.BackgroundColor.G, si.BackgroundColor.B); } _contentByte.CurveTo(X1, PageSize.yHeight - Y1, X2, PageSize.yHeight - Y1, X3, PageSize.yHeight - Y3); if (si.BackgroundColor.IsEmpty) { _contentByte.ClosePathStroke(); } else { _contentByte.ClosePathFillStroke(); } }
public void ReadAll() { if (meta.ReadInt() != unchecked ((int)0x9AC6CDD7)) { throw new DocumentException(MessageLocalization.GetComposedMessage("not.a.placeable.windows.metafile")); } meta.ReadWord(); left = meta.ReadShort(); top = meta.ReadShort(); right = meta.ReadShort(); bottom = meta.ReadShort(); inch = meta.ReadWord(); state.ScalingX = (float)(right - left) / (float)inch * 72f; state.ScalingY = (float)(bottom - top) / (float)inch * 72f; state.OffsetWx = left; state.OffsetWy = top; state.ExtentWx = right - left; state.ExtentWy = bottom - top; meta.ReadInt(); meta.ReadWord(); meta.Skip(18); int tsize; int function; cb.SetLineCap(1); cb.SetLineJoin(1); for (;;) { int lenMarker = meta.Length; tsize = meta.ReadInt(); if (tsize < 3) { break; } function = meta.ReadWord(); switch (function) { case 0: break; case META_CREATEPALETTE: case META_CREATEREGION: case META_DIBCREATEPATTERNBRUSH: state.AddMetaObject(new MetaObject()); break; case META_CREATEPENINDIRECT: { MetaPen pen = new MetaPen(); pen.Init(meta); state.AddMetaObject(pen); break; } case META_CREATEBRUSHINDIRECT: { MetaBrush brush = new MetaBrush(); brush.Init(meta); state.AddMetaObject(brush); break; } case META_CREATEFONTINDIRECT: { MetaFont font = new MetaFont(); font.Init(meta); state.AddMetaObject(font); break; } case META_SELECTOBJECT: { int idx = meta.ReadWord(); state.SelectMetaObject(idx, cb); break; } case META_DELETEOBJECT: { int idx = meta.ReadWord(); state.DeleteMetaObject(idx); break; } case META_SAVEDC: state.SaveState(cb); break; case META_RESTOREDC: { int idx = meta.ReadShort(); state.RestoreState(idx, cb); break; } case META_SETWINDOWORG: state.OffsetWy = meta.ReadShort(); state.OffsetWx = meta.ReadShort(); break; case META_SETWINDOWEXT: state.ExtentWy = meta.ReadShort(); state.ExtentWx = meta.ReadShort(); break; case META_MOVETO: { int y = meta.ReadShort(); System.Drawing.Point p = new System.Drawing.Point(meta.ReadShort(), y); state.CurrentPoint = p; break; } case META_LINETO: { int y = meta.ReadShort(); int x = meta.ReadShort(); System.Drawing.Point p = state.CurrentPoint; cb.MoveTo(state.TransformX(p.X), state.TransformY(p.Y)); cb.LineTo(state.TransformX(x), state.TransformY(y)); cb.Stroke(); state.CurrentPoint = new System.Drawing.Point(x, y); break; } case META_POLYLINE: { state.LineJoinPolygon = cb; int len = meta.ReadWord(); int x = meta.ReadShort(); int y = meta.ReadShort(); cb.MoveTo(state.TransformX(x), state.TransformY(y)); for (int k = 1; k < len; ++k) { x = meta.ReadShort(); y = meta.ReadShort(); cb.LineTo(state.TransformX(x), state.TransformY(y)); } cb.Stroke(); break; } case META_POLYGON: { if (IsNullStrokeFill(false)) { break; } int len = meta.ReadWord(); int sx = meta.ReadShort(); int sy = meta.ReadShort(); cb.MoveTo(state.TransformX(sx), state.TransformY(sy)); for (int k = 1; k < len; ++k) { int x = meta.ReadShort(); int y = meta.ReadShort(); cb.LineTo(state.TransformX(x), state.TransformY(y)); } cb.LineTo(state.TransformX(sx), state.TransformY(sy)); StrokeAndFill(); break; } case META_POLYPOLYGON: { if (IsNullStrokeFill(false)) { break; } int numPoly = meta.ReadWord(); int[] lens = new int[numPoly]; for (int k = 0; k < lens.Length; ++k) { lens[k] = meta.ReadWord(); } for (int j = 0; j < lens.Length; ++j) { int len = lens[j]; int sx = meta.ReadShort(); int sy = meta.ReadShort(); cb.MoveTo(state.TransformX(sx), state.TransformY(sy)); for (int k = 1; k < len; ++k) { int x = meta.ReadShort(); int y = meta.ReadShort(); cb.LineTo(state.TransformX(x), state.TransformY(y)); } cb.LineTo(state.TransformX(sx), state.TransformY(sy)); } StrokeAndFill(); break; } case META_ELLIPSE: { if (IsNullStrokeFill(state.LineNeutral)) { break; } int b = meta.ReadShort(); int r = meta.ReadShort(); int t = meta.ReadShort(); int l = meta.ReadShort(); cb.Arc(state.TransformX(l), state.TransformY(b), state.TransformX(r), state.TransformY(t), 0, 360); StrokeAndFill(); break; } case META_ARC: { if (IsNullStrokeFill(state.LineNeutral)) { break; } float yend = state.TransformY(meta.ReadShort()); float xend = state.TransformX(meta.ReadShort()); float ystart = state.TransformY(meta.ReadShort()); float xstart = state.TransformX(meta.ReadShort()); float b = state.TransformY(meta.ReadShort()); float r = state.TransformX(meta.ReadShort()); float t = state.TransformY(meta.ReadShort()); float l = state.TransformX(meta.ReadShort()); float cx = (r + l) / 2; float cy = (t + b) / 2; float arc1 = GetArc(cx, cy, xstart, ystart); float arc2 = GetArc(cx, cy, xend, yend); arc2 -= arc1; if (arc2 <= 0) { arc2 += 360; } cb.Arc(l, b, r, t, arc1, arc2); cb.Stroke(); break; } case META_PIE: { if (IsNullStrokeFill(state.LineNeutral)) { break; } float yend = state.TransformY(meta.ReadShort()); float xend = state.TransformX(meta.ReadShort()); float ystart = state.TransformY(meta.ReadShort()); float xstart = state.TransformX(meta.ReadShort()); float b = state.TransformY(meta.ReadShort()); float r = state.TransformX(meta.ReadShort()); float t = state.TransformY(meta.ReadShort()); float l = state.TransformX(meta.ReadShort()); float cx = (r + l) / 2; float cy = (t + b) / 2; float arc1 = GetArc(cx, cy, xstart, ystart); float arc2 = GetArc(cx, cy, xend, yend); arc2 -= arc1; if (arc2 <= 0) { arc2 += 360; } List <float[]> ar = PdfContentByte.BezierArc(l, b, r, t, arc1, arc2); if (ar.Count == 0) { break; } float[] pt = ar[0]; cb.MoveTo(cx, cy); cb.LineTo(pt[0], pt[1]); for (int k = 0; k < ar.Count; ++k) { pt = ar[k]; cb.CurveTo(pt[2], pt[3], pt[4], pt[5], pt[6], pt[7]); } cb.LineTo(cx, cy); StrokeAndFill(); break; } case META_CHORD: { if (IsNullStrokeFill(state.LineNeutral)) { break; } float yend = state.TransformY(meta.ReadShort()); float xend = state.TransformX(meta.ReadShort()); float ystart = state.TransformY(meta.ReadShort()); float xstart = state.TransformX(meta.ReadShort()); float b = state.TransformY(meta.ReadShort()); float r = state.TransformX(meta.ReadShort()); float t = state.TransformY(meta.ReadShort()); float l = state.TransformX(meta.ReadShort()); float cx = (r + l) / 2; float cy = (t + b) / 2; float arc1 = GetArc(cx, cy, xstart, ystart); float arc2 = GetArc(cx, cy, xend, yend); arc2 -= arc1; if (arc2 <= 0) { arc2 += 360; } List <float[]> ar = PdfContentByte.BezierArc(l, b, r, t, arc1, arc2); if (ar.Count == 0) { break; } float[] pt = ar[0]; cx = pt[0]; cy = pt[1]; cb.MoveTo(cx, cy); for (int k = 0; k < ar.Count; ++k) { pt = ar[k]; cb.CurveTo(pt[2], pt[3], pt[4], pt[5], pt[6], pt[7]); } cb.LineTo(cx, cy); StrokeAndFill(); break; } case META_RECTANGLE: { if (IsNullStrokeFill(true)) { break; } float b = state.TransformY(meta.ReadShort()); float r = state.TransformX(meta.ReadShort()); float t = state.TransformY(meta.ReadShort()); float l = state.TransformX(meta.ReadShort()); cb.Rectangle(l, b, r - l, t - b); StrokeAndFill(); break; } case META_ROUNDRECT: { if (IsNullStrokeFill(true)) { break; } float h = state.TransformY(0) - state.TransformY(meta.ReadShort()); float w = state.TransformX(meta.ReadShort()) - state.TransformX(0); float b = state.TransformY(meta.ReadShort()); float r = state.TransformX(meta.ReadShort()); float t = state.TransformY(meta.ReadShort()); float l = state.TransformX(meta.ReadShort()); cb.RoundRectangle(l, b, r - l, t - b, (h + w) / 4); StrokeAndFill(); break; } case META_INTERSECTCLIPRECT: { float b = state.TransformY(meta.ReadShort()); float r = state.TransformX(meta.ReadShort()); float t = state.TransformY(meta.ReadShort()); float l = state.TransformX(meta.ReadShort()); cb.Rectangle(l, b, r - l, t - b); cb.EoClip(); cb.NewPath(); break; } case META_EXTTEXTOUT: { int y = meta.ReadShort(); int x = meta.ReadShort(); int count = meta.ReadWord(); int flag = meta.ReadWord(); int x1 = 0; int y1 = 0; int x2 = 0; int y2 = 0; if ((flag & (MetaFont.ETO_CLIPPED | MetaFont.ETO_OPAQUE)) != 0) { x1 = meta.ReadShort(); y1 = meta.ReadShort(); x2 = meta.ReadShort(); y2 = meta.ReadShort(); } byte[] text = new byte[count]; int k; for (k = 0; k < count; ++k) { byte c = (byte)meta.ReadByte(); if (c == 0) { break; } text[k] = c; } string s; try { s = System.Text.Encoding.GetEncoding(1252).GetString(text, 0, k); } catch { s = System.Text.ASCIIEncoding.ASCII.GetString(text, 0, k); } OutputText(x, y, flag, x1, y1, x2, y2, s); break; } case META_TEXTOUT: { int count = meta.ReadWord(); byte[] text = new byte[count]; int k; for (k = 0; k < count; ++k) { byte c = (byte)meta.ReadByte(); if (c == 0) { break; } text[k] = c; } string s; try { s = System.Text.Encoding.GetEncoding(1252).GetString(text, 0, k); } catch { s = System.Text.ASCIIEncoding.ASCII.GetString(text, 0, k); } count = (count + 1) & 0xfffe; meta.Skip(count - k); int y = meta.ReadShort(); int x = meta.ReadShort(); OutputText(x, y, 0, 0, 0, 0, 0, s); break; } case META_SETBKCOLOR: state.CurrentBackgroundColor = meta.ReadColor(); break; case META_SETTEXTCOLOR: state.CurrentTextColor = meta.ReadColor(); break; case META_SETTEXTALIGN: state.TextAlign = meta.ReadWord(); break; case META_SETBKMODE: state.BackgroundMode = meta.ReadWord(); break; case META_SETPOLYFILLMODE: state.PolyFillMode = meta.ReadWord(); break; case META_SETPIXEL: { BaseColor color = meta.ReadColor(); int y = meta.ReadShort(); int x = meta.ReadShort(); cb.SaveState(); cb.SetColorFill(color); cb.Rectangle(state.TransformX(x), state.TransformY(y), .2f, .2f); cb.Fill(); cb.RestoreState(); break; } case META_DIBSTRETCHBLT: case META_STRETCHDIB: { int rop = meta.ReadInt(); if (function == META_STRETCHDIB) { /*int usage = */ meta.ReadWord(); } int srcHeight = meta.ReadShort(); int srcWidth = meta.ReadShort(); int ySrc = meta.ReadShort(); int xSrc = meta.ReadShort(); float destHeight = state.TransformY(meta.ReadShort()) - state.TransformY(0); float destWidth = state.TransformX(meta.ReadShort()) - state.TransformX(0); float yDest = state.TransformY(meta.ReadShort()); float xDest = state.TransformX(meta.ReadShort()); byte[] b = new byte[(tsize * 2) - (meta.Length - lenMarker)]; for (int k = 0; k < b.Length; ++k) { b[k] = (byte)meta.ReadByte(); } try { MemoryStream inb = new MemoryStream(b); Image bmp = BmpImage.GetImage(inb, true, b.Length); cb.SaveState(); cb.Rectangle(xDest, yDest, destWidth, destHeight); cb.Clip(); cb.NewPath(); bmp.ScaleAbsolute(destWidth * bmp.Width / srcWidth, -destHeight * bmp.Height / srcHeight); bmp.SetAbsolutePosition(xDest - destWidth * xSrc / srcWidth, yDest + destHeight * ySrc / srcHeight - bmp.ScaledHeight); cb.AddImage(bmp); cb.RestoreState(); } catch { // empty on purpose } break; } } meta.Skip((tsize * 2) - (meta.Length - lenMarker)); } state.Cleanup(cb); }
public void curveTo(Int64 x1, Int64 y1, Int64 x2, Int64 y2, Int64 x3, Int64 y3) { m_canvas.CurveTo(dkw(x1), dkh(y1), dkw(x2), dkh(y2), dkw(x3), dkh(y3)); }
public void ReadAll() { if (Meta.ReadInt() != unchecked ((int)0x9AC6CDD7)) { throw new DocumentException("Not a placeable windows metafile"); } Meta.ReadWord(); _left = Meta.ReadShort(); _top = Meta.ReadShort(); _right = Meta.ReadShort(); _bottom = Meta.ReadShort(); _inch = Meta.ReadWord(); _state.ScalingX = (_right - _left) / (float)_inch * 72f; _state.ScalingY = (_bottom - _top) / (float)_inch * 72f; _state.OffsetWx = _left; _state.OffsetWy = _top; _state.ExtentWx = _right - _left; _state.ExtentWy = _bottom - _top; Meta.ReadInt(); Meta.ReadWord(); Meta.Skip(18); int tsize; int function; Cb.SetLineCap(1); Cb.SetLineJoin(1); for (; ;) { var lenMarker = Meta.Length; tsize = Meta.ReadInt(); if (tsize < 3) { break; } function = Meta.ReadWord(); switch (function) { case 0: break; case META_CREATEPALETTE: case META_CREATEREGION: case META_DIBCREATEPATTERNBRUSH: _state.AddMetaObject(new MetaObject()); break; case META_CREATEPENINDIRECT: { var pen = new MetaPen(); pen.Init(Meta); _state.AddMetaObject(pen); break; } case META_CREATEBRUSHINDIRECT: { var brush = new MetaBrush(); brush.Init(Meta); _state.AddMetaObject(brush); break; } case META_CREATEFONTINDIRECT: { var font = new MetaFont(); font.Init(Meta); _state.AddMetaObject(font); break; } case META_SELECTOBJECT: { var idx = Meta.ReadWord(); _state.SelectMetaObject(idx, Cb); break; } case META_DELETEOBJECT: { var idx = Meta.ReadWord(); _state.DeleteMetaObject(idx); break; } case META_SAVEDC: _state.SaveState(Cb); break; case META_RESTOREDC: { var idx = Meta.ReadShort(); _state.RestoreState(idx, Cb); break; } case META_SETWINDOWORG: _state.OffsetWy = Meta.ReadShort(); _state.OffsetWx = Meta.ReadShort(); break; case META_SETWINDOWEXT: _state.ExtentWy = Meta.ReadShort(); _state.ExtentWx = Meta.ReadShort(); break; case META_MOVETO: { var y = Meta.ReadShort(); var p = new System.Drawing.Point(Meta.ReadShort(), y); _state.CurrentPoint = p; break; } case META_LINETO: { var y = Meta.ReadShort(); var x = Meta.ReadShort(); var p = _state.CurrentPoint; Cb.MoveTo(_state.TransformX(p.X), _state.TransformY(p.Y)); Cb.LineTo(_state.TransformX(x), _state.TransformY(y)); Cb.Stroke(); _state.CurrentPoint = new System.Drawing.Point(x, y); break; } case META_POLYLINE: { _state.LineJoinPolygon = Cb; var len = Meta.ReadWord(); var x = Meta.ReadShort(); var y = Meta.ReadShort(); Cb.MoveTo(_state.TransformX(x), _state.TransformY(y)); for (var k = 1; k < len; ++k) { x = Meta.ReadShort(); y = Meta.ReadShort(); Cb.LineTo(_state.TransformX(x), _state.TransformY(y)); } Cb.Stroke(); break; } case META_POLYGON: { if (IsNullStrokeFill(false)) { break; } var len = Meta.ReadWord(); var sx = Meta.ReadShort(); var sy = Meta.ReadShort(); Cb.MoveTo(_state.TransformX(sx), _state.TransformY(sy)); for (var k = 1; k < len; ++k) { var x = Meta.ReadShort(); var y = Meta.ReadShort(); Cb.LineTo(_state.TransformX(x), _state.TransformY(y)); } Cb.LineTo(_state.TransformX(sx), _state.TransformY(sy)); StrokeAndFill(); break; } case META_POLYPOLYGON: { if (IsNullStrokeFill(false)) { break; } var numPoly = Meta.ReadWord(); var lens = new int[numPoly]; for (var k = 0; k < lens.Length; ++k) { lens[k] = Meta.ReadWord(); } for (var j = 0; j < lens.Length; ++j) { var len = lens[j]; var sx = Meta.ReadShort(); var sy = Meta.ReadShort(); Cb.MoveTo(_state.TransformX(sx), _state.TransformY(sy)); for (var k = 1; k < len; ++k) { var x = Meta.ReadShort(); var y = Meta.ReadShort(); Cb.LineTo(_state.TransformX(x), _state.TransformY(y)); } Cb.LineTo(_state.TransformX(sx), _state.TransformY(sy)); } StrokeAndFill(); break; } case META_ELLIPSE: { if (IsNullStrokeFill(_state.LineNeutral)) { break; } var b = Meta.ReadShort(); var r = Meta.ReadShort(); var t = Meta.ReadShort(); var l = Meta.ReadShort(); Cb.Arc(_state.TransformX(l), _state.TransformY(b), _state.TransformX(r), _state.TransformY(t), 0, 360); StrokeAndFill(); break; } case META_ARC: { if (IsNullStrokeFill(_state.LineNeutral)) { break; } var yend = _state.TransformY(Meta.ReadShort()); var xend = _state.TransformX(Meta.ReadShort()); var ystart = _state.TransformY(Meta.ReadShort()); var xstart = _state.TransformX(Meta.ReadShort()); var b = _state.TransformY(Meta.ReadShort()); var r = _state.TransformX(Meta.ReadShort()); var t = _state.TransformY(Meta.ReadShort()); var l = _state.TransformX(Meta.ReadShort()); var cx = (r + l) / 2; var cy = (t + b) / 2; var arc1 = GetArc(cx, cy, xstart, ystart); var arc2 = GetArc(cx, cy, xend, yend); arc2 -= arc1; if (arc2 <= 0) { arc2 += 360; } Cb.Arc(l, b, r, t, arc1, arc2); Cb.Stroke(); break; } case META_PIE: { if (IsNullStrokeFill(_state.LineNeutral)) { break; } var yend = _state.TransformY(Meta.ReadShort()); var xend = _state.TransformX(Meta.ReadShort()); var ystart = _state.TransformY(Meta.ReadShort()); var xstart = _state.TransformX(Meta.ReadShort()); var b = _state.TransformY(Meta.ReadShort()); var r = _state.TransformX(Meta.ReadShort()); var t = _state.TransformY(Meta.ReadShort()); var l = _state.TransformX(Meta.ReadShort()); var cx = (r + l) / 2; var cy = (t + b) / 2; var arc1 = GetArc(cx, cy, xstart, ystart); var arc2 = GetArc(cx, cy, xend, yend); arc2 -= arc1; if (arc2 <= 0) { arc2 += 360; } var ar = PdfContentByte.BezierArc(l, b, r, t, arc1, arc2); if (ar.Count == 0) { break; } var pt = (float[])ar[0]; Cb.MoveTo(cx, cy); Cb.LineTo(pt[0], pt[1]); for (var k = 0; k < ar.Count; ++k) { pt = (float[])ar[k]; Cb.CurveTo(pt[2], pt[3], pt[4], pt[5], pt[6], pt[7]); } Cb.LineTo(cx, cy); StrokeAndFill(); break; } case META_CHORD: { if (IsNullStrokeFill(_state.LineNeutral)) { break; } var yend = _state.TransformY(Meta.ReadShort()); var xend = _state.TransformX(Meta.ReadShort()); var ystart = _state.TransformY(Meta.ReadShort()); var xstart = _state.TransformX(Meta.ReadShort()); var b = _state.TransformY(Meta.ReadShort()); var r = _state.TransformX(Meta.ReadShort()); var t = _state.TransformY(Meta.ReadShort()); var l = _state.TransformX(Meta.ReadShort()); var cx = (r + l) / 2; var cy = (t + b) / 2; var arc1 = GetArc(cx, cy, xstart, ystart); var arc2 = GetArc(cx, cy, xend, yend); arc2 -= arc1; if (arc2 <= 0) { arc2 += 360; } var ar = PdfContentByte.BezierArc(l, b, r, t, arc1, arc2); if (ar.Count == 0) { break; } var pt = (float[])ar[0]; cx = pt[0]; cy = pt[1]; Cb.MoveTo(cx, cy); for (var k = 0; k < ar.Count; ++k) { pt = (float[])ar[k]; Cb.CurveTo(pt[2], pt[3], pt[4], pt[5], pt[6], pt[7]); } Cb.LineTo(cx, cy); StrokeAndFill(); break; } case META_RECTANGLE: { if (IsNullStrokeFill(true)) { break; } var b = _state.TransformY(Meta.ReadShort()); var r = _state.TransformX(Meta.ReadShort()); var t = _state.TransformY(Meta.ReadShort()); var l = _state.TransformX(Meta.ReadShort()); Cb.Rectangle(l, b, r - l, t - b); StrokeAndFill(); break; } case META_ROUNDRECT: { if (IsNullStrokeFill(true)) { break; } var h = _state.TransformY(0) - _state.TransformY(Meta.ReadShort()); var w = _state.TransformX(Meta.ReadShort()) - _state.TransformX(0); var b = _state.TransformY(Meta.ReadShort()); var r = _state.TransformX(Meta.ReadShort()); var t = _state.TransformY(Meta.ReadShort()); var l = _state.TransformX(Meta.ReadShort()); Cb.RoundRectangle(l, b, r - l, t - b, (h + w) / 4); StrokeAndFill(); break; } case META_INTERSECTCLIPRECT: { var b = _state.TransformY(Meta.ReadShort()); var r = _state.TransformX(Meta.ReadShort()); var t = _state.TransformY(Meta.ReadShort()); var l = _state.TransformX(Meta.ReadShort()); Cb.Rectangle(l, b, r - l, t - b); Cb.EoClip(); Cb.NewPath(); break; } case META_EXTTEXTOUT: { var y = Meta.ReadShort(); var x = Meta.ReadShort(); var count = Meta.ReadWord(); var flag = Meta.ReadWord(); var x1 = 0; var y1 = 0; var x2 = 0; var y2 = 0; if ((flag & (MetaFont.ETO_CLIPPED | MetaFont.ETO_OPAQUE)) != 0) { x1 = Meta.ReadShort(); y1 = Meta.ReadShort(); x2 = Meta.ReadShort(); y2 = Meta.ReadShort(); } var text = new byte[count]; int k; for (k = 0; k < count; ++k) { var c = (byte)Meta.ReadByte(); if (c == 0) { break; } text[k] = c; } string s; try { s = EncodingsRegistry.Instance.GetEncoding(1252).GetString(text, 0, k); } catch { s = System.Text.Encoding.ASCII.GetString(text, 0, k); } OutputText(x, y, flag, x1, y1, x2, y2, s); break; } case META_TEXTOUT: { var count = Meta.ReadWord(); var text = new byte[count]; int k; for (k = 0; k < count; ++k) { var c = (byte)Meta.ReadByte(); if (c == 0) { break; } text[k] = c; } string s; try { s = EncodingsRegistry.Instance.GetEncoding(1252).GetString(text, 0, k); } catch { s = System.Text.Encoding.ASCII.GetString(text, 0, k); } count = (count + 1) & 0xfffe; Meta.Skip(count - k); var y = Meta.ReadShort(); var x = Meta.ReadShort(); OutputText(x, y, 0, 0, 0, 0, 0, s); break; } case META_SETBKCOLOR: _state.CurrentBackgroundColor = Meta.ReadColor(); break; case META_SETTEXTCOLOR: _state.CurrentTextColor = Meta.ReadColor(); break; case META_SETTEXTALIGN: _state.TextAlign = Meta.ReadWord(); break; case META_SETBKMODE: _state.BackgroundMode = Meta.ReadWord(); break; case META_SETPOLYFILLMODE: _state.PolyFillMode = Meta.ReadWord(); break; case META_SETPIXEL: { var color = Meta.ReadColor(); var y = Meta.ReadShort(); var x = Meta.ReadShort(); Cb.SaveState(); Cb.SetColorFill(color); Cb.Rectangle(_state.TransformX(x), _state.TransformY(y), .2f, .2f); Cb.Fill(); Cb.RestoreState(); break; } case META_DIBSTRETCHBLT: case META_STRETCHDIB: { var rop = Meta.ReadInt(); if (function == META_STRETCHDIB) { /*int usage = */ Meta.ReadWord(); } var srcHeight = Meta.ReadShort(); var srcWidth = Meta.ReadShort(); var ySrc = Meta.ReadShort(); var xSrc = Meta.ReadShort(); var destHeight = _state.TransformY(Meta.ReadShort()) - _state.TransformY(0); var destWidth = _state.TransformX(Meta.ReadShort()) - _state.TransformX(0); var yDest = _state.TransformY(Meta.ReadShort()); var xDest = _state.TransformX(Meta.ReadShort()); var b = new byte[(tsize * 2) - (Meta.Length - lenMarker)]; for (var k = 0; k < b.Length; ++k) { b[k] = (byte)Meta.ReadByte(); } try { var inb = new MemoryStream(b); var bmp = BmpImage.GetImage(inb, true, b.Length); Cb.SaveState(); Cb.Rectangle(xDest, yDest, destWidth, destHeight); Cb.Clip(); Cb.NewPath(); bmp.ScaleAbsolute(destWidth * bmp.Width / srcWidth, -destHeight * bmp.Height / srcHeight); bmp.SetAbsolutePosition(xDest - destWidth * xSrc / srcWidth, yDest + destHeight * ySrc / srcHeight - bmp.ScaledHeight); Cb.AddImage(bmp); Cb.RestoreState(); } catch { // empty on purpose } break; } } Meta.Skip((tsize * 2) - (Meta.Length - lenMarker)); } _state.Cleanup(Cb); }
/* Draw one note, do = 1. * content: Drawing content container. * left: Beginning position. * up: Beginning position. * number: Tone. * length: Length of the note, currently support 1, 0.75, 0.5, 0.25. */ private void DrawOneScore(PdfContentByte content, float left, float up, double number, double length = 1) { // TODO(allenxie): Deal with flag == false. up = PageSize.A4.Height - up; float position = up - 5 * lineSpace + ((float)number - 1) * lineSpace / 2; // Circle content.SetColorFill(BaseColor.BLACK); // content.Circle(left, position, scoreRadius); content.Ellipse(left - 4, position - 3, left + 4, position + 3); content.Fill(); // Vertical line (0.5 is for good-looking) if (number < 8) { content.MoveTo(left + scoreRadius + 0.5, position); content.LineTo(left + scoreRadius + 0.5, position + 3.5 * lineSpace); content.Stroke(); if (length == 0.5 || length == 0.75) { double left_start = left + scoreRadius + 0.5; double up_start = position + 3.5 * lineSpace - 0.5; content.MoveTo(left_start, up_start); content.CurveTo(left_start + 1, up_start - 4, left_start + 7, up_start - 7, left_start + 4, up_start - 12); content.Stroke(); if (length == 0.75) { double dot_position = (number % 2 == 0) ? position : position + 0.5 * lineSpace; content.Circle(left_start + 3, dot_position, 1); content.Fill(); } } if (length == 0.25) { double left_start = left + scoreRadius + 0.5; double up_start = position + 3.5 * lineSpace - 0.5; content.MoveTo(left_start, up_start); content.CurveTo(left_start + 1, up_start - 3, left_start + 6, up_start - 6, left_start + 3, up_start - 9); content.Stroke(); up_start = up_start - 4; content.MoveTo(left_start, up_start); content.CurveTo(left_start + 1, up_start - 3, left_start + 6, up_start - 6, left_start + 3, up_start - 9); content.Stroke(); } } else { content.MoveTo(left - scoreRadius - 0.5, position); content.LineTo(left - scoreRadius - 0.5, position - 3.5 * lineSpace); content.Stroke(); if (length == 0.5 || length == 0.75) { double left_start = left - scoreRadius - 0.5; double up_start = position - 3.5 * lineSpace + 0.5; content.MoveTo(left_start, up_start); content.CurveTo(left_start + 1, up_start + 4, left_start + 7, up_start + 7, left_start + 4, up_start + 12); content.Stroke(); if (length == 0.75) { double dot_position = (number % 2 == 0) ? position : position + 0.5 * lineSpace; content.Circle(left_start + 8, dot_position, 1); content.Fill(); } } if (length == 0.25) { double left_start = left - scoreRadius - 0.5; double up_start = position - 3.5 * lineSpace + 0.5; content.MoveTo(left_start, up_start); content.CurveTo(left_start + 1, up_start + 3, left_start + 6, up_start + 6, left_start + 3, up_start + 9); content.Stroke(); up_start = up_start + 4; content.MoveTo(left_start, up_start); content.CurveTo(left_start + 1, up_start + 3, left_start + 6, up_start + 6, left_start + 3, up_start + 9); content.Stroke(); } } // If need addition lateral line if (number < 2 && ((int)number % 2 == 0)) { content.MoveTo(left - scoreRadius * 2, position + scoreRadius); content.LineTo(left + scoreRadius * 2, position + scoreRadius); content.Stroke(); } else if (number < 2 && ((int)number % 2 != 0)) { content.MoveTo(left - scoreRadius * 2, position); content.LineTo(left + scoreRadius * 2, position); content.Stroke(); } else if (number > 12 && ((int)number % 2 == 0)) { content.MoveTo(left - scoreRadius * 2, position - scoreRadius); content.LineTo(left + scoreRadius * 2, position - scoreRadius); content.Stroke(); } else if (number > 12 && ((int)number % 2 != 0)) { content.MoveTo(left - scoreRadius * 2, position); content.LineTo(left + scoreRadius * 2, position); content.Stroke(); } }
public Boolean Draw(float left, float top, PdfContentByte dc, Transform transform) { if (this.RotationAngle != 0) { return(false); } try { Double x1 = this.StartPoint.X, x2 = EndPoint.X; Double y1 = this.StartPoint.Y, y2 = EndPoint.Y; Double a = RadiusX, b = RadiusY; var aByb = a / b; var M1 = aByb * aByb; var M2 = M1 * M1; var xError = x1 - x2; var yError = y1 - y2; var xErrorSquare = xError * xError; var yErrorSquare = yError * yError; var ySquareError = y1 * y1 - y2 * y2; var A = 4 * M1 * (M1 * yErrorSquare / xErrorSquare + 1); var B = -4 * M1 * yError * (1 + M1 * ySquareError / xErrorSquare + 2 * y2 / yError); var C = xErrorSquare + M2 * ySquareError * ySquareError / xErrorSquare + 2 * M1 * ySquareError + 4 * M1 * y2 * y2 - 4 * a * a; List <Point> centers = new List <Point>(); Point transformedPoint; var y0 = (-B + Math.Sqrt(B * B - 4 * A * C)) / (2 * A); var x0 = x2; var temp = 1 - (y2 - y0) * (y2 - y0) / (b * b); if (Helper.IsNullOrZero(temp)) { if (Helper.IsNullOrZero((x1 - x0) * (x1 - x0) / a / a + (y1 - y0) * (y1 - y0) / b / b - 1)) { transformedPoint = transform.Transform(new Point(x0, y0)); centers.Add(new Point(left + transformedPoint.X, top - transformedPoint.Y)); } } else if (temp > 0) { x0 = x2 + a * Math.Sqrt(temp); if (Helper.IsNullOrZero((x1 - x0) * (x1 - x0) / a / a + (y1 - y0) * (y1 - y0) / b / b - 1)) { transformedPoint = transform.Transform(new Point(x0, y0)); centers.Add(new Point(left + transformedPoint.X, top - transformedPoint.Y)); } x0 = x2 - a * Math.Sqrt(temp); if (Helper.IsNullOrZero((x1 - x0) * (x1 - x0) / a / a + (y1 - y0) * (y1 - y0) / b / b - 1)) { transformedPoint = transform.Transform(new Point(x0, y0)); centers.Add(new Point(left + transformedPoint.X, top - transformedPoint.Y)); } } y0 = (-B - Math.Sqrt(B * B - 4 * A * C)) / (2 * A); x0 = x2; temp = 1 - (y2 - y0) * (y2 - y0) / (b * b); if (Helper.IsNullOrZero(temp)) { if (Helper.IsNullOrZero((x1 - x0) * (x1 - x0) / a / a + (y1 - y0) * (y1 - y0) / b / b - 1)) { transformedPoint = transform.Transform(new Point(x0, y0)); centers.Add(new Point(left + transformedPoint.X, top - transformedPoint.Y)); } } else if (temp > 0) { x0 = x2 + a * Math.Sqrt(temp); if (Helper.IsNullOrZero((x1 - x0) * (x1 - x0) / a / a + (y1 - y0) * (y1 - y0) / b / b - 1)) { transformedPoint = transform.Transform(new Point(x0, y0)); centers.Add(new Point(left + transformedPoint.X, top - transformedPoint.Y)); } x0 = x2 - a * Math.Sqrt(temp); if (Helper.IsNullOrZero((x1 - x0) * (x1 - x0) / a / a + (y1 - y0) * (y1 - y0) / b / b - 1)) { transformedPoint = transform.Transform(new Point(x0, y0)); centers.Add(new Point(left + transformedPoint.X, top - transformedPoint.Y)); } } var radius = transform.Transform(new Point(RadiusX, RadiusY)); foreach (var centerPoint in centers) { Double startAngle = 0, entendAngle = 0; var startPoint = transform.Transform(this.StartPoint); var endPoint = transform.Transform(EndPoint); if (IsMatched(new Point(left + startPoint.X, top - startPoint.Y), new Point(left + endPoint.X, top - endPoint.Y), centerPoint, out startAngle, out entendAngle)) { var array = PdfContentByte.BezierArc(centerPoint.X - radius.X, centerPoint.Y - radius.Y, centerPoint.X + radius.X, centerPoint.Y + radius.Y, startAngle, entendAngle); if (array.Count == 0) { continue; } var pt = (float[])array[0]; dc.LineTo(pt[0], pt[1]); for (int k = 0; k < array.Count; k++) { pt = (float[])array[k]; dc.CurveTo(pt[2], pt[3], pt[4], pt[5], pt[6], pt[7]); } break; } } return(true); } catch (Exception ex) { ExceptionHandler.ThrowException(ex); return(false); } }
public void ToPDF(iTextSharp.text.pdf.PdfWriter w) { PdfContentByte cb = w.DirectContent; cb.SetLineWidth((float)Settings.Thickness); if (Settings.Fill != null) { cb.SetColorFill(Settings.Fill.ToPDFColor()); } if (Settings.Stroke != null) { cb.SetColorStroke(Settings.Stroke.ToPDFColor()); } if (Geometry.GetType() == typeof(Dyn.Arc)) { Dyn.Arc arc = Geometry as Dyn.Arc; cb.MoveTo(arc.StartPoint.X, arc.EndPoint.Y); cb.CurveTo(arc.PointAtParameter(0.5).X, arc.PointAtParameter(0.5).Y, arc.EndPoint.X, arc.EndPoint.Y); } else if (Geometry.GetType() == typeof(Dyn.Line)) { Dyn.Line line = Geometry as Dyn.Line; cb.MoveTo(line.StartPoint.X, line.StartPoint.Y); cb.LineTo(line.EndPoint.X, line.EndPoint.Y); } else if (Geometry.GetType() == typeof(Dyn.Circle)) { Dyn.Circle circle = Geometry as Dyn.Circle; cb.Circle(circle.CenterPoint.X, circle.CenterPoint.Y, circle.Radius); } else if (Geometry.GetType() == typeof(Dyn.Ellipse)) { Dyn.Ellipse ellipse = Geometry as Dyn.Ellipse; cb.Ellipse(ellipse.StartPoint.X, ellipse.StartPoint.Y, ellipse.EndPoint.X, ellipse.EndPoint.Y); } else if (Geometry.GetType() == typeof(Dyn.Rectangle)) { Dyn.Rectangle rect = Geometry as Dyn.Rectangle; cb.Rectangle(rect.Center().X, rect.Center().Y, rect.Width, rect.Height); } else if (Geometry.GetType() == typeof(Dyn.Polygon)) { Dyn.Polygon p = Geometry as Dyn.Polygon; foreach (var curve in p.Curves()) { CurveToPDF(curve, cb); } } else if (Geometry.GetType() == typeof(Dyn.PolyCurve)) { Dyn.PolyCurve pc = Geometry as Dyn.PolyCurve; foreach (var curve in pc.Curves()) { CurveToPDF(curve, cb); } } else if (Geometry.GetType() == typeof(Dyn.NurbsCurve)) { Dyn.NurbsCurve nc = Geometry as Dyn.NurbsCurve; foreach (var linearc in nc.ApproximateWithArcAndLineSegments()) { CurveToPDF(linearc, cb); } } else if (Geometry.GetType() == typeof(Dyn.Curve)) { Dyn.Curve curve = Geometry as Dyn.Curve; CurveToPDF(curve, cb); } else { throw new Exception(Properties.Resources.NotSupported); } if (Settings.Fill != null && Settings.Stroke != null) { cb.FillStroke(); } else { if (Settings.Stroke != null) { cb.Stroke(); } if (Settings.Fill != null) { cb.Fill(); } } }