Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion mordant-baseline.toml
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@
[bun_css]
"arg_named_like_other_param:src/css/rules/mod.rs" = 1
"bare_bool_args:src/css/selectors/builder.rs" = 1
"tuple_wants_struct:src/css/css_parser.rs" = 1
"tuple_wants_struct:src/css/values/color.rs" = 5

[bun_install]
Expand Down
48 changes: 30 additions & 18 deletions src/css/css_parser.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5537,8 +5537,10 @@ impl<'a> CopyOnWriteStr<'a> {
// ───────────────────────────── color ─────────────────────────────

pub mod color {
/// The opaque alpha value of 1.0.
pub(crate) const OPAQUE: f32 = 1.0;
use crate::values::color::RGBA;

/// The alpha channel of a fully opaque color.
pub(crate) const OPAQUE: u8 = 255;

#[derive(Debug, strum::IntoStaticStr)]
pub enum ColorError {
Expand Down Expand Up @@ -5727,29 +5729,39 @@ pub mod color {
}

/// Parse a color hash, without the leading '#' character.
pub(crate) fn parse_hash_color(value: &[u8]) -> Option<(u8, u8, u8, f32)> {
pub(crate) fn parse_hash_color(value: &[u8]) -> Option<RGBA> {
parse_hash_color_impl(value).ok()
}

pub(crate) fn parse_hash_color_impl(value: &[u8]) -> Result<(u8, u8, u8, f32), ColorError> {
pub(crate) fn parse_hash_color_impl(value: &[u8]) -> Result<RGBA, ColorError> {
let pair = |i: usize| {
bun_core::fmt::hex_pair_value(value[i], value[i + 1]).ok_or(ColorError::Parse)
};
match value.len() {
8 => Ok((pair(0)?, pair(2)?, pair(4)?, pair(6)? as f32 / 255.0)),
6 => Ok((pair(0)?, pair(2)?, pair(4)?, OPAQUE)),
4 => Ok((
from_hex(value[0])? * 17,
from_hex(value[1])? * 17,
from_hex(value[2])? * 17,
(from_hex(value[3])? * 17) as f32 / 255.0,
)),
3 => Ok((
from_hex(value[0])? * 17,
from_hex(value[1])? * 17,
from_hex(value[2])? * 17,
OPAQUE,
)),
8 => Ok(RGBA {
red: pair(0)?,
green: pair(2)?,
blue: pair(4)?,
alpha: pair(6)?,
}),
6 => Ok(RGBA {
red: pair(0)?,
green: pair(2)?,
blue: pair(4)?,
alpha: OPAQUE,
}),
4 => Ok(RGBA {
red: from_hex(value[0])? * 17,
green: from_hex(value[1])? * 17,
blue: from_hex(value[2])? * 17,
alpha: from_hex(value[3])? * 17,
}),
3 => Ok(RGBA {
red: from_hex(value[0])? * 17,
green: from_hex(value[1])? * 17,
blue: from_hex(value[2])? * 17,
alpha: OPAQUE,
}),
_ => Err(ColorError::Parse),
}
}
Expand Down
11 changes: 3 additions & 8 deletions src/css/properties/custom.rs
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ use crate::printer::Printer;

use crate::values as css_values;
use css_values::angle::Angle;
use css_values::color::{ColorFallbackKind, CssColor, RGBA};
use css_values::color::{ColorFallbackKind, CssColor};
use css_values::ident::{
CustomIdent, CustomIdentFns, DashedIdent, DashedIdentReference, Ident, IdentFns,
};
Expand Down Expand Up @@ -650,16 +650,11 @@ impl TokenList {
}
Token::UnrestrictedHash(h) | Token::IdHash(h) => {
'brk: {
let Some((r, g, b, a)) = css_parser::color::parse_hash_color(h) else {
let Some(rgba) = css_parser::color::parse_hash_color(h) else {
tokens.push(TokenOrValue::Token(Token::UnrestrictedHash(*h)));
break 'brk;
};
tokens.push(TokenOrValue::Color(CssColor::Rgba(RGBA::from_floats(
r as f32 / 255.0,
g as f32 / 255.0,
b as f32 / 255.0,
a,
))));
tokens.push(TokenOrValue::Color(CssColor::Rgba(rgba)));
}
last_is_delim = false;
last_is_whitespace = false;
Expand Down
4 changes: 2 additions & 2 deletions src/css/values/color.rs
Original file line number Diff line number Diff line change
Expand Up @@ -405,10 +405,10 @@ impl CssColor {

match token {
css::Token::UnrestrictedHash(v) | css::Token::IdHash(v) => {
let Some((r, g, b, a)) = css::color::parse_hash_color(v) else {
let Some(rgba) = css::color::parse_hash_color(v) else {
return Err(location.new_unexpected_token_error(token));
};
Ok(CssColor::Rgba(RGBA::new(r, g, b, a)))
Ok(CssColor::Rgba(rgba))
}
css::Token::Ident(value) => crate::match_ignore_ascii_case! { value, {
b"currentcolor" => Ok(CssColor::CurrentColor),
Expand Down
Loading