#ifndef SPECTRE_GRAPHICS_PIXELFORMAT_H
#define SPECTRE_GRAPHICS_PIXELFORMAT_H

#include <cstdint>

namespace sp {

enum PixelFormat
{
	PF_Unknown      = 0,
	PF_Alpha        = 1, // 8 bit alpha channel.

	// Byte-order formats.
	// Pixels are always ordered with the first channel at the first byte, second channel at the second byte.
	// ---------------------------

	PF_RGB	        = 2, // Standard RGB: 24 bits per pixel, 8 bits are used for red, green, blue.
	PF_RGBX	        = 3, // 32 bits per pixel, 8 bits are used for red, green, Last 8 bits are unused.
	PF_RGBA	        = 4, // Standard RGBA: 32 bits per pixel, 8 bits are used for red, green, blue, alpha.
	PF_BGR          = 5, // 24 bits per pixel, 8 bits are used for blue, green, red.
	PF_BGRX         = 6, // 32 bits per pixel, 8 bits are used for blue, green, red. Last 8 bits are unused.
	PF_BGRA	        = 7, // 32 bits per pixel, 8 bits are used for blue, green, red, alpha.

	// Packed formats.
	// ---------------------------

	// 32-bit: Pixels are in ordered in 32-bit words. where the first channel is stored at the most significant byte (MSB).
	// these formats are architecture dependant (litte/big-endian).
	//                 (MSB) | byte 0    | byte 1    | byte 2    | byte 3    | (LSB)
	PF_RGBX32       = 8,  // | rrrr rrrr | gggg gggg | bbbb bbbb | xxxx xxxx |
	PF_RGBA32       = 9,  // | rrrr rrrr | gggg gggg | bbbb bbbb | aaaa aaaa |
	PF_BGRX32       = 10, // | bbbb bbbb | gggg gggg | rrrr rrrr | xxxx xxxx |
	PF_BGRA32       = 11, // | bbbb bbbb | gggg gggg | rrrr rrrr | aaaa aaaa |

	// 24-bit (unsuppored for now)
	//PF_RGB24        = 12, // | rrrr rrrr | gggg gggg | bbbb bbbb |
	//PF_BGR24        = 13, // | bbbb bbbb | gggg gggg | rrrr rrrr |

	// 16-bit (unsuppored for now)
	//PF_RGB565   = 14, // | rrrr rggg | gggb bbbb |
	//PF_RGBA5551 = 15  // | rrrr rggg | ggb bbbba |
	//PF_RGBX5551 = 16  // | rrrr rggg | ggb bbbbx |
};

uint8_t PF_getNumChannels(enum PixelFormat format);

} // namespace

#endif /* SPECTRE_GRAPHICS_PIXELFORMAT_H */
