示例#1
0
// ---------------------------------------------------------------------------

        /**
         * 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();
        }
示例#2
0
 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));
 }
示例#3
0
        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
            }
        }
示例#4
0
        //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]);
            }
        }
示例#5
0
        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);
            }
        }
示例#6
0
 /// <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);
     }
 }
示例#7
0
        /// <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();
            }
        }
示例#9
0
        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);
        }
示例#10
0
 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);
        }
示例#12
0
        /* 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();
            }
        }
示例#13
0
        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);
            }
        }
示例#14
0
        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();
                }
            }
        }