module Graphics.LambdaCube.PixelFormat where

-- | The pixel format used for images, textures, and render surfaces
data PixelFormat
    = PF_UNKNOWN        -- ^ Unknown pixel format.
    | PF_L8             -- ^ 8-bit pixel format, all bits luminace.
--    | PF_BYTE_L = PF_L8
    | PF_L16            -- ^ 16-bit pixel format, all bits luminace.
--    | PF_SHORT_L = PF_L16
    | PF_A8             -- ^ 8-bit pixel format, all bits alpha.
--    | PF_BYTE_A = PF_A8
    | PF_A4L4           -- ^ 8-bit pixel format, 4 bits alpha, 4 bits luminance.
    | PF_BYTE_LA        -- ^ 2 byte pixel format, 1 byte luminance, 1 byte alpha
    | PF_R5G6B5         -- ^ 16-bit pixel format, 5 bits red, 6 bits green, 5 bits blue.
    | PF_B5G6R5         -- ^ 16-bit pixel format, 5 bits red, 6 bits green, 5 bits blue.
    | PF_R3G3B2         -- ^ 8-bit pixel format, 2 bits blue, 3 bits green, 3 bits red.
    | PF_A4R4G4B4       -- ^ 16-bit pixel format, 4 bits for alpha, red, green and blue.
    | PF_A1R5G5B5       -- ^ 16-bit pixel format, 5 bits for blue, green, red and 1 for alpha.
    | PF_R8G8B8         -- ^ 24-bit pixel format, 8 bits for red, green and blue.
    | PF_B8G8R8         -- ^ 24-bit pixel format, 8 bits for blue, green and red.
    | PF_A8R8G8B8       -- ^ 32-bit pixel format, 8 bits for alpha, red, green and blue.
    | PF_A8B8G8R8       -- ^ 32-bit pixel format, 8 bits for blue, green, red and alpha.
    | PF_B8G8R8A8       -- ^ 32-bit pixel format, 8 bits for blue, green, red and alpha.
    | PF_R8G8B8A8       -- ^ 32-bit pixel format, 8 bits for red, green, blue and alpha.
    | PF_X8R8G8B8       -- ^ 32-bit pixel format, 8 bits for red, 8 bits for green, 8 bits for blue; like PF_A8R8G8B8, but alpha will get discarded
    | PF_X8B8G8R8       -- ^ 32-bit pixel format, 8 bits for blue, 8 bits for green, 8 bits for red; like PF_A8B8G8R8, but alpha will get discarded
    | PF_A2R10G10B10    -- ^ 32-bit pixel format, 2 bits for alpha, 10 bits for red, green and blue.
    | PF_A2B10G10R10    -- ^ 32-bit pixel format, 10 bits for blue, green and red, 2 bits for alpha.
    | PF_DXT1           -- ^ DDS (DirectDraw Surface) DXT1 format
    | PF_DXT2           -- ^ DDS (DirectDraw Surface) DXT2 format
    | PF_DXT3           -- ^ DDS (DirectDraw Surface) DXT3 format
    | PF_DXT4           -- ^ DDS (DirectDraw Surface) DXT4 format
    | PF_DXT5           -- ^ DDS (DirectDraw Surface) DXT5 format
    | PF_FLOAT16_R      -- ^ 16-bit pixel format, 16 bits (float) for red
    | PF_FLOAT16_RGB    -- ^ 48-bit pixel format, 16 bits (float) for red, 16 bits (float) for green, 16 bits (float) for blue
    | PF_FLOAT16_RGBA   -- ^ 64-bit pixel format, 16 bits (float) for red, 16 bits (float) for green, 16 bits (float) for blue, 16 bits (float) for alpha
    | PF_FLOAT32_R      -- ^ 16-bit pixel format, 16 bits (float) for red
    | PF_FLOAT32_RGB    -- ^ 96-bit pixel format, 32 bits (float) for red, 32 bits (float) for green, 32 bits (float) for blue
    | PF_FLOAT32_RGBA   -- ^ 128-bit pixel format, 32 bits (float) for red, 32 bits (float) for green, 32 bits (float) for blue, 32 bits (float) for alpha
    | PF_FLOAT16_GR     -- ^ 32-bit, 2-channel s10e5 floating point pixel format, 16-bit green, 16-bit red
    | PF_FLOAT32_GR     -- ^ 64-bit, 2-channel floating point pixel format, 32-bit green, 32-bit red
    | PF_DEPTH          -- ^ Depth texture format
    | PF_SHORT_RGBA     -- ^ 64-bit pixel format, 16 bits for red, green, blue and alpha
    | PF_SHORT_GR       -- ^ 32-bit pixel format, 16-bit green, 16-bit red
    | PF_SHORT_RGB      -- ^ 48-bit pixel format, 16 bits for red, green and blue
    deriving (Eq,Ord)

-- | Flags defining some on/off properties of pixel formats
data PixelFormatFlags
    = PFF_HASALPHA      -- ^ This format has an alpha channel
    | PFF_COMPRESSED    -- ^ This format is compressed. This invalidates the values in elemBytes, elemBits and the bit counts as these might not be fixed in a compressed format.
    | PFF_FLOAT         -- ^ This is a floating point format
    | PFF_DEPTH         -- ^ This is a depth format (for depth textures)
    | PFF_NATIVEENDIAN  -- ^ Format is in native endian. Generally true for the 16, 24 and 32 bits formats which can be represented as machine integers.
    | PFF_LUMINANCE     -- ^ This is an intensity format instead of a RGB one. The luminance replaces R,G and B. (but not A)

-- | Pixel component format
data PixelComponentType
    = PCT_BYTE      -- ^ Byte per component (8 bit fixed 0.0..1.0)
    | PCT_SHORT     -- ^ Short per component (16 bit fixed 0.0..1.0))
    | PCT_FLOAT16   -- ^ 16 bit float per component
    | PCT_FLOAT32   -- ^ 32 bit float per component