Files
ThreeAM/colors.hpp
2024-01-16 14:21:54 -06:00

57 lines
1.6 KiB
C++

#ifndef H_29BB41A351824C13AA4B9673DCEC215D
#define H_29BB41A351824C13AA4B9673DCEC215D
#include <cstdint>
struct Pixel
{
uint8_t green;
uint8_t red;
uint8_t blue;
void set(uint8_t g, uint8_t r, uint8_t b)
{
green = g;
red = r;
blue = b;
}
void set(const uint8_t* grb)
{
set(grb[0], grb[1], grb[2]);
}
uint32_t get()
{
return green << 24 | red << 16 | blue << 8;
}
};
struct BigPixel
{
uint32_t value;
//should check for endianness I think
//but there is no fully compliant way to test at compile time
#if defined(__BYTE_ORDER__)&&(__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)
uint8_t& green() { return *(reinterpret_cast<uint8_t*>(value)+0); }
uint8_t& red() { return *(reinterpret_cast<uint8_t*>(value)+1); }
uint8_t& blue() { return *(reinterpret_cast<uint8_t*>(value)+2); }
uint8_t& white() { return *(reinterpret_cast<uint8_t*>(value)+3); }
#else
uint8_t& green() { return *(reinterpret_cast<uint8_t*>(value)+3); }
uint8_t& red() { return *(reinterpret_cast<uint8_t*>(value)+2); }
uint8_t& blue() { return *(reinterpret_cast<uint8_t*>(value)+1); }
uint8_t& white() { return *(reinterpret_cast<uint8_t*>(value)+0); }
#endif
};
// GRB color
const Pixel Callie = { 0xD0, 0xA0, 0xC8 };
const Pixel Coqui = { 0xF4, 0xFF, 0x91 };
const Pixel Meat = { 0xEA, 0xCD, 0xBF };
const Pixel Olivia = { 0xCC, 0xFF, 0xE7 };
const BigPixel bCallie = { 0xD0A0C800 };
const BigPixel bCoqui = { 0xF4FF9100 };
const BigPixel bMeat = { 0xEACDBF00 };
const BigPixel bOlivia = { 0xCCFFE700 };
#endif //H_29BB41A351824C13AA4B9673DCEC215D