static gboolean gtk_css_image_radial_equal (GtkCssImage *image1, GtkCssImage *image2) { GtkCssImageRadial *radial1 = GTK_CSS_IMAGE_RADIAL (image1); GtkCssImageRadial *radial2 = GTK_CSS_IMAGE_RADIAL (image2); guint i; if (radial1->repeating != radial2->repeating || radial1->size != radial2->size || !_gtk_css_value_equal (radial1->position, radial2->position) || ((radial1->sizes[0] == NULL) != (radial2->sizes[0] == NULL)) || (radial1->sizes[0] && radial2->sizes[0] && !_gtk_css_value_equal (radial1->sizes[0], radial2->sizes[0])) || ((radial1->sizes[1] == NULL) != (radial2->sizes[1] == NULL)) || (radial1->sizes[1] && radial2->sizes[1] && !_gtk_css_value_equal (radial1->sizes[1], radial2->sizes[1])) || radial1->stops->len != radial2->stops->len) return FALSE; for (i = 0; i < radial1->stops->len; i++) { GtkCssImageRadialColorStop *stop1, *stop2; stop1 = &g_array_index (radial1->stops, GtkCssImageRadialColorStop, i); stop2 = &g_array_index (radial2->stops, GtkCssImageRadialColorStop, i); if (!_gtk_css_value_equal0 (stop1->offset, stop2->offset) || !_gtk_css_value_equal (stop1->color, stop2->color)) return FALSE; } return TRUE; }
static gboolean gtk_css_image_linear_equal (GtkCssImage *image1, GtkCssImage *image2) { GtkCssImageLinear *linear1 = GTK_CSS_IMAGE_LINEAR (image1); GtkCssImageLinear *linear2 = GTK_CSS_IMAGE_LINEAR (image2); guint i; if (linear1->repeating != linear2->repeating || linear1->side != linear2->side || (linear1->side == 0 && !_gtk_css_value_equal (linear1->angle, linear2->angle)) || linear1->stops->len != linear2->stops->len) return FALSE; for (i = 0; i < linear1->stops->len; i++) { GtkCssImageLinearColorStop *stop1, *stop2; stop1 = &g_array_index (linear1->stops, GtkCssImageLinearColorStop, i); stop2 = &g_array_index (linear2->stops, GtkCssImageLinearColorStop, i); if (!_gtk_css_value_equal0 (stop1->offset, stop2->offset) || !_gtk_css_value_equal (stop1->color, stop2->color)) return FALSE; } return TRUE; }
static gboolean gtk_css_value_bg_size_equal (const GtkCssValue *value1, const GtkCssValue *value2) { return value1->cover == value2->cover && value1->contain == value2->contain && (value1->x == value2->x || (value1->x != NULL && value2->x != NULL && _gtk_css_value_equal (value1->x, value2->x))) && (value1->y == value2->y || (value1->y != NULL && value2->y != NULL && _gtk_css_value_equal (value1->y, value2->y))); }
static void gtk_css_computed_values_create_css_transitions (GtkCssComputedValues *values, gint64 timestamp, GtkCssComputedValues *source) { TransitionInfo transitions[GTK_CSS_PROPERTY_N_PROPERTIES] = { { 0, } }; GtkCssValue *durations, *delays, *timing_functions; guint i; transition_infos_set (transitions, _gtk_css_computed_values_get_value (values, GTK_CSS_PROPERTY_TRANSITION_PROPERTY)); durations = _gtk_css_computed_values_get_value (values, GTK_CSS_PROPERTY_TRANSITION_DURATION); delays = _gtk_css_computed_values_get_value (values, GTK_CSS_PROPERTY_TRANSITION_DELAY); timing_functions = _gtk_css_computed_values_get_value (values, GTK_CSS_PROPERTY_TRANSITION_TIMING_FUNCTION); for (i = 0; i < GTK_CSS_PROPERTY_N_PROPERTIES; i++) { GtkStyleAnimation *animation; GtkCssValue *start, *end; double duration, delay; if (!transitions[i].pending) continue; duration = _gtk_css_number_value_get (_gtk_css_array_value_get_nth (durations, transitions[i].index), 100); delay = _gtk_css_number_value_get (_gtk_css_array_value_get_nth (delays, transitions[i].index), 100); if (duration + delay == 0.0) continue; start = _gtk_css_computed_values_get_intrinsic_value (source, i); end = _gtk_css_computed_values_get_intrinsic_value (values, i); if (_gtk_css_value_equal (start, end)) { animation = gtk_css_computed_values_find_transition (GTK_CSS_COMPUTED_VALUES (source), i); if (animation) values->animations = g_slist_prepend (values->animations, g_object_ref (animation)); } else { animation = _gtk_css_transition_new (i, _gtk_css_computed_values_get_value (source, i), _gtk_css_array_value_get_nth (timing_functions, i), timestamp + delay * G_USEC_PER_SEC, timestamp + (delay + duration) * G_USEC_PER_SEC); values->animations = g_slist_prepend (values->animations, animation); } } }
static gboolean gtk_css_value_shadows_equal (const GtkCssValue *value1, const GtkCssValue *value2) { guint i; /* XXX: Should we fill up here? */ if (value1->len != value2->len) return FALSE; for (i = 0; i < value1->len; i++) { if (!_gtk_css_value_equal (value1->values[i], value2->values[i])) return FALSE; } return TRUE; }
GtkBitmask * gtk_css_style_get_difference (GtkCssStyle *style, GtkCssStyle *other) { GtkBitmask *result; guint i, len; if (style == other) return _gtk_bitmask_new (); result = _gtk_bitmask_new (); len = _gtk_css_style_property_get_n_properties (); for (i = 0; i < len; i++) { if (!_gtk_css_value_equal (gtk_css_style_get_value (style, i), gtk_css_style_get_value (other, i))) result = _gtk_bitmask_set (result, i, TRUE); } return result; }
GtkBitmask * _gtk_css_computed_values_get_difference (GtkCssComputedValues *values, GtkCssComputedValues *other) { GtkBitmask *result; guint i, len; len = MIN (values->values->len, other->values->len); result = _gtk_bitmask_new (); if (values->values->len != other->values->len) result = _gtk_bitmask_invert_range (result, len, MAX (values->values->len, other->values->len)); for (i = 0; i < len; i++) { if (!_gtk_css_value_equal (g_ptr_array_index (values->values, i), g_ptr_array_index (other->values, i))) result = _gtk_bitmask_set (result, i, TRUE); } return result; }
GtkBitmask * gtk_css_style_add_difference (GtkBitmask *accumulated, GtkCssStyle *style, GtkCssStyle *other) { gint len, i; if (style == other) return accumulated; len = _gtk_css_style_property_get_n_properties (); for (i = 0; i < len; i++) { if (_gtk_bitmask_get (accumulated, i)) continue; if (!_gtk_css_value_equal (gtk_css_style_get_value (style, i), gtk_css_style_get_value (other, i))) accumulated = _gtk_bitmask_set (accumulated, i, TRUE); } return accumulated; }
static GSList * gtk_css_animated_style_create_css_transitions (GSList *animations, GtkCssStyle *base_style, gint64 timestamp, GtkCssStyle *source) { TransitionInfo transitions[GTK_CSS_PROPERTY_N_PROPERTIES] = { { 0, } }; GtkCssValue *durations, *delays, *timing_functions; guint i; transition_infos_set (transitions, gtk_css_style_get_value (base_style, GTK_CSS_PROPERTY_TRANSITION_PROPERTY)); durations = gtk_css_style_get_value (base_style, GTK_CSS_PROPERTY_TRANSITION_DURATION); delays = gtk_css_style_get_value (base_style, GTK_CSS_PROPERTY_TRANSITION_DELAY); timing_functions = gtk_css_style_get_value (base_style, GTK_CSS_PROPERTY_TRANSITION_TIMING_FUNCTION); for (i = 0; i < GTK_CSS_PROPERTY_N_PROPERTIES; i++) { GtkStyleAnimation *animation; GtkCssValue *start, *end; double duration, delay; if (!transitions[i].pending) continue; duration = _gtk_css_number_value_get (_gtk_css_array_value_get_nth (durations, transitions[i].index), 100); delay = _gtk_css_number_value_get (_gtk_css_array_value_get_nth (delays, transitions[i].index), 100); if (duration + delay == 0.0) continue; if (GTK_IS_CSS_ANIMATED_STYLE (source)) { start = gtk_css_animated_style_get_intrinsic_value (GTK_CSS_ANIMATED_STYLE (source), i); end = gtk_css_style_get_value (base_style, i); if (_gtk_css_value_equal (start, end)) { animation = gtk_css_animated_style_find_transition (GTK_CSS_ANIMATED_STYLE (source), i); if (animation) { animation = _gtk_style_animation_advance (animation, timestamp); animations = g_slist_prepend (animations, animation); } continue; } } if (_gtk_css_value_equal (gtk_css_style_get_value (source, i), gtk_css_style_get_value (base_style, i))) continue; animation = _gtk_css_transition_new (i, gtk_css_style_get_value (source, i), _gtk_css_array_value_get_nth (timing_functions, i), timestamp, duration * G_USEC_PER_SEC, delay * G_USEC_PER_SEC); animations = g_slist_prepend (animations, animation); } return animations; }