Skip to content

Commit 0bf4089

Browse files
AtkinsSJlinusg
authored andcommitted
LibWeb: Convert border painting to new pixel units
1 parent 0233627 commit 0bf4089

12 files changed

+135
-140
lines changed

Userland/Libraries/LibWeb/Painting/BackgroundPainting.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ void paint_background(PaintContext& context, Layout::NodeWithStyleAndBoxModelMet
7777

7878
Gfx::AntiAliasingPainter aa_painter { painter };
7979
aa_painter.fill_rect_with_rounded_corners(context.rounded_device_rect(color_box.rect).to_type<int>(),
80-
background_color, color_box.radii.top_left.as_corner(), color_box.radii.top_right.as_corner(), color_box.radii.bottom_right.as_corner(), color_box.radii.bottom_left.as_corner());
80+
background_color, color_box.radii.top_left.as_corner(context), color_box.radii.top_right.as_corner(context), color_box.radii.bottom_right.as_corner(context), color_box.radii.bottom_left.as_corner(context));
8181

8282
if (!has_paintable_layers)
8383
return;
@@ -114,7 +114,7 @@ void paint_background(PaintContext& context, Layout::NodeWithStyleAndBoxModelMet
114114
CSSPixelRect const& css_clip_rect = clip_box.rect;
115115
auto clip_rect = context.rounded_device_rect(css_clip_rect);
116116
painter.add_clip_rect(clip_rect.to_type<int>());
117-
ScopedCornerRadiusClip corner_clip { painter, clip_rect.to_type<int>(), clip_box.radii };
117+
ScopedCornerRadiusClip corner_clip { context, painter, clip_rect, clip_box.radii };
118118

119119
if (layer.clip == CSS::BackgroundBox::BorderBox) {
120120
// Shrink the effective clip rect if to account for the bits the borders will definitely paint over

Userland/Libraries/LibWeb/Painting/BorderPainting.cpp

Lines changed: 73 additions & 79 deletions
Large diffs are not rendered by default.

Userland/Libraries/LibWeb/Painting/BorderPainting.h

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -13,26 +13,26 @@
1313
namespace Web::Painting {
1414

1515
struct BorderRadiusData {
16-
float horizontal_radius { 0 };
17-
float vertical_radius { 0 };
16+
CSSPixels horizontal_radius { 0 };
17+
CSSPixels vertical_radius { 0 };
1818

19-
Gfx::AntiAliasingPainter::CornerRadius as_corner() const
19+
Gfx::AntiAliasingPainter::CornerRadius as_corner(PaintContext& context) const
2020
{
2121
return Gfx::AntiAliasingPainter::CornerRadius {
22-
static_cast<int>(horizontal_radius),
23-
static_cast<int>(vertical_radius)
22+
context.floored_device_pixels(horizontal_radius).value(),
23+
context.floored_device_pixels(vertical_radius).value()
2424
};
2525
};
2626

2727
inline operator bool() const
2828
{
29-
return static_cast<int>(horizontal_radius) > 0 && static_cast<int>(vertical_radius) > 0;
29+
return horizontal_radius > 0 && vertical_radius > 0;
3030
}
3131

32-
inline void shrink(float horizontal, float vertical)
32+
inline void shrink(CSSPixels horizontal, CSSPixels vertical)
3333
{
34-
horizontal_radius = max(0, horizontal_radius - horizontal);
35-
vertical_radius = max(0, vertical_radius - vertical);
34+
horizontal_radius = max(CSSPixels(0), horizontal_radius - horizontal);
35+
vertical_radius = max(CSSPixels(0), vertical_radius - vertical);
3636
}
3737
};
3838

@@ -47,7 +47,7 @@ struct BorderRadiiData {
4747
return top_left || top_right || bottom_right || bottom_left;
4848
}
4949

50-
inline void shrink(float top, float right, float bottom, float left)
50+
inline void shrink(CSSPixels top, CSSPixels right, CSSPixels bottom, CSSPixels left)
5151
{
5252
top_left.shrink(left, top);
5353
top_right.shrink(right, top);
@@ -56,7 +56,7 @@ struct BorderRadiiData {
5656
}
5757
};
5858

59-
BorderRadiiData normalized_border_radii_data(Layout::Node const&, Gfx::FloatRect const&, CSS::BorderRadiusData top_left_radius, CSS::BorderRadiusData top_right_radius, CSS::BorderRadiusData bottom_right_radius, CSS::BorderRadiusData bottom_left_radius);
59+
BorderRadiiData normalized_border_radii_data(Layout::Node const&, CSSPixelRect const&, CSS::BorderRadiusData top_left_radius, CSS::BorderRadiusData top_right_radius, CSS::BorderRadiusData bottom_right_radius, CSS::BorderRadiusData bottom_left_radius);
6060

6161
enum class BorderEdge {
6262
Top,
@@ -71,9 +71,9 @@ struct BordersData {
7171
CSS::BorderData left;
7272
};
7373

74-
RefPtr<Gfx::Bitmap> get_cached_corner_bitmap(Gfx::IntSize corners_size);
74+
RefPtr<Gfx::Bitmap> get_cached_corner_bitmap(DevicePixelSize corners_size);
7575

76-
void paint_border(PaintContext& context, BorderEdge edge, Gfx::IntRect const& rect, BorderRadiiData const& border_radii_data, BordersData const& borders_data);
77-
void paint_all_borders(PaintContext& context, Gfx::FloatRect const& bordered_rect, BorderRadiiData const& border_radii_data, BordersData const&);
76+
void paint_border(PaintContext& context, BorderEdge edge, DevicePixelRect const& rect, BorderRadiiData const& border_radii_data, BordersData const& borders_data);
77+
void paint_all_borders(PaintContext& context, CSSPixelRect const& bordered_rect, BorderRadiiData const& border_radii_data, BordersData const&);
7878

7979
}

Userland/Libraries/LibWeb/Painting/BorderRadiusCornerClipper.cpp

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -10,16 +10,16 @@
1010

1111
namespace Web::Painting {
1212

13-
ErrorOr<BorderRadiusCornerClipper> BorderRadiusCornerClipper::create(Gfx::IntRect const& border_rect, BorderRadiiData const& border_radii, CornerClip corner_clip, UseCachedBitmap use_cached_bitmap)
13+
ErrorOr<BorderRadiusCornerClipper> BorderRadiusCornerClipper::create(PaintContext& context, DevicePixelRect const& border_rect, BorderRadiiData const& border_radii, CornerClip corner_clip, UseCachedBitmap use_cached_bitmap)
1414
{
1515
VERIFY(border_radii.has_any_radius());
1616

17-
auto top_left = border_radii.top_left.as_corner();
18-
auto top_right = border_radii.top_right.as_corner();
19-
auto bottom_right = border_radii.bottom_right.as_corner();
20-
auto bottom_left = border_radii.bottom_left.as_corner();
17+
auto top_left = border_radii.top_left.as_corner(context);
18+
auto top_right = border_radii.top_right.as_corner(context);
19+
auto bottom_right = border_radii.bottom_right.as_corner(context);
20+
auto bottom_left = border_radii.bottom_left.as_corner(context);
2121

22-
Gfx::IntSize corners_bitmap_size {
22+
DevicePixelSize corners_bitmap_size {
2323
max(
2424
top_left.horizontal_radius + top_right.horizontal_radius,
2525
bottom_left.horizontal_radius + bottom_right.horizontal_radius),
@@ -34,7 +34,7 @@ ErrorOr<BorderRadiusCornerClipper> BorderRadiusCornerClipper::create(Gfx::IntRec
3434
if (!corner_bitmap)
3535
return Error::from_errno(ENOMEM);
3636
} else {
37-
corner_bitmap = TRY(Gfx::Bitmap::try_create(Gfx::BitmapFormat::BGRA8888, corners_bitmap_size));
37+
corner_bitmap = TRY(Gfx::Bitmap::try_create(Gfx::BitmapFormat::BGRA8888, corners_bitmap_size.to_type<int>()));
3838
}
3939

4040
CornerData corner_data {
@@ -60,7 +60,7 @@ void BorderRadiusCornerClipper::sample_under_corners(Gfx::Painter& page_painter)
6060
corner_aa_painter.fill_rect_with_rounded_corners(corner_rect, Color::NamedColor::Black,
6161
m_data.corner_radii.top_left, m_data.corner_radii.top_right, m_data.corner_radii.bottom_right, m_data.corner_radii.bottom_left);
6262

63-
auto copy_page_masked = [&](auto const& mask_src, auto const& page_location) {
63+
auto copy_page_masked = [&](Gfx::IntRect const& mask_src, Gfx::IntPoint const& page_location) {
6464
for (int row = 0; row < mask_src.height(); ++row) {
6565
for (int col = 0; col < mask_src.width(); ++col) {
6666
auto corner_location = mask_src.location().translated(col, row);
@@ -81,13 +81,13 @@ void BorderRadiusCornerClipper::sample_under_corners(Gfx::Painter& page_painter)
8181

8282
// Copy the pixels under the corner mask (using the alpha of the mask):
8383
if (m_data.corner_radii.top_left)
84-
copy_page_masked(m_data.corner_radii.top_left.as_rect().translated(m_data.bitmap_locations.top_left), m_data.page_locations.top_left);
84+
copy_page_masked(m_data.corner_radii.top_left.as_rect().translated(m_data.bitmap_locations.top_left.to_type<int>()), m_data.page_locations.top_left.to_type<int>());
8585
if (m_data.corner_radii.top_right)
86-
copy_page_masked(m_data.corner_radii.top_right.as_rect().translated(m_data.bitmap_locations.top_right), m_data.page_locations.top_right);
86+
copy_page_masked(m_data.corner_radii.top_right.as_rect().translated(m_data.bitmap_locations.top_right.to_type<int>()), m_data.page_locations.top_right.to_type<int>());
8787
if (m_data.corner_radii.bottom_right)
88-
copy_page_masked(m_data.corner_radii.bottom_right.as_rect().translated(m_data.bitmap_locations.bottom_right), m_data.page_locations.bottom_right);
88+
copy_page_masked(m_data.corner_radii.bottom_right.as_rect().translated(m_data.bitmap_locations.bottom_right.to_type<int>()), m_data.page_locations.bottom_right.to_type<int>());
8989
if (m_data.corner_radii.bottom_left)
90-
copy_page_masked(m_data.corner_radii.bottom_left.as_rect().translated(m_data.bitmap_locations.bottom_left), m_data.page_locations.bottom_left);
90+
copy_page_masked(m_data.corner_radii.bottom_left.as_rect().translated(m_data.bitmap_locations.bottom_left.to_type<int>()), m_data.page_locations.bottom_left.to_type<int>());
9191

9292
m_has_sampled = true;
9393
}
@@ -98,13 +98,13 @@ void BorderRadiusCornerClipper::blit_corner_clipping(Gfx::Painter& painter)
9898

9999
// Restore the corners:
100100
if (m_data.corner_radii.top_left)
101-
painter.blit(m_data.page_locations.top_left, *m_corner_bitmap, m_data.corner_radii.top_left.as_rect().translated(m_data.bitmap_locations.top_left));
101+
painter.blit(m_data.page_locations.top_left.to_type<int>(), *m_corner_bitmap, m_data.corner_radii.top_left.as_rect().translated(m_data.bitmap_locations.top_left.to_type<int>()));
102102
if (m_data.corner_radii.top_right)
103-
painter.blit(m_data.page_locations.top_right, *m_corner_bitmap, m_data.corner_radii.top_right.as_rect().translated(m_data.bitmap_locations.top_right));
103+
painter.blit(m_data.page_locations.top_right.to_type<int>(), *m_corner_bitmap, m_data.corner_radii.top_right.as_rect().translated(m_data.bitmap_locations.top_right.to_type<int>()));
104104
if (m_data.corner_radii.bottom_right)
105-
painter.blit(m_data.page_locations.bottom_right, *m_corner_bitmap, m_data.corner_radii.bottom_right.as_rect().translated(m_data.bitmap_locations.bottom_right));
105+
painter.blit(m_data.page_locations.bottom_right.to_type<int>(), *m_corner_bitmap, m_data.corner_radii.bottom_right.as_rect().translated(m_data.bitmap_locations.bottom_right.to_type<int>()));
106106
if (m_data.corner_radii.bottom_left)
107-
painter.blit(m_data.page_locations.bottom_left, *m_corner_bitmap, m_data.corner_radii.bottom_left.as_rect().translated(m_data.bitmap_locations.bottom_left));
107+
painter.blit(m_data.page_locations.bottom_left.to_type<int>(), *m_corner_bitmap, m_data.corner_radii.bottom_left.as_rect().translated(m_data.bitmap_locations.bottom_left.to_type<int>()));
108108
}
109109

110110
}

Userland/Libraries/LibWeb/Painting/BorderRadiusCornerClipper.h

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ class BorderRadiusCornerClipper {
2323
No
2424
};
2525

26-
static ErrorOr<BorderRadiusCornerClipper> create(Gfx::IntRect const& border_rect, BorderRadiiData const& border_radii, CornerClip corner_clip = CornerClip::Outside, UseCachedBitmap use_cached_bitmap = UseCachedBitmap::Yes);
26+
static ErrorOr<BorderRadiusCornerClipper> create(PaintContext&, DevicePixelRect const& border_rect, BorderRadiiData const& border_radii, CornerClip corner_clip = CornerClip::Outside, UseCachedBitmap use_cached_bitmap = UseCachedBitmap::Yes);
2727

2828
void sample_under_corners(Gfx::Painter& page_painter);
2929
void blit_corner_clipping(Gfx::Painter& page_painter);
@@ -38,14 +38,14 @@ class BorderRadiusCornerClipper {
3838
CornerRadius bottom_left;
3939
} corner_radii;
4040
struct CornerLocations {
41-
Gfx::IntPoint top_left;
42-
Gfx::IntPoint top_right;
43-
Gfx::IntPoint bottom_right;
44-
Gfx::IntPoint bottom_left;
41+
DevicePixelPoint top_left;
42+
DevicePixelPoint top_right;
43+
DevicePixelPoint bottom_right;
44+
DevicePixelPoint bottom_left;
4545
};
4646
CornerLocations page_locations;
4747
CornerLocations bitmap_locations;
48-
Gfx::IntSize corner_bitmap_size;
48+
DevicePixelSize corner_bitmap_size;
4949
} m_data;
5050

5151
NonnullRefPtr<Gfx::Bitmap> m_corner_bitmap;
@@ -61,11 +61,11 @@ class BorderRadiusCornerClipper {
6161
};
6262

6363
struct ScopedCornerRadiusClip {
64-
ScopedCornerRadiusClip(Gfx::Painter& painter, Gfx::IntRect const& border_rect, BorderRadiiData const& border_radii, CornerClip corner_clip = CornerClip::Outside, BorderRadiusCornerClipper::UseCachedBitmap use_cached_bitmap = BorderRadiusCornerClipper::UseCachedBitmap::Yes)
64+
ScopedCornerRadiusClip(PaintContext& context, Gfx::Painter& painter, DevicePixelRect const& border_rect, BorderRadiiData const& border_radii, CornerClip corner_clip = CornerClip::Outside, BorderRadiusCornerClipper::UseCachedBitmap use_cached_bitmap = BorderRadiusCornerClipper::UseCachedBitmap::Yes)
6565
: m_painter(painter)
6666
{
6767
if (border_radii.has_any_radius()) {
68-
auto clipper = BorderRadiusCornerClipper::create(border_rect, border_radii, corner_clip, use_cached_bitmap);
68+
auto clipper = BorderRadiusCornerClipper::create(context, border_rect, border_radii, corner_clip, use_cached_bitmap);
6969
if (!clipper.is_error()) {
7070
m_corner_clipper = clipper.release_value();
7171
m_corner_clipper->sample_under_corners(m_painter);

Userland/Libraries/LibWeb/Painting/CanvasPaintable.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,8 @@ void CanvasPaintable::paint(PaintContext& context, PaintPhase phase) const
3131
PaintableBox::paint(context, phase);
3232

3333
if (phase == PaintPhase::Foreground) {
34-
auto canvas_rect = absolute_rect().to_rounded<int>();
35-
ScopedCornerRadiusClip corner_clip { context.painter(), canvas_rect, normalized_border_radii_data(ShrinkRadiiForBorders::Yes) };
34+
auto canvas_rect = context.rounded_device_rect(absolute_rect().to_type<CSSPixels>());
35+
ScopedCornerRadiusClip corner_clip { context, context.painter(), canvas_rect, normalized_border_radii_data(ShrinkRadiiForBorders::Yes) };
3636

3737
// FIXME: This should be done at a different level.
3838
if (is_out_of_view(context))
@@ -41,7 +41,7 @@ void CanvasPaintable::paint(PaintContext& context, PaintPhase phase) const
4141
if (layout_box().dom_node().bitmap()) {
4242
// FIXME: Remove this const_cast.
4343
const_cast<HTML::HTMLCanvasElement&>(layout_box().dom_node()).present();
44-
context.painter().draw_scaled_bitmap(canvas_rect, *layout_box().dom_node().bitmap(), layout_box().dom_node().bitmap()->rect(), 1.0f, to_gfx_scaling_mode(computed_values().image_rendering()));
44+
context.painter().draw_scaled_bitmap(canvas_rect.to_type<int>(), *layout_box().dom_node().bitmap(), layout_box().dom_node().bitmap()->rect(), 1.0f, to_gfx_scaling_mode(computed_values().image_rendering()));
4545
}
4646
}
4747
}

Userland/Libraries/LibWeb/Painting/FilterPainting.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ void apply_backdrop_filter(PaintContext& context, Layout::Node const& node, Gfx:
125125
// FIXME: 3. If element B has any transforms (between B and the Backdrop Root), apply the inverse of those transforms to the contents of T’.
126126

127127
// 4. Apply a clip to the contents of T’, using the border box of element B, including border-radius if specified. Note that the children of B are not considered for the sizing or location of this clip.
128-
ScopedCornerRadiusClip corner_clipper { context.painter(), backdrop_region, border_radii_data };
128+
ScopedCornerRadiusClip corner_clipper { context, context.painter(), backdrop_region.to_type<DevicePixels>(), border_radii_data };
129129

130130
// FIXME: 5. Draw all of element B, including its background, border, and any children elements, into T’.
131131

Userland/Libraries/LibWeb/Painting/ImagePaintable.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,9 +49,9 @@ void ImagePaintable::paint(PaintContext& context, PaintPhase phase) const
4949
alt = image_element.src();
5050
context.painter().draw_text(enclosing_int_rect(absolute_rect()), alt, Gfx::TextAlignment::Center, computed_values().color(), Gfx::TextElision::Right);
5151
} else if (auto bitmap = layout_box().image_loader().bitmap(layout_box().image_loader().current_frame_index())) {
52-
auto image_rect = absolute_rect().to_rounded<int>();
53-
ScopedCornerRadiusClip corner_clip { context.painter(), image_rect, normalized_border_radii_data(ShrinkRadiiForBorders::Yes) };
54-
context.painter().draw_scaled_bitmap(image_rect, *bitmap, bitmap->rect(), 1.0f, to_gfx_scaling_mode(computed_values().image_rendering()));
52+
auto image_rect = context.rounded_device_rect(absolute_rect().to_type<CSSPixels>());
53+
ScopedCornerRadiusClip corner_clip { context, context.painter(), image_rect, normalized_border_radii_data(ShrinkRadiiForBorders::Yes) };
54+
context.painter().draw_scaled_bitmap(image_rect.to_type<int>(), *bitmap, bitmap->rect(), 1.0f, to_gfx_scaling_mode(computed_values().image_rendering()));
5555
}
5656
}
5757
}

Userland/Libraries/LibWeb/Painting/InlinePaintable.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ void InlinePaintable::paint(PaintContext& context, Painting::PaintPhase phase) c
5454
absolute_fragment_rect.set_width(absolute_fragment_rect.width() + extra_end_width);
5555
}
5656

57-
auto border_radii_data = Painting::normalized_border_radii_data(layout_node(), absolute_fragment_rect, top_left_border_radius, top_right_border_radius, bottom_right_border_radius, bottom_left_border_radius);
57+
auto border_radii_data = Painting::normalized_border_radii_data(layout_node(), absolute_fragment_rect.to_type<CSSPixels>(), top_left_border_radius, top_right_border_radius, bottom_right_border_radius, bottom_left_border_radius);
5858
Painting::paint_background(context, layout_node(), absolute_fragment_rect.to_type<CSSPixels>(), computed_values().background_color(), computed_values().image_rendering(), &computed_values().background_layers(), border_radii_data);
5959

6060
if (auto computed_box_shadow = computed_values().box_shadow(); !computed_box_shadow.is_empty()) {
@@ -92,7 +92,7 @@ void InlinePaintable::paint(PaintContext& context, Painting::PaintPhase phase) c
9292
auto containing_block_position_in_absolute_coordinates = containing_block()->paint_box()->absolute_position();
9393

9494
for_each_fragment([&](auto const& fragment, bool is_first_fragment, bool is_last_fragment) {
95-
Gfx::FloatRect absolute_fragment_rect { containing_block_position_in_absolute_coordinates.translated(fragment.offset()), fragment.size() };
95+
CSSPixelRect absolute_fragment_rect { containing_block_position_in_absolute_coordinates.translated(fragment.offset()), fragment.size() };
9696

9797
if (is_first_fragment) {
9898
float extra_start_width = box_model().padding.left;

Userland/Libraries/LibWeb/Painting/NestedBrowsingContextPaintable.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,8 @@ void NestedBrowsingContextPaintable::paint(PaintContext& context, PaintPhase pha
3636
PaintableBox::paint(context, phase);
3737

3838
if (phase == PaintPhase::Foreground) {
39-
auto clip_rect = absolute_rect().to_rounded<int>();
40-
ScopedCornerRadiusClip corner_clip { context.painter(), clip_rect, normalized_border_radii_data(ShrinkRadiiForBorders::Yes) };
39+
auto clip_rect = context.rounded_device_rect(absolute_rect().to_type<CSSPixels>());
40+
ScopedCornerRadiusClip corner_clip { context, context.painter(), clip_rect, normalized_border_radii_data(ShrinkRadiiForBorders::Yes) };
4141

4242
auto* hosted_document = layout_box().dom_node().content_document_without_origin_check();
4343
if (!hosted_document)
@@ -49,7 +49,7 @@ void NestedBrowsingContextPaintable::paint(PaintContext& context, PaintPhase pha
4949
context.painter().save();
5050
auto old_viewport_rect = context.device_viewport_rect();
5151

52-
context.painter().add_clip_rect(clip_rect);
52+
context.painter().add_clip_rect(clip_rect.to_type<int>());
5353
context.painter().translate(absolute_x(), absolute_y());
5454

5555
context.set_device_viewport_rect({ {}, layout_box().dom_node().nested_browsing_context()->size() });

0 commit comments

Comments
 (0)