/// <summary> /// Updates the current position to the specified point and optionally returns the previous position. /// </summary> /// <param name="x"></param> /// <param name="y"></param> /// <param name="old"></param> public void MoveToEx(int x, int y, WMFConverter.Gdi.Point old) { if (old != null) { old.X = _cx; old.Y = _cy; } _cx = x; _cy = y; }
/// <summary> /// Modifies the window origin for a device context using the specified horizontal and vertical offsets. /// </summary> /// <param name="x"></param> /// <param name="y"></param> /// <param name="old"></param> public void OffSetWindowOrgEx(int x, int y, WMFConverter.Gdi.Point old) { if (old != null) { old.X = _wox; old.Y = _woy; } _wox += x; _woy += y; }
/// <summary> /// Modifies the viewport origin for a device context using the specified horizontal and vertical offsets. /// </summary> /// <param name="x"></param> /// <param name="y"></param> /// <param name="old"></param> public void OffSetViewportOrgEx(int x, int y, WMFConverter.Gdi.Point old) { if (old != null) { old.X = _vox; old.Y = _voy; } _vox = x; _voy = y; }
/// <summary> /// Specifies which window point maps to the viewport origin (0,0). /// </summary> /// <param name="x"></param> /// <param name="y"></param> /// <param name="old"></param> public void SetWindowOrgEx(int x, int y, WMFConverter.Gdi.Point old) { if (old != null) { old.X = _wx; old.Y = _wy; } _wx = x; _wy = y; }
/// <summary> /// Parse WMF file to SVG file. /// </summary> /// <param name="stream"></param> /// <param name="gdi"></param> public void Parse(System.IO.Stream stream, Gdi.IGdi gdi) { WMFConverter.IO.DataInput binReader = null; bool isEmpty = true; try { binReader = new WMFConverter.IO.DataInput(stream, true); int mtType = 0; int mtHeaderSize = 0; long key = binReader.ReadUint32(); isEmpty = false; if (key == -1698247209)//0x9AC6CDD7) { int hmf = binReader.ReadInt16(); int vsx = binReader.ReadInt16(); int vsy = binReader.ReadInt16(); int vex = binReader.ReadInt16(); int vey = binReader.ReadInt16(); int dpi = binReader.ReadUint16(); long reserved = binReader.ReadUint32(); int checksum = binReader.ReadUint16(); gdi.PlaceableHeader(vsx, vsy, vex, vey, dpi); mtType = binReader.ReadUint16(); mtHeaderSize = binReader.ReadUint16(); } else { mtType = (int)(key & 0x0000FFFF); mtHeaderSize = (int)((key & 0xFFFF0000) >> 16); } int mtVersion = binReader.ReadUint16(); long mtSize = binReader.ReadUint32(); int mtNoObjects = binReader.ReadUint16(); long mtMaxRecord = binReader.ReadUint32(); int mtNoParameters = binReader.ReadUint16(); if (mtType != 1 || mtHeaderSize != 9) { throw new WmfParseException("invalid file format."); } gdi.Header(); WMFConverter.Gdi.IGdiObject[] objs = new WMFConverter.Gdi.IGdiObject[mtNoObjects]; while (true) { int size = (int)binReader.ReadUint32() - 3; int id = binReader.ReadUint16(); if (id == (int)WmfConstants.RECORD_EOF) { break; // Last record } binReader.Count = 0; switch (id) { case (int)WmfConstants.RECORD_REALIZE_PALETTE: gdi.RealizePalette(); break; case (int)WmfConstants.RECORD_SET_PALETTE_ENTRIES: { int[] entries = new int[binReader.ReadUint16()]; int startIndex = binReader.ReadUint16(); int objID = binReader.ReadUint16(); for (int i = 0; i < entries.Length; i++) { entries[i] = binReader.ReadInt32(); } gdi.SetPaletteEntries((Gdi.IGdiPalette)objs[objID], startIndex, entries); break; } case (int)WmfConstants.RECORD_SET_BK_MODE: { int mode = binReader.ReadInt16(); gdi.SetBkMode(mode); break; } case (int)WmfConstants.RECORD_SET_MAP_MODE: { int mode = binReader.ReadInt16(); gdi.SetMapMode(mode); break; } case (int)WmfConstants.RECORD_SET_ROP2: { int mode = binReader.ReadInt16(); gdi.SetROP2(mode); break; } case (int)WmfConstants.RECORD_SET_REL_ABS: { int mode = binReader.ReadInt16(); gdi.SetRelAbs(mode); break; } case (int)WmfConstants.RECORD_SET_POLY_FILL_MODE: { int mode = binReader.ReadInt16(); gdi.SetPolyFillMode(mode); break; } case (int)WmfConstants.RECORD_SET_STRETCH_BLT_MODE: { int mode = binReader.ReadInt16(); gdi.SetStretchBltMode(mode); break; } case (int)WmfConstants.RECORD_SET_TEXT_CHARACTER_EXTRA: { int extra = binReader.ReadInt16(); gdi.SetTextCharacterExtra(extra); break; } case (int)WmfConstants.RECORD_RESTORE_DC: { int dc = binReader.ReadInt16(); gdi.RestoreDC(dc); break; } case (int)WmfConstants.RECORD_RESIZE_PALETTE: { int objID = binReader.ReadUint16(); gdi.ResizePalette((Gdi.IGdiPalette)objs[objID]); break; } case (int)WmfConstants.RECORD_DIB_CREATE_PATTERN_BRUSH: { int usage = binReader.ReadInt32(); byte[] image = binReader.ReadBytes(size * 2 - binReader.Count); for (int i = 0; i < objs.Length; i++) { if (objs[i] == null) { objs[i] = gdi.DibCreatePatternBrush(image, usage); break; } } break; } case (int)WmfConstants.RECORD_SET_LAYOUT: { long layout = binReader.ReadUint32(); gdi.SetLayout(layout); break; } case (int)WmfConstants.RECORD_SET_BK_COLOR: { int color = binReader.ReadInt32(); gdi.SetBkColor(color); break; } case (int)WmfConstants.RECORD_SET_TEXT_COLOR: { int color = binReader.ReadInt32(); gdi.SetTextColor(color); break; } case (int)WmfConstants.RECORD_OFFSET_VIEWPORT_ORG_EX: { int y = binReader.ReadInt16(); int x = binReader.ReadInt16(); gdi.OffsetViewportOrgEx(x, y, null); break; } case (int)WmfConstants.RECORD_LINE_TO: { int ey = binReader.ReadInt16(); int ex = binReader.ReadInt16(); gdi.LineTo(ex, ey); break; } case (int)WmfConstants.RECORD_MOVE_TO_EX: { int y = binReader.ReadInt16(); int x = binReader.ReadInt16(); gdi.MoveToEx(x, y, null); break; } case (int)WmfConstants.RECORD_OFFSET_CLIP_RGN: { int y = binReader.ReadInt16(); int x = binReader.ReadInt16(); gdi.OffsetClipRgn(x, y); break; } case (int)WmfConstants.RECORD_FILL_RGN: { int brushID = binReader.ReadUint16(); int rgnID = binReader.ReadUint16(); gdi.FillRgn((Gdi.IGdiRegion)objs[rgnID], (Gdi.IGdiBrush)objs[brushID]); break; } case (int)WmfConstants.RECORD_SET_MAPPER_FLAGS: { long flag = binReader.ReadUint32(); gdi.SetMapperFlags(flag); break; } case (int)WmfConstants.RECORD_SELECT_PALETTE: { bool mode = (binReader.ReadInt16() != 0); if ((size * 2 - binReader.Count) > 0) { int objID = binReader.ReadUint16(); gdi.SelectPalette((Gdi.IGdiPalette)objs[objID], mode); } break; } case (int)WmfConstants.RECORD_POLYGON: { WMFConverter.Gdi.Point[] points = new WMFConverter.Gdi.Point[binReader.ReadInt16()]; for (int i = 0; i < points.Length; i++) { points[i] = new WMFConverter.Gdi.Point(binReader.ReadInt16(), binReader.ReadInt16()); } gdi.Polygon(points); break; } case (int)WmfConstants.RECORD_POLYLINE: { WMFConverter.Gdi.Point[] points = new WMFConverter.Gdi.Point[binReader.ReadInt16()]; for (int i = 0; i < points.Length; i++) { points[i] = new WMFConverter.Gdi.Point(binReader.ReadInt16(), binReader.ReadInt16()); } gdi.Polyline(points); break; } case (int)WmfConstants.RECORD_SET_TEXT_JUSTIFICATION: { int breakCount = binReader.ReadInt16(); int breakExtra = binReader.ReadInt16(); gdi.SetTextJustification(breakExtra, breakCount); break; } case (int)WmfConstants.RECORD_SET_WINDOW_ORG_EX: { int y = binReader.ReadInt16(); int x = binReader.ReadInt16(); gdi.SetWindowOrgEx(x, y, null); break; } case (int)WmfConstants.RECORD_SET_WINDOW_EXT_EX: { int height = binReader.ReadInt16(); int width = binReader.ReadInt16(); gdi.SetWindowExtEx(width, height, null); break; } case (int)WmfConstants.RECORD_SET_VIEWPORT_ORG_EX: { int y = binReader.ReadInt16(); int x = binReader.ReadInt16(); gdi.SetViewportOrgEx(x, y, null); break; } case (int)WmfConstants.RECORD_SET_VIEWPORT_EXT_EX: { int y = binReader.ReadInt16(); int x = binReader.ReadInt16(); gdi.SetViewportExtEx(x, y, null); break; } case (int)WmfConstants.RECORD_OFFSET_WINDOW_ORG_EX: { int y = binReader.ReadInt16(); int x = binReader.ReadInt16(); gdi.OffsetWindowOrgEx(x, y, null); break; } case (int)WmfConstants.RECORD_SCALE_WINDOW_EXT_EX: { int yd = binReader.ReadInt16(); int y = binReader.ReadInt16(); int xd = binReader.ReadInt16(); int x = binReader.ReadInt16(); gdi.ScaleWindowExtEx(x, xd, y, yd, null); break; } case (int)WmfConstants.RECORD_SCALE_VIEWPORT_EXT_EX: { int yd = binReader.ReadInt16(); int y = binReader.ReadInt16(); int xd = binReader.ReadInt16(); int x = binReader.ReadInt16(); gdi.ScaleViewportExtEx(x, xd, y, yd, null); break; } case (int)WmfConstants.RECORD_EXCLUDE_CLIP_RECT: { int ey = binReader.ReadInt16(); int ex = binReader.ReadInt16(); int sy = binReader.ReadInt16(); int sx = binReader.ReadInt16(); gdi.ExcludeClipRect(sx, sy, ex, ey); break; } case (int)WmfConstants.RECORD_INTERSECT_CLIP_RECT: { int ey = binReader.ReadInt16(); int ex = binReader.ReadInt16(); int sy = binReader.ReadInt16(); int sx = binReader.ReadInt16(); gdi.IntersectClipRect(sx, sy, ex, ey); break; } case (int)WmfConstants.RECORD_ELLIPSE: { int ey = binReader.ReadInt16(); int ex = binReader.ReadInt16(); int sy = binReader.ReadInt16(); int sx = binReader.ReadInt16(); gdi.Ellipse(sx, sy, ex, ey); break; } case (int)WmfConstants.RECORD_FLOOD_FILL: { int color = binReader.ReadInt32(); int y = binReader.ReadInt16(); int x = binReader.ReadInt16(); gdi.FloodFill(x, y, color); break; } case (int)WmfConstants.RECORD_FRAME_RGN: { int height = binReader.ReadInt16(); int width = binReader.ReadInt16(); int brushID = binReader.ReadUint16(); int rgnID = binReader.ReadUint16(); gdi.FrameRgn((Gdi.IGdiRegion)objs[rgnID], (Gdi.IGdiBrush)objs[brushID], width, height); break; } case (int)WmfConstants.RECORD_ANIMATE_PALETTE: { int[] entries = new int[binReader.ReadUint16()]; int startIndex = binReader.ReadUint16(); int objID = binReader.ReadUint16(); for (int i = 0; i < entries.Length; i++) { entries[i] = binReader.ReadInt32(); } gdi.AnimatePalette((Gdi.IGdiPalette)objs[objID], startIndex, entries); break; } case (int)WmfConstants.RECORD_TEXT_OUT: { int count = binReader.ReadInt16(); byte[] text = binReader.ReadBytes(count); if (count % 2 == 1) { binReader.ReadByte(); } int y = binReader.ReadInt16(); int x = binReader.ReadInt16(); gdi.TextOut(x, y, text); break; } case (int)WmfConstants.RECORD_POLY_POLYGON: { WMFConverter.Gdi.Point[][] points = new WMFConverter.Gdi.Point[binReader.ReadInt16()][]; for (int i = 0; i < points.Length; i++) { points[i] = new WMFConverter.Gdi.Point[binReader.ReadInt16()]; } for (int i = 0; i < points.Length; i++) { for (int j = 0; j < points[i].Length; j++) { points[i][j] = new WMFConverter.Gdi.Point(binReader.ReadInt16(), binReader.ReadInt16()); } } gdi.PolyPolygon(points); break; } case (int)WmfConstants.RECORD_EXT_FLOOD_FILL: { int type = binReader.ReadUint16(); int color = binReader.ReadInt32(); int y = binReader.ReadInt16(); int x = binReader.ReadInt16(); gdi.ExtFloodFill(x, y, color, type); break; } case (int)WmfConstants.RECORD_RECTANGLE: { int ey = binReader.ReadInt16(); int ex = binReader.ReadInt16(); int sy = binReader.ReadInt16(); int sx = binReader.ReadInt16(); gdi.Rectangle(sx, sy, ex, ey); break; } case (int)WmfConstants.RECORD_SET_PIXEL: { int color = binReader.ReadInt32(); int y = binReader.ReadInt16(); int x = binReader.ReadInt16(); gdi.SetPixel(x, y, color); break; } case (int)WmfConstants.RECORD_ROUND_RECT: { int rh = binReader.ReadInt16(); int rw = binReader.ReadInt16(); int ey = binReader.ReadInt16(); int ex = binReader.ReadInt16(); int sy = binReader.ReadInt16(); int sx = binReader.ReadInt16(); gdi.RoundRect(sx, sy, ex, ey, rw, rh); break; } case (int)WmfConstants.RECORD_PAT_BLT: { long rop = binReader.ReadUint32(); int height = binReader.ReadInt16(); int width = binReader.ReadInt16(); int y = binReader.ReadInt16(); int x = binReader.ReadInt16(); gdi.PatBlt(x, y, width, height, rop); break; } case (int)WmfConstants.RECORD_SAVE_DC: { gdi.SeveDC(); break; } case (int)WmfConstants.RECORD_PIE: { int eyr = binReader.ReadInt16(); int exr = binReader.ReadInt16(); int syr = binReader.ReadInt16(); int sxr = binReader.ReadInt16(); int ey = binReader.ReadInt16(); int ex = binReader.ReadInt16(); int sy = binReader.ReadInt16(); int sx = binReader.ReadInt16(); gdi.Pie(sx, sy, ex, ey, sxr, syr, exr, eyr); break; } case (int)WmfConstants.RECORD_STRETCH_BLT: { long rop = binReader.ReadUint32(); int sh = binReader.ReadInt16(); int sw = binReader.ReadInt16(); int sy = binReader.ReadInt16(); int sx = binReader.ReadInt16(); int dh = binReader.ReadInt16(); int dw = binReader.ReadInt16(); int dy = binReader.ReadInt16(); int dx = binReader.ReadInt16(); byte[] image = binReader.ReadBytes(size * 2 - binReader.Count); gdi.StretchBlt(image, dx, dy, dw, dh, sx, sy, sw, sh, rop); break; } case (int)WmfConstants.RECORD_ESCAPE: { byte[] data = binReader.ReadBytes(2 * size); gdi.Escape(data); break; } case (int)WmfConstants.RECORD_INVERT_RGN: { int rgnID = binReader.ReadUint16(); gdi.InvertRgn((Gdi.IGdiRegion)objs[rgnID]); break; } case (int)WmfConstants.RECORD_PAINT_RGN: { int objID = binReader.ReadUint16(); gdi.PaintRgn((Gdi.IGdiRegion)objs[objID]); break; } case (int)WmfConstants.RECORD_SELECT_CLIP_RGN: { int objID = binReader.ReadUint16(); Gdi.IGdiRegion rgn = (objID > 0) ? (Gdi.IGdiRegion)objs[objID] : null; gdi.SelectClipRgn(rgn); break; } case (int)WmfConstants.RECORD_SELECT_OBJECT: { int objID = binReader.ReadUint16(); gdi.SelectObject(objs[objID]); break; } case (int)WmfConstants.RECORD_SET_TEXT_ALIGN: { int align = binReader.ReadInt16(); gdi.SetTextAlign(align); break; } case (int)WmfConstants.RECORD_ARC: { int eya = binReader.ReadInt16(); int exa = binReader.ReadInt16(); int sya = binReader.ReadInt16(); int sxa = binReader.ReadInt16(); int eyr = binReader.ReadInt16(); int exr = binReader.ReadInt16(); int syr = binReader.ReadInt16(); int sxr = binReader.ReadInt16(); gdi.Arc(sxr, syr, exr, eyr, sxa, sya, exa, eya); break; } case (int)WmfConstants.RECORD_CHORD: { int eya = binReader.ReadInt16(); int exa = binReader.ReadInt16(); int sya = binReader.ReadInt16(); int sxa = binReader.ReadInt16(); int eyr = binReader.ReadInt16(); int exr = binReader.ReadInt16(); int syr = binReader.ReadInt16(); int sxr = binReader.ReadInt16(); gdi.Chord(sxr, syr, exr, eyr, sxa, sya, exa, eya); break; } case (int)WmfConstants.RECORD_BIT_BLT: { long rop = binReader.ReadUint32(); int sy = binReader.ReadInt16(); int sx = binReader.ReadInt16(); int height = binReader.ReadInt16(); int width = binReader.ReadInt16(); int dy = binReader.ReadInt16(); int dx = binReader.ReadInt16(); byte[] image = binReader.ReadBytes(size * 2 - binReader.Count); gdi.BitBlt(image, dx, dy, width, height, sx, sy, rop); break; } case (int)WmfConstants.RECORD_EXT_TEXT_OUT: { int rsize = size; int y = binReader.ReadInt16(); int x = binReader.ReadInt16(); int count = binReader.ReadInt16(); int options = binReader.ReadUint16(); rsize -= 4; int[] rect = null; if ((options & 0x0006) > 0) { rect = new int[] { binReader.ReadInt16(), binReader.ReadInt16(), binReader.ReadInt16(), binReader.ReadInt16() }; rsize -= 4; } byte[] text = binReader.ReadBytes(count); if (count % 2 == 1) { binReader.ReadByte(); } rsize -= (count + 1) / 2; int[] dx = null; if (rsize > 0) { dx = new int[rsize]; for (int i = 0; i < dx.Length; i++) { dx[i] = binReader.ReadInt16(); } } gdi.ExtTextOut(x, y, options, rect, text, dx); break; } case (int)WmfConstants.RECORD_SET_DIBITS_TO_DEVICE: { int colorUse = binReader.ReadUint16(); int scanlines = binReader.ReadUint16(); int startscan = binReader.ReadUint16(); int sy = binReader.ReadInt16(); int sx = binReader.ReadInt16(); int dh = binReader.ReadInt16(); int dw = binReader.ReadInt16(); int dy = binReader.ReadInt16(); int dx = binReader.ReadInt16(); byte[] image = binReader.ReadBytes(size * 2 - binReader.Count); gdi.SetDIBitsToDevice(dx, dy, dw, dh, sx, sy, startscan, scanlines, image, colorUse); break; } case (int)WmfConstants.RECORD_DIB_BIT_BLT: { bool isRop = false; long rop = binReader.ReadUint32(); int sy = binReader.ReadInt16(); int sx = binReader.ReadInt16(); int height = binReader.ReadInt16(); if (height == 0) { height = binReader.ReadInt16(); isRop = true; } int width = binReader.ReadInt16(); int dy = binReader.ReadInt16(); int dx = binReader.ReadInt16(); if (isRop) { gdi.DibBitBlt(null, dx, dy, width, height, sx, sy, rop); } else { byte[] image = binReader.ReadBytes(size * 2 - binReader.Count); gdi.DibBitBlt(image, dx, dy, width, height, sx, sy, rop); } break; } case (int)WmfConstants.RECORD_DIB_STRETCH_BLT: { long rop = binReader.ReadUint32(); int sh = binReader.ReadInt16(); int sw = binReader.ReadInt16(); int sx = binReader.ReadInt16(); int sy = binReader.ReadInt16(); int dh = binReader.ReadInt16(); int dw = binReader.ReadInt16(); int dy = binReader.ReadInt16(); int dx = binReader.ReadInt16(); byte[] image = binReader.ReadBytes(size * 2 - binReader.Count); gdi.DibStretchBlt(image, dx, dy, dw, dh, sx, sy, sw, sh, rop); break; } case (int)WmfConstants.RECORD_STRETCH_DIBITS: { long rop = binReader.ReadUint32(); int usage = binReader.ReadUint16(); int sh = binReader.ReadInt16(); int sw = binReader.ReadInt16(); int sy = binReader.ReadInt16(); int sx = binReader.ReadInt16(); int dh = binReader.ReadInt16(); int dw = binReader.ReadInt16(); int dy = binReader.ReadInt16(); int dx = binReader.ReadInt16(); byte[] image = binReader.ReadBytes(size * 2 - binReader.Count); gdi.StretchDIBits(dx, dy, dw, dh, sx, sy, sw, sh, image, usage, rop); break; } case (int)WmfConstants.RECORD_DELETE_OBJECT: { int objID = binReader.ReadUint16(); gdi.DeleteObject(objs[objID]); objs[objID] = null; break; } case (int)WmfConstants.RECORD_CREATE_PALETTE: { int version = binReader.ReadUint16(); int[] entries = new int[binReader.ReadUint16()]; for (int i = 0; i < entries.Length; i++) { entries[i] = binReader.ReadInt32(); } for (int i = 0; i < objs.Length; i++) { if (objs[i] == null) { objs[i] = gdi.CreatePalette(version, entries); break; } } break; } case (int)WmfConstants.RECORD_CREATE_PATTERN_BRUSH: { byte[] image = binReader.ReadBytes(size * 2 - binReader.Count); for (int i = 0; i < objs.Length; i++) { if (objs[i] == null) { objs[i] = gdi.CreatePatternBrush(image); break; } } break; } case (int)WmfConstants.RECORD_CREATE_PEN_INDIRECT: { int style = binReader.ReadUint16(); int width = binReader.ReadInt16(); binReader.ReadInt16(); int color = binReader.ReadInt32(); for (int i = 0; i < objs.Length; i++) { if (objs[i] == null) { objs[i] = gdi.CreatePenIndirect(style, width, color); break; } } break; } case (int)WmfConstants.RECORD_CREATE_FONT_INDIRECT: { int height = binReader.ReadInt16(); int width = binReader.ReadInt16(); int escapement = binReader.ReadInt16(); int orientation = binReader.ReadInt16(); int weight = binReader.ReadInt16(); bool italic = (binReader.ReadByte() == 1); bool underline = (binReader.ReadByte() == 1); bool strikeout = (binReader.ReadByte() == 1); int charset = binReader.ReadByte(); int outPrecision = binReader.ReadByte(); int clipPrecision = binReader.ReadByte(); int quality = binReader.ReadByte(); int pitchAndFamily = binReader.ReadByte(); byte[] faceName = binReader.ReadBytes(size * 2 - binReader.Count); Gdi.IGdiObject obj = gdi.CreateFontIndirect(height, width, escapement, orientation, weight, italic, underline, strikeout, charset, outPrecision, clipPrecision, quality, pitchAndFamily, faceName); for (int i = 0; i < objs.Length; i++) { if (objs[i] == null) { objs[i] = obj; break; } } break; } case (int)WmfConstants.RECORD_CREATE_BRUSH_INDIRECT: { int style = binReader.ReadUint16(); int color = binReader.ReadInt32(); int hatch = binReader.ReadUint16(); for (int i = 0; i < objs.Length; i++) { if (objs[i] == null) { objs[i] = gdi.CreateBrushIndirect(style, color, hatch); break; } } break; } case (int)WmfConstants.RECORD_CREATE_RECT_RGN: { int ey = binReader.ReadInt16(); int ex = binReader.ReadInt16(); int sy = binReader.ReadInt16(); int sx = binReader.ReadInt16(); for (int i = 0; i < objs.Length; i++) { if (objs[i] == null) { objs[i] = gdi.CreateRectRgn(sx, sy, ex, ey); break; } } break; } default: { //log.fine("unsuppored id find: " + id + " (size=" + size + ")"); Console.Write("unsuppored id find:" + id + "(size=" + size + ")"); break; } } int rest = size * 2 - binReader.Count; for (int i = 0; i < rest; i++) { binReader.ReadByte(); } } binReader.Close(); gdi.Footer(); } catch (Exception) { if (isEmpty) { throw new WmfParseException("input file size is zero."); } } }