#pragma once struct Color16 { static constexpr std::uint8_t MaxRed = 0x1f; static constexpr std::uint8_t MaxGreen = 0x3f; static constexpr std::uint8_t MaxBlue = 0x1f; constexpr Color16() : value(0){} constexpr Color16(std::uint16_t v) : value(v){} static constexpr Color16 red() { Color16 result; result.r(MaxRed); result.g(0); result.b(0); return result; } static constexpr Color16 green() { Color16 result; result.r(0); result.g(MaxGreen); result.b(0); return result; } static constexpr Color16 blue() { Color16 result; result.r(0); result.g(0); result.b(MaxBlue); return result; } static constexpr Color16 white() { Color16 result; result.r(MaxRed); result.g(MaxGreen); result.b(MaxBlue); return result; } std::uint16_t value; constexpr std::uint8_t r() const{ return (value & 0xf800) >> 11; } constexpr std::uint8_t g() const{ return (value & 0x7e0) >> 5; } constexpr std::uint8_t b() const{ return (value & 0x1f); } constexpr void r(std::uint8_t v){ value = (value & ~0xf800) | (v << 11); } constexpr void g(std::uint8_t v){ value = (value & ~0x7e0) | (v << 5); } constexpr void b(std::uint8_t v){ value = (value & ~0x1f) | (v); } };