Example #1
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();
        }
Example #2
0
                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;
                }