Explorar el Código

LibWeb: Store clip border radii in CSSPixels instead of DevicePixels

Paintable boxes should not hold information stored in device pixels.
It should be converted from CSS pixels only by the time painting
command recording occurs.
Aliaksandr Kalenik hace 1 año
padre
commit
d27b376699

+ 1 - 1
Userland/Libraries/LibWeb/HTML/Navigable.cpp

@@ -2085,7 +2085,7 @@ void Navigable::paint(Painting::RecordingPainter& recording_painter, PaintConfig
     HashMap<Painting::PaintableBox const*, Painting::ViewportPaintable::ScrollFrame> scroll_frames;
     if (is_traversable()) {
         document->paintable()->assign_scroll_frame_ids(scroll_frames);
-        document->paintable()->assign_clip_rectangles(context);
+        document->paintable()->assign_clip_rectangles();
     }
 
     document->paintable()->paint_all_phases(context);

+ 6 - 2
Userland/Libraries/LibWeb/Painting/PaintableBox.cpp

@@ -412,7 +412,9 @@ void PaintableBox::apply_clip_overflow_rect(PaintContext& context, PaintPhase ph
         if (m_corner_clip_radii.has_value()) {
             VERIFY(!m_corner_clipper_id.has_value());
             m_corner_clipper_id = context.allocate_corner_clipper_id();
-            context.recording_painter().sample_under_corners(*m_corner_clipper_id, *m_corner_clip_radii, context.rounded_device_rect(overflow_clip_rect).to_type<int>(), CornerClip::Outside);
+            auto corner_radii = m_corner_clip_radii->as_corners(context);
+            if (corner_radii.has_any_radius())
+                context.recording_painter().sample_under_corners(*m_corner_clipper_id, m_corner_clip_radii->as_corners(context), context.rounded_device_rect(overflow_clip_rect).to_type<int>(), CornerClip::Outside);
         }
     }
 }
@@ -426,7 +428,9 @@ void PaintableBox::clear_clip_overflow_rect(PaintContext& context, PaintPhase ph
         m_clipping_overflow = false;
         if (m_corner_clip_radii.has_value()) {
             VERIFY(m_corner_clipper_id.has_value());
-            context.recording_painter().blit_corner_clipping(*m_corner_clipper_id, context.rounded_device_rect(*m_clip_rect).to_type<int>());
+            auto corner_radii = m_corner_clip_radii->as_corners(context);
+            if (corner_radii.has_any_radius())
+                context.recording_painter().blit_corner_clipping(*m_corner_clipper_id, context.rounded_device_rect(*m_clip_rect).to_type<int>());
             m_corner_clipper_id = {};
         }
         context.recording_painter().restore();

+ 2 - 2
Userland/Libraries/LibWeb/Painting/PaintableBox.h

@@ -196,7 +196,7 @@ public:
     void set_clip_rect(Optional<CSSPixelRect> rect) { m_clip_rect = rect; }
     void set_scroll_frame_id(int id) { m_scroll_frame_id = id; }
     void set_enclosing_scroll_frame_offset(CSSPixelPoint offset) { m_enclosing_scroll_frame_offset = offset; }
-    void set_corner_clip_radii(CornerRadii const& corner_radii) { m_corner_clip_radii = corner_radii; }
+    void set_corner_clip_radii(BorderRadiiData const& corner_radii) { m_corner_clip_radii = corner_radii; }
 
 protected:
     explicit PaintableBox(Layout::Box const&);
@@ -228,7 +228,7 @@ private:
     Optional<CSSPixelRect> m_clip_rect;
     Optional<int> m_scroll_frame_id;
     Optional<CSSPixelPoint> m_enclosing_scroll_frame_offset;
-    Optional<CornerRadii> m_corner_clip_radii;
+    Optional<BorderRadiiData> m_corner_clip_radii;
 
     Optional<BordersDataWithElementKind> m_override_borders_data;
     Optional<TableCellCoordinates> m_table_cell_coordinates;

+ 3 - 4
Userland/Libraries/LibWeb/Painting/ViewportPaintable.cpp

@@ -95,7 +95,7 @@ void ViewportPaintable::assign_scroll_frame_ids(HashMap<Painting::PaintableBox c
     });
 }
 
-void ViewportPaintable::assign_clip_rectangles(PaintContext const& context)
+void ViewportPaintable::assign_clip_rectangles()
 {
     HashMap<Paintable const*, CSSPixelRect> clip_rects;
     // Calculate clip rects for all boxes that either have hidden overflow or a CSS clip property.
@@ -129,10 +129,9 @@ void ViewportPaintable::assign_clip_rectangles(PaintContext const& context)
         for (auto block = paintable_box.containing_block(); block; block = block->containing_block()) {
             if (auto containing_block_clip_rect = clip_rects.get(block->paintable()); containing_block_clip_rect.has_value()) {
                 auto border_radii_data = block->paintable_box()->normalized_border_radii_data(ShrinkRadiiForBorders::Yes);
-                CornerRadii corner_radii = border_radii_data.as_corners(context);
-                if (corner_radii.has_any_radius()) {
+                if (border_radii_data.has_any_radius()) {
                     // FIXME: Border radii of all boxes in containing block chain should be taken into account instead of just the closest one.
-                    const_cast<PaintableBox&>(paintable_box).set_corner_clip_radii(corner_radii);
+                    const_cast<PaintableBox&>(paintable_box).set_corner_clip_radii(border_radii_data);
                 }
                 clip_rect = *containing_block_clip_rect;
                 break;

+ 1 - 1
Userland/Libraries/LibWeb/Painting/ViewportPaintable.h

@@ -25,7 +25,7 @@ public:
         CSSPixelPoint offset;
     };
     void assign_scroll_frame_ids(HashMap<Painting::PaintableBox const*, ScrollFrame>&) const;
-    void assign_clip_rectangles(PaintContext const&);
+    void assign_clip_rectangles();
 
 private:
     void build_stacking_context_tree();