mirror of
https://github.com/RGBCube/serenity
synced 2025-06-01 03:08:13 +00:00
LibWeb: Make intrinsic width/height/ratio a Box concept and simplify it
Apparently it's not only replaced elements that can have intrinsic sizes, so let's move this concept from ReplacedBox to Box. To avoid bloating Box, we make the accessors virtual.
This commit is contained in:
parent
1b1bf5c321
commit
81590b1804
9 changed files with 21 additions and 40 deletions
|
@ -121,6 +121,14 @@ public:
|
|||
|
||||
Painting::BorderRadiusData normalized_border_radius_data();
|
||||
|
||||
virtual Optional<float> intrinsic_width() const { return {}; }
|
||||
virtual Optional<float> intrinsic_height() const { return {}; }
|
||||
virtual Optional<float> intrinsic_ratio() const { return {}; }
|
||||
|
||||
bool has_intrinsic_width() const { return intrinsic_width().has_value(); }
|
||||
bool has_intrinsic_height() const { return intrinsic_height().has_value(); }
|
||||
bool has_intrinsic_ratio() const { return intrinsic_ratio().has_value(); }
|
||||
|
||||
protected:
|
||||
Box(DOM::Document& document, DOM::Node* node, NonnullRefPtr<CSS::StyleProperties> style)
|
||||
: NodeWithStyleAndBoxModelMetrics(document, node, move(style))
|
||||
|
|
|
@ -27,10 +27,7 @@ ButtonBox::~ButtonBox()
|
|||
void ButtonBox::prepare_for_replaced_layout()
|
||||
{
|
||||
set_intrinsic_width(font().width(dom_node().value()) + 20);
|
||||
set_has_intrinsic_width(true);
|
||||
|
||||
set_intrinsic_height(20);
|
||||
set_has_intrinsic_height(true);
|
||||
}
|
||||
|
||||
void ButtonBox::paint(PaintContext& context, PaintPhase phase)
|
||||
|
|
|
@ -20,8 +20,6 @@ CanvasBox::~CanvasBox()
|
|||
|
||||
void CanvasBox::prepare_for_replaced_layout()
|
||||
{
|
||||
set_has_intrinsic_width(true);
|
||||
set_has_intrinsic_height(true);
|
||||
set_intrinsic_width(dom_node().width());
|
||||
set_intrinsic_height(dom_node().height());
|
||||
}
|
||||
|
|
|
@ -17,8 +17,6 @@ namespace Web::Layout {
|
|||
CheckBox::CheckBox(DOM::Document& document, HTML::HTMLInputElement& element, NonnullRefPtr<CSS::StyleProperties> style)
|
||||
: LabelableNode(document, element, move(style))
|
||||
{
|
||||
set_has_intrinsic_width(true);
|
||||
set_has_intrinsic_height(true);
|
||||
set_intrinsic_width(13);
|
||||
set_intrinsic_height(13);
|
||||
}
|
||||
|
|
|
@ -254,7 +254,7 @@ float FormattingContext::tentative_width_for_replaced_element(const ReplacedBox&
|
|||
// If 'height' and 'width' both have computed values of 'auto' and the element also has an intrinsic width,
|
||||
// then that intrinsic width is the used value of 'width'.
|
||||
if (specified_height.is_auto() && width.is_auto() && box.has_intrinsic_width()) {
|
||||
used_width = box.intrinsic_width();
|
||||
used_width = box.intrinsic_width().value();
|
||||
}
|
||||
|
||||
// If 'height' and 'width' both have computed values of 'auto' and the element has no intrinsic width,
|
||||
|
@ -264,11 +264,11 @@ float FormattingContext::tentative_width_for_replaced_element(const ReplacedBox&
|
|||
//
|
||||
// (used height) * (intrinsic ratio)
|
||||
else if ((specified_height.is_auto() && width.is_auto() && !box.has_intrinsic_width() && box.has_intrinsic_height() && box.has_intrinsic_ratio()) || (width.is_auto() && box.has_intrinsic_ratio())) {
|
||||
used_width = compute_height_for_replaced_element(box) * box.intrinsic_ratio();
|
||||
used_width = compute_height_for_replaced_element(box) * box.intrinsic_ratio().value();
|
||||
}
|
||||
|
||||
else if (width.is_auto() && box.has_intrinsic_width()) {
|
||||
used_width = box.intrinsic_width();
|
||||
used_width = box.intrinsic_width().value();
|
||||
}
|
||||
|
||||
else if (width.is_auto()) {
|
||||
|
@ -347,11 +347,11 @@ float FormattingContext::tentative_height_for_replaced_element(const ReplacedBox
|
|||
// If 'height' and 'width' both have computed values of 'auto' and the element also has
|
||||
// an intrinsic height, then that intrinsic height is the used value of 'height'.
|
||||
if (specified_width.is_auto() && height.is_auto() && box.has_intrinsic_height())
|
||||
used_height = box.intrinsic_height();
|
||||
used_height = box.intrinsic_height().value();
|
||||
else if (height.is_auto() && box.has_intrinsic_ratio())
|
||||
used_height = compute_width_for_replaced_element(box) / box.intrinsic_ratio();
|
||||
used_height = compute_width_for_replaced_element(box) / box.intrinsic_ratio().value();
|
||||
else if (height.is_auto() && box.has_intrinsic_height())
|
||||
used_height = box.intrinsic_height();
|
||||
used_height = box.intrinsic_height().value();
|
||||
else if (height.is_auto())
|
||||
used_height = 150;
|
||||
|
||||
|
|
|
@ -26,8 +26,6 @@ void FrameBox::prepare_for_replaced_layout()
|
|||
{
|
||||
VERIFY(dom_node().nested_browsing_context());
|
||||
|
||||
set_has_intrinsic_width(true);
|
||||
set_has_intrinsic_height(true);
|
||||
// FIXME: Do proper error checking, etc.
|
||||
set_intrinsic_width(dom_node().attribute(HTML::AttributeNames::width).to_int().value_or(300));
|
||||
set_intrinsic_height(dom_node().attribute(HTML::AttributeNames::height).to_int().value_or(150));
|
||||
|
|
|
@ -37,25 +37,20 @@ int ImageBox::preferred_height() const
|
|||
void ImageBox::prepare_for_replaced_layout()
|
||||
{
|
||||
if (!m_image_loader.has_loaded_or_failed()) {
|
||||
set_has_intrinsic_width(true);
|
||||
set_has_intrinsic_height(true);
|
||||
set_intrinsic_width(0);
|
||||
set_intrinsic_height(0);
|
||||
} else {
|
||||
if (m_image_loader.width()) {
|
||||
set_has_intrinsic_width(true);
|
||||
set_intrinsic_width(m_image_loader.width());
|
||||
}
|
||||
if (m_image_loader.height()) {
|
||||
set_has_intrinsic_height(true);
|
||||
set_intrinsic_height(m_image_loader.height());
|
||||
}
|
||||
|
||||
if (m_image_loader.width() && m_image_loader.height()) {
|
||||
set_has_intrinsic_ratio(true);
|
||||
set_intrinsic_ratio((float)m_image_loader.width() / (float)m_image_loader.height());
|
||||
} else {
|
||||
set_has_intrinsic_ratio(false);
|
||||
set_intrinsic_ratio({});
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -17,8 +17,6 @@ namespace Web::Layout {
|
|||
RadioButton::RadioButton(DOM::Document& document, HTML::HTMLInputElement& element, NonnullRefPtr<CSS::StyleProperties> style)
|
||||
: LabelableNode(document, element, move(style))
|
||||
{
|
||||
set_has_intrinsic_width(true);
|
||||
set_has_intrinsic_height(true);
|
||||
set_intrinsic_width(12);
|
||||
set_intrinsic_height(12);
|
||||
}
|
||||
|
|
|
@ -19,17 +19,9 @@ public:
|
|||
const DOM::Element& dom_node() const { return verify_cast<DOM::Element>(*Node::dom_node()); }
|
||||
DOM::Element& dom_node() { return verify_cast<DOM::Element>(*Node::dom_node()); }
|
||||
|
||||
bool has_intrinsic_width() const { return m_has_intrinsic_width; }
|
||||
bool has_intrinsic_height() const { return m_has_intrinsic_height; }
|
||||
bool has_intrinsic_ratio() const { return m_has_intrinsic_ratio; }
|
||||
|
||||
float intrinsic_width() const { return m_intrinsic_width; }
|
||||
float intrinsic_height() const { return m_intrinsic_height; }
|
||||
float intrinsic_ratio() const { return m_intrinsic_ratio; }
|
||||
|
||||
void set_has_intrinsic_width(bool has) { m_has_intrinsic_width = has; }
|
||||
void set_has_intrinsic_height(bool has) { m_has_intrinsic_height = has; }
|
||||
void set_has_intrinsic_ratio(bool has) { m_has_intrinsic_ratio = has; }
|
||||
virtual Optional<float> intrinsic_width() const final { return m_intrinsic_width; }
|
||||
virtual Optional<float> intrinsic_height() const final { return m_intrinsic_height; }
|
||||
virtual Optional<float> intrinsic_ratio() const final { return m_intrinsic_ratio; }
|
||||
|
||||
void set_intrinsic_width(float width) { m_intrinsic_width = width; }
|
||||
void set_intrinsic_height(float height) { m_intrinsic_height = height; }
|
||||
|
@ -43,12 +35,9 @@ protected:
|
|||
virtual void split_into_lines(InlineFormattingContext&, LayoutMode) override;
|
||||
|
||||
private:
|
||||
bool m_has_intrinsic_width { false };
|
||||
bool m_has_intrinsic_height { false };
|
||||
bool m_has_intrinsic_ratio { false };
|
||||
float m_intrinsic_width { 0 };
|
||||
float m_intrinsic_height { 0 };
|
||||
float m_intrinsic_ratio { 0 };
|
||||
Optional<float> m_intrinsic_width;
|
||||
Optional<float> m_intrinsic_height;
|
||||
Optional<float> m_intrinsic_ratio;
|
||||
};
|
||||
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue