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 IBinaryRecord Read() { long begin = reader.BaseStream.Position; var rt = (EmfPlusRecordType)reader.ReadUInt32(); var recordSize = reader.ReadUInt32(); EmfBinaryRecord record = new EmfUnknownRecord(); record.RecordType = rt; record.RecordSize = recordSize; record.Read(reader); long end = reader.BaseStream.Position; long rlen = end - begin; //Read length long excess = recordSize - rlen; if (excess > 0) { //Oops, reader did not read whole record?! reader.Skip((int)excess); } return record; }