示例#1
0
        public void DrawSplineInternal(Vector3 offset, DrawLineDelegate dld)
        {
            if (nodes == null || nodes.Count == 0)
            {
                return;
            }

            for (int i = leadIn ? 1 : 0; i < nodes.Count - (leadOut ? 2 : 1); ++i)
            {
                if (!isTangentsCalced && !isReticulated)
                {
                    dld(nodes[i].transform.position + offset, nodes[i + 1].transform.position + offset);
                }
                else
                {
                    for (int j = 0; j < nodes[i].reticulationPoints.Length - 1; ++j)
                    {
                        dld(nodes[i].reticulationPoints[j] + offset, nodes[i].reticulationPoints[j + 1] + offset);
                    }
                }
            }
        }
示例#2
0
            public void EnumerateMetafile(Stream emf, float unitSize, PointF destination, DrawLineDelegate drawLine, FillPolygonDelegate fillPolygon)
            {
                _transform   = new SVG.Gaps.Matrix();
                _drawLine    = drawLine;
                _fillPolygon = fillPolygon;
                _zero        = destination;
                _lineBuffer  = new LineBuffer(unitSize);
                _objects     = new Dictionary <uint, ObjectHandle>();
                _brush       = null;

                using (var reader = new EmfTools.EmfReader(emf)) {
                    while (!reader.IsEndOfFile)
                    {
                        if (reader.Read() is EmfTools.EmfUnknownRecord record)
                        {
                            Enumerate(record);
                        }
                    }
                }

                CommitLine();
            }
示例#3
0
    public void LineTo(float xn, float yn, Color32 col, DrawLineDelegate TexLineFn, int n)
    {
        if (m_alpha >= 0.0f)
        {
            col.a = (byte)(Mathf.Clamp01(m_alpha) * 255.0f);
        }

        float x0 = m_moveX;
        float y0 = m_moveY;
        float x1 = xn;
        float y1 = yn;

        m_moveX = xn;
        m_moveY = yn;

        // Ensure that x0 <= x1 for better crop calculation

        if (x0 > x1)
        {
            float tmp = x0; x0 = x1; x1 = tmp;
            tmp = y0; y0 = y1; y1 = tmp;
        }

        // Left / right crop

        float sl = (y1 - y0) / (x1 - x0);

        if (x0 < m_clipArea.xMin)
        {
            y0 += (m_clipArea.xMin - x0) * sl; x0 = m_clipArea.xMin;
        }
        if (x1 > m_clipArea.xMax)
        {
            y1 += (m_clipArea.xMax - x1) * sl; x1 = m_clipArea.xMax;
        }

        // We can now discard the lines that won't cross the visible view.

        if (x0 > m_clipArea.xMax || x1 < m_clipArea.xMin ||
            (y0 < m_clipArea.yMin && y1 < m_clipArea.yMin) || (y0 > m_clipArea.yMax && y1 > m_clipArea.yMax))
        {
            return;
        }

        // Here the line necessarily crosses the visible viewport. X coords are already cropped.
        // We now crop the Y coords that may be outside the view.

        if (y0 < m_clipArea.yMin)
        {
            x0 += (m_clipArea.yMin - y0) / sl; y0 = m_clipArea.yMin;
        }
        if (y0 > m_clipArea.yMax)
        {
            x0 += (m_clipArea.yMax - y0) / sl; y0 = m_clipArea.yMax;
        }

        if (y1 < m_clipArea.yMin)
        {
            x1 += (m_clipArea.yMin - y1) / sl; y1 = m_clipArea.yMin;
        }
        if (y1 > m_clipArea.yMax)
        {
            x1 += (m_clipArea.yMax - y1) / sl; y1 = m_clipArea.yMax;
        }

        // Draw the resulting line

        TexLineFn((int)((x0 - m_viewArea.x) * m_scaleX), (int)((y0 - m_viewArea.y) * m_scaleY), (int)((x1 - m_viewArea.x) * m_scaleX), (int)((y1 - m_viewArea.y) * m_scaleY), n, col);
        m_changed = true;
    }
