Explorar el Código

LibWeb: When painting, reduce computation cost by using the reciprocal

Rather than dividing the rect width and high by the border lengths,
this change multiples those lengths by the reciprocal of the width
and height because this is a faster operation. When mousing around on
the html spec website, the profile showed that inline painting
went from ~15% to ~3%
James Bellamy hace 3 años
padre
commit
7ab62ecd16
Se han modificado 1 ficheros con 8 adiciones y 4 borrados
  1. 8 4
      Userland/Libraries/LibWeb/Painting/BorderPainting.cpp

+ 8 - 4
Userland/Libraries/LibWeb/Painting/BorderPainting.cpp

@@ -24,10 +24,14 @@ BorderRadiusData normalized_border_radius_data(Layout::Node const& node, Gfx::Fl
 
     // Scale overlapping curves according to https://www.w3.org/TR/css-backgrounds-3/#corner-overlap
     auto f = 1.0f;
-    f = min(f, rect.width() / (float)(top_left_radius_px + top_right_radius_px));
-    f = min(f, rect.height() / (float)(top_right_radius_px + bottom_right_radius_px));
-    f = min(f, rect.width() / (float)(bottom_left_radius_px + bottom_right_radius_px));
-    f = min(f, rect.height() / (float)(top_left_radius_px + bottom_left_radius_px));
+    auto width_reciprocal = 1.0f / rect.width();
+    auto height_reciprocal = 1.0f / rect.height();
+    f = max(f, width_reciprocal * (top_left_radius_px + top_right_radius_px));
+    f = max(f, height_reciprocal * (top_right_radius_px + bottom_right_radius_px));
+    f = max(f, width_reciprocal * (bottom_left_radius_px + bottom_right_radius_px));
+    f = max(f, height_reciprocal * (top_left_radius_px + bottom_left_radius_px));
+
+    f = 1.0f / f;
 
     top_left_radius_px = (int)(top_left_radius_px * f);
     top_right_radius_px = (int)(top_right_radius_px * f);