#![no_std]
#[cfg(feature = "bytemuck")]
use bytemuck::{Pod, Zeroable};
macro_rules! color_struct {
{
$(#[$doc:meta])*
$name:ident {
$($(#[$compdoc:meta])+
$compname:ident,)+
}
} => {
$(#[$doc])*
#[repr(C)]
#[derive(Clone, Copy, Debug, Hash, PartialEq, PartialOrd, Eq, Ord)]
pub struct $name<ComponentTy> {
$($(#[$compdoc])+
pub $compname: ComponentTy,)+
}
#[cfg(feature = "bytemuck")]
unsafe impl<ComponentTy: Zeroable> Zeroable for $name<ComponentTy> {}
#[cfg(feature = "bytemuck")]
unsafe impl<ComponentTy: Pod> Pod for $name<ComponentTy> {}
impl<ComponentTy> From<[ComponentTy; 3]> for $name<ComponentTy> {
fn from([$($compname),+]: [ComponentTy; 3]) -> $name<ComponentTy> {
$name {
$($compname,)+
}
}
}
#[allow(clippy::from_over_into)]
impl<ComponentTy> Into<[ComponentTy; 3]> for $name<ComponentTy> {
fn into(self) -> [ComponentTy; 3] {
let $name {
$($compname,)+
} = self;
[$($compname),+]
}
}
impl<ComponentTy> AsRef<[ComponentTy; 3]> for $name<ComponentTy> {
fn as_ref(&self) -> &[ComponentTy; 3] {
unsafe { &*(self as *const $name<ComponentTy> as *const [ComponentTy; 3]) }
}
}
};
{
$(#[$doc:meta])*
$name:ident, $alphaname:ident {
$($(#[$compdoc:meta])+
$compname:ident,)+
}
} => {
color_struct! {
$(#[$doc])*
$name {
$($(#[$compdoc])+
$compname,)+
}
}
$(#[$doc])*
#[repr(C)]
#[derive(Clone, Copy, Debug, Hash, PartialEq, PartialOrd, Eq, Ord)]
pub struct $alphaname<ComponentTy, AlphaState> {
$($(#[$compdoc])+
pub $compname: ComponentTy,)+
pub alpha: ComponentTy,
_pd: core::marker::PhantomData<AlphaState>,
}
#[cfg(feature = "bytemuck")]
unsafe impl<ComponentTy: Zeroable, AlphaState> Zeroable for $alphaname<ComponentTy, AlphaState> {}
#[cfg(feature = "bytemuck")]
unsafe impl<ComponentTy: Pod, AlphaState: Copy + 'static> Pod for $alphaname<ComponentTy, AlphaState> {}
#[allow(clippy::from_over_into)]
impl<ComponentTy, AlphaState> Into<[ComponentTy; 4]> for $alphaname<ComponentTy, AlphaState> {
fn into(self) -> [ComponentTy; 4] {
let $alphaname {
$($compname,)+
alpha,
..
} = self;
[$($compname,)+ alpha]
}
}
impl<ComponentTy, AlphaState> AsRef<[ComponentTy; 4]> for $alphaname<ComponentTy, AlphaState> {
fn as_ref(&self) -> &[ComponentTy; 4] {
unsafe { &*(self as *const $alphaname<ComponentTy, AlphaState> as *const [ComponentTy; 4]) }
}
}
};
}
color_struct! {
EncodedSrgb, EncodedSrgbA {
r,
g,
b,
}
}
color_struct! {
LinearSrgb, LinearSrgbA {
r,
g,
b,
}
}
color_struct! {
EncodedRec709 {
r,
g,
b,
}
}
color_struct! {
Rec709 {
r,
g,
b,
}
}
color_struct! {
GenericColor, GenericColorAlpha {
comp1,
comp2,
comp3,
}
}
color_struct! {
AcesCg {
r,
g,
b,
}
}
color_struct! {
Aces2065 {
r,
g,
b,
}
}
color_struct! {
AcesCc {
r,
g,
b,
}
}
color_struct! {
AcesCct {
r,
g,
b,
}
}
color_struct! {
DisplayP3, DisplayP3A {
r,
g,
b,
}
}
color_struct! {
EncodedDisplayP3, EncodedDisplayP3A {
r,
g,
b,
}
}
color_struct! {
DciP3 {
r,
g,
b,
}
}
color_struct! {
DciXYZPrime {
x,
y,
z,
}
}
color_struct! {
Bt2020 {
r,
g,
b,
}
}
color_struct! {
EncodedBt2020 {
r,
g,
b,
}
}
color_struct! {
Bt2100 {
r,
g,
b,
}
}
color_struct! {
EncodedBt2100PQ {
r,
g,
b,
}
}
color_struct! {
EncodedBt2100HLG {
r,
g,
b,
}
}
color_struct! {
ICtCpPQ {
i,
ct,
cp,
}
}
color_struct! {
ICtCpHLG {
i,
ct,
cp,
}
}
color_struct! {
CieXYZ, CieXYZA {
x,
y,
z,
}
}
color_struct! {
CieLab, CieLabA {
l,
a,
b,
}
}
color_struct! {
CieLCh, CieLChA {
l,
c,
h,
}
}
color_struct! {
Oklab, OklabA {
l,
a,
b,
}
}
color_struct! {
Oklch, OklchA {
l,
c,
h,
}
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
pub enum Premultiplied {}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
pub enum Separate {}