linear-gradient: Remove the hack using NUMBER
Instead, add a "side" member to the struct that keeps sides explicitly.
This commit is contained in:
parent
0645425046
commit
7b301fcece
@ -142,12 +142,10 @@ gtk_css_image_linear_draw (GtkCssImage *image,
|
|||||||
double offset;
|
double offset;
|
||||||
int i, last;
|
int i, last;
|
||||||
|
|
||||||
if (_gtk_css_number_value_get_unit (linear->angle) == GTK_CSS_NUMBER)
|
if (linear->side)
|
||||||
{
|
{
|
||||||
guint side = _gtk_css_number_value_get (linear->angle, 100);
|
|
||||||
|
|
||||||
/* special casing the regular cases here so we don't get rounding errors */
|
/* special casing the regular cases here so we don't get rounding errors */
|
||||||
switch (side)
|
switch (linear->side)
|
||||||
{
|
{
|
||||||
case 1 << GTK_CSS_RIGHT:
|
case 1 << GTK_CSS_RIGHT:
|
||||||
angle = 90;
|
angle = 90;
|
||||||
@ -162,8 +160,8 @@ gtk_css_image_linear_draw (GtkCssImage *image,
|
|||||||
angle = 180;
|
angle = 180;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
angle = atan2 (side & 1 << GTK_CSS_TOP ? -width : width,
|
angle = atan2 (linear->side & 1 << GTK_CSS_TOP ? -width : width,
|
||||||
side & 1 << GTK_CSS_LEFT ? -height : height);
|
linear->side & 1 << GTK_CSS_LEFT ? -height : height);
|
||||||
angle = 180 * angle / G_PI + 90;
|
angle = 180 * angle / G_PI + 90;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -258,58 +256,54 @@ gtk_css_image_linear_parse (GtkCssImage *image,
|
|||||||
|
|
||||||
if (_gtk_css_parser_try (parser, "to", TRUE))
|
if (_gtk_css_parser_try (parser, "to", TRUE))
|
||||||
{
|
{
|
||||||
guint side = 0;
|
|
||||||
|
|
||||||
for (i = 0; i < 2; i++)
|
for (i = 0; i < 2; i++)
|
||||||
{
|
{
|
||||||
if (_gtk_css_parser_try (parser, "left", TRUE))
|
if (_gtk_css_parser_try (parser, "left", TRUE))
|
||||||
{
|
{
|
||||||
if (side & ((1 << GTK_CSS_LEFT) | (1 << GTK_CSS_RIGHT)))
|
if (linear->side & ((1 << GTK_CSS_LEFT) | (1 << GTK_CSS_RIGHT)))
|
||||||
{
|
{
|
||||||
_gtk_css_parser_error (parser, "Expected 'top', 'bottom' or comma");
|
_gtk_css_parser_error (parser, "Expected 'top', 'bottom' or comma");
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
side |= (1 << GTK_CSS_LEFT);
|
linear->side |= (1 << GTK_CSS_LEFT);
|
||||||
}
|
}
|
||||||
else if (_gtk_css_parser_try (parser, "right", TRUE))
|
else if (_gtk_css_parser_try (parser, "right", TRUE))
|
||||||
{
|
{
|
||||||
if (side & ((1 << GTK_CSS_LEFT) | (1 << GTK_CSS_RIGHT)))
|
if (linear->side & ((1 << GTK_CSS_LEFT) | (1 << GTK_CSS_RIGHT)))
|
||||||
{
|
{
|
||||||
_gtk_css_parser_error (parser, "Expected 'top', 'bottom' or comma");
|
_gtk_css_parser_error (parser, "Expected 'top', 'bottom' or comma");
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
side |= (1 << GTK_CSS_RIGHT);
|
linear->side |= (1 << GTK_CSS_RIGHT);
|
||||||
}
|
}
|
||||||
else if (_gtk_css_parser_try (parser, "top", TRUE))
|
else if (_gtk_css_parser_try (parser, "top", TRUE))
|
||||||
{
|
{
|
||||||
if (side & ((1 << GTK_CSS_TOP) | (1 << GTK_CSS_BOTTOM)))
|
if (linear->side & ((1 << GTK_CSS_TOP) | (1 << GTK_CSS_BOTTOM)))
|
||||||
{
|
{
|
||||||
_gtk_css_parser_error (parser, "Expected 'left', 'right' or comma");
|
_gtk_css_parser_error (parser, "Expected 'left', 'right' or comma");
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
side |= (1 << GTK_CSS_TOP);
|
linear->side |= (1 << GTK_CSS_TOP);
|
||||||
}
|
}
|
||||||
else if (_gtk_css_parser_try (parser, "bottom", TRUE))
|
else if (_gtk_css_parser_try (parser, "bottom", TRUE))
|
||||||
{
|
{
|
||||||
if (side & ((1 << GTK_CSS_TOP) | (1 << GTK_CSS_BOTTOM)))
|
if (linear->side & ((1 << GTK_CSS_TOP) | (1 << GTK_CSS_BOTTOM)))
|
||||||
{
|
{
|
||||||
_gtk_css_parser_error (parser, "Expected 'left', 'right' or comma");
|
_gtk_css_parser_error (parser, "Expected 'left', 'right' or comma");
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
side |= (1 << GTK_CSS_BOTTOM);
|
linear->side |= (1 << GTK_CSS_BOTTOM);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (side == 0)
|
if (linear->side == 0)
|
||||||
{
|
{
|
||||||
_gtk_css_parser_error (parser, "Expected side that gradient should go to");
|
_gtk_css_parser_error (parser, "Expected side that gradient should go to");
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
linear->angle = _gtk_css_number_value_new (side, GTK_CSS_NUMBER);
|
|
||||||
|
|
||||||
if (!_gtk_css_parser_try (parser, ",", TRUE))
|
if (!_gtk_css_parser_try (parser, ",", TRUE))
|
||||||
{
|
{
|
||||||
_gtk_css_parser_error (parser, "Expected a comma");
|
_gtk_css_parser_error (parser, "Expected a comma");
|
||||||
@ -329,7 +323,7 @@ gtk_css_image_linear_parse (GtkCssImage *image,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
linear->angle = _gtk_css_number_value_new (1 << GTK_CSS_BOTTOM, GTK_CSS_NUMBER);
|
linear->side = 1 << GTK_CSS_BOTTOM;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
GtkCssImageLinearColorStop stop;
|
GtkCssImageLinearColorStop stop;
|
||||||
@ -379,22 +373,20 @@ gtk_css_image_linear_print (GtkCssImage *image,
|
|||||||
else
|
else
|
||||||
g_string_append (string, "linear-gradient(");
|
g_string_append (string, "linear-gradient(");
|
||||||
|
|
||||||
if (_gtk_css_number_value_get_unit (linear->angle) == GTK_CSS_NUMBER)
|
if (linear->side)
|
||||||
{
|
{
|
||||||
guint side = _gtk_css_number_value_get (linear->angle, 100);
|
if (linear->side != (1 << GTK_CSS_BOTTOM))
|
||||||
|
|
||||||
if (side != (1 << GTK_CSS_BOTTOM))
|
|
||||||
{
|
{
|
||||||
g_string_append (string, "to");
|
g_string_append (string, "to");
|
||||||
|
|
||||||
if (side & (1 << GTK_CSS_TOP))
|
if (linear->side & (1 << GTK_CSS_TOP))
|
||||||
g_string_append (string, " top");
|
g_string_append (string, " top");
|
||||||
else if (side & (1 << GTK_CSS_BOTTOM))
|
else if (linear->side & (1 << GTK_CSS_BOTTOM))
|
||||||
g_string_append (string, " bottom");
|
g_string_append (string, " bottom");
|
||||||
|
|
||||||
if (side & (1 << GTK_CSS_LEFT))
|
if (linear->side & (1 << GTK_CSS_LEFT))
|
||||||
g_string_append (string, " left");
|
g_string_append (string, " left");
|
||||||
else if (side & (1 << GTK_CSS_RIGHT))
|
else if (linear->side & (1 << GTK_CSS_RIGHT))
|
||||||
g_string_append (string, " right");
|
g_string_append (string, " right");
|
||||||
|
|
||||||
g_string_append (string, ", ");
|
g_string_append (string, ", ");
|
||||||
@ -440,7 +432,9 @@ gtk_css_image_linear_compute (GtkCssImage *image,
|
|||||||
|
|
||||||
copy = g_object_new (GTK_TYPE_CSS_IMAGE_LINEAR, NULL);
|
copy = g_object_new (GTK_TYPE_CSS_IMAGE_LINEAR, NULL);
|
||||||
copy->repeating = linear->repeating;
|
copy->repeating = linear->repeating;
|
||||||
|
copy->side = linear->side;
|
||||||
|
|
||||||
|
if (linear->angle)
|
||||||
copy->angle = _gtk_css_value_compute (linear->angle, property_id, provider, style, parent_style);
|
copy->angle = _gtk_css_value_compute (linear->angle, property_id, provider, style, parent_style);
|
||||||
|
|
||||||
g_array_set_size (copy->stops, linear->stops->len);
|
g_array_set_size (copy->stops, linear->stops->len);
|
||||||
@ -492,10 +486,11 @@ gtk_css_image_linear_transition (GtkCssImage *start_image,
|
|||||||
result = g_object_new (GTK_TYPE_CSS_IMAGE_LINEAR, NULL);
|
result = g_object_new (GTK_TYPE_CSS_IMAGE_LINEAR, NULL);
|
||||||
result->repeating = start->repeating;
|
result->repeating = start->repeating;
|
||||||
|
|
||||||
if (_gtk_css_number_value_get_unit (start->angle) == GTK_CSS_NUMBER ||
|
if (start->side != end->side)
|
||||||
_gtk_css_number_value_get_unit (end->angle) == GTK_CSS_NUMBER)
|
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
||||||
|
result->side = start->side;
|
||||||
|
if (result->side == 0)
|
||||||
result->angle = _gtk_css_value_transition (start->angle, end->angle, property_id, progress);
|
result->angle = _gtk_css_value_transition (start->angle, end->angle, property_id, progress);
|
||||||
if (result->angle == NULL)
|
if (result->angle == NULL)
|
||||||
goto fail;
|
goto fail;
|
||||||
@ -554,7 +549,8 @@ gtk_css_image_linear_equal (GtkCssImage *image1,
|
|||||||
guint i;
|
guint i;
|
||||||
|
|
||||||
if (linear1->repeating != linear2->repeating ||
|
if (linear1->repeating != linear2->repeating ||
|
||||||
!_gtk_css_value_equal (linear1->angle, linear2->angle) ||
|
linear1->side != linear2->side ||
|
||||||
|
(linear1->side == 0 && !_gtk_css_value_equal (linear1->angle, linear2->angle)) ||
|
||||||
linear1->stops->len != linear2->stops->len)
|
linear1->stops->len != linear2->stops->len)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
@ -584,6 +580,7 @@ gtk_css_image_linear_dispose (GObject *object)
|
|||||||
linear->stops = NULL;
|
linear->stops = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
linear->side = 0;
|
||||||
if (linear->angle)
|
if (linear->angle)
|
||||||
{
|
{
|
||||||
_gtk_css_value_unref (linear->angle);
|
_gtk_css_value_unref (linear->angle);
|
||||||
|
@ -45,7 +45,8 @@ struct _GtkCssImageLinear
|
|||||||
{
|
{
|
||||||
GtkCssImage parent;
|
GtkCssImage parent;
|
||||||
|
|
||||||
GtkCssValue *angle; /* warning: We use GTK_CSS_NUMBER as an enum for the corners */
|
guint side; /* side the gradient should go to or 0 for angle */
|
||||||
|
GtkCssValue *angle;
|
||||||
GArray *stops;
|
GArray *stops;
|
||||||
guint repeating :1;
|
guint repeating :1;
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user