#color #macro

colorthis

元宏,帮助宏作者使用通用语法创建颜色

2个版本

0.1.1 2023年10月15日
0.1.0 2023年10月15日

#1877 in 过程宏


用于 bevy_aoui_widgets

MIT/Apache

41KB
777

colorthis

Crates.io Docs

元宏,帮助宏作者使用通用语法创建颜色。

通用语法

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));

然而,如果所有值都是 01,并且调用的宏是 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 在编译时解析和生成这些数据。无需外部支持。

功能标志

uncheckedclamp

默认情况下,我们断言整数在 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