limelight_primitives/
color.rs1use 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}