using System.Runtime.InteropServices;

namespace Raylib_cs;

/// <summary>
/// Pixel formats<br/>
/// NOTE: Support depends on OpenGL version and platform
/// </summary>
public enum PixelFormat
{
    /// <summary>
    /// 8 bit per pixel (no alpha)
    /// </summary>
    PIXELFORMAT_UNCOMPRESSED_GRAYSCALE = 1,

    /// <summary>
    /// 8*2 bpp (2 channels)
    /// </summary>
    PIXELFORMAT_UNCOMPRESSED_GRAY_ALPHA,

    /// <summary>
    /// 16 bpp
    /// </summary>
    PIXELFORMAT_UNCOMPRESSED_R5G6B5,

    /// <summary>
    /// 24 bpp
    /// </summary>
    PIXELFORMAT_UNCOMPRESSED_R8G8B8,

    /// <summary>
    /// 16 bpp (1 bit alpha)
    /// </summary>
    PIXELFORMAT_UNCOMPRESSED_R5G5B5A1,

    /// <summary>
    /// 16 bpp (4 bit alpha)
    /// </summary>
    PIXELFORMAT_UNCOMPRESSED_R4G4B4A4,

    /// <summary>
    /// 32 bpp
    /// </summary>
    PIXELFORMAT_UNCOMPRESSED_R8G8B8A8,

    /// <summary>
    /// 32 bpp (1 channel - float)
    /// </summary>
    PIXELFORMAT_UNCOMPRESSED_R32,

    /// <summary>
    /// 32*3 bpp (3 channels - float)
    /// </summary>
    PIXELFORMAT_UNCOMPRESSED_R32G32B32,

    /// <summary>
    /// 32*4 bpp (4 channels - float)
    /// </summary>
    PIXELFORMAT_UNCOMPRESSED_R32G32B32A32,

    /// <summary>
    /// 4 bpp (no alpha)
    /// </summary>
    PIXELFORMAT_COMPRESSED_DXT1_RGB,

    /// <summary>
    /// 4 bpp (1 bit alpha)
    /// </summary>
    PIXELFORMAT_COMPRESSED_DXT1_RGBA,

    /// <summary>
    /// 8 bpp
    /// </summary>
    PIXELFORMAT_COMPRESSED_DXT3_RGBA,

    /// <summary>
    /// 8 bpp
    /// </summary>
    PIXELFORMAT_COMPRESSED_DXT5_RGBA,

    /// <summary>
    /// 4 bpp
    /// </summary>
    PIXELFORMAT_COMPRESSED_ETC1_RGB,

    /// <summary>
    /// 4 bpp
    /// </summary>
    PIXELFORMAT_COMPRESSED_ETC2_RGB,

    /// <summary>
    /// 8 bpp
    /// </summary>
    PIXELFORMAT_COMPRESSED_ETC2_EAC_RGBA,

    /// <summary>
    /// 4 bpp
    /// </summary>
    PIXELFORMAT_COMPRESSED_PVRT_RGB,

    /// <summary>
    /// 4 bpp
    /// </summary>
    PIXELFORMAT_COMPRESSED_PVRT_RGBA,

    /// <summary>
    /// 8 bpp
    /// </summary>
    PIXELFORMAT_COMPRESSED_ASTC_4x4_RGBA,

    /// <summary>
    /// 2 bpp
    /// </summary>
    PIXELFORMAT_COMPRESSED_ASTC_8x8_RGBA
}

/// <summary>
/// Image, pixel data stored in CPU memory (RAM)
/// </summary>
[StructLayout(LayoutKind.Sequential)]
public unsafe partial struct Image
{
    /// <summary>
    /// Image raw data
    /// </summary>
    public void* Data;

    /// <summary>
    /// Image base width
    /// </summary>
    public int Width;

    /// <summary>
    /// Image base height
    /// </summary>
    public int Height;

    /// <summary>
    /// Mipmap levels, 1 by default
    /// </summary>
    public int Mipmaps;

    /// <summary>
    /// Data format (PixelFormat type)
    /// </summary>
    public PixelFormat Format;
}