mirror of
https://github.com/RGBCube/serenity
synced 2025-07-27 05:47:35 +00:00
LibWeb: Make box-shadow known throughout the CSS subsystem
This patch spreads box-shadows around: - The Values important to box-shadows are stored in a BoxShadowData struct - StyleProperties knows how to construct such a struct from a BoxShadowStyleValue and a Node knows how to ask for it - CalculatedValues contain BoxShadowData and expose them
This commit is contained in:
parent
36e6f559c5
commit
f1bdaafcf6
4 changed files with 27 additions and 0 deletions
|
@ -45,6 +45,13 @@ struct FlexBasisData {
|
||||||
CSS::Length length {};
|
CSS::Length length {};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct BoxShadowData {
|
||||||
|
CSS::Length offset_x {};
|
||||||
|
CSS::Length offset_y {};
|
||||||
|
CSS::Length blur_radius {};
|
||||||
|
Color color {};
|
||||||
|
};
|
||||||
|
|
||||||
class ComputedValues {
|
class ComputedValues {
|
||||||
public:
|
public:
|
||||||
CSS::Float float_() const { return m_noninherited.float_; }
|
CSS::Float float_() const { return m_noninherited.float_; }
|
||||||
|
@ -64,6 +71,7 @@ public:
|
||||||
Optional<float> flex_shrink_factor() const { return m_noninherited.flex_shrink_factor; }
|
Optional<float> flex_shrink_factor() const { return m_noninherited.flex_shrink_factor; }
|
||||||
Optional<float> opacity() const { return m_noninherited.opacity; }
|
Optional<float> opacity() const { return m_noninherited.opacity; }
|
||||||
CSS::JustifyContent justify_content() const { return m_noninherited.justify_content; }
|
CSS::JustifyContent justify_content() const { return m_noninherited.justify_content; }
|
||||||
|
Optional<BoxShadowData> box_shadow() const { return m_noninherited.box_shadow; }
|
||||||
const CSS::Length& width() const { return m_noninherited.width; }
|
const CSS::Length& width() const { return m_noninherited.width; }
|
||||||
const CSS::Length& min_width() const { return m_noninherited.min_width; }
|
const CSS::Length& min_width() const { return m_noninherited.min_width; }
|
||||||
const CSS::Length& max_width() const { return m_noninherited.max_width; }
|
const CSS::Length& max_width() const { return m_noninherited.max_width; }
|
||||||
|
@ -148,6 +156,7 @@ protected:
|
||||||
CSS::Overflow overflow_x { InitialValues::overflow() };
|
CSS::Overflow overflow_x { InitialValues::overflow() };
|
||||||
CSS::Overflow overflow_y { InitialValues::overflow() };
|
CSS::Overflow overflow_y { InitialValues::overflow() };
|
||||||
Optional<float> opacity;
|
Optional<float> opacity;
|
||||||
|
Optional<BoxShadowData> box_shadow {};
|
||||||
} m_noninherited;
|
} m_noninherited;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -197,6 +206,7 @@ public:
|
||||||
void set_flex_shrink_factor(Optional<float> value) { m_noninherited.flex_shrink_factor = value; }
|
void set_flex_shrink_factor(Optional<float> value) { m_noninherited.flex_shrink_factor = value; }
|
||||||
void set_opacity(Optional<float> value) { m_noninherited.opacity = value; }
|
void set_opacity(Optional<float> value) { m_noninherited.opacity = value; }
|
||||||
void set_justify_content(CSS::JustifyContent value) { m_noninherited.justify_content = value; }
|
void set_justify_content(CSS::JustifyContent value) { m_noninherited.justify_content = value; }
|
||||||
|
void set_box_shadow(Optional<BoxShadowData> value) { m_noninherited.box_shadow = move(value); }
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -764,4 +764,18 @@ Optional<CSS::Repeat> StyleProperties::background_repeat_y() const
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Optional<CSS::BoxShadowData> StyleProperties::box_shadow() const
|
||||||
|
{
|
||||||
|
auto value_or_error = property(CSS::PropertyID::BoxShadow);
|
||||||
|
if (!value_or_error.has_value())
|
||||||
|
return {};
|
||||||
|
|
||||||
|
auto value = value_or_error.value();
|
||||||
|
if (!value->is_box_shadow())
|
||||||
|
return {};
|
||||||
|
|
||||||
|
auto box = verify_cast<CSS::BoxShadowStyleValue>(value.ptr());
|
||||||
|
return { { box->offset_x(), box->offset_y(), box->blur_radius(), box->color() } };
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -62,6 +62,7 @@ public:
|
||||||
Optional<CSS::Overflow> overflow_y() const;
|
Optional<CSS::Overflow> overflow_y() const;
|
||||||
Optional<CSS::Repeat> background_repeat_x() const;
|
Optional<CSS::Repeat> background_repeat_x() const;
|
||||||
Optional<CSS::Repeat> background_repeat_y() const;
|
Optional<CSS::Repeat> background_repeat_y() const;
|
||||||
|
Optional<CSS::BoxShadowData> box_shadow() const;
|
||||||
|
|
||||||
const Gfx::Font& font() const
|
const Gfx::Font& font() const
|
||||||
{
|
{
|
||||||
|
|
|
@ -350,6 +350,8 @@ void NodeWithStyle::apply_style(const CSS::StyleProperties& specified_style)
|
||||||
computed_values.set_margin(specified_style.length_box(CSS::PropertyID::MarginLeft, CSS::PropertyID::MarginTop, CSS::PropertyID::MarginRight, CSS::PropertyID::MarginBottom, CSS::Length::make_px(0)));
|
computed_values.set_margin(specified_style.length_box(CSS::PropertyID::MarginLeft, CSS::PropertyID::MarginTop, CSS::PropertyID::MarginRight, CSS::PropertyID::MarginBottom, CSS::Length::make_px(0)));
|
||||||
computed_values.set_padding(specified_style.length_box(CSS::PropertyID::PaddingLeft, CSS::PropertyID::PaddingTop, CSS::PropertyID::PaddingRight, CSS::PropertyID::PaddingBottom, CSS::Length::make_px(0)));
|
computed_values.set_padding(specified_style.length_box(CSS::PropertyID::PaddingLeft, CSS::PropertyID::PaddingTop, CSS::PropertyID::PaddingRight, CSS::PropertyID::PaddingBottom, CSS::Length::make_px(0)));
|
||||||
|
|
||||||
|
computed_values.set_box_shadow(specified_style.box_shadow());
|
||||||
|
|
||||||
auto do_border_style = [&](CSS::BorderData& border, CSS::PropertyID width_property, CSS::PropertyID color_property, CSS::PropertyID style_property) {
|
auto do_border_style = [&](CSS::BorderData& border, CSS::PropertyID width_property, CSS::PropertyID color_property, CSS::PropertyID style_property) {
|
||||||
border.color = specified_style.color_or_fallback(color_property, document(), Color::Transparent);
|
border.color = specified_style.color_or_fallback(color_property, document(), Color::Transparent);
|
||||||
border.line_style = specified_style.line_style(style_property).value_or(CSS::LineStyle::None);
|
border.line_style = specified_style.line_style(style_property).value_or(CSS::LineStyle::None);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue