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.
This commit is contained in:
Timm Bäder 2019-12-30 09:46:15 +01:00
parent cee8f78c6e
commit 59111d100f

View File

@ -76,10 +76,12 @@ 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)
@ -87,26 +89,30 @@ gtk_css_image_linear_compute_start_point (double angle_in_degrees,
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;
}
@ -123,8 +129,14 @@ gtk_css_image_linear_compute_start_point (double angle_in_degrees,
/* 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)