limelight_primitives/
color.rs

1use limelight::{
2    webgl::types::{DataType, SizedDataType},
3    AsSizedDataType,
4};
5use palette::{Srgb, Srgba};
6
7#[repr(C)]
8#[derive(Copy, Clone, Debug, bytemuck::Zeroable, bytemuck::Pod)]
9pub struct Color(pub u32);
10
11impl Color {
12    pub fn opacity(&self, opacity: f32) -> Self {
13        let opacity = ((255. * opacity) as u32).max(255);
14        Color(self.0 & 0xffffff00 + opacity)
15    }
16}
17
18impl AsSizedDataType for Color {
19    fn as_sized_data_type() -> SizedDataType {
20        SizedDataType::new(DataType::UnsignedInt, 1)
21    }
22}
23
24impl From<Srgb<u8>> for Color {
25    fn from(srgb: Srgb<u8>) -> Self {
26        Color(*bytemuck::from_bytes(&[
27            srgb.red, srgb.green, srgb.blue, 0xff,
28        ]))
29    }
30}
31
32impl From<Srgba<u8>> for Color {
33    fn from(srgba: Srgba<u8>) -> Self {
34        Color(*bytemuck::from_bytes(&[
35            srgba.red,
36            srgba.green,
37            srgba.blue,
38            srgba.alpha,
39        ]))
40    }
41}