// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.

#nullable enable

using System.Drawing;
using System.Runtime.InteropServices;
using static Interop;

namespace System.Windows.Forms.Metafiles
{
    [StructLayout(LayoutKind.Sequential)]
    internal struct ENHMETAHEADER
    {
        public uint iType;              // Record typeEMR_HEADER
        public uint nSize;              // Record size in bytes.  This may be greater
                                        // than the sizeof(ENHMETAHEADER).
        public RECT rclBounds;          // Inclusive-inclusive bounds in device units
        public RECT rclFrame;           // Inclusive-inclusive Picture Frame of metafile in .01 mm units
        public uint dSignature;         // Signature.  Must be ENHMETA_SIGNATURE.
        public uint nVersion;           // Version number
        public uint nBytes;             // Size of the metafile in bytes
        public uint nRecords;           // Number of records in the metafile
        public ushort nHandles;         // Number of handles in the handle table
                                        // Handle index zero is reserved.
        public ushort sReserved;        // Reserved.  Must be zero.
        public uint nDescription;       // Number of chars in the unicode description string
                                        // This is 0 if there is no description string
        public uint offDescription;     // Offset to the metafile description record.
                                        // This is 0 if there is no description string
        public uint nPalEntries;        // Number of entries in the metafile palette.
        public Size szlDevice;          // Size of the reference device in pels
        public Size szlMillimeters;     // Size of the reference device in millimeters

        // The next three bring the size up to 100 bytes
        public uint cbPixelFormat;      // Size of PIXELFORMATDESCRIPTOR information
                                        // This is 0 if no pixel format is set
        public uint offPixelFormat;     // Offset to PIXELFORMATDESCRIPTOR
                                        // This is 0 if no pixel format is set
        public BOOL bOpenGL;            // TRUE if OpenGL commands are present in
                                        // the metafile, otherwise FALSE

        // The next field brings the size to 108 bytes
        public Size szlMicrometers;     // Size of the reference device in micrometers

        public override string ToString() => $@"[{nameof(ENHMETAHEADER)}] Bounds: {rclBounds} Device Size: {
            szlDevice} Header Size: {nSize}";
    }
}