示例#4
0
        public void EnumerateMetafile(Stream emf, float unitSize, PointF destination, DrawLineDelegate drawLine, FillPolygonDelegate fillPolygon)
        {
            this.Transform    = new Matrix();
            this._drawLine    = drawLine;
            this._fillPolygon = fillPolygon;
            this._zero        = destination;
            this._lineBuffer  = new MetafileParser.LineBuffer(unitSize);
            this._objects     = new Dictionary <uint, MetafileParser.ObjectHandle>();
            this._brush       = null;
            using (EmfReader emfReader = new EmfReader(emf))
            {
                while (!emfReader.IsEndOfFile)
                {
                    EmfUnknownRecord emfUnknownRecord = emfReader.Read() as EmfUnknownRecord;
                    if (emfUnknownRecord != null)
                    {
                        EmfPlusRecordType recordType = emfUnknownRecord.RecordType;
                        if (recordType <= EmfPlusRecordType.EmfSetPolyFillMode)
                        {
                            if (recordType != EmfPlusRecordType.EmfHeader && recordType != EmfPlusRecordType.EmfEof && recordType != EmfPlusRecordType.EmfSetPolyFillMode)
                            {
                                goto IL_1FE;
                            }
                        }
                        else
                        {
                            switch (recordType)
                            {
                            case EmfPlusRecordType.EmfMoveToEx:
                                this.ProcessMoveToEx(emfUnknownRecord.Data);
                                break;

                            case EmfPlusRecordType.EmfSetMetaRgn:
                            case EmfPlusRecordType.EmfExcludeClipRect:
                            case EmfPlusRecordType.EmfIntersectClipRect:
                            case EmfPlusRecordType.EmfScaleViewportExtEx:
                            case EmfPlusRecordType.EmfScaleWindowExtEx:
                            case EmfPlusRecordType.EmfSetWorldTransform:
                                goto IL_1FE;

                            case EmfPlusRecordType.EmfSaveDC:
                            case EmfPlusRecordType.EmfRestoreDC:
                            case EmfPlusRecordType.EmfCreatePen:
                            case EmfPlusRecordType.EmfDeleteObject:
                                break;

                            case EmfPlusRecordType.EmfModifyWorldTransform:
                                this.ProcessModifyWorldTransform(emfUnknownRecord.Data);
                                break;

                            case EmfPlusRecordType.EmfSelectObject:
                                this.ProcessSelectObject(emfUnknownRecord.Data);
                                break;

                            case EmfPlusRecordType.EmfCreateBrushIndirect:
                                this.ProcessCreateBrushIndirect(emfUnknownRecord.Data);
                                break;

                            default:
                                switch (recordType)
                                {
                                case EmfPlusRecordType.EmfSetMiterLimit:
                                    break;

                                case EmfPlusRecordType.EmfBeginPath:
                                    this.ProcessBeginPath(emfUnknownRecord.Data);
                                    break;

                                case EmfPlusRecordType.EmfEndPath:
                                    break;

                                case EmfPlusRecordType.EmfCloseFigure:
                                    this.ProcessCloseFigure(emfUnknownRecord.Data);
                                    break;

                                case EmfPlusRecordType.EmfFillPath:
                                    goto IL_1FE;

                                case EmfPlusRecordType.EmfStrokeAndFillPath:
                                    this.ProcessStrokeAndFillPath(emfUnknownRecord.Data);
                                    break;

                                default:
                                    switch (recordType)
                                    {
                                    case EmfPlusRecordType.EmfPolygon16:
                                        this.ProcessPolygon16(emfUnknownRecord.Data);
                                        break;

                                    case EmfPlusRecordType.EmfPolyline16:
                                        this.ProcessPolyline16(emfUnknownRecord.Data);
                                        break;

                                    case EmfPlusRecordType.EmfPolyBezierTo16:
                                        this.ProcessPolyBezierTo16(emfUnknownRecord.Data);
                                        break;

                                    case EmfPlusRecordType.EmfPolylineTo16:
                                        this.ProcessPolylineTo16(emfUnknownRecord.Data);
                                        break;

                                    case EmfPlusRecordType.EmfPolyPolyline16:
                                    case EmfPlusRecordType.EmfPolyDraw16:
                                    case EmfPlusRecordType.EmfCreateMonoBrush:
                                    case EmfPlusRecordType.EmfCreateDibPatternBrushPt:
                                    case EmfPlusRecordType.EmfPolyTextOutA:
                                    case EmfPlusRecordType.EmfPolyTextOutW:
                                        goto IL_1FE;

                                    case EmfPlusRecordType.EmfPolyPolygon16:
                                        this.ProcessPolyPolygon16(emfUnknownRecord.Data);
                                        break;

                                    case EmfPlusRecordType.EmfExtCreatePen:
                                    case EmfPlusRecordType.EmfSetIcmMode:
                                        break;

                                    default:
                                        goto IL_1FE;
                                    }
                                    break;
                                }
                                break;
                            }
                        }
                        continue;
                        continue;
IL_1FE:
                        throw new NotImplementedException();
                    }
                }
            }
            this.CommitLine();
        }
示例#5
0
            public void EnumerateMetafile(Stream emf, float unitSize, PointF destination, DrawLineDelegate drawLine, FillPolygonDelegate fillPolygon)
            {
                Transform = new Matrix();
                _drawLine = drawLine;
                _fillPolygon = fillPolygon;
                _zero = destination;
                _lineBuffer = new LineBuffer(unitSize);
                _objects = new System.Collections.Generic.Dictionary<uint, ObjectHandle>();
                _brush = null;

                using (var reader = new EmfTools.EmfReader(emf))
                {
                    while (!reader.IsEndOfFile)
                    {
                        var record = reader.Read() as EmfTools.EmfUnknownRecord;
                        if (record == null)
                            continue;

                        switch (record.RecordType)
                        {
                            case EmfPlusRecordType.EmfHeader:
                            case EmfPlusRecordType.EmfEof:
                            case EmfPlusRecordType.EmfSaveDC:
                            case EmfPlusRecordType.EmfDeleteObject:
                            case EmfPlusRecordType.EmfExtCreatePen:
                            case EmfPlusRecordType.EmfCreatePen:
                            case EmfPlusRecordType.EmfRestoreDC:
                            case EmfPlusRecordType.EmfSetIcmMode:
                            case EmfPlusRecordType.EmfSetMiterLimit:
                            case EmfPlusRecordType.EmfSetPolyFillMode:
                                // Harmless records with no significant side-effects on the shape of the drawn outline
                                break;

                            case EmfPlusRecordType.EmfSelectObject:
                                ProcessSelectObject(record.Data);
                                break;

                            case EmfPlusRecordType.EmfCreateBrushIndirect:
                                ProcessCreateBrushIndirect(record.Data);
                                break;

                            case EmfPlusRecordType.EmfBeginPath:
                                ProcessBeginPath(record.Data);
                                break;

                            case EmfPlusRecordType.EmfEndPath:
                                // TODO:
                                break;

                            case EmfPlusRecordType.EmfStrokeAndFillPath:
                                ProcessStrokeAndFillPath(record.Data);
                                break;

                            case EmfPlusRecordType.EmfMoveToEx:
                                ProcessMoveToEx(record.Data);
                                break;

                            case EmfPlusRecordType.EmfModifyWorldTransform:
                                ProcessModifyWorldTransform(record.Data);
                                break;

                            case EmfPlusRecordType.EmfPolygon16:
                                ProcessPolygon16(record.Data);
                                break;

                            case EmfPlusRecordType.EmfPolyPolygon16:
                                ProcessPolyPolygon16(record.Data);
                                break;

                            case EmfPlusRecordType.EmfPolyline16:
                                ProcessPolyline16(record.Data);
                                break;

                            case EmfPlusRecordType.EmfPolylineTo16:
                                ProcessPolylineTo16(record.Data);
                                break;

                            case EmfPlusRecordType.EmfCloseFigure:
                                ProcessCloseFigure(record.Data);
                                break;

                            case EmfPlusRecordType.EmfPolyBezierTo16:
                                ProcessPolyBezierTo16(record.Data);
                                break;

                            default:
                                throw new NotImplementedException();
                        }
                    }
                }

                CommitLine();
            }