2个版本
0.1.1 | 2023年10月15日 |
---|---|
0.1.0 | 2023年10月15日 |
#1877 in 过程宏
41KB
777 行
colorthis
元宏,帮助宏作者使用通用语法创建颜色。
通用语法
rgb!($path: path, $color_syntax: tt [=> {$($fields: ident)*}])
路径是一个函数或结构体构造函数
如果没有指定字段,
rgba!(Cmyk, [123, 155, 224, 155]);
生成
Cmyk(123, 155, 224, 155);
如果指定了字段,
rgba!(Cmyk, [123, 155, 224, 155] => {c, m, y, k});
生成
Cmyk {
c: 123,
m: 155,
y: 224,
k: 155,
};
只要结构体实现了Default,就可以填充更大的结构体。
# use colorthis::rgba;
#[derive(Default)]
struct PixelData {
r: u8, g: u8, b: u8, a: u8,
z: u8, brightness: u8, magic_number: u8
}
rgba!(PixelData, [1, 2, 3, 4] => {r, g, b, a, _});
生成
PixelData {
r: 1,
g: 2,
b: 3,
a: 4,
..Default::default()
};
示例用法
macro_rules! bevy_rgba {
($color: tt) => {
::colorthis::rgbaf!(::bevy::prelude::Color::Rgba, $color => {red, green, blue, alpha})
};
($($colors: literal),* $(,)?) => {
::colorthis::rgbaf!(::bevy::prelude::Color::Rgba, [$($colors),*] => {red, green, blue, alpha})
};
}
bevy_rgba!("00EEFFFF");
bevy_rgba!("#AAEE22");
bevy_rgba!(0xAABBCC);
bevy_rgba!(72, 184, 255, 255);
bevy_rgba!(0.23, 0.44, 0.89, 0.50);
bevy_rgba!(Red);
bevy_rgba!(Violet800);
颜色语法
颜色总是TokenTree tt
。
- 括号中的数字:
[0.3, 0.72, 0.98]
,[124, 54, 87, 255]
- 括号中的表达式:
(0.3, 0.72, 0.98)
,(r, g, b + g, a + 0.5)
- 展开语法:
[0.3; 3]
,[0.3; 3, 0.8]
,[0.7; 4]
- 十六进制字符串:
"AABBCC"
,"AABBCCFF"
,"#AABBCC"
,"#AABBCCFF"
- 十六进制数字字面量:
0xAABBCC
,0xAABBCCFF
- CSS颜色名称:
Red
,Blue
- TailwindCSS颜色名称:
Red100
,Sky400
详细信息
括号内数字
如果所有值都是整数,则它们被认为是范围 0..=255
中的。
assert_eq!(rgba!(Color, [32, 144, 220, 125]), Color(32,144,220,125));
如果任何值是浮点数,则值被认为是范围 0.0..=1.0
中的。
因此,由于像144这样的数字超出了这个范围,这会导致编译失败。
assert_eq!(rgba!(Color, [0.5, 144, 220, 125]), Color(32, 144, 220, 125));
然而,如果所有值都是 0
或 1
,并且调用的宏是 rgbf!()
或 rgbaf!()
,1
被视为 1.0
。
assert_eq!(rgbaf!(ColorF, [255, 255, 255, 255]), ColorF(1.0, 1.0, 1.0, 1.0));
assert_eq!(rgbaf!(ColorF, [1.0, 0.5, 1, 0]), ColorF(1.0, 0.5, 1.0, 0.0));
assert_eq!(rgbaf!(ColorF, [1, 0, 1, 0]), ColorF(1.0, 0.0, 1.0, 0.0));
括号表达式
目前我们不会修改表达式或提供类型转换,除了验证表达式的数量,并在需要时提供默认的alpha值。
展开语法
[v; 3]
表示[v, v, v, 255]
[v; 3, a]
表示[v, v, v, a]
[v; 4]
表示[v, v, v, v]
颜色名称
我们依赖于一个 crate 在编译时解析和生成这些数据。无需外部支持。
功能标志
unchecked
和 clamp
默认情况下,我们断言整数在 0..=255
范围内,浮点数在 0.0..=1.0
范围内。
如果没有指定 unchecked,这会失败
rgba!(color, [1000, 255, 128, 0]); // 1000 is not in 0..=255
使用 unchecked
,这可能编译,假设颜色接受 1000
作为输入。
rgba!(color, [1000, 255, 128, 0]);
使用 clamp
,这会编译并将 1000
裁剪为 255
rgba!(color, [1000, 255, 128, 0]); // produces color(255, 255, 128, 0)
紧凑
Compact 允许编译由 3 或 4 个字母组成的紧凑型颜色。
rgba!(color, 0xABC); // compiles to 0xAABBCC
rgba!(color, "1234"); // compiles to "11223344"
rgba!(color, "#FFF"); // compiles to "FFFFFF"
依赖项
~235–315KB