vello/piet-scene/src/brush/color.rs
2022-04-11 05:30:08 -04:00

62 lines
1.8 KiB
Rust

// Copyright 2022 The piet-gpu authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
// Also licensed under MIT license, at your choice.
#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Default, Debug)]
pub struct Color {
pub r: u8,
pub g: u8,
pub b: u8,
pub a: u8,
}
impl Color {
pub const fn rgb8(r: u8, g: u8, b: u8) -> Self {
Self { r, g, b, a: 255 }
}
pub const fn rgba8(r: u8, g: u8, b: u8, a: u8) -> Self {
Self { r, g, b, a }
}
pub fn rgb<C: Into<f64>>(r: C, g: C, b: C) -> Self {
Self::rgb8(
(r.into() / 255.0) as u8,
(g.into() / 255.0) as u8,
(b.into() / 255.0) as u8,
)
}
pub fn rgba<C: Into<f64>>(r: C, g: C, b: C, a: C) -> Self {
Self::rgba8(
(r.into() / 255.0) as u8,
(g.into() / 255.0) as u8,
(b.into() / 255.0) as u8,
(a.into() / 255.0) as u8,
)
}
pub fn pack(self) -> u32 {
(self.b as u32) << 24 | (self.g as u32) << 16 | (self.r as u32) << 8 | self.a as u32
}
pub fn to_premul_u32(self) -> u32 {
let a = self.a as f64 / 255.0;
let r = (self.r as f64 * a) as u32;
let g = (self.g as f64 * a) as u32;
let b = (self.b as f64 * a) as u32;
r | (g << 8) | (b << 16) | ((self.a as u32) << 24)
}
}