Metafile
Defines a graphic metafile. A metafile contains records that describe a sequence of graphics operations that can be recorded (constructed) and played back (displayed). This class is not inheritable.
using System.ComponentModel;
using System.IO;
using System.Runtime.CompilerServices;
using System.Runtime.Serialization;
using Windows.Win32;
using Windows.Win32.Foundation;
using Windows.Win32.Graphics.Gdi;
using Windows.Win32.Graphics.GdiPlus;
using Windows.Win32.System.Com;
namespace System.Drawing.Imaging
{
[Serializable]
[NullableContext(1)]
[Nullable(0)]
[Editor("System.Drawing.Design.MetafileEditor, System.Drawing.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", "System.Drawing.Design.UITypeEditor, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")]
[TypeForwardedFrom("System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")]
public sealed class Metafile : Image, IPointer<GpMetafile>
{
private const int MaxPath = 260;
unsafe IntPtr IPointer<GpMetafile>.Pointer {
get {
return (IntPtr)this.Pointer();
}
}
public unsafe Metafile(IntPtr hmetafile, WmfPlaceableFileHeader wmfHeader, bool deleteWmf)
{
fixed (global::Windows.Win32.Graphics.GdiPlus.WmfPlaceableFileHeader* wmfPlaceableFileHeader = &wmfHeader._header) {
GpMetafile* nativeImage = default(GpMetafile*);
PInvokeGdiPlus.GdipCreateMetafileFromWmf((HMETAFILE)hmetafile, deleteWmf, wmfPlaceableFileHeader, &nativeImage).ThrowIfFailed();
SetNativeImage((GpImage*)nativeImage);
}
}
public unsafe Metafile(IntPtr henhmetafile, bool deleteEmf)
{
GpMetafile* nativeImage = default(GpMetafile*);
PInvokeGdiPlus.GdipCreateMetafileFromEmf((HENHMETAFILE)henhmetafile, deleteEmf, &nativeImage).ThrowIfFailed();
SetNativeImage((GpImage*)nativeImage);
}
public unsafe Metafile(string filename)
{
Path.GetFullPath(filename);
IntPtr value;
if (filename == null)
value = (IntPtr)(void*)null;
else {
ref reference = ref filename.GetPinnableReference();
value = (IntPtr)(&reference);
}
GpMetafile* nativeImage = default(GpMetafile*);
PInvokeGdiPlus.GdipCreateMetafileFromFile((char*)(long)value, &nativeImage).ThrowIfFailed();
SetNativeImage((GpImage*)nativeImage);
ref reference = ref *(char*)null;
}
public Metafile(IntPtr referenceHdc, Rectangle frameRect)
: this(referenceHdc, frameRect, MetafileFrameUnit.GdiCompatible)
{
}
public Metafile(IntPtr referenceHdc, EmfType emfType)
: this(referenceHdc, emfType, null)
{
}
public Metafile(IntPtr referenceHdc, RectangleF frameRect)
: this(referenceHdc, frameRect, MetafileFrameUnit.GdiCompatible)
{
}
public Metafile(IntPtr referenceHdc, RectangleF frameRect, MetafileFrameUnit frameUnit)
: this(referenceHdc, frameRect, frameUnit, EmfType.EmfPlusDual)
{
}
public Metafile(IntPtr referenceHdc, RectangleF frameRect, MetafileFrameUnit frameUnit, EmfType type)
: this(referenceHdc, frameRect, frameUnit, type, null)
{
}
[NullableContext(2)]
public unsafe Metafile(IntPtr referenceHdc, RectangleF frameRect, MetafileFrameUnit frameUnit, EmfType type, string description)
{
RectF rectF = frameRect;
IntPtr intPtr;
if (description == null)
intPtr = (IntPtr)(void*)null;
else {
ref reference = ref description.GetPinnableReference();
intPtr = (IntPtr)(&reference);
}
char* value = (char*)(long)intPtr;
GpMetafile* nativeImage = default(GpMetafile*);
PInvokeGdiPlus.GdipRecordMetafile((HDC)referenceHdc, (global::Windows.Win32.Graphics.GdiPlus.EmfType)type, &rectF, (global::Windows.Win32.Graphics.GdiPlus.MetafileFrameUnit)frameUnit, value, &nativeImage).ThrowIfFailed();
ref reference = ref *(char*)null;
SetNativeImage((GpImage*)nativeImage);
}
public Metafile(IntPtr referenceHdc, Rectangle frameRect, MetafileFrameUnit frameUnit)
: this(referenceHdc, frameRect, frameUnit, EmfType.EmfPlusDual)
{
}
public Metafile(IntPtr referenceHdc, Rectangle frameRect, MetafileFrameUnit frameUnit, EmfType type)
: this(referenceHdc, frameRect, frameUnit, type, null)
{
}
public Metafile(string fileName, IntPtr referenceHdc)
: this(fileName, referenceHdc, EmfType.EmfPlusDual, null)
{
}
public Metafile(string fileName, IntPtr referenceHdc, EmfType type)
: this(fileName, referenceHdc, type, null)
{
}
public Metafile(string fileName, IntPtr referenceHdc, RectangleF frameRect)
: this(fileName, referenceHdc, frameRect, MetafileFrameUnit.GdiCompatible)
{
}
public Metafile(string fileName, IntPtr referenceHdc, RectangleF frameRect, MetafileFrameUnit frameUnit)
: this(fileName, referenceHdc, frameRect, frameUnit, EmfType.EmfPlusDual)
{
}
public Metafile(string fileName, IntPtr referenceHdc, RectangleF frameRect, MetafileFrameUnit frameUnit, EmfType type)
: this(fileName, referenceHdc, frameRect, frameUnit, type, null)
{
}
public Metafile(string fileName, IntPtr referenceHdc, RectangleF frameRect, MetafileFrameUnit frameUnit, [Nullable(2)] string desc)
: this(fileName, referenceHdc, frameRect, frameUnit, EmfType.EmfPlusDual, desc)
{
}
public unsafe Metafile(string fileName, IntPtr referenceHdc, RectangleF frameRect, MetafileFrameUnit frameUnit, EmfType type, [Nullable(2)] string description)
{
Path.GetFullPath(fileName);
if (fileName.Length > 260)
throw new PathTooLongException();
RectF rectF = frameRect;
IntPtr value;
if (fileName == null)
value = (IntPtr)(void*)null;
else {
ref reference = ref fileName.GetPinnableReference();
value = (IntPtr)(&reference);
}
IntPtr intPtr;
if (description == null)
intPtr = (IntPtr)(void*)null;
else {
ref reference2 = ref description.GetPinnableReference();
intPtr = (IntPtr)(&reference2);
}
char* value2 = (char*)(long)intPtr;
GpMetafile* nativeImage = default(GpMetafile*);
PInvokeGdiPlus.GdipRecordMetafileFileName((char*)(long)value, (HDC)referenceHdc, (global::Windows.Win32.Graphics.GdiPlus.EmfType)type, &rectF, (global::Windows.Win32.Graphics.GdiPlus.MetafileFrameUnit)frameUnit, value2, &nativeImage).ThrowIfFailed();
ref reference2 = ref *(char*)null;
ref reference = ref *(char*)null;
SetNativeImage((GpImage*)nativeImage);
}
public Metafile(string fileName, IntPtr referenceHdc, Rectangle frameRect)
: this(fileName, referenceHdc, frameRect, MetafileFrameUnit.GdiCompatible)
{
}
public Metafile(string fileName, IntPtr referenceHdc, Rectangle frameRect, MetafileFrameUnit frameUnit)
: this(fileName, referenceHdc, frameRect, frameUnit, EmfType.EmfPlusDual)
{
}
public Metafile(string fileName, IntPtr referenceHdc, Rectangle frameRect, MetafileFrameUnit frameUnit, EmfType type)
: this(fileName, referenceHdc, frameRect, frameUnit, type, null)
{
}
public Metafile(string fileName, IntPtr referenceHdc, Rectangle frameRect, MetafileFrameUnit frameUnit, [Nullable(2)] string description)
: this(fileName, referenceHdc, frameRect, frameUnit, EmfType.EmfPlusDual, description)
{
}
public Metafile(Stream stream, IntPtr referenceHdc)
: this(stream, referenceHdc, EmfType.EmfPlusDual, null)
{
}
public Metafile(Stream stream, IntPtr referenceHdc, EmfType type)
: this(stream, referenceHdc, type, null)
{
}
public Metafile(Stream stream, IntPtr referenceHdc, RectangleF frameRect)
: this(stream, referenceHdc, frameRect, MetafileFrameUnit.GdiCompatible)
{
}
public Metafile(Stream stream, IntPtr referenceHdc, RectangleF frameRect, MetafileFrameUnit frameUnit)
: this(stream, referenceHdc, frameRect, frameUnit, EmfType.EmfPlusDual)
{
}
public Metafile(Stream stream, IntPtr referenceHdc, RectangleF frameRect, MetafileFrameUnit frameUnit, EmfType type)
: this(stream, referenceHdc, frameRect, frameUnit, type, null)
{
}
public Metafile(Stream stream, IntPtr referenceHdc, Rectangle frameRect)
: this(stream, referenceHdc, frameRect, MetafileFrameUnit.GdiCompatible)
{
}
public Metafile(Stream stream, IntPtr referenceHdc, Rectangle frameRect, MetafileFrameUnit frameUnit)
: this(stream, referenceHdc, frameRect, frameUnit, EmfType.EmfPlusDual)
{
}
public Metafile(Stream stream, IntPtr referenceHdc, Rectangle frameRect, MetafileFrameUnit frameUnit, EmfType type)
: this(stream, referenceHdc, frameRect, frameUnit, type, null)
{
}
public Metafile(IntPtr hmetafile, WmfPlaceableFileHeader wmfHeader)
: this(hmetafile, wmfHeader, false)
{
}
public unsafe Metafile(Stream stream)
{
ArgumentNullException.ThrowIfNull(stream, "stream");
ComScope<IStream> scope = stream.ToIStream(true);
try {
GpMetafile* nativeImage = null;
PInvokeGdiPlus.GdipCreateMetafileFromStream((IStream*)ref scope, &nativeImage).ThrowIfFailed();
SetNativeImage((GpImage*)nativeImage);
} finally {
scope.Dispose();
}
}
[NullableContext(2)]
public unsafe Metafile(IntPtr referenceHdc, EmfType emfType, string description)
{
IntPtr intPtr;
if (description == null)
intPtr = (IntPtr)(void*)null;
else {
ref reference = ref description.GetPinnableReference();
intPtr = (IntPtr)(&reference);
}
char* value = (char*)(long)intPtr;
GpMetafile* nativeImage = default(GpMetafile*);
PInvokeGdiPlus.GdipRecordMetafile((HDC)referenceHdc, (global::Windows.Win32.Graphics.GdiPlus.EmfType)emfType, null, global::Windows.Win32.Graphics.GdiPlus.MetafileFrameUnit.MetafileFrameUnitGdi, value, &nativeImage).ThrowIfFailed();
ref reference = ref *(char*)null;
SetNativeImage((GpImage*)nativeImage);
}
[NullableContext(2)]
public unsafe Metafile(IntPtr referenceHdc, Rectangle frameRect, MetafileFrameUnit frameUnit, EmfType type, string desc)
{
RectF rectF = (RectangleF)frameRect;
IntPtr intPtr;
if (desc == null)
intPtr = (IntPtr)(void*)null;
else {
ref reference = ref desc.GetPinnableReference();
intPtr = (IntPtr)(&reference);
}
char* value = (char*)(long)intPtr;
GpMetafile* nativeImage = default(GpMetafile*);
PInvokeGdiPlus.GdipRecordMetafile((HDC)referenceHdc, (global::Windows.Win32.Graphics.GdiPlus.EmfType)type, (RectF*)(long)(frameRect.IsEmpty ? ((IntPtr)(void*)null) : ((IntPtr)(&rectF))), (global::Windows.Win32.Graphics.GdiPlus.MetafileFrameUnit)frameUnit, value, &nativeImage).ThrowIfFailed();
ref reference = ref *(char*)null;
SetNativeImage((GpImage*)nativeImage);
}
public unsafe Metafile(string fileName, IntPtr referenceHdc, EmfType type, [Nullable(2)] string description)
{
Path.GetFullPath(fileName);
IntPtr value;
if (fileName == null)
value = (IntPtr)(void*)null;
else {
ref reference = ref fileName.GetPinnableReference();
value = (IntPtr)(&reference);
}
IntPtr intPtr;
if (description == null)
intPtr = (IntPtr)(void*)null;
else {
ref reference2 = ref description.GetPinnableReference();
intPtr = (IntPtr)(&reference2);
}
char* value2 = (char*)(long)intPtr;
GpMetafile* nativeImage = default(GpMetafile*);
PInvokeGdiPlus.GdipRecordMetafileFileName((char*)(long)value, (HDC)referenceHdc, (global::Windows.Win32.Graphics.GdiPlus.EmfType)type, null, global::Windows.Win32.Graphics.GdiPlus.MetafileFrameUnit.MetafileFrameUnitGdi, value2, &nativeImage).ThrowIfFailed();
ref reference2 = ref *(char*)null;
ref reference = ref *(char*)null;
SetNativeImage((GpImage*)nativeImage);
}
public unsafe Metafile(string fileName, IntPtr referenceHdc, Rectangle frameRect, MetafileFrameUnit frameUnit, EmfType type, [Nullable(2)] string description)
{
Path.GetFullPath(fileName);
RectF rectF = (RectangleF)frameRect;
IntPtr value;
if (fileName == null)
value = (IntPtr)(void*)null;
else {
ref reference = ref fileName.GetPinnableReference();
value = (IntPtr)(&reference);
}
IntPtr intPtr;
if (description == null)
intPtr = (IntPtr)(void*)null;
else {
ref reference2 = ref description.GetPinnableReference();
intPtr = (IntPtr)(&reference2);
}
char* value2 = (char*)(long)intPtr;
GpMetafile* nativeImage = default(GpMetafile*);
PInvokeGdiPlus.GdipRecordMetafileFileName((char*)(long)value, (HDC)referenceHdc, (global::Windows.Win32.Graphics.GdiPlus.EmfType)type, (RectF*)(long)(frameRect.IsEmpty ? ((IntPtr)(void*)null) : ((IntPtr)(&rectF))), (global::Windows.Win32.Graphics.GdiPlus.MetafileFrameUnit)frameUnit, value2, &nativeImage).ThrowIfFailed();
ref reference2 = ref *(char*)null;
ref reference = ref *(char*)null;
SetNativeImage((GpImage*)nativeImage);
}
public unsafe Metafile(Stream stream, IntPtr referenceHdc, EmfType type, [Nullable(2)] string description)
{
ArgumentNullException.ThrowIfNull(stream, "stream");
ComScope<IStream> scope = stream.ToIStream(true);
try {
GpMetafile* nativeImage = null;
IntPtr intPtr;
if (description == null)
intPtr = (IntPtr)(void*)null;
else {
ref reference = ref description.GetPinnableReference();
intPtr = (IntPtr)(&reference);
}
char* value = (char*)(long)intPtr;
PInvokeGdiPlus.GdipRecordMetafileStream((IStream*)ref scope, (HDC)referenceHdc, (global::Windows.Win32.Graphics.GdiPlus.EmfType)type, null, global::Windows.Win32.Graphics.GdiPlus.MetafileFrameUnit.MetafileFrameUnitGdi, value, &nativeImage).ThrowIfFailed();
ref reference = ref *(char*)null;
SetNativeImage((GpImage*)nativeImage);
} finally {
scope.Dispose();
}
}
public unsafe Metafile(Stream stream, IntPtr referenceHdc, RectangleF frameRect, MetafileFrameUnit frameUnit, EmfType type, [Nullable(2)] string description)
{
ArgumentNullException.ThrowIfNull(stream, "stream");
ComScope<IStream> scope = stream.ToIStream(true);
try {
GpMetafile* nativeImage = null;
IntPtr intPtr;
if (description == null)
intPtr = (IntPtr)(void*)null;
else {
ref reference = ref description.GetPinnableReference();
intPtr = (IntPtr)(&reference);
}
char* value = (char*)(long)intPtr;
RectF rectF = frameRect;
PInvokeGdiPlus.GdipRecordMetafileStream((IStream*)ref scope, (HDC)referenceHdc, (global::Windows.Win32.Graphics.GdiPlus.EmfType)type, &rectF, (global::Windows.Win32.Graphics.GdiPlus.MetafileFrameUnit)frameUnit, value, &nativeImage).ThrowIfFailed();
ref reference = ref *(char*)null;
SetNativeImage((GpImage*)nativeImage);
} finally {
scope.Dispose();
}
}
public unsafe Metafile(Stream stream, IntPtr referenceHdc, Rectangle frameRect, MetafileFrameUnit frameUnit, EmfType type, [Nullable(2)] string description)
{
ArgumentNullException.ThrowIfNull(stream, "stream");
ComScope<IStream> scope = stream.ToIStream(true);
try {
GpMetafile* nativeImage = null;
IntPtr intPtr;
if (description == null)
intPtr = (IntPtr)(void*)null;
else {
ref reference = ref description.GetPinnableReference();
intPtr = (IntPtr)(&reference);
}
char* value = (char*)(long)intPtr;
RectF rectF = (RectangleF)frameRect;
PInvokeGdiPlus.GdipRecordMetafileStream((IStream*)ref scope, (HDC)referenceHdc, (global::Windows.Win32.Graphics.GdiPlus.EmfType)type, (RectF*)(long)(frameRect.IsEmpty ? ((IntPtr)(void*)null) : ((IntPtr)(&rectF))), (global::Windows.Win32.Graphics.GdiPlus.MetafileFrameUnit)frameUnit, value, &nativeImage).ThrowIfFailed();
ref reference = ref *(char*)null;
SetNativeImage((GpImage*)nativeImage);
} finally {
scope.Dispose();
}
}
private Metafile(SerializationInfo info, StreamingContext context)
: base(info, context)
{
}
internal unsafe Metafile(IntPtr ptr)
{
SetNativeImage((GpImage*)(long)ptr);
}
public unsafe void PlayRecord(EmfPlusRecordType recordType, int flags, int dataSize, byte[] data)
{
fixed (byte* data2 = data) {
PInvokeGdiPlus.GdipPlayMetafileRecord(this.Pointer(), (global::Windows.Win32.Graphics.GdiPlus.EmfPlusRecordType)recordType, (uint)flags, (uint)dataSize, data2).ThrowIfFailed();
GC.KeepAlive(this);
}
}
public unsafe static MetafileHeader GetMetafileHeader(IntPtr hmetafile, WmfPlaceableFileHeader wmfHeader)
{
MetafileHeader metafileHeader = new MetafileHeader();
fixed (global::Windows.Win32.Graphics.GdiPlus.MetafileHeader* header = &metafileHeader._header) {
fixed (global::Windows.Win32.Graphics.GdiPlus.WmfPlaceableFileHeader* wmfPlaceableFileHeader = &wmfHeader._header) {
PInvokeGdiPlus.GdipGetMetafileHeaderFromWmf((HMETAFILE)hmetafile, wmfPlaceableFileHeader, header).ThrowIfFailed();
return metafileHeader;
}
}
}
public unsafe static MetafileHeader GetMetafileHeader(IntPtr henhmetafile)
{
MetafileHeader metafileHeader = new MetafileHeader();
fixed (global::Windows.Win32.Graphics.GdiPlus.MetafileHeader* header = &metafileHeader._header) {
PInvokeGdiPlus.GdipGetMetafileHeaderFromEmf((HENHMETAFILE)henhmetafile, header).ThrowIfFailed();
return metafileHeader;
}
}
public unsafe static MetafileHeader GetMetafileHeader(string fileName)
{
Path.GetFullPath(fileName);
MetafileHeader metafileHeader = new MetafileHeader();
IntPtr intPtr;
if (fileName == null)
intPtr = (IntPtr)(void*)null;
else {
ref pinnableReference = ref fileName.GetPinnableReference();
intPtr = (IntPtr)(&pinnableReference);
}
char* value = (char*)(long)intPtr;
fixed (global::Windows.Win32.Graphics.GdiPlus.MetafileHeader* header = &metafileHeader._header) {
PInvokeGdiPlus.GdipGetMetafileHeaderFromFile(value, header).ThrowIfFailed();
return metafileHeader;
}
}
public unsafe static MetafileHeader GetMetafileHeader(Stream stream)
{
ArgumentNullException.ThrowIfNull(stream, "stream");
MetafileHeader metafileHeader = new MetafileHeader();
fixed (global::Windows.Win32.Graphics.GdiPlus.MetafileHeader* header = &metafileHeader._header) {
ComScope<IStream> scope = stream.ToIStream(true);
try {
PInvokeGdiPlus.GdipGetMetafileHeaderFromStream((IStream*)ref scope, header).ThrowIfFailed();
return metafileHeader;
} finally {
scope.Dispose();
}
}
}
public unsafe MetafileHeader GetMetafileHeader()
{
MetafileHeader metafileHeader = new MetafileHeader();
fixed (global::Windows.Win32.Graphics.GdiPlus.MetafileHeader* header = &metafileHeader._header) {
PInvokeGdiPlus.GdipGetMetafileHeaderFromMetafile(this.Pointer(), header).ThrowIfFailed();
GC.KeepAlive(this);
return metafileHeader;
}
}
public IntPtr GetHenhmetafile()
{
return this.GetHENHMETAFILE();
}
}
}