LibWeb: Remove unused members in PaintOuterBoxShadowParams

This struct had all members in CSSPixels and DevicePixels, but only the
latter are needed for painting.

Shrinks PaintOuterBoxShadowParams from 144 bytes to 72 bytes.
This commit is contained in:
Aliaksandr Kalenik 2024-06-07 15:42:35 +03:00 committed by Andreas Kling
commit 2dd3b6fcff
Notes: sideshowbarker 2024-07-16 23:51:07 +09:00
2 changed files with 23 additions and 28 deletions

View file

@ -12,10 +12,8 @@
namespace Web::Painting { namespace Web::Painting {
struct PaintOuterBoxShadowParams { struct PaintOuterBoxShadowParams {
RecordingPainter& painter; Gfx::Color color;
CSSPixelRect content_rect; ShadowPlacement placement;
BorderRadiiData border_radii;
ShadowData box_shadow_data;
CornerRadii corner_radii; CornerRadii corner_radii;
DevicePixels offset_x; DevicePixels offset_x;
DevicePixels offset_y; DevicePixels offset_y;

View file

@ -57,20 +57,20 @@ void paint_inner_box_shadow(Gfx::Painter& painter, PaintOuterBoxShadowParams par
auto top_right_corner = params.corner_radii.top_right; auto top_right_corner = params.corner_radii.top_right;
auto bottom_right_corner = params.corner_radii.bottom_right; auto bottom_right_corner = params.corner_radii.bottom_right;
auto bottom_left_corner = params.corner_radii.bottom_left; auto bottom_left_corner = params.corner_radii.bottom_left;
shadow_painter.fill_rect(outer_shadow_rect, params.box_shadow_data.color.with_alpha(0xff)); shadow_painter.fill_rect(outer_shadow_rect, params.color.with_alpha(0xff));
if (params.border_radii.has_any_radius()) { if (params.corner_radii.has_any_radius()) {
shadow_aa_painter.fill_rect_with_rounded_corners(inner_shadow_rect, params.box_shadow_data.color.with_alpha(0xff), shadow_aa_painter.fill_rect_with_rounded_corners(inner_shadow_rect, params.color.with_alpha(0xff),
top_left_corner, top_right_corner, bottom_right_corner, bottom_left_corner, top_left_corner, top_right_corner, bottom_right_corner, bottom_left_corner,
Gfx::AntiAliasingPainter::BlendMode::AlphaSubtract); Gfx::AntiAliasingPainter::BlendMode::AlphaSubtract);
} else { } else {
shadow_painter.clear_rect(inner_shadow_rect, Color::Transparent); shadow_painter.clear_rect(inner_shadow_rect, Color::Transparent);
} }
Gfx::StackBlurFilter filter(*shadow_bitmap); Gfx::StackBlurFilter filter(*shadow_bitmap);
filter.process_rgba(blur_radius.value(), params.box_shadow_data.color); filter.process_rgba(blur_radius.value(), params.color);
Gfx::PainterStateSaver save { painter }; Gfx::PainterStateSaver save { painter };
painter.add_clip_rect(device_content_rect_int); painter.add_clip_rect(device_content_rect_int);
painter.blit({ device_content_rect_int.left() - blur_radius.value(), device_content_rect_int.top() - blur_radius.value() }, painter.blit({ device_content_rect_int.left() - blur_radius.value(), device_content_rect_int.top() - blur_radius.value() },
*shadow_bitmap, shadow_bitmap->rect(), params.box_shadow_data.color.alpha() / 255.); *shadow_bitmap, shadow_bitmap->rect(), params.color.alpha() / 255.);
} }
struct OuterBoxShadowMetrics { struct OuterBoxShadowMetrics {
@ -306,9 +306,7 @@ Gfx::IntRect get_outer_box_shadow_bounding_rect(PaintOuterBoxShadowParams params
void paint_outer_box_shadow(Gfx::Painter& painter, PaintOuterBoxShadowParams params) void paint_outer_box_shadow(Gfx::Painter& painter, PaintOuterBoxShadowParams params)
{ {
auto const& box_shadow_data = params.box_shadow_data;
auto const& device_content_rect = params.device_content_rect; auto const& device_content_rect = params.device_content_rect;
auto const& border_radii = params.border_radii;
auto const& top_left_corner = params.corner_radii.top_left; auto const& top_left_corner = params.corner_radii.top_left;
auto const& top_right_corner = params.corner_radii.top_right; auto const& top_right_corner = params.corner_radii.top_right;
@ -366,14 +364,14 @@ void paint_outer_box_shadow(Gfx::Painter& painter, PaintOuterBoxShadowParams par
}; };
// If there's no blurring, nor rounded corners, we can save a lot of effort. // If there's no blurring, nor rounded corners, we can save a lot of effort.
if (blur_radius == 0 && !border_radii.has_any_radius()) { if (blur_radius == 0 && !params.corner_radii.has_any_radius()) {
fill_rect_masked(painter, non_blurred_shadow_rect.translated(offset_x, offset_y), device_content_rect, box_shadow_data.color); fill_rect_masked(painter, non_blurred_shadow_rect.translated(offset_x, offset_y), device_content_rect, params.color);
return; return;
} }
auto paint_shadow_infill = [&] { auto paint_shadow_infill = [&] {
if (!params.border_radii.has_any_radius()) if (!params.corner_radii.has_any_radius())
return painter.fill_rect(inner_bounding_rect.to_type<int>(), box_shadow_data.color); return painter.fill_rect(inner_bounding_rect.to_type<int>(), params.color);
auto top_left_inner_width = top_left_corner_rect.width() - blurred_edge_thickness; auto top_left_inner_width = top_left_corner_rect.width() - blurred_edge_thickness;
auto top_left_inner_height = top_left_corner_rect.height() - blurred_edge_thickness; auto top_left_inner_height = top_left_corner_rect.height() - blurred_edge_thickness;
@ -415,11 +413,11 @@ void paint_outer_box_shadow(Gfx::Painter& painter, PaintOuterBoxShadowParams par
inner_bounding_rect.height() - top_rect.height() - bottom_rect.height() inner_bounding_rect.height() - top_rect.height() - bottom_rect.height()
}; };
painter.fill_rect(top_rect.to_type<int>(), box_shadow_data.color); painter.fill_rect(top_rect.to_type<int>(), params.color);
painter.fill_rect(right_rect.to_type<int>(), box_shadow_data.color); painter.fill_rect(right_rect.to_type<int>(), params.color);
painter.fill_rect(bottom_rect.to_type<int>(), box_shadow_data.color); painter.fill_rect(bottom_rect.to_type<int>(), params.color);
painter.fill_rect(left_rect.to_type<int>(), box_shadow_data.color); painter.fill_rect(left_rect.to_type<int>(), params.color);
painter.fill_rect(inner.to_type<int>(), box_shadow_data.color); painter.fill_rect(inner.to_type<int>(), params.color);
}; };
auto shadows_bitmap = Gfx::Bitmap::create(Gfx::BitmapFormat::BGRA8888, shadow_bitmap_rect.size().to_type<int>()); auto shadows_bitmap = Gfx::Bitmap::create(Gfx::BitmapFormat::BGRA8888, shadow_bitmap_rect.size().to_type<int>());
@ -433,9 +431,9 @@ void paint_outer_box_shadow(Gfx::Painter& painter, PaintOuterBoxShadowParams par
aa_corner_painter.fill_rect_with_rounded_corners( aa_corner_painter.fill_rect_with_rounded_corners(
shadow_bitmap_rect.shrunken(double_radius, double_radius, double_radius, double_radius).to_type<int>(), shadow_bitmap_rect.shrunken(double_radius, double_radius, double_radius, double_radius).to_type<int>(),
box_shadow_data.color, top_left_shadow_corner, top_right_shadow_corner, bottom_right_shadow_corner, bottom_left_shadow_corner); params.color, top_left_shadow_corner, top_right_shadow_corner, bottom_right_shadow_corner, bottom_left_shadow_corner);
Gfx::StackBlurFilter filter(*shadow_bitmap); Gfx::StackBlurFilter filter(*shadow_bitmap);
filter.process_rgba(blur_radius.value(), box_shadow_data.color); filter.process_rgba(blur_radius.value(), params.color);
auto paint_shadow = [&](DevicePixelRect clip_rect) { auto paint_shadow = [&](DevicePixelRect clip_rect) {
Gfx::PainterStateSaver save { painter }; Gfx::PainterStateSaver save { painter };
@ -552,10 +550,8 @@ void paint_box_shadow(PaintContext& context,
} }
auto params = PaintOuterBoxShadowParams { auto params = PaintOuterBoxShadowParams {
.painter = context.recording_painter(), .color = box_shadow_data.color,
.content_rect = bordered_content_rect, .placement = box_shadow_data.placement,
.border_radii = border_radii,
.box_shadow_data = box_shadow_data,
.corner_radii = CornerRadii { .corner_radii = CornerRadii {
.top_left = border_radii.top_left.as_corner(context), .top_left = border_radii.top_left.as_corner(context),
.top_right = border_radii.top_right.as_corner(context), .top_right = border_radii.top_right.as_corner(context),
@ -569,8 +565,9 @@ void paint_box_shadow(PaintContext& context,
}; };
if (box_shadow_data.placement == ShadowPlacement::Inner) { if (box_shadow_data.placement == ShadowPlacement::Inner) {
params.border_radii.shrink(borders_data.top.width, borders_data.right.width, borders_data.bottom.width, borders_data.left.width); auto shrinked_border_radii = border_radii;
ScopedCornerRadiusClip corner_clipper { context, device_content_rect, params.border_radii, CornerClip::Outside }; shrinked_border_radii.shrink(borders_data.top.width, borders_data.right.width, borders_data.bottom.width, borders_data.left.width);
ScopedCornerRadiusClip corner_clipper { context, device_content_rect, shrinked_border_radii, CornerClip::Outside };
context.recording_painter().paint_inner_box_shadow_params(params); context.recording_painter().paint_inner_box_shadow_params(params);
} else { } else {
ScopedCornerRadiusClip corner_clipper { context, device_content_rect, border_radii, CornerClip::Inside }; ScopedCornerRadiusClip corner_clipper { context, device_content_rect, border_radii, CornerClip::Inside };