Files
OpenVulkano/openVulkanoCpp/Math/RGB565.hpp
Metehan Tuncbilek 3370f0ed85 first test
2024-08-06 17:23:35 +03:00

74 lines
3.2 KiB
C++

/*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
#pragma once
#include "Math/Math.hpp"
#include <algorithm>
namespace OpenVulkano::Math
{
class RGB565
{
static uint16_t Make5(uint8_t val) { return val * 31.0f / 255.0f; }
static uint16_t Make6(uint8_t val) { return val * 63.0f / 255.0f; }
static uint8_t Unmake5(uint16_t val) { return static_cast<uint8_t>(val * 255.0f / 31.0f); }
static uint8_t Unmake6(uint16_t val) { return static_cast<uint8_t>(val * 255.0f / 63.0f); }
static float Unmake5ToFloat(uint16_t val) {return std::clamp(val / 31.0f, 0.0f, 1.0f); }
static float Unmake6ToFloat(uint16_t val) { return std::clamp(val / 63.0f, 0.0f, 1.0f); }
static uint16_t Make5FromFloat(float val) { return (uint16_t)std::clamp(val * 31.0f, 0.0f, 31.f); }
static uint16_t Make6FromFloat(float val) { return (uint16_t) std::clamp(val * 63.0f, 0.0f, 63.f); }
public:
union
{
uint16_t value;
struct
{
uint16_t b : 5;
uint16_t g : 6;
uint16_t r : 5;
};
};
RGB565(Math::Vector4uc color = { 0, 0, 0, 1 }) : b(Make5(color.b)), g(Make6(color.g)), r(Make5(color.r)) {}
RGB565(Math::Vector3uc color = { 0, 0, 0 }) : b(Make5(color.b)), g(Make6(color.g)), r(Make5(color.r)) {}
RGB565(Math::Vector4uc_SIMD color = { 0, 0, 0, 1 }) : b(Make5(color.b)), g(Make6(color.g)), r(Make5(color.r)) {}
RGB565(Math::Vector3uc_SIMD color = { 0, 0, 0 }) : b(Make5(color.b)), g(Make6(color.g)), r(Make5(color.r)) {}
RGB565(Math::Vector4f color = {0.f, 0.f, 0.f, 1.f}) : b(Make5FromFloat(color.b)), g(Make6FromFloat(color.g)), r(Make5FromFloat(color.r)) {}
RGB565(Math::Vector3f color = { 0.f, 0.f, 0.f }) : b(Make5FromFloat(color.b)), g(Make6FromFloat(color.g)), r(Make5FromFloat(color.r)) {}
RGB565(Math::Vector3f_SIMD color = { 0.f, 0.f, 0.f }) : b(Make5FromFloat(color.b)), g(Make6FromFloat(color.g)), r(Make5FromFloat(color.r)) {}
RGB565(Math::Vector4f_SIMD color = { 0.f, 0.f, 0.f, 1.f }) : b(Make5FromFloat(color.b)), g(Make6FromFloat(color.g)), r(Make5FromFloat(color.r)) {}
uint8_t GetR() { return Unmake5(r); }
uint8_t GetG() { return Unmake6(g); }
uint8_t GetB() { return Unmake5(b); }
Math::Vector4uc GetColor() { return { GetR(), GetG(), GetB(), 1 }; }
void SetR(uint8_t red) { r = Make5(red); }
void SetG(uint8_t green) { g = Make6(green); }
void SetB(uint8_t blue) { b = Make5(blue); }
void SetColor(Math::Vector4uc color) { b = Make5(color.b); g = Make6(color.g); r = Make5(color.r); }
float GetRFloat() { return Unmake5ToFloat(r); }
float GetGFloat() { return Unmake6ToFloat(g); }
float GetBFloat() { return Unmake5ToFloat(b); }
Math::Vector4f GetColorFloat() { return { GetRFloat(), GetGFloat(), GetBFloat(), 1.0f }; }
void SetRNormalized(float red) { r = Make5FromFloat(red); }
void SetGNormalized(float green) { g = Make6FromFloat(green); }
void SetBNormalized(float blue) { b = Make5FromFloat(blue); }
void SetColorNormalized(Math::Vector4f color) { b = Make5FromFloat(color.b); g = Make6FromFloat(color.g); r = Make5FromFloat(color.r); }
};
static_assert(sizeof(RGB565) == 2);
}