LibWeb: Add some helpers to PositionStyleValue

Both of these are needed by the gradient style values.
This commit is contained in:
Sam Atkins 2023-11-07 12:10:16 +00:00 committed by Sam Atkins
parent 8917378aa7
commit 2ae53bc5eb
Notes: sideshowbarker 2024-07-17 06:09:44 +09:00
2 changed files with 28 additions and 0 deletions

View File

@ -11,6 +11,26 @@
namespace Web::CSS {
bool PositionStyleValue::is_center() const
{
return (edge_x()->edge() == PositionEdge::Left
&& edge_x()->offset().is_percentage() && edge_x()->offset().percentage() == Percentage { 50 })
&& (edge_y()->edge() == PositionEdge::Top
&& edge_y()->offset().is_percentage() && edge_y()->offset().percentage() == Percentage { 50 });
}
CSSPixelPoint PositionStyleValue::resolved(Layout::Node const& node, CSSPixelRect const& rect) const
{
// Note: A preset + a none default x/y_relative_to is impossible in the syntax (and makes little sense)
CSSPixels x = m_properties.edge_x->offset().to_px(node, rect.width());
CSSPixels y = m_properties.edge_y->offset().to_px(node, rect.height());
if (m_properties.edge_x->edge() == PositionEdge::Right)
x = rect.width() - x;
if (m_properties.edge_y->edge() == PositionEdge::Bottom)
y = rect.height() - y;
return CSSPixelPoint { rect.x() + x, rect.y() + y };
}
String PositionStyleValue::to_string() const
{
return MUST(String::formatted("{} {}", m_properties.edge_x->to_string(), m_properties.edge_y->to_string()));

View File

@ -22,10 +22,18 @@ public:
{
return adopt_ref(*new (nothrow) PositionStyleValue(move(edge_x), move(edge_y)));
}
static ValueComparingNonnullRefPtr<PositionStyleValue> create_center()
{
return adopt_ref(*new (nothrow) PositionStyleValue(
EdgeStyleValue::create(PositionEdge::Left, Percentage { 50 }),
EdgeStyleValue::create(PositionEdge::Top, Percentage { 50 })));
}
virtual ~PositionStyleValue() override = default;
ValueComparingNonnullRefPtr<EdgeStyleValue> edge_x() const { return m_properties.edge_x; }
ValueComparingNonnullRefPtr<EdgeStyleValue> edge_y() const { return m_properties.edge_y; }
bool is_center() const;
CSSPixelPoint resolved(Layout::Node const&, CSSPixelRect const&) const;
virtual String to_string() const override;