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); } } } }
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(); }
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; }
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(); }
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(); }