mirror of
https://github.com/RGBCube/serenity
synced 2025-07-23 10:27:35 +00:00
LibWeb: Move StackingContext and PaintPhase into the Painting namespace
This commit is contained in:
parent
a4d51b3dc2
commit
f0d833a3d7
41 changed files with 105 additions and 103 deletions
|
@ -264,6 +264,7 @@ class PerformanceTiming;
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace Web::Painting {
|
namespace Web::Painting {
|
||||||
|
enum class PaintPhase;
|
||||||
class Box;
|
class Box;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -299,7 +300,6 @@ class WebSocket;
|
||||||
|
|
||||||
namespace Web::Layout {
|
namespace Web::Layout {
|
||||||
enum class LayoutMode;
|
enum class LayoutMode;
|
||||||
enum class PaintPhase;
|
|
||||||
class BlockContainer;
|
class BlockContainer;
|
||||||
class BlockFormattingContext;
|
class BlockFormattingContext;
|
||||||
class Box;
|
class Box;
|
||||||
|
|
|
@ -34,7 +34,7 @@ bool BlockContainer::should_clip_overflow() const
|
||||||
return computed_values().overflow_x() != CSS::Overflow::Visible && computed_values().overflow_y() != CSS::Overflow::Visible;
|
return computed_values().overflow_x() != CSS::Overflow::Visible && computed_values().overflow_y() != CSS::Overflow::Visible;
|
||||||
}
|
}
|
||||||
|
|
||||||
void BlockContainer::paint(PaintContext& context, PaintPhase phase)
|
void BlockContainer::paint(PaintContext& context, Painting::PaintPhase phase)
|
||||||
{
|
{
|
||||||
if (!is_visible())
|
if (!is_visible())
|
||||||
return;
|
return;
|
||||||
|
@ -64,7 +64,7 @@ void BlockContainer::paint(PaintContext& context, PaintPhase phase)
|
||||||
}
|
}
|
||||||
|
|
||||||
// FIXME: Merge this loop with the above somehow..
|
// FIXME: Merge this loop with the above somehow..
|
||||||
if (phase == PaintPhase::FocusOutline) {
|
if (phase == Painting::PaintPhase::FocusOutline) {
|
||||||
for (auto& line_box : m_paint_box->m_line_boxes) {
|
for (auto& line_box : m_paint_box->m_line_boxes) {
|
||||||
for (auto& fragment : line_box.fragments()) {
|
for (auto& fragment : line_box.fragments()) {
|
||||||
auto* node = fragment.layout_node().dom_node();
|
auto* node = fragment.layout_node().dom_node();
|
||||||
|
|
|
@ -18,7 +18,7 @@ public:
|
||||||
BlockContainer(DOM::Document&, DOM::Node*, CSS::ComputedValues);
|
BlockContainer(DOM::Document&, DOM::Node*, CSS::ComputedValues);
|
||||||
virtual ~BlockContainer() override;
|
virtual ~BlockContainer() override;
|
||||||
|
|
||||||
virtual void paint(PaintContext&, PaintPhase) override;
|
virtual void paint(PaintContext&, Painting::PaintPhase) override;
|
||||||
|
|
||||||
virtual HitTestResult hit_test(const Gfx::IntPoint&, HitTestType) const override;
|
virtual HitTestResult hit_test(const Gfx::IntPoint&, HitTestType) const override;
|
||||||
|
|
||||||
|
|
|
@ -34,21 +34,21 @@ Box::~Box()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void Box::paint(PaintContext& context, PaintPhase phase)
|
void Box::paint(PaintContext& context, Painting::PaintPhase phase)
|
||||||
{
|
{
|
||||||
if (!is_visible())
|
if (!is_visible())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (phase == PaintPhase::Background) {
|
if (phase == Painting::PaintPhase::Background) {
|
||||||
paint_background(context);
|
paint_background(context);
|
||||||
paint_box_shadow(context);
|
paint_box_shadow(context);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (phase == PaintPhase::Border) {
|
if (phase == Painting::PaintPhase::Border) {
|
||||||
paint_border(context);
|
paint_border(context);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (phase == PaintPhase::Overlay && dom_node() && document().inspected_node() == dom_node()) {
|
if (phase == Painting::PaintPhase::Overlay && dom_node() && document().inspected_node() == dom_node()) {
|
||||||
auto content_rect = m_paint_box->absolute_rect();
|
auto content_rect = m_paint_box->absolute_rect();
|
||||||
|
|
||||||
auto margin_box = box_model().margin_box();
|
auto margin_box = box_model().margin_box();
|
||||||
|
@ -88,7 +88,7 @@ void Box::paint(PaintContext& context, PaintPhase phase)
|
||||||
context.painter().draw_text(enclosing_int_rect(size_text_rect), size_text, Gfx::TextAlignment::Center, context.palette().color(Gfx::ColorRole::TooltipText));
|
context.painter().draw_text(enclosing_int_rect(size_text_rect), size_text, Gfx::TextAlignment::Center, context.palette().color(Gfx::ColorRole::TooltipText));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (phase == PaintPhase::FocusOutline && dom_node() && dom_node()->is_element() && verify_cast<DOM::Element>(*dom_node()).is_focused()) {
|
if (phase == Painting::PaintPhase::FocusOutline && dom_node() && dom_node()->is_element() && verify_cast<DOM::Element>(*dom_node()).is_focused()) {
|
||||||
context.painter().draw_rect(enclosing_int_rect(m_paint_box->absolute_rect()), context.palette().focus_outline());
|
context.painter().draw_rect(enclosing_int_rect(m_paint_box->absolute_rect()), context.palette().focus_outline());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -217,7 +217,7 @@ bool Box::is_body() const
|
||||||
return dom_node() && dom_node() == document().body();
|
return dom_node() && dom_node() == document().body();
|
||||||
}
|
}
|
||||||
|
|
||||||
StackingContext* Box::enclosing_stacking_context()
|
Painting::StackingContext* Box::enclosing_stacking_context()
|
||||||
{
|
{
|
||||||
for (auto* ancestor = parent(); ancestor; ancestor = ancestor->parent()) {
|
for (auto* ancestor = parent(); ancestor; ancestor = ancestor->parent()) {
|
||||||
if (!is<Box>(ancestor))
|
if (!is<Box>(ancestor))
|
||||||
|
@ -232,7 +232,7 @@ StackingContext* Box::enclosing_stacking_context()
|
||||||
VERIFY_NOT_REACHED();
|
VERIFY_NOT_REACHED();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Box::before_children_paint(PaintContext& context, PaintPhase phase)
|
void Box::before_children_paint(PaintContext& context, Painting::PaintPhase phase)
|
||||||
{
|
{
|
||||||
NodeWithStyleAndBoxModelMetrics::before_children_paint(context, phase);
|
NodeWithStyleAndBoxModelMetrics::before_children_paint(context, phase);
|
||||||
// FIXME: Support more overflow variations.
|
// FIXME: Support more overflow variations.
|
||||||
|
@ -242,7 +242,7 @@ void Box::before_children_paint(PaintContext& context, PaintPhase phase)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Box::after_children_paint(PaintContext& context, PaintPhase phase)
|
void Box::after_children_paint(PaintContext& context, Painting::PaintPhase phase)
|
||||||
{
|
{
|
||||||
NodeWithStyleAndBoxModelMetrics::after_children_paint(context, phase);
|
NodeWithStyleAndBoxModelMetrics::after_children_paint(context, phase);
|
||||||
// FIXME: Support more overflow variations.
|
// FIXME: Support more overflow variations.
|
||||||
|
|
|
@ -30,12 +30,12 @@ public:
|
||||||
|
|
||||||
bool is_body() const;
|
bool is_body() const;
|
||||||
|
|
||||||
StackingContext* stacking_context() { return m_stacking_context; }
|
Painting::StackingContext* stacking_context() { return m_stacking_context; }
|
||||||
const StackingContext* stacking_context() const { return m_stacking_context; }
|
Painting::StackingContext const* stacking_context() const { return m_stacking_context; }
|
||||||
void set_stacking_context(NonnullOwnPtr<StackingContext> context) { m_stacking_context = move(context); }
|
void set_stacking_context(NonnullOwnPtr<Painting::StackingContext> context) { m_stacking_context = move(context); }
|
||||||
StackingContext* enclosing_stacking_context();
|
Painting::StackingContext* enclosing_stacking_context();
|
||||||
|
|
||||||
virtual void paint(PaintContext&, PaintPhase) override;
|
virtual void paint(PaintContext&, Painting::PaintPhase) override;
|
||||||
virtual void paint_border(PaintContext& context);
|
virtual void paint_border(PaintContext& context);
|
||||||
virtual void paint_box_shadow(PaintContext& context);
|
virtual void paint_box_shadow(PaintContext& context);
|
||||||
virtual void paint_background(PaintContext& context);
|
virtual void paint_background(PaintContext& context);
|
||||||
|
@ -50,8 +50,8 @@ public:
|
||||||
bool has_intrinsic_height() const { return intrinsic_height().has_value(); }
|
bool has_intrinsic_height() const { return intrinsic_height().has_value(); }
|
||||||
bool has_intrinsic_aspect_ratio() const { return intrinsic_aspect_ratio().has_value(); }
|
bool has_intrinsic_aspect_ratio() const { return intrinsic_aspect_ratio().has_value(); }
|
||||||
|
|
||||||
virtual void before_children_paint(PaintContext&, PaintPhase) override;
|
virtual void before_children_paint(PaintContext&, Painting::PaintPhase) override;
|
||||||
virtual void after_children_paint(PaintContext&, PaintPhase) override;
|
virtual void after_children_paint(PaintContext&, Painting::PaintPhase) override;
|
||||||
|
|
||||||
virtual ~Box() override;
|
virtual ~Box() override;
|
||||||
|
|
||||||
|
@ -64,7 +64,7 @@ protected:
|
||||||
private:
|
private:
|
||||||
virtual bool is_box() const final { return true; }
|
virtual bool is_box() const final { return true; }
|
||||||
|
|
||||||
OwnPtr<StackingContext> m_stacking_context;
|
OwnPtr<Painting::StackingContext> m_stacking_context;
|
||||||
};
|
};
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
|
|
|
@ -20,7 +20,7 @@ BreakNode::~BreakNode()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void BreakNode::paint(PaintContext&, PaintPhase)
|
void BreakNode::paint(PaintContext&, Painting::PaintPhase)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -20,7 +20,7 @@ public:
|
||||||
|
|
||||||
private:
|
private:
|
||||||
virtual bool is_break_node() const final { return true; }
|
virtual bool is_break_node() const final { return true; }
|
||||||
virtual void paint(PaintContext&, PaintPhase) override;
|
virtual void paint(PaintContext&, Painting::PaintPhase) override;
|
||||||
};
|
};
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
|
|
|
@ -31,14 +31,14 @@ void ButtonBox::prepare_for_replaced_layout()
|
||||||
set_intrinsic_height(font().glyph_height());
|
set_intrinsic_height(font().glyph_height());
|
||||||
}
|
}
|
||||||
|
|
||||||
void ButtonBox::paint(PaintContext& context, PaintPhase phase)
|
void ButtonBox::paint(PaintContext& context, Painting::PaintPhase phase)
|
||||||
{
|
{
|
||||||
if (!is_visible())
|
if (!is_visible())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
LabelableNode::paint(context, phase);
|
LabelableNode::paint(context, phase);
|
||||||
|
|
||||||
if (phase == PaintPhase::Foreground) {
|
if (phase == Painting::PaintPhase::Foreground) {
|
||||||
auto text_rect = enclosing_int_rect(m_paint_box->absolute_rect());
|
auto text_rect = enclosing_int_rect(m_paint_box->absolute_rect());
|
||||||
if (m_being_pressed)
|
if (m_being_pressed)
|
||||||
text_rect.translate_by(1, 1);
|
text_rect.translate_by(1, 1);
|
||||||
|
|
|
@ -17,7 +17,7 @@ public:
|
||||||
virtual ~ButtonBox() override;
|
virtual ~ButtonBox() override;
|
||||||
|
|
||||||
virtual void prepare_for_replaced_layout() override;
|
virtual void prepare_for_replaced_layout() override;
|
||||||
virtual void paint(PaintContext&, PaintPhase) override;
|
virtual void paint(PaintContext&, Painting::PaintPhase) override;
|
||||||
|
|
||||||
const HTML::HTMLInputElement& dom_node() const { return static_cast<const HTML::HTMLInputElement&>(LabelableNode::dom_node()); }
|
const HTML::HTMLInputElement& dom_node() const { return static_cast<const HTML::HTMLInputElement&>(LabelableNode::dom_node()); }
|
||||||
HTML::HTMLInputElement& dom_node() { return static_cast<HTML::HTMLInputElement&>(LabelableNode::dom_node()); }
|
HTML::HTMLInputElement& dom_node() { return static_cast<HTML::HTMLInputElement&>(LabelableNode::dom_node()); }
|
||||||
|
|
|
@ -25,14 +25,14 @@ void CanvasBox::prepare_for_replaced_layout()
|
||||||
set_intrinsic_height(dom_node().height());
|
set_intrinsic_height(dom_node().height());
|
||||||
}
|
}
|
||||||
|
|
||||||
void CanvasBox::paint(PaintContext& context, PaintPhase phase)
|
void CanvasBox::paint(PaintContext& context, Painting::PaintPhase phase)
|
||||||
{
|
{
|
||||||
if (!is_visible())
|
if (!is_visible())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
ReplacedBox::paint(context, phase);
|
ReplacedBox::paint(context, phase);
|
||||||
|
|
||||||
if (phase == PaintPhase::Foreground) {
|
if (phase == Painting::PaintPhase::Foreground) {
|
||||||
// FIXME: This should be done at a different level. Also rect() does not include padding etc!
|
// FIXME: This should be done at a different level. Also rect() does not include padding etc!
|
||||||
if (!context.viewport_rect().intersects(enclosing_int_rect(m_paint_box->absolute_rect())))
|
if (!context.viewport_rect().intersects(enclosing_int_rect(m_paint_box->absolute_rect())))
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -17,7 +17,7 @@ public:
|
||||||
virtual ~CanvasBox() override;
|
virtual ~CanvasBox() override;
|
||||||
|
|
||||||
virtual void prepare_for_replaced_layout() override;
|
virtual void prepare_for_replaced_layout() override;
|
||||||
virtual void paint(PaintContext&, PaintPhase) override;
|
virtual void paint(PaintContext&, Painting::PaintPhase) override;
|
||||||
|
|
||||||
const HTML::HTMLCanvasElement& dom_node() const { return static_cast<const HTML::HTMLCanvasElement&>(ReplacedBox::dom_node()); }
|
const HTML::HTMLCanvasElement& dom_node() const { return static_cast<const HTML::HTMLCanvasElement&>(ReplacedBox::dom_node()); }
|
||||||
};
|
};
|
||||||
|
|
|
@ -27,14 +27,14 @@ CheckBox::~CheckBox()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void CheckBox::paint(PaintContext& context, PaintPhase phase)
|
void CheckBox::paint(PaintContext& context, Painting::PaintPhase phase)
|
||||||
{
|
{
|
||||||
if (!is_visible())
|
if (!is_visible())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
LabelableNode::paint(context, phase);
|
LabelableNode::paint(context, phase);
|
||||||
|
|
||||||
if (phase == PaintPhase::Foreground) {
|
if (phase == Painting::PaintPhase::Foreground) {
|
||||||
Gfx::StylePainter::paint_check_box(context.painter(), enclosing_int_rect(m_paint_box->absolute_rect()), context.palette(), dom_node().enabled(), dom_node().checked(), m_being_pressed);
|
Gfx::StylePainter::paint_check_box(context.painter(), enclosing_int_rect(m_paint_box->absolute_rect()), context.palette(), dom_node().enabled(), dom_node().checked(), m_being_pressed);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,7 +16,7 @@ public:
|
||||||
CheckBox(DOM::Document&, HTML::HTMLInputElement&, NonnullRefPtr<CSS::StyleProperties>);
|
CheckBox(DOM::Document&, HTML::HTMLInputElement&, NonnullRefPtr<CSS::StyleProperties>);
|
||||||
virtual ~CheckBox() override;
|
virtual ~CheckBox() override;
|
||||||
|
|
||||||
virtual void paint(PaintContext&, PaintPhase) override;
|
virtual void paint(PaintContext&, Painting::PaintPhase) override;
|
||||||
|
|
||||||
const HTML::HTMLInputElement& dom_node() const { return static_cast<const HTML::HTMLInputElement&>(LabelableNode::dom_node()); }
|
const HTML::HTMLInputElement& dom_node() const { return static_cast<const HTML::HTMLInputElement&>(LabelableNode::dom_node()); }
|
||||||
HTML::HTMLInputElement& dom_node() { return static_cast<HTML::HTMLInputElement&>(LabelableNode::dom_node()); }
|
HTML::HTMLInputElement& dom_node() { return static_cast<HTML::HTMLInputElement&>(LabelableNode::dom_node()); }
|
||||||
|
|
|
@ -32,11 +32,11 @@ void FrameBox::prepare_for_replaced_layout()
|
||||||
set_intrinsic_height(dom_node().attribute(HTML::AttributeNames::height).to_int().value_or(150));
|
set_intrinsic_height(dom_node().attribute(HTML::AttributeNames::height).to_int().value_or(150));
|
||||||
}
|
}
|
||||||
|
|
||||||
void FrameBox::paint(PaintContext& context, PaintPhase phase)
|
void FrameBox::paint(PaintContext& context, Painting::PaintPhase phase)
|
||||||
{
|
{
|
||||||
ReplacedBox::paint(context, phase);
|
ReplacedBox::paint(context, phase);
|
||||||
|
|
||||||
if (phase == PaintPhase::Foreground) {
|
if (phase == Painting::PaintPhase::Foreground) {
|
||||||
auto* hosted_document = dom_node().content_document_without_origin_check();
|
auto* hosted_document = dom_node().content_document_without_origin_check();
|
||||||
if (!hosted_document)
|
if (!hosted_document)
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -16,7 +16,7 @@ public:
|
||||||
FrameBox(DOM::Document&, DOM::Element&, NonnullRefPtr<CSS::StyleProperties>);
|
FrameBox(DOM::Document&, DOM::Element&, NonnullRefPtr<CSS::StyleProperties>);
|
||||||
virtual ~FrameBox() override;
|
virtual ~FrameBox() override;
|
||||||
|
|
||||||
virtual void paint(PaintContext&, PaintPhase) override;
|
virtual void paint(PaintContext&, Painting::PaintPhase) override;
|
||||||
virtual void prepare_for_replaced_layout() override;
|
virtual void prepare_for_replaced_layout() override;
|
||||||
|
|
||||||
const HTML::HTMLIFrameElement& dom_node() const { return verify_cast<HTML::HTMLIFrameElement>(ReplacedBox::dom_node()); }
|
const HTML::HTMLIFrameElement& dom_node() const { return verify_cast<HTML::HTMLIFrameElement>(ReplacedBox::dom_node()); }
|
||||||
|
|
|
@ -72,7 +72,7 @@ void ImageBox::prepare_for_replaced_layout()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ImageBox::paint(PaintContext& context, PaintPhase phase)
|
void ImageBox::paint(PaintContext& context, Painting::PaintPhase phase)
|
||||||
{
|
{
|
||||||
if (!is_visible())
|
if (!is_visible())
|
||||||
return;
|
return;
|
||||||
|
@ -83,7 +83,7 @@ void ImageBox::paint(PaintContext& context, PaintPhase phase)
|
||||||
|
|
||||||
ReplacedBox::paint(context, phase);
|
ReplacedBox::paint(context, phase);
|
||||||
|
|
||||||
if (phase == PaintPhase::Foreground) {
|
if (phase == Painting::PaintPhase::Foreground) {
|
||||||
if (renders_as_alt_text()) {
|
if (renders_as_alt_text()) {
|
||||||
auto& image_element = verify_cast<HTML::HTMLImageElement>(dom_node());
|
auto& image_element = verify_cast<HTML::HTMLImageElement>(dom_node());
|
||||||
context.painter().set_font(Gfx::FontDatabase::default_font());
|
context.painter().set_font(Gfx::FontDatabase::default_font());
|
||||||
|
|
|
@ -20,7 +20,7 @@ public:
|
||||||
virtual ~ImageBox() override;
|
virtual ~ImageBox() override;
|
||||||
|
|
||||||
virtual void prepare_for_replaced_layout() override;
|
virtual void prepare_for_replaced_layout() override;
|
||||||
virtual void paint(PaintContext&, PaintPhase) override;
|
virtual void paint(PaintContext&, Painting::PaintPhase) override;
|
||||||
|
|
||||||
const DOM::Element& dom_node() const { return static_cast<const DOM::Element&>(ReplacedBox::dom_node()); }
|
const DOM::Element& dom_node() const { return static_cast<const DOM::Element&>(ReplacedBox::dom_node()); }
|
||||||
|
|
||||||
|
|
|
@ -24,7 +24,7 @@ InitialContainingBlock::~InitialContainingBlock()
|
||||||
|
|
||||||
void InitialContainingBlock::build_stacking_context_tree()
|
void InitialContainingBlock::build_stacking_context_tree()
|
||||||
{
|
{
|
||||||
set_stacking_context(make<StackingContext>(*this, nullptr));
|
set_stacking_context(make<Painting::StackingContext>(*this, nullptr));
|
||||||
|
|
||||||
for_each_in_inclusive_subtree_of_type<Box>([&](Box& box) {
|
for_each_in_inclusive_subtree_of_type<Box>([&](Box& box) {
|
||||||
if (&box == this)
|
if (&box == this)
|
||||||
|
@ -35,7 +35,7 @@ void InitialContainingBlock::build_stacking_context_tree()
|
||||||
}
|
}
|
||||||
auto* parent_context = box.enclosing_stacking_context();
|
auto* parent_context = box.enclosing_stacking_context();
|
||||||
VERIFY(parent_context);
|
VERIFY(parent_context);
|
||||||
box.set_stacking_context(make<StackingContext>(box, parent_context));
|
box.set_stacking_context(make<Painting::StackingContext>(box, parent_context));
|
||||||
return IterationDecision::Continue;
|
return IterationDecision::Continue;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,11 +27,11 @@ InlineNode::~InlineNode()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void InlineNode::paint(PaintContext& context, PaintPhase phase)
|
void InlineNode::paint(PaintContext& context, Painting::PaintPhase phase)
|
||||||
{
|
{
|
||||||
auto& painter = context.painter();
|
auto& painter = context.painter();
|
||||||
|
|
||||||
if (phase == PaintPhase::Background) {
|
if (phase == Painting::PaintPhase::Background) {
|
||||||
auto top_left_border_radius = computed_values().border_top_left_radius();
|
auto top_left_border_radius = computed_values().border_top_left_radius();
|
||||||
auto top_right_border_radius = computed_values().border_top_right_radius();
|
auto top_right_border_radius = computed_values().border_top_right_radius();
|
||||||
auto bottom_right_border_radius = computed_values().border_bottom_right_radius();
|
auto bottom_right_border_radius = computed_values().border_bottom_right_radius();
|
||||||
|
@ -74,7 +74,7 @@ void InlineNode::paint(PaintContext& context, PaintPhase phase)
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
if (phase == PaintPhase::Border) {
|
if (phase == Painting::PaintPhase::Border) {
|
||||||
auto top_left_border_radius = computed_values().border_top_left_radius();
|
auto top_left_border_radius = computed_values().border_top_left_radius();
|
||||||
auto top_right_border_radius = computed_values().border_top_right_radius();
|
auto top_right_border_radius = computed_values().border_top_right_radius();
|
||||||
auto bottom_right_border_radius = computed_values().border_bottom_right_radius();
|
auto bottom_right_border_radius = computed_values().border_bottom_right_radius();
|
||||||
|
@ -114,7 +114,7 @@ void InlineNode::paint(PaintContext& context, PaintPhase phase)
|
||||||
|
|
||||||
// FIXME: We check for a non-null dom_node(), since pseudo-elements have a null one and were getting
|
// FIXME: We check for a non-null dom_node(), since pseudo-elements have a null one and were getting
|
||||||
// highlighted incorrectly. A better solution will be needed if we want to inspect them too.
|
// highlighted incorrectly. A better solution will be needed if we want to inspect them too.
|
||||||
if (phase == PaintPhase::Overlay && dom_node() && document().inspected_node() == dom_node()) {
|
if (phase == Painting::PaintPhase::Overlay && dom_node() && document().inspected_node() == dom_node()) {
|
||||||
// FIXME: This paints a double-thick border between adjacent fragments, where ideally there
|
// FIXME: This paints a double-thick border between adjacent fragments, where ideally there
|
||||||
// would be none. Once we implement non-rectangular outlines for the `outline` CSS
|
// would be none. Once we implement non-rectangular outlines for the `outline` CSS
|
||||||
// property, we can use that here instead.
|
// property, we can use that here instead.
|
||||||
|
|
|
@ -15,7 +15,7 @@ public:
|
||||||
InlineNode(DOM::Document&, DOM::Element*, NonnullRefPtr<CSS::StyleProperties>);
|
InlineNode(DOM::Document&, DOM::Element*, NonnullRefPtr<CSS::StyleProperties>);
|
||||||
virtual ~InlineNode() override;
|
virtual ~InlineNode() override;
|
||||||
|
|
||||||
virtual void paint(PaintContext&, PaintPhase) override;
|
virtual void paint(PaintContext&, Painting::PaintPhase) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
template<typename Callback>
|
template<typename Callback>
|
||||||
|
|
|
@ -15,7 +15,7 @@
|
||||||
|
|
||||||
namespace Web::Layout {
|
namespace Web::Layout {
|
||||||
|
|
||||||
void LineBoxFragment::paint(PaintContext& context, PaintPhase phase)
|
void LineBoxFragment::paint(PaintContext& context, Painting::PaintPhase phase)
|
||||||
{
|
{
|
||||||
for (auto* ancestor = layout_node().parent(); ancestor; ancestor = ancestor->parent()) {
|
for (auto* ancestor = layout_node().parent(); ancestor; ancestor = ancestor->parent()) {
|
||||||
if (!ancestor->is_visible())
|
if (!ancestor->is_visible())
|
||||||
|
|
|
@ -55,7 +55,7 @@ public:
|
||||||
|
|
||||||
float absolute_x() const { return absolute_rect().x(); }
|
float absolute_x() const { return absolute_rect().x(); }
|
||||||
|
|
||||||
void paint(PaintContext&, PaintPhase);
|
void paint(PaintContext&, Painting::PaintPhase);
|
||||||
|
|
||||||
bool ends_in_whitespace() const;
|
bool ends_in_whitespace() const;
|
||||||
bool is_justifiable_whitespace() const;
|
bool is_justifiable_whitespace() const;
|
||||||
|
|
|
@ -55,9 +55,9 @@ ListItemMarkerBox::~ListItemMarkerBox()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void ListItemMarkerBox::paint(PaintContext& context, PaintPhase phase)
|
void ListItemMarkerBox::paint(PaintContext& context, Painting::PaintPhase phase)
|
||||||
{
|
{
|
||||||
if (phase != PaintPhase::Foreground)
|
if (phase != Painting::PaintPhase::Foreground)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
auto enclosing = enclosing_int_rect(m_paint_box->absolute_rect());
|
auto enclosing = enclosing_int_rect(m_paint_box->absolute_rect());
|
||||||
|
|
|
@ -16,7 +16,7 @@ public:
|
||||||
explicit ListItemMarkerBox(DOM::Document&, CSS::ListStyleType, size_t index, NonnullRefPtr<CSS::StyleProperties>);
|
explicit ListItemMarkerBox(DOM::Document&, CSS::ListStyleType, size_t index, NonnullRefPtr<CSS::StyleProperties>);
|
||||||
virtual ~ListItemMarkerBox() override;
|
virtual ~ListItemMarkerBox() override;
|
||||||
|
|
||||||
virtual void paint(PaintContext&, PaintPhase) override;
|
virtual void paint(PaintContext&, Painting::PaintPhase) override;
|
||||||
|
|
||||||
Gfx::Bitmap const* list_style_image_bitmap() const;
|
Gfx::Bitmap const* list_style_image_bitmap() const;
|
||||||
String const& text() const { return m_text; }
|
String const& text() const { return m_text; }
|
||||||
|
|
|
@ -26,14 +26,6 @@ enum class LayoutMode {
|
||||||
OnlyRequiredLineBreaks,
|
OnlyRequiredLineBreaks,
|
||||||
};
|
};
|
||||||
|
|
||||||
enum class PaintPhase {
|
|
||||||
Background,
|
|
||||||
Border,
|
|
||||||
Foreground,
|
|
||||||
FocusOutline,
|
|
||||||
Overlay,
|
|
||||||
};
|
|
||||||
|
|
||||||
struct HitTestResult {
|
struct HitTestResult {
|
||||||
RefPtr<Node> layout_node;
|
RefPtr<Node> layout_node;
|
||||||
int index_in_node { 0 };
|
int index_in_node { 0 };
|
||||||
|
@ -92,10 +84,10 @@ public:
|
||||||
virtual void handle_mousemove(Badge<EventHandler>, const Gfx::IntPoint&, unsigned buttons, unsigned modifiers);
|
virtual void handle_mousemove(Badge<EventHandler>, const Gfx::IntPoint&, unsigned buttons, unsigned modifiers);
|
||||||
virtual bool handle_mousewheel(Badge<EventHandler>, const Gfx::IntPoint&, unsigned buttons, unsigned modifiers, int wheel_delta_x, int wheel_delta_y);
|
virtual bool handle_mousewheel(Badge<EventHandler>, const Gfx::IntPoint&, unsigned buttons, unsigned modifiers, int wheel_delta_x, int wheel_delta_y);
|
||||||
|
|
||||||
virtual void before_children_paint(PaintContext&, PaintPhase) {};
|
virtual void before_children_paint(PaintContext&, Painting::PaintPhase) {};
|
||||||
virtual void paint(PaintContext&, PaintPhase) = 0;
|
virtual void paint(PaintContext&, Painting::PaintPhase) = 0;
|
||||||
virtual void paint_fragment(PaintContext&, const LineBoxFragment&, PaintPhase) const { }
|
virtual void paint_fragment(PaintContext&, const LineBoxFragment&, Painting::PaintPhase) const { }
|
||||||
virtual void after_children_paint(PaintContext&, PaintPhase) {};
|
virtual void after_children_paint(PaintContext&, Painting::PaintPhase) {};
|
||||||
|
|
||||||
// These are used to optimize hot is<T> variants for some classes where dynamic_cast is too slow.
|
// These are used to optimize hot is<T> variants for some classes where dynamic_cast is too slow.
|
||||||
virtual bool is_box() const { return false; }
|
virtual bool is_box() const { return false; }
|
||||||
|
|
|
@ -21,12 +21,12 @@ Progress::~Progress()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void Progress::paint(PaintContext& context, PaintPhase phase)
|
void Progress::paint(PaintContext& context, Painting::PaintPhase phase)
|
||||||
{
|
{
|
||||||
if (!is_visible())
|
if (!is_visible())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (phase == PaintPhase::Foreground) {
|
if (phase == Painting::PaintPhase::Foreground) {
|
||||||
// FIXME: This does not support floating point value() and max()
|
// FIXME: This does not support floating point value() and max()
|
||||||
Gfx::StylePainter::paint_progressbar(context.painter(), enclosing_int_rect(m_paint_box->absolute_rect()), context.palette(), 0, dom_node().max(), dom_node().value(), "");
|
Gfx::StylePainter::paint_progressbar(context.painter(), enclosing_int_rect(m_paint_box->absolute_rect()), context.palette(), 0, dom_node().max(), dom_node().value(), "");
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,7 +16,7 @@ public:
|
||||||
Progress(DOM::Document&, HTML::HTMLProgressElement&, NonnullRefPtr<CSS::StyleProperties>);
|
Progress(DOM::Document&, HTML::HTMLProgressElement&, NonnullRefPtr<CSS::StyleProperties>);
|
||||||
virtual ~Progress() override;
|
virtual ~Progress() override;
|
||||||
|
|
||||||
virtual void paint(PaintContext&, PaintPhase) override;
|
virtual void paint(PaintContext&, Painting::PaintPhase) override;
|
||||||
|
|
||||||
const HTML::HTMLProgressElement& dom_node() const { return static_cast<const HTML::HTMLProgressElement&>(LabelableNode::dom_node()); }
|
const HTML::HTMLProgressElement& dom_node() const { return static_cast<const HTML::HTMLProgressElement&>(LabelableNode::dom_node()); }
|
||||||
HTML::HTMLProgressElement& dom_node() { return static_cast<HTML::HTMLProgressElement&>(LabelableNode::dom_node()); }
|
HTML::HTMLProgressElement& dom_node() { return static_cast<HTML::HTMLProgressElement&>(LabelableNode::dom_node()); }
|
||||||
|
|
|
@ -26,14 +26,14 @@ RadioButton::~RadioButton()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void RadioButton::paint(PaintContext& context, PaintPhase phase)
|
void RadioButton::paint(PaintContext& context, Painting::PaintPhase phase)
|
||||||
{
|
{
|
||||||
if (!is_visible())
|
if (!is_visible())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
LabelableNode::paint(context, phase);
|
LabelableNode::paint(context, phase);
|
||||||
|
|
||||||
if (phase == PaintPhase::Foreground) {
|
if (phase == Painting::PaintPhase::Foreground) {
|
||||||
Gfx::StylePainter::paint_radio_button(context.painter(), enclosing_int_rect(m_paint_box->absolute_rect()), context.palette(), dom_node().checked(), m_being_pressed);
|
Gfx::StylePainter::paint_radio_button(context.painter(), enclosing_int_rect(m_paint_box->absolute_rect()), context.palette(), dom_node().checked(), m_being_pressed);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,7 +16,7 @@ public:
|
||||||
RadioButton(DOM::Document&, HTML::HTMLInputElement&, NonnullRefPtr<CSS::StyleProperties>);
|
RadioButton(DOM::Document&, HTML::HTMLInputElement&, NonnullRefPtr<CSS::StyleProperties>);
|
||||||
virtual ~RadioButton() override;
|
virtual ~RadioButton() override;
|
||||||
|
|
||||||
virtual void paint(PaintContext&, PaintPhase) override;
|
virtual void paint(PaintContext&, Painting::PaintPhase) override;
|
||||||
|
|
||||||
const HTML::HTMLInputElement& dom_node() const { return static_cast<const HTML::HTMLInputElement&>(LabelableNode::dom_node()); }
|
const HTML::HTMLInputElement& dom_node() const { return static_cast<const HTML::HTMLInputElement&>(LabelableNode::dom_node()); }
|
||||||
HTML::HTMLInputElement& dom_node() { return static_cast<HTML::HTMLInputElement&>(LabelableNode::dom_node()); }
|
HTML::HTMLInputElement& dom_node() { return static_cast<HTML::HTMLInputElement&>(LabelableNode::dom_node()); }
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
|
|
||||||
#include <LibGfx/Painter.h>
|
#include <LibGfx/Painter.h>
|
||||||
#include <LibWeb/Layout/SVGBox.h>
|
#include <LibWeb/Layout/SVGBox.h>
|
||||||
|
#include <LibWeb/Painting/StackingContext.h>
|
||||||
|
|
||||||
namespace Web::Layout {
|
namespace Web::Layout {
|
||||||
|
|
||||||
|
@ -14,18 +15,18 @@ SVGBox::SVGBox(DOM::Document& document, SVG::SVGElement& element, NonnullRefPtr<
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void SVGBox::before_children_paint(PaintContext& context, PaintPhase phase)
|
void SVGBox::before_children_paint(PaintContext& context, Painting::PaintPhase phase)
|
||||||
{
|
{
|
||||||
Node::before_children_paint(context, phase);
|
Node::before_children_paint(context, phase);
|
||||||
if (phase != PaintPhase::Foreground)
|
if (phase != Painting::PaintPhase::Foreground)
|
||||||
return;
|
return;
|
||||||
context.svg_context().save();
|
context.svg_context().save();
|
||||||
}
|
}
|
||||||
|
|
||||||
void SVGBox::after_children_paint(PaintContext& context, PaintPhase phase)
|
void SVGBox::after_children_paint(PaintContext& context, Painting::PaintPhase phase)
|
||||||
{
|
{
|
||||||
Node::after_children_paint(context, phase);
|
Node::after_children_paint(context, phase);
|
||||||
if (phase != PaintPhase::Foreground)
|
if (phase != Painting::PaintPhase::Foreground)
|
||||||
return;
|
return;
|
||||||
context.svg_context().restore();
|
context.svg_context().restore();
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,8 +20,8 @@ public:
|
||||||
SVG::SVGElement& dom_node() { return verify_cast<SVG::SVGElement>(*Box::dom_node()); }
|
SVG::SVGElement& dom_node() { return verify_cast<SVG::SVGElement>(*Box::dom_node()); }
|
||||||
SVG::SVGElement const& dom_node() const { return verify_cast<SVG::SVGElement>(*Box::dom_node()); }
|
SVG::SVGElement const& dom_node() const { return verify_cast<SVG::SVGElement>(*Box::dom_node()); }
|
||||||
|
|
||||||
virtual void before_children_paint(PaintContext& context, PaintPhase phase) override;
|
virtual void before_children_paint(PaintContext& context, Painting::PaintPhase phase) override;
|
||||||
virtual void after_children_paint(PaintContext& context, PaintPhase phase) override;
|
virtual void after_children_paint(PaintContext& context, Painting::PaintPhase phase) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
virtual bool is_svg_box() const final { return true; }
|
virtual bool is_svg_box() const final { return true; }
|
||||||
|
|
|
@ -19,14 +19,14 @@ SVGGeometryBox::SVGGeometryBox(DOM::Document& document, SVG::SVGGeometryElement&
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void SVGGeometryBox::paint(PaintContext& context, PaintPhase phase)
|
void SVGGeometryBox::paint(PaintContext& context, Painting::PaintPhase phase)
|
||||||
{
|
{
|
||||||
if (!is_visible())
|
if (!is_visible())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
SVGGraphicsBox::paint(context, phase);
|
SVGGraphicsBox::paint(context, phase);
|
||||||
|
|
||||||
if (phase != PaintPhase::Foreground)
|
if (phase != Painting::PaintPhase::Foreground)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
auto& geometry_element = dom_node();
|
auto& geometry_element = dom_node();
|
||||||
|
|
|
@ -19,7 +19,7 @@ public:
|
||||||
SVG::SVGGeometryElement& dom_node() { return verify_cast<SVG::SVGGeometryElement>(SVGGraphicsBox::dom_node()); }
|
SVG::SVGGeometryElement& dom_node() { return verify_cast<SVG::SVGGeometryElement>(SVGGraphicsBox::dom_node()); }
|
||||||
SVG::SVGGeometryElement const& dom_node() const { return verify_cast<SVG::SVGGeometryElement>(SVGGraphicsBox::dom_node()); }
|
SVG::SVGGeometryElement const& dom_node() const { return verify_cast<SVG::SVGGeometryElement>(SVGGraphicsBox::dom_node()); }
|
||||||
|
|
||||||
virtual void paint(PaintContext& context, PaintPhase phase) override;
|
virtual void paint(PaintContext& context, Painting::PaintPhase phase) override;
|
||||||
|
|
||||||
float viewbox_scaling() const;
|
float viewbox_scaling() const;
|
||||||
Gfx::FloatPoint viewbox_origin() const;
|
Gfx::FloatPoint viewbox_origin() const;
|
||||||
|
|
|
@ -5,6 +5,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <LibWeb/Layout/SVGGraphicsBox.h>
|
#include <LibWeb/Layout/SVGGraphicsBox.h>
|
||||||
|
#include <LibWeb/Painting/StackingContext.h>
|
||||||
|
|
||||||
namespace Web::Layout {
|
namespace Web::Layout {
|
||||||
|
|
||||||
|
@ -13,10 +14,10 @@ SVGGraphicsBox::SVGGraphicsBox(DOM::Document& document, SVG::SVGGraphicsElement&
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void SVGGraphicsBox::before_children_paint(PaintContext& context, PaintPhase phase)
|
void SVGGraphicsBox::before_children_paint(PaintContext& context, Painting::PaintPhase phase)
|
||||||
{
|
{
|
||||||
SVGBox::before_children_paint(context, phase);
|
SVGBox::before_children_paint(context, phase);
|
||||||
if (phase != PaintPhase::Foreground)
|
if (phase != Painting::PaintPhase::Foreground)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
auto& graphics_element = verify_cast<SVG::SVGGraphicsElement>(dom_node());
|
auto& graphics_element = verify_cast<SVG::SVGGraphicsElement>(dom_node());
|
||||||
|
|
|
@ -20,7 +20,7 @@ public:
|
||||||
SVG::SVGGraphicsElement& dom_node() { return verify_cast<SVG::SVGGraphicsElement>(SVGBox::dom_node()); }
|
SVG::SVGGraphicsElement& dom_node() { return verify_cast<SVG::SVGGraphicsElement>(SVGBox::dom_node()); }
|
||||||
SVG::SVGGraphicsElement const& dom_node() const { return verify_cast<SVG::SVGGraphicsElement>(SVGBox::dom_node()); }
|
SVG::SVGGraphicsElement const& dom_node() const { return verify_cast<SVG::SVGGraphicsElement>(SVGBox::dom_node()); }
|
||||||
|
|
||||||
virtual void before_children_paint(PaintContext& context, PaintPhase phase) override;
|
virtual void before_children_paint(PaintContext& context, Painting::PaintPhase phase) override;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,9 +14,9 @@ SVGSVGBox::SVGSVGBox(DOM::Document& document, SVG::SVGSVGElement& element, Nonnu
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void SVGSVGBox::before_children_paint(PaintContext& context, PaintPhase phase)
|
void SVGSVGBox::before_children_paint(PaintContext& context, Painting::PaintPhase phase)
|
||||||
{
|
{
|
||||||
if (phase != PaintPhase::Foreground)
|
if (phase != Painting::PaintPhase::Foreground)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (!context.has_svg_context())
|
if (!context.has_svg_context())
|
||||||
|
@ -25,10 +25,10 @@ void SVGSVGBox::before_children_paint(PaintContext& context, PaintPhase phase)
|
||||||
SVGGraphicsBox::before_children_paint(context, phase);
|
SVGGraphicsBox::before_children_paint(context, phase);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SVGSVGBox::after_children_paint(PaintContext& context, PaintPhase phase)
|
void SVGSVGBox::after_children_paint(PaintContext& context, Painting::PaintPhase phase)
|
||||||
{
|
{
|
||||||
SVGGraphicsBox::after_children_paint(context, phase);
|
SVGGraphicsBox::after_children_paint(context, phase);
|
||||||
if (phase != PaintPhase::Foreground)
|
if (phase != Painting::PaintPhase::Foreground)
|
||||||
return;
|
return;
|
||||||
context.clear_svg_context();
|
context.clear_svg_context();
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,8 +18,8 @@ public:
|
||||||
|
|
||||||
SVG::SVGSVGElement& dom_node() { return verify_cast<SVG::SVGSVGElement>(SVGGraphicsBox::dom_node()); }
|
SVG::SVGSVGElement& dom_node() { return verify_cast<SVG::SVGSVGElement>(SVGGraphicsBox::dom_node()); }
|
||||||
|
|
||||||
virtual void before_children_paint(PaintContext& context, PaintPhase phase) override;
|
virtual void before_children_paint(PaintContext& context, Painting::PaintPhase phase) override;
|
||||||
virtual void after_children_paint(PaintContext& context, PaintPhase phase) override;
|
virtual void after_children_paint(PaintContext& context, Painting::PaintPhase phase) override;
|
||||||
|
|
||||||
virtual bool can_have_children() const override { return true; }
|
virtual bool can_have_children() const override { return true; }
|
||||||
};
|
};
|
||||||
|
|
|
@ -113,11 +113,11 @@ void TextNode::paint_text_decoration(Gfx::Painter& painter, LineBoxFragment cons
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void TextNode::paint_fragment(PaintContext& context, const LineBoxFragment& fragment, PaintPhase phase) const
|
void TextNode::paint_fragment(PaintContext& context, const LineBoxFragment& fragment, Painting::PaintPhase phase) const
|
||||||
{
|
{
|
||||||
auto& painter = context.painter();
|
auto& painter = context.painter();
|
||||||
|
|
||||||
if (phase == PaintPhase::Foreground) {
|
if (phase == Painting::PaintPhase::Foreground) {
|
||||||
auto fragment_absolute_rect = fragment.absolute_rect();
|
auto fragment_absolute_rect = fragment.absolute_rect();
|
||||||
|
|
||||||
painter.set_font(font());
|
painter.set_font(font());
|
||||||
|
@ -366,7 +366,7 @@ Optional<TextNode::Chunk> TextNode::ChunkIterator::try_commit_chunk(Utf8View::It
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
void TextNode::paint(PaintContext&, PaintPhase)
|
void TextNode::paint(PaintContext&, Painting::PaintPhase)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -23,7 +23,7 @@ public:
|
||||||
|
|
||||||
const String& text_for_rendering() const { return m_text_for_rendering; }
|
const String& text_for_rendering() const { return m_text_for_rendering; }
|
||||||
|
|
||||||
virtual void paint_fragment(PaintContext&, const LineBoxFragment&, PaintPhase) const override;
|
virtual void paint_fragment(PaintContext&, const LineBoxFragment&, Painting::PaintPhase) const override;
|
||||||
|
|
||||||
struct Chunk {
|
struct Chunk {
|
||||||
Utf8View view;
|
Utf8View view;
|
||||||
|
@ -60,7 +60,7 @@ private:
|
||||||
virtual void handle_mousemove(Badge<EventHandler>, const Gfx::IntPoint&, unsigned button, unsigned modifiers) override;
|
virtual void handle_mousemove(Badge<EventHandler>, const Gfx::IntPoint&, unsigned button, unsigned modifiers) override;
|
||||||
void paint_cursor_if_needed(PaintContext&, const LineBoxFragment&) const;
|
void paint_cursor_if_needed(PaintContext&, const LineBoxFragment&) const;
|
||||||
void paint_text_decoration(Gfx::Painter&, LineBoxFragment const&) const;
|
void paint_text_decoration(Gfx::Painter&, LineBoxFragment const&) const;
|
||||||
virtual void paint(PaintContext&, PaintPhase) override;
|
virtual void paint(PaintContext&, Painting::PaintPhase) override;
|
||||||
|
|
||||||
String m_text_for_rendering;
|
String m_text_for_rendering;
|
||||||
};
|
};
|
||||||
|
|
|
@ -13,9 +13,9 @@
|
||||||
#include <LibWeb/Painting/Box.h>
|
#include <LibWeb/Painting/Box.h>
|
||||||
#include <LibWeb/Painting/StackingContext.h>
|
#include <LibWeb/Painting/StackingContext.h>
|
||||||
|
|
||||||
namespace Web::Layout {
|
namespace Web::Painting {
|
||||||
|
|
||||||
StackingContext::StackingContext(Box& box, StackingContext* parent)
|
StackingContext::StackingContext(Layout::Box& box, StackingContext* parent)
|
||||||
: m_box(box)
|
: m_box(box)
|
||||||
, m_parent(parent)
|
, m_parent(parent)
|
||||||
{
|
{
|
||||||
|
@ -34,7 +34,7 @@ StackingContext::StackingContext(Box& box, StackingContext* parent)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void StackingContext::paint_descendants(PaintContext& context, Node& box, StackingContextPaintPhase phase)
|
void StackingContext::paint_descendants(PaintContext& context, Layout::Node& box, StackingContextPaintPhase phase)
|
||||||
{
|
{
|
||||||
if (phase == StackingContextPaintPhase::Foreground)
|
if (phase == StackingContextPaintPhase::Foreground)
|
||||||
box.before_children_paint(context, PaintPhase::Foreground);
|
box.before_children_paint(context, PaintPhase::Foreground);
|
||||||
|
@ -42,7 +42,7 @@ void StackingContext::paint_descendants(PaintContext& context, Node& box, Stacki
|
||||||
box.for_each_child([&](auto& child) {
|
box.for_each_child([&](auto& child) {
|
||||||
if (child.establishes_stacking_context())
|
if (child.establishes_stacking_context())
|
||||||
return;
|
return;
|
||||||
bool child_is_inline_or_replaced = child.is_inline() || is<ReplacedBox>(child);
|
bool child_is_inline_or_replaced = child.is_inline() || is<Layout::ReplacedBox>(child);
|
||||||
switch (phase) {
|
switch (phase) {
|
||||||
case StackingContextPaintPhase::BackgroundAndBorders:
|
case StackingContextPaintPhase::BackgroundAndBorders:
|
||||||
if (!child_is_inline_or_replaced && !child.is_floating() && !child.is_positioned()) {
|
if (!child_is_inline_or_replaced && !child.is_floating() && !child.is_positioned()) {
|
||||||
|
@ -147,7 +147,7 @@ void StackingContext::paint(PaintContext& context)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
HitTestResult StackingContext::hit_test(const Gfx::IntPoint& position, HitTestType type) const
|
Layout::HitTestResult StackingContext::hit_test(const Gfx::IntPoint& position, Layout::HitTestType type) const
|
||||||
{
|
{
|
||||||
// NOTE: Hit testing basically happens in reverse painting order.
|
// NOTE: Hit testing basically happens in reverse painting order.
|
||||||
// https://www.w3.org/TR/CSS22/visuren.html#z-index
|
// https://www.w3.org/TR/CSS22/visuren.html#z-index
|
||||||
|
@ -162,7 +162,7 @@ HitTestResult StackingContext::hit_test(const Gfx::IntPoint& position, HitTestTy
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
HitTestResult result;
|
Layout::HitTestResult result;
|
||||||
// 6. the child stacking contexts with stack level 0 and the positioned descendants with stack level 0.
|
// 6. the child stacking contexts with stack level 0 and the positioned descendants with stack level 0.
|
||||||
m_box.for_each_in_subtree_of_type<Layout::Box>([&](Layout::Box const& box) {
|
m_box.for_each_in_subtree_of_type<Layout::Box>([&](Layout::Box const& box) {
|
||||||
if (box.is_positioned() && !box.stacking_context()) {
|
if (box.is_positioned() && !box.stacking_context()) {
|
||||||
|
@ -176,7 +176,7 @@ HitTestResult StackingContext::hit_test(const Gfx::IntPoint& position, HitTestTy
|
||||||
return result;
|
return result;
|
||||||
|
|
||||||
// 5. the in-flow, inline-level, non-positioned descendants, including inline tables and inline blocks.
|
// 5. the in-flow, inline-level, non-positioned descendants, including inline tables and inline blocks.
|
||||||
if (m_box.children_are_inline() && is<BlockContainer>(m_box)) {
|
if (m_box.children_are_inline() && is<Layout::BlockContainer>(m_box)) {
|
||||||
auto result = m_box.hit_test(position, type);
|
auto result = m_box.hit_test(position, type);
|
||||||
if (result.layout_node)
|
if (result.layout_node)
|
||||||
return result;
|
return result;
|
||||||
|
@ -218,7 +218,7 @@ HitTestResult StackingContext::hit_test(const Gfx::IntPoint& position, HitTestTy
|
||||||
|
|
||||||
// 1. the background and borders of the element forming the stacking context.
|
// 1. the background and borders of the element forming the stacking context.
|
||||||
if (m_box.m_paint_box->absolute_border_box_rect().contains(position.to_type<float>())) {
|
if (m_box.m_paint_box->absolute_border_box_rect().contains(position.to_type<float>())) {
|
||||||
return HitTestResult {
|
return Layout::HitTestResult {
|
||||||
.layout_node = m_box,
|
.layout_node = m_box,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,11 +9,19 @@
|
||||||
#include <AK/Vector.h>
|
#include <AK/Vector.h>
|
||||||
#include <LibWeb/Layout/Node.h>
|
#include <LibWeb/Layout/Node.h>
|
||||||
|
|
||||||
namespace Web::Layout {
|
namespace Web::Painting {
|
||||||
|
|
||||||
|
enum class PaintPhase {
|
||||||
|
Background,
|
||||||
|
Border,
|
||||||
|
Foreground,
|
||||||
|
FocusOutline,
|
||||||
|
Overlay,
|
||||||
|
};
|
||||||
|
|
||||||
class StackingContext {
|
class StackingContext {
|
||||||
public:
|
public:
|
||||||
StackingContext(Box&, StackingContext* parent);
|
StackingContext(Layout::Box&, StackingContext* parent);
|
||||||
|
|
||||||
StackingContext* parent() { return m_parent; }
|
StackingContext* parent() { return m_parent; }
|
||||||
const StackingContext* parent() const { return m_parent; }
|
const StackingContext* parent() const { return m_parent; }
|
||||||
|
@ -26,14 +34,14 @@ public:
|
||||||
FocusAndOverlay,
|
FocusAndOverlay,
|
||||||
};
|
};
|
||||||
|
|
||||||
void paint_descendants(PaintContext&, Node&, StackingContextPaintPhase);
|
void paint_descendants(PaintContext&, Layout::Node&, StackingContextPaintPhase);
|
||||||
void paint(PaintContext&);
|
void paint(PaintContext&);
|
||||||
HitTestResult hit_test(const Gfx::IntPoint&, HitTestType) const;
|
Layout::HitTestResult hit_test(Gfx::IntPoint const&, Layout::HitTestType) const;
|
||||||
|
|
||||||
void dump(int indent = 0) const;
|
void dump(int indent = 0) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Box& m_box;
|
Layout::Box& m_box;
|
||||||
StackingContext* const m_parent { nullptr };
|
StackingContext* const m_parent { nullptr };
|
||||||
Vector<StackingContext*> m_children;
|
Vector<StackingContext*> m_children;
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue