* wip: update to use cosmic-advanced-text * use cosmic-advanced-text branch of iced * fix: line height and spacing for segmented button and update to get svg fix * fix: spin button styling & spacing * update iced to fix segmented button border radius * feat: example improvements * feat: helper for loading fonts * feat: add focus style to button * fix: slider height and iced fixed * feat: hash icon width and height * cleanup * update ci * refactor: always use lazy feature of iced * update iced * update iced * cleanup & update iced * update iced: new slider & tiny-skia quad updates * update iced: fixes for tiny-skia quad rendering with edge case border radius * re-export iced_runtime & iced_widget * merge master * udpate iced * update iced * update iced * update iced * fix: make rectangle_tracker subscription only return update if there is some * feat: derive macro for loading a cosmic-config * feat (cosmic-config): iced subscription * fix (example): update to rectangle tracker subscription * fix (cosmic-config) * refactor(cosmic-config-derive): add support for types with generic parameters * fix (cosmic-config): feature gate updates for subscription helpers * feat: support for custom & system themes + move cosmic-theme to libcosmic * feat: sorta hacky way of creating header bars for libcosmic + update iced to get support for resizable windows in iced-sctk * update iced * update and reexport sctk * fix: applet border radius * feat (cosmic-theme): add id and name methods * fix(cosmic-theme): reexport palette from cosmic-theme * fix(cosmic-config-derive): allow use with reexported cosmic-config * feat: update iced with fix and refactor applet env vars * update iced
59 lines
1.5 KiB
Rust
59 lines
1.5 KiB
Rust
use csscolorparser::Color;
|
|
use palette::Srgba;
|
|
use serde::{Deserialize, Serialize};
|
|
|
|
/// utility wrapper for serializing and deserializing colors with arbitrary CSS
|
|
#[derive(Clone, Debug, Default, Deserialize, Serialize)]
|
|
pub struct CssColor {
|
|
c: Color,
|
|
}
|
|
|
|
impl From<Srgba> for CssColor {
|
|
fn from(c: Srgba) -> Self {
|
|
Self {
|
|
c: Color {
|
|
r: c.red as f64,
|
|
g: c.green as f64,
|
|
b: c.blue as f64,
|
|
a: c.alpha as f64,
|
|
},
|
|
}
|
|
}
|
|
}
|
|
|
|
impl Into<Srgba> for CssColor {
|
|
fn into(self) -> Srgba {
|
|
Srgba::new(
|
|
self.c.r as f32,
|
|
self.c.g as f32,
|
|
self.c.b as f32,
|
|
self.c.a as f32,
|
|
)
|
|
}
|
|
}
|
|
|
|
/// straight alpha "A over B" operator on non-linear srgba
|
|
pub fn over<A: Into<Srgba>, B: Into<Srgba>>(a: A, b: B) -> Srgba {
|
|
let a = a.into();
|
|
let b = b.into();
|
|
let o_a = (alpha_over(a.alpha, b.alpha)).max(0.0).min(1.0);
|
|
let o_r = (c_over(a.red, b.red, a.alpha, b.alpha, o_a))
|
|
.max(0.0)
|
|
.min(1.0);
|
|
let o_g = (c_over(a.green, b.green, a.alpha, b.alpha, o_a))
|
|
.max(0.0)
|
|
.min(1.0);
|
|
let o_b = (c_over(a.blue, b.blue, a.alpha, b.alpha, o_a))
|
|
.max(0.0)
|
|
.min(1.0);
|
|
|
|
Srgba::new(o_r, o_g, o_b, o_a)
|
|
}
|
|
|
|
fn alpha_over(a: f32, b: f32) -> f32 {
|
|
a + b * (1.0 - a)
|
|
}
|
|
|
|
fn c_over(a: f32, b: f32, a_alpha: f32, b_alpha: f32, o_alpha: f32) -> f32 {
|
|
a * a_alpha + b * b_alpha * (1.0 - a_alpha) / o_alpha
|
|
}
|