From 14d2445c3226513be56c29b94c837487a3af709d Mon Sep 17 00:00:00 2001 From: Mist Date: Sun, 31 Mar 2024 18:13:36 +0800 Subject: [PATCH] [Feat] convert rgb hex color to rgba hex color --- generator/src/color.rs | 33 +++++++++++++++++++------- generator/src/components/background.rs | 12 ++-------- 2 files changed, 27 insertions(+), 18 deletions(-) diff --git a/generator/src/color.rs b/generator/src/color.rs index 8719830..59bfda2 100644 --- a/generator/src/color.rs +++ b/generator/src/color.rs @@ -1,27 +1,44 @@ use std::i64; use tiny_skia::Color; +const HEX_COLOR_LENGTH: usize = 7; +const HEX_COLOR_WITH_ALPHA_LENGTH: usize = 9; + pub struct RgbaColor { pub color: Color, } +pub fn is_valid_hex_color(color: &str) -> bool { + (color.len() == HEX_COLOR_LENGTH || color.len() == HEX_COLOR_WITH_ALPHA_LENGTH) + && color.starts_with("#") +} + +fn parse_color_to_rgba_hex(hex: &str) -> String { + if !is_valid_hex_color(&hex) || hex.len() == HEX_COLOR_WITH_ALPHA_LENGTH { + hex.to_string() + } else { + format!("{}ff", hex) + } +} + impl Into for String { fn into(self) -> RgbaColor { - let hex_color = &self.to_lowercase()[1..self.len()]; + let rgba_hex_color = parse_color_to_rgba_hex(&self); + // Remove the '#' symbol + let hex_color = &rgba_hex_color.to_lowercase()[1..rgba_hex_color.len()]; let chars = hex_color.chars().collect::>(); let splits = &chars .chunks(2) .map(|chunk| i64::from_str_radix(&chunk.iter().collect::(), 16).unwrap()) .collect::>(); - - let alpha: i64; - match splits.get(3) { - Some(x) => alpha = *x, - None => alpha = 255, - } RgbaColor { - color: Color::from_rgba8(splits[0] as u8, splits[1] as u8, splits[2] as u8, alpha as u8), + color: Color::from_rgba8( + splits[0] as u8, + splits[1] as u8, + splits[2] as u8, + splits[3] as u8, + ), } } } diff --git a/generator/src/components/background.rs b/generator/src/components/background.rs index 325fb3b..8b4ca83 100644 --- a/generator/src/components/background.rs +++ b/generator/src/components/background.rs @@ -2,7 +2,7 @@ use tiny_skia::{ Color, GradientStop, LinearGradient, Paint, Pixmap, Point, Rect, SpreadMode, Transform, }; -use crate::color::RgbaColor; +use crate::color::{is_valid_hex_color, RgbaColor}; use super::interface::{ component::{Component, ComponentContext, RenderParams}, @@ -10,9 +10,6 @@ use super::interface::{ style::{ComponentAlign, ComponentStyle, RawComponentStyle}, }; -const HEX_COLOR_LENGTH: usize = 7; -const HEX_COLOR_WITH_ALPHA_LENGTH: usize = 9; - pub struct Background { children: Vec>, } @@ -23,11 +20,6 @@ impl Background { } } -fn is_valid_hex_color(color: String) -> bool { - (color.len() == HEX_COLOR_LENGTH || color.len() == HEX_COLOR_WITH_ALPHA_LENGTH) - && color.starts_with("#") -} - impl Component for Background { fn children(&self) -> &Vec> { &self.children @@ -52,7 +44,7 @@ impl Component for Background { paint.anti_alias = false; match params.bg_color.as_ref() { Some(color) => { - if ! is_valid_hex_color(color.to_string()){ + if !is_valid_hex_color(color) { return Err(RenderError::InvalidHexColor(color.to_string())); }