Forráskód Böngészése

LibWeb: Fix shadow painting when the target painter is translated

MacDue 2 éve
szülő
commit
e3537e4374
1 módosított fájl, 9 hozzáadás és 3 törlés
  1. 9 3
      Userland/Libraries/LibWeb/Painting/ShadowPainting.cpp

+ 9 - 3
Userland/Libraries/LibWeb/Painting/ShadowPainting.cpp

@@ -6,6 +6,7 @@
  * SPDX-License-Identifier: BSD-2-Clause
  */
 
+#include <AK/NumericLimits.h>
 #include <LibGfx/DisjointRectSet.h>
 #include <LibGfx/Filters/StackBlurFilter.h>
 #include <LibGfx/Painter.h>
@@ -281,17 +282,22 @@ void paint_box_shadow(PaintContext& context, Gfx::IntRect const& content_rect, B
 
         // FIXME: Could reduce the shadow paints from 8 to 4 for shadows with all corner radii 50%.
 
+        // FIXME: We use this since we want the clip rect to include everything after a certain x or y.
+        // Note: Using painter.target()->width() or height() does not work, when the painter is a small
+        // translated bitmap rather than full screen, as the clip rect may not intersect.
+        constexpr auto really_large_number = NumericLimits<int>::max() / 2;
+
         // Everything above content_rect, including sides
-        paint_shadow({ 0, 0, painter.target()->width(), content_rect.top() });
+        paint_shadow({ 0, 0, really_large_number, content_rect.top() });
 
         // Everything below content_rect, including sides
-        paint_shadow({ 0, content_rect.bottom() + 1, painter.target()->width(), painter.target()->height() });
+        paint_shadow({ 0, content_rect.bottom() + 1, really_large_number, really_large_number });
 
         // Everything directly to the left of content_rect
         paint_shadow({ 0, content_rect.top(), content_rect.left(), content_rect.height() });
 
         // Everything directly to the right of content_rect
-        paint_shadow({ content_rect.right() + 1, content_rect.top(), painter.target()->width(), content_rect.height() });
+        paint_shadow({ content_rect.right() + 1, content_rect.top(), really_large_number, content_rect.height() });
 
         if (top_left_corner) {
             // Inside the top left corner (the part outside the border radius)