Ejemplo n.º 1
0
 /** Creates new MetaState */
 public MetaState()
 {
     savedStates  = new Stack();
     MetaObjects  = new ArrayList();
     currentPoint = new Point(0, 0);
     currentPen   = new MetaPen();
     currentBrush = new MetaBrush();
 }
Ejemplo n.º 2
0
        public bool isNullStrokeFill(bool isRectangle)
        {
            MetaPen   pen     = state.CurrentPen;
            MetaBrush brush   = state.CurrentBrush;
            bool      noPen   = (pen.Style == MetaPen.PS_NULL);
            int       style   = brush.Style;
            bool      isBrush = (style == MetaBrush.BS_SOLID || (style == MetaBrush.BS_HATCHED && state.BackgroundMode == MetaState.OPAQUE));
            bool      result  = noPen && !isBrush;

            if (!noPen)
            {
                if (isRectangle)
                {
                    state.LineJoinRectangle = cb;
                }
                else
                {
                    state.LineJoinPolygon = cb;
                }
            }
            return(result);
        }
Ejemplo n.º 3
0
        public void strokeAndFill()
        {
            MetaPen   pen        = state.CurrentPen;
            MetaBrush brush      = state.CurrentBrush;
            int       penStyle   = pen.Style;
            int       brushStyle = brush.Style;

            if (penStyle == MetaPen.PS_NULL)
            {
                cb.closePath();
                if (state.PolyFillMode == MetaState.ALTERNATE)
                {
                    cb.eoFill();
                }
                else
                {
                    cb.fill();
                }
            }
            else
            {
                bool isBrush = (brushStyle == MetaBrush.BS_SOLID || (brushStyle == MetaBrush.BS_HATCHED && state.BackgroundMode == MetaState.OPAQUE));
                if (isBrush)
                {
                    if (state.PolyFillMode == MetaState.ALTERNATE)
                    {
                        cb.closePathEoFillStroke();
                    }
                    else
                    {
                        cb.closePathFillStroke();
                    }
                }
                else
                {
                    cb.closePathStroke();
                }
            }
        }
Ejemplo n.º 4
0
        public void selectMetaObject(int index, PdfContentByte cb)
        {
            MetaObject obj = (MetaObject)MetaObjects[index];

            if (obj == null)
            {
                return;
            }
            int style;

            switch (obj.Type)
            {
            case MetaObject.META_BRUSH:
                currentBrush = (MetaBrush)obj;
                style        = currentBrush.Style;
                if (style == MetaBrush.BS_SOLID)
                {
                    Color color = currentBrush.Color;
                    cb.ColorFill = color;
                }
                else if (style == MetaBrush.BS_HATCHED)
                {
                    Color color = currentBackgroundColor;
                    cb.ColorFill = color;
                }
                break;

            case MetaObject.META_PEN: {
                currentPen = (MetaPen)obj;
                style      = currentPen.Style;
                if (style != MetaPen.PS_NULL)
                {
                    Color color = currentPen.Color;
                    cb.ColorStroke = color;
                    cb.LineWidth   = Math.Abs((float)currentPen.PenWidth * scalingX / extentWx);
                    switch (style)
                    {
                    case MetaPen.PS_DASH:
                        cb.setLineDash(18, 6, 0);
                        break;

                    case MetaPen.PS_DASHDOT:
                        cb.setLiteral("[9 6 3 6]0 d\n");
                        break;

                    case MetaPen.PS_DASHDOTDOT:
                        cb.setLiteral("[9 3 3 3 3 3]0 d\n");
                        break;

                    case MetaPen.PS_DOT:
                        cb.setLineDash(3, 0);
                        break;

                    default:
                        cb.LineDash = 0;
                        break;
                    }
                }
                break;
            }

            case MetaObject.META_FONT: {
                currentFont = (MetaFont)obj;
                break;
            }
            }
        }
Ejemplo n.º 5
0
        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 = (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.LineCap  = 1;
            cb.LineJoin = 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();
                    Point p = new Point(meta.readShort(), y);
                    state.CurrentPoint = p;
                    break;
                }

                case META_LINETO:
                {
                    int   y = meta.readShort();
                    int   x = meta.readShort();
                    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 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;
                    }
                    ArrayList ar = PdfContentByte.bezierArc(l, b, r, t, arc1, arc2);
                    if (ar.Count == 0)
                    {
                        break;
                    }
                    float[] pt = (float [])ar[0];
                    cb.moveTo(cx, cy);
                    cb.lineTo(pt[0], pt[1]);
                    for (int 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;
                    }
                    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;
                    }
                    ArrayList ar = PdfContentByte.bezierArc(l, b, r, t, arc1, arc2);
                    if (ar.Count == 0)
                    {
                        break;
                    }
                    float[] pt = (float [])ar[0];
                    cx = pt[0];
                    cy = pt[1];
                    cb.moveTo(cx, cy);
                    for (int 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;
                    }
                    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_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("windows-1252").GetString(text, 0, k);
                    }
                    catch (Exception e) {
                        e.GetType();
                        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("windows-1252").GetString(text, 0, k);
                    }
                    catch (Exception e) {
                        e.GetType();
                        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:
                {
                    Color color = meta.readColor();
                    int   y     = meta.readShort();
                    int   x     = meta.readShort();
                    cb.saveState();
                    cb.ColorFill = color;
                    cb.rectangle(state.transformX(x), state.transformY(y), .2f, .2f);
                    cb.fill();
                    cb.restoreState();
                    break;
                }
                }
                meta.skip((tsize * 2) - (meta.Length - lenMarker));
            }
        }