Skip to content

Commit 031730c

Browse files
authored
Merge pull request #1194 from godot-rust/qol/all-color-constants
`Color`: const constructors, add `ALL_GODOT_COLORS` constant
2 parents 5fc4358 + 598d891 commit 031730c

File tree

2 files changed

+172
-13
lines changed

2 files changed

+172
-13
lines changed

godot-core/src/builtin/color.rs

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ use sys::{ffi_methods, GodotFfi};
2222
///
2323
/// To access its [**HSVA**](ColorHsv) representation, use [`Color::to_hsv`].
2424
///
25+
/// Predefined colors are available as constants, see the corresponding [`impl` block](#impl-Color-1).
26+
///
2527
/// # Godot docs
2628
///
2729
/// [`Color` (stable)](https://docs.godotengine.org/en/stable/classes/class_color.html)
@@ -58,28 +60,29 @@ impl Color {
5860
/// mapped to 1.0.
5961
///
6062
/// _Godot equivalent: the global `Color8` function_
61-
pub fn from_rgba8(r: u8, g: u8, b: u8, a: u8) -> Self {
63+
pub const fn from_rgba8(r: u8, g: u8, b: u8, a: u8) -> Self {
6264
Self::from_rgba(from_u8(r), from_u8(g), from_u8(b), from_u8(a))
6365
}
6466

65-
/// Constructs a new `Color` with the given components as `u16` words. 0 is mapped to 0.0,
66-
/// 65535 (`0xffff`) is mapped to 1.0.
67-
pub fn from_rgba16(r: u16, g: u16, b: u16, a: u16) -> Self {
67+
/// Constructs a new `Color` with the given components as `u16` words.
68+
///
69+
/// 0 is mapped to 0.0, 65535 (`0xFFFF`) is mapped to 1.0.
70+
pub const fn from_rgba16(r: u16, g: u16, b: u16, a: u16) -> Self {
6871
Self::from_rgba(from_u16(r), from_u16(g), from_u16(b), from_u16(a))
6972
}
7073

7174
/// Constructs a new `Color` from a 32-bits value with the given channel `order`.
7275
///
7376
/// _Godot equivalent: `Color.hex`, if `ColorChannelOrder::Rgba` is used_
74-
pub fn from_u32_rgba(u: u32, order: ColorChannelOrder) -> Self {
77+
pub const fn from_u32_rgba(u: u32, order: ColorChannelOrder) -> Self {
7578
let [r, g, b, a] = order.unpack(u.to_be_bytes());
7679
Color::from_rgba8(r, g, b, a)
7780
}
7881

7982
/// Constructs a new `Color` from a 64-bits value with the given channel `order`.
8083
///
8184
/// _Godot equivalent: `Color.hex64`, if `ColorChannelOrder::Rgba` is used_
82-
pub fn from_u64_rgba(u: u64, order: ColorChannelOrder) -> Self {
85+
pub const fn from_u64_rgba(u: u64, order: ColorChannelOrder) -> Self {
8386
let [r, g, b, a] = order.unpack(to_be_words(u));
8487
Color::from_rgba16(r, g, b, a)
8588
}
@@ -383,7 +386,7 @@ pub enum ColorChannelOrder {
383386
}
384387

385388
impl ColorChannelOrder {
386-
fn pack<T>(self, rgba: [T; 4]) -> [T; 4] {
389+
const fn pack<T: Copy>(self, rgba: [T; 4]) -> [T; 4] {
387390
let [r, g, b, a] = rgba;
388391
match self {
389392
ColorChannelOrder::RGBA => [r, g, b, a],
@@ -392,7 +395,7 @@ impl ColorChannelOrder {
392395
}
393396
}
394397

395-
fn unpack<T>(self, xyzw: [T; 4]) -> [T; 4] {
398+
const fn unpack<T: Copy>(self, xyzw: [T; 4]) -> [T; 4] {
396399
let [x, y, z, w] = xyzw;
397400
match self {
398401
ColorChannelOrder::RGBA => [x, y, z, w],
@@ -510,12 +513,12 @@ impl ops::Neg for Color {
510513
}
511514

512515
/// Converts a single channel byte to a float in the range 0 to 1.
513-
fn from_u8(byte: u8) -> f32 {
516+
const fn from_u8(byte: u8) -> f32 {
514517
byte as f32 / 255.0
515518
}
516519

517520
/// Converts a single channel `u16` word to a float in the range 0 to 1.
518-
fn from_u16(byte: u16) -> f32 {
521+
const fn from_u16(byte: u16) -> f32 {
519522
byte as f32 / 65535.0
520523
}
521524

@@ -542,7 +545,7 @@ fn from_be_words(words: [u16; 4]) -> u64 {
542545
}
543546

544547
/// Unpacks a `u64` into four `u16` words in big-endian order.
545-
fn to_be_words(mut u: u64) -> [u16; 4] {
548+
const fn to_be_words(mut u: u64) -> [u16; 4] {
546549
let w = (u & 0xffff) as u16;
547550
u >>= 16;
548551
let z = (u & 0xffff) as u16;

godot-core/src/builtin/color_constants.rs

Lines changed: 158 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,9 @@ use crate::builtin::Color;
99

1010
/// Godot's predefined colors.
1111
///
12-
/// This [visual cheat sheet](https://raw.githubusercontent.com/godotengine/godot-docs/master/img/color_constants.png)
13-
/// shows how the colors look.
12+
/// This [visual cheat sheet](https://raw.githubusercontent.com/godotengine/godot-docs/master/img/color_constants.png) shows how the colors look.
13+
///
14+
/// For a systematic list of all predefined Godot colors, check out the [`ALL_GODOT_COLORS`][Self::ALL_GODOT_COLORS] constant.
1415
impl Color {
1516
/// Transparent black.
1617
///
@@ -169,4 +170,159 @@ impl Color {
169170
pub const WHITE_SMOKE: Color = Color::from_rgba(0.960784, 0.960784, 0.960784, 1.0);
170171
pub const YELLOW: Color = Color::from_rgba(1.0, 1.0, 0.0, 1.0);
171172
pub const YELLOW_GREEN: Color = Color::from_rgba(0.603922, 0.803922, 0.196078, 1.0);
173+
174+
/// All colors that Godot itself defines on the `Color` builtin type, in alphabetic order.
175+
///
176+
/// Contains tuples where the first element is the name of the color constant, and the second element is the corresponding [`Color`].
177+
///
178+
/// Excludes Rust-specific colors like `TRANSPARENT_BLACK` and `TRANSPARENT_WHITE`.
179+
///
180+
/// This list may change over time.
181+
pub const ALL_GODOT_COLORS: &'static [(&'static str, Color)] = &[
182+
("ALICE_BLUE", Self::ALICE_BLUE),
183+
("ANTIQUE_WHITE", Self::ANTIQUE_WHITE),
184+
("AQUA", Self::AQUA),
185+
("AQUAMARINE", Self::AQUAMARINE),
186+
("AZURE", Self::AZURE),
187+
("BEIGE", Self::BEIGE),
188+
("BISQUE", Self::BISQUE),
189+
("BLACK", Self::BLACK),
190+
("BLANCHED_ALMOND", Self::BLANCHED_ALMOND),
191+
("BLUE", Self::BLUE),
192+
("BLUE_VIOLET", Self::BLUE_VIOLET),
193+
("BROWN", Self::BROWN),
194+
("BURLYWOOD", Self::BURLYWOOD),
195+
("CADET_BLUE", Self::CADET_BLUE),
196+
("CHARTREUSE", Self::CHARTREUSE),
197+
("CHOCOLATE", Self::CHOCOLATE),
198+
("CORAL", Self::CORAL),
199+
("CORNFLOWER_BLUE", Self::CORNFLOWER_BLUE),
200+
("CORNSILK", Self::CORNSILK),
201+
("CRIMSON", Self::CRIMSON),
202+
("CYAN", Self::CYAN),
203+
("DARK_BLUE", Self::DARK_BLUE),
204+
("DARK_CYAN", Self::DARK_CYAN),
205+
("DARK_GOLDENROD", Self::DARK_GOLDENROD),
206+
("DARK_GRAY", Self::DARK_GRAY),
207+
("DARK_GREEN", Self::DARK_GREEN),
208+
("DARK_KHAKI", Self::DARK_KHAKI),
209+
("DARK_MAGENTA", Self::DARK_MAGENTA),
210+
("DARK_OLIVE_GREEN", Self::DARK_OLIVE_GREEN),
211+
("DARK_ORANGE", Self::DARK_ORANGE),
212+
("DARK_ORCHID", Self::DARK_ORCHID),
213+
("DARK_RED", Self::DARK_RED),
214+
("DARK_SALMON", Self::DARK_SALMON),
215+
("DARK_SEA_GREEN", Self::DARK_SEA_GREEN),
216+
("DARK_SLATE_BLUE", Self::DARK_SLATE_BLUE),
217+
("DARK_SLATE_GRAY", Self::DARK_SLATE_GRAY),
218+
("DARK_TURQUOISE", Self::DARK_TURQUOISE),
219+
("DARK_VIOLET", Self::DARK_VIOLET),
220+
("DEEP_PINK", Self::DEEP_PINK),
221+
("DEEP_SKY_BLUE", Self::DEEP_SKY_BLUE),
222+
("DIM_GRAY", Self::DIM_GRAY),
223+
("DODGER_BLUE", Self::DODGER_BLUE),
224+
("FIREBRICK", Self::FIREBRICK),
225+
("FLORAL_WHITE", Self::FLORAL_WHITE),
226+
("FOREST_GREEN", Self::FOREST_GREEN),
227+
("FUCHSIA", Self::FUCHSIA),
228+
("GAINSBORO", Self::GAINSBORO),
229+
("GHOST_WHITE", Self::GHOST_WHITE),
230+
("GOLD", Self::GOLD),
231+
("GOLDENROD", Self::GOLDENROD),
232+
("GRAY", Self::GRAY),
233+
("GREEN", Self::GREEN),
234+
("GREEN_YELLOW", Self::GREEN_YELLOW),
235+
("HONEYDEW", Self::HONEYDEW),
236+
("HOT_PINK", Self::HOT_PINK),
237+
("INDIAN_RED", Self::INDIAN_RED),
238+
("INDIGO", Self::INDIGO),
239+
("IVORY", Self::IVORY),
240+
("KHAKI", Self::KHAKI),
241+
("LAVENDER", Self::LAVENDER),
242+
("LAVENDER_BLUSH", Self::LAVENDER_BLUSH),
243+
("LAWN_GREEN", Self::LAWN_GREEN),
244+
("LEMON_CHIFFON", Self::LEMON_CHIFFON),
245+
("LIGHT_BLUE", Self::LIGHT_BLUE),
246+
("LIGHT_CORAL", Self::LIGHT_CORAL),
247+
("LIGHT_CYAN", Self::LIGHT_CYAN),
248+
("LIGHT_GOLDENROD", Self::LIGHT_GOLDENROD),
249+
("LIGHT_GRAY", Self::LIGHT_GRAY),
250+
("LIGHT_GREEN", Self::LIGHT_GREEN),
251+
("LIGHT_PINK", Self::LIGHT_PINK),
252+
("LIGHT_SALMON", Self::LIGHT_SALMON),
253+
("LIGHT_SEA_GREEN", Self::LIGHT_SEA_GREEN),
254+
("LIGHT_SKY_BLUE", Self::LIGHT_SKY_BLUE),
255+
("LIGHT_SLATE_GRAY", Self::LIGHT_SLATE_GRAY),
256+
("LIGHT_STEEL_BLUE", Self::LIGHT_STEEL_BLUE),
257+
("LIGHT_YELLOW", Self::LIGHT_YELLOW),
258+
("LIME", Self::LIME),
259+
("LIME_GREEN", Self::LIME_GREEN),
260+
("LINEN", Self::LINEN),
261+
("MAGENTA", Self::MAGENTA),
262+
("MAROON", Self::MAROON),
263+
("MEDIUM_AQUAMARINE", Self::MEDIUM_AQUAMARINE),
264+
("MEDIUM_BLUE", Self::MEDIUM_BLUE),
265+
("MEDIUM_ORCHID", Self::MEDIUM_ORCHID),
266+
("MEDIUM_PURPLE", Self::MEDIUM_PURPLE),
267+
("MEDIUM_SEA_GREEN", Self::MEDIUM_SEA_GREEN),
268+
("MEDIUM_SLATE_BLUE", Self::MEDIUM_SLATE_BLUE),
269+
("MEDIUM_SPRING_GREEN", Self::MEDIUM_SPRING_GREEN),
270+
("MEDIUM_TURQUOISE", Self::MEDIUM_TURQUOISE),
271+
("MEDIUM_VIOLET_RED", Self::MEDIUM_VIOLET_RED),
272+
("MIDNIGHT_BLUE", Self::MIDNIGHT_BLUE),
273+
("MINT_CREAM", Self::MINT_CREAM),
274+
("MISTY_ROSE", Self::MISTY_ROSE),
275+
("MOCCASIN", Self::MOCCASIN),
276+
("NAVAJO_WHITE", Self::NAVAJO_WHITE),
277+
("NAVY_BLUE", Self::NAVY_BLUE),
278+
("OLD_LACE", Self::OLD_LACE),
279+
("OLIVE", Self::OLIVE),
280+
("OLIVE_DRAB", Self::OLIVE_DRAB),
281+
("ORANGE", Self::ORANGE),
282+
("ORANGE_RED", Self::ORANGE_RED),
283+
("ORCHID", Self::ORCHID),
284+
("PALE_GOLDENROD", Self::PALE_GOLDENROD),
285+
("PALE_GREEN", Self::PALE_GREEN),
286+
("PALE_TURQUOISE", Self::PALE_TURQUOISE),
287+
("PALE_VIOLET_RED", Self::PALE_VIOLET_RED),
288+
("PAPAYA_WHIP", Self::PAPAYA_WHIP),
289+
("PEACH_PUFF", Self::PEACH_PUFF),
290+
("PERU", Self::PERU),
291+
("PINK", Self::PINK),
292+
("PLUM", Self::PLUM),
293+
("POWDER_BLUE", Self::POWDER_BLUE),
294+
("PURPLE", Self::PURPLE),
295+
("REBECCA_PURPLE", Self::REBECCA_PURPLE),
296+
("RED", Self::RED),
297+
("ROSY_BROWN", Self::ROSY_BROWN),
298+
("ROYAL_BLUE", Self::ROYAL_BLUE),
299+
("SADDLE_BROWN", Self::SADDLE_BROWN),
300+
("SALMON", Self::SALMON),
301+
("SANDY_BROWN", Self::SANDY_BROWN),
302+
("SEA_GREEN", Self::SEA_GREEN),
303+
("SEASHELL", Self::SEASHELL),
304+
("SIENNA", Self::SIENNA),
305+
("SILVER", Self::SILVER),
306+
("SKY_BLUE", Self::SKY_BLUE),
307+
("SLATE_BLUE", Self::SLATE_BLUE),
308+
("SLATE_GRAY", Self::SLATE_GRAY),
309+
("SNOW", Self::SNOW),
310+
("SPRING_GREEN", Self::SPRING_GREEN),
311+
("STEEL_BLUE", Self::STEEL_BLUE),
312+
("TAN", Self::TAN),
313+
("TEAL", Self::TEAL),
314+
("THISTLE", Self::THISTLE),
315+
("TOMATO", Self::TOMATO),
316+
("TURQUOISE", Self::TURQUOISE),
317+
("VIOLET", Self::VIOLET),
318+
("WEB_GRAY", Self::WEB_GRAY),
319+
("WEB_GREEN", Self::WEB_GREEN),
320+
("WEB_MAROON", Self::WEB_MAROON),
321+
("WEB_PURPLE", Self::WEB_PURPLE),
322+
("WHEAT", Self::WHEAT),
323+
("WHITE", Self::WHITE),
324+
("WHITE_SMOKE", Self::WHITE_SMOKE),
325+
("YELLOW", Self::YELLOW),
326+
("YELLOW_GREEN", Self::YELLOW_GREEN),
327+
];
172328
}

0 commit comments

Comments
 (0)