diff options
author | Timm Bäder <mail@baedert.org> | 2019-12-30 09:46:15 +0100 |
---|---|---|
committer | Timm Bäder <mail@baedert.org> | 2020-01-07 17:27:18 +0100 |
commit | 59111d100f23ea88419af246e9e1c3c8ad879b89 (patch) | |
tree | ae84b30bd47c636db6eebb0269a072117716bcd2 | |
parent | cee8f78c6ea64bb636db7937ec983f361086a116 (diff) | |
download | gtk+-59111d100f23ea88419af246e9e1c3c8ad879b89.tar.gz |
cssimagelinear: Avoid computing the length if we know it
We handlet the common easy cases manually anyway, so don't bother
sqrt()ing the x/y coords in those cases.
-rw-r--r-- | gtk/gtkcssimagelinear.c | 44 |
1 files changed, 28 insertions, 16 deletions
diff --git a/gtk/gtkcssimagelinear.c b/gtk/gtkcssimagelinear.c index 3816514d17..d3b7a07e1d 100644 --- a/gtk/gtkcssimagelinear.c +++ b/gtk/gtkcssimagelinear.c @@ -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) |