cssimagelinear: Avoid computing the length if we know it
authorTimm Bäder <mail@baedert.org>
Mon, 30 Dec 2019 08:46:15 +0000 (09:46 +0100)
committerTimm Bäder <mail@baedert.org>
Tue, 7 Jan 2020 16:27:18 +0000 (17:27 +0100)
We handlet the common easy cases manually anyway, so don't bother
sqrt()ing the x/y coords in those cases.

gtk/gtkcssimagelinear.c

index 3816514d1784b33089d5e682b56b2cdca663b39b..d3b7a07e1d96cee03a11e59fd12f91f5d5921712 100644 (file)
@@ -76,37 +76,43 @@ static void
 gtk_css_image_linear_compute_start_point (double angle_in_degrees,
                                           double width,
                                           double height,
-                                          double *x,
-                                          double *y)
+                                          double *out_x,
+                                          double *out_y,
+                                          double *out_length)
 {
   double angle, c, slope, perpendicular;
-  
+  double x, y, length;
+
   angle = fmod (angle_in_degrees, 360);
   if (angle < 0)
     angle += 360;
 
   if (angle == 0)
     {
-      *x = 0;
-      *y = -height;
+      *out_x = 0;
+      *out_y = -height;
+      *out_length = height;
       return;
     }
   else if (angle == 90)
     {
-      *x = width;
-      *y = 0;
+      *out_x = width;
+      *out_y = 0;
+      *out_length = width;
       return;
     }
   else if (angle == 180)
     {
-      *x = 0;
-      *y = height;
+      *out_x = 0;
+      *out_y = height;
+      *out_length = height;
       return;
     }
   else if (angle == 270)
     {
-      *x = -width;
-      *y = 0;
+      *out_x = -width;
+      *out_y = 0;
+      *out_length = width;
       return;
     }
 
@@ -119,12 +125,18 @@ gtk_css_image_linear_compute_start_point (double angle_in_degrees,
     width = - width;
   if (angle < 90 || angle > 270)
     height = - height;
-  
+
   /* Compute c (of y = mx + c) of perpendicular */
   c = height - perpendicular * width;
 
-  *x = c / (slope - perpendicular);
-  *y = perpendicular * *x + c;
+  x = c / (slope - perpendicular);
+  y = perpendicular * x + c;
+
+  length = sqrt (x * x + y * y);
+
+  *out_x = x;
+  *out_y = y;
+  *out_length = length;
 }
 
 static void
@@ -173,9 +185,9 @@ gtk_css_image_linear_snapshot (GtkCssImage        *image,
 
   gtk_css_image_linear_compute_start_point (angle,
                                             width, height,
-                                            &x, &y);
+                                            &x, &y,
+                                            &length);
 
-  length = sqrt (x * x + y * y);
   gtk_css_image_linear_get_start_end (linear, length, &start, &end);
 
   if (start == end)