/// <summary> /// Initializes a new instance of the <see cref='Metafile'/> class with the specified filename. /// </summary> public unsafe Metafile(Stream stream, IntPtr referenceHdc, Rectangle frameRect, MetafileFrameUnit frameUnit, EmfType type, string?description) { using DrawingCom.IStreamWrapper streamWrapper = DrawingCom.GetComWrapper(new GPStream(stream)); IntPtr metafile = IntPtr.Zero; if (frameRect.IsEmpty) { Gdip.CheckStatus(Gdip.GdipRecordMetafileStream( streamWrapper.Ptr, referenceHdc, type, IntPtr.Zero, frameUnit, description, &metafile)); } else { Gdip.CheckStatus(Gdip.GdipRecordMetafileStreamI( streamWrapper.Ptr, referenceHdc, type, &frameRect, frameUnit, description, &metafile)); } SetNativeImage(metafile); }
/// <summary> /// Initializes a new instance of the <see cref='Metafile'/> class from the specified stream. /// </summary> public unsafe Metafile(Stream stream) { ArgumentNullException.ThrowIfNull(stream); using DrawingCom.IStreamWrapper streamWrapper = DrawingCom.GetComWrapper(new GPStream(stream)); IntPtr metafile = IntPtr.Zero; Gdip.CheckStatus(Gdip.GdipCreateMetafileFromStream(streamWrapper.Ptr, &metafile)); SetNativeImage(metafile); }
/// <summary> /// Initializes a new instance of the <see cref='Metafile'/> class from the specified data stream. /// </summary> public unsafe Metafile(Stream stream, IntPtr referenceHdc, EmfType type, string?description) { using DrawingCom.IStreamWrapper streamWrapper = DrawingCom.GetComWrapper(new GPStream(stream)); IntPtr metafile = IntPtr.Zero; Gdip.CheckStatus(Gdip.GdipRecordMetafileStream( streamWrapper.Ptr, referenceHdc, type, IntPtr.Zero, MetafileFrameUnit.GdiCompatible, description, &metafile)); SetNativeImage(metafile); }
/// <summary> /// Returns the <see cref='MetafileHeader'/> associated with the specified <see cref='Metafile'/>. /// </summary> public static MetafileHeader GetMetafileHeader(Stream stream) { MetafileHeader header; IntPtr memory = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(MetafileHeaderEmf))); try { using DrawingCom.IStreamWrapper streamWrapper = DrawingCom.GetComWrapper(new GPStream(stream)); Gdip.CheckStatus(Gdip.GdipGetMetafileHeaderFromStream(streamWrapper.Ptr, memory)); int[] type = new int[] { 0 }; Marshal.Copy(memory, type, 0, 1); MetafileType metafileType = (MetafileType)type[0]; header = new MetafileHeader(); if (metafileType == MetafileType.Wmf || metafileType == MetafileType.WmfPlaceable) { // WMF header header.wmf = (MetafileHeaderWmf)Marshal.PtrToStructure(memory, typeof(MetafileHeaderWmf)) !; header.emf = null; } else { // EMF header header.wmf = null; header.emf = (MetafileHeaderEmf)Marshal.PtrToStructure(memory, typeof(MetafileHeaderEmf)) !; } } finally { Marshal.FreeHGlobal(memory); } return(header); }