CYD-UI
A C++ library for building native graphic user interfaces
Loading...
Searching...
No Matches
color.cppm
Go to the documentation of this file.
1// Copyright (c) 2024, Víctor Castillo Agüero.
2// SPDX-License-Identifier: GPL-3.0-or-later
3
5
6import std;
7
8import fabric.type_aliases;
9import fabric.char_utils;
10import fabric.templates.str_buffer;
11
12export namespace color {
13 struct Color {
14 double r = 0.0;
15 double g = 0.0;
16 double b = 0.0;
17 double a = 1.0;
18
19 [[nodiscard("Don't call 'to_string()' if you don't need a string.")]]
20 std::string to_string() const {
21 std::ostringstream oss;
22 oss << '#';
23 oss << std::setfill('0') << std::setw(2) << std::hex << static_cast<int>(r * 255.0);
24 oss << std::setfill('0') << std::setw(2) << std::hex << static_cast<int>(g * 255.0);
25 oss << std::setfill('0') << std::setw(2) << std::hex << static_cast<int>(b * 255.0);
26 return oss.str();
27 }
28
29 u32 to_id() const {
30 u32 id = 0;
31 return id | ((u32)r << 16) | ((u32)g << 8) | (u32)b;
32 }
33
34 bool operator==(const Color& rhl) const {
35 return r == rhl.r && g == rhl.g && b == rhl.b && a == rhl.a;
36 }
37
38 static Color from_str(const std::string& data) {
39 u8 r = 0U;
40 (void)std::from_chars(&data[1], &data[3], r, 16);
41 u8 g = 0U;
42 (void)std::from_chars(&data[3], &data[5], g, 16);
43 u8 b = 0U;
44 (void)std::from_chars(&data[5], &data[7], b, 16);
45 if (data.size() == 9) {
46 u8 a = 0U;
47 (void)std::from_chars(&data[7], &data[9], a, 16);
48 return {(double)r / 255.0, (double)g / 255.0, (double)b / 255.0, (double)a / 255.0};
49 } else {
50 return {(double)r / 255.0, (double)g / 255.0, (double)b / 255.0, 1.0};
51 }
52 }
53 };
54}
55
56export template<template_str_buffer data>
57consteval color::Color operator ""_color() {
58 static_assert(data.count == 7 || data.count == 9, "Invalid Color, wrong length");
59 static_assert(data.data[0] == '#', "Invalid Color, must begin with '#'");
60
61 static_assert(char_is_hex(data.data[1]), "Invalid char (1), must be hexadecimal");
62 static_assert(char_is_hex(data.data[2]), "Invalid char (2), must be hexadecimal");
63 static_assert(char_is_hex(data.data[3]), "Invalid char (3), must be hexadecimal");
64 static_assert(char_is_hex(data.data[4]), "Invalid char (4), must be hexadecimal");
65 static_assert(char_is_hex(data.data[5]), "Invalid char (5), must be hexadecimal");
66 static_assert(char_is_hex(data.data[6]), "Invalid char (6), must be hexadecimal");
67 if constexpr (data.count == 9) {
68 static_assert(char_is_hex(data.data[7]), "Invalid char (7), must be hexadecimal");
69 static_assert(char_is_hex(data.data[8]), "Invalid char (8), must be hexadecimal");
70 }
71
72 u8 r = 0U;
73 (void) std::from_chars(&data.data[1], &data.data[3], r, 16);
74 u8 g = 0U;
75 (void) std::from_chars(&data.data[3], &data.data[5], g, 16);
76 u8 b = 0U;
77 (void) std::from_chars(&data.data[5], &data.data[7], b, 16);
78 if (data.count == 9) {
79 u8 a = 0U;
80 (void) std::from_chars(&data.data[7], &data.data[9], a, 16);
81 return {(double) r / 255.0, (double) g / 255.0, (double) b / 255.0, (double) a / 255.0};
82 } else {
83 return {(double) r / 255.0, (double) g / 255.0, (double) b / 255.0, 1.0};
84 }
85}
86
87export namespace color {
88 Color White = "#FFFFFF"_color;
89 Color Black = "#000000"_color;
90 Color Red = "#FF0000"_color;
91 Color Green = "#00FF00"_color;
92 Color Blue = "#0000FF"_color;
93 Color Transparent = "#00000000"_color;
94}
Color White
Definition color.cppm:88
Color Black
Definition color.cppm:89
Color Blue
Definition color.cppm:92
Color Transparent
Definition color.cppm:93
Color Red
Definition color.cppm:90
Color Green
Definition color.cppm:91
std::string to_string() const
Definition color.cppm:20
double g
Definition color.cppm:15
bool operator==(const Color &rhl) const
Definition color.cppm:34
double b
Definition color.cppm:16
u32 to_id() const
Definition color.cppm:29
double a
Definition color.cppm:17
double r
Definition color.cppm:14
static Color from_str(const std::string &data)
Definition color.cppm:38