static void _gtk_css_computed_values_init (GtkCssComputedValues *values) { values->depends_on_parent = _gtk_bitmask_new (); values->equals_parent = _gtk_bitmask_new (); values->depends_on_color = _gtk_bitmask_new (); values->depends_on_font_size = _gtk_bitmask_new (); }
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_advance (GtkCssComputedValues *values, gint64 timestamp) { GtkBitmask *changed; GPtrArray *old_computed_values; GSList *list; guint i; gtk_internal_return_val_if_fail (GTK_IS_CSS_COMPUTED_VALUES (values), NULL); gtk_internal_return_val_if_fail (timestamp >= values->current_time, NULL); values->current_time = timestamp; old_computed_values = values->animated_values; values->animated_values = NULL; list = values->animations; while (list) { GtkStyleAnimation *animation = list->data; list = list->next; _gtk_style_animation_set_values (animation, timestamp, GTK_CSS_COMPUTED_VALUES (values)); if (_gtk_style_animation_is_finished (animation, timestamp)) { values->animations = g_slist_remove (values->animations, animation); g_object_unref (animation); } } /* figure out changes */ changed = _gtk_bitmask_new (); for (i = 0; i < GTK_CSS_PROPERTY_N_PROPERTIES; i++) { GtkCssValue *old_animated, *new_animated; old_animated = old_computed_values && i < old_computed_values->len ? g_ptr_array_index (old_computed_values, i) : NULL; new_animated = values->animated_values && i < values->animated_values->len ? g_ptr_array_index (values->animated_values, i) : NULL; if (!_gtk_css_value_equal0 (old_animated, new_animated)) changed = _gtk_bitmask_set (changed, i, TRUE); } if (old_computed_values) g_ptr_array_unref (old_computed_values); return changed; }
static void gtk_css_widget_node_validate (GtkCssNode *node) { GtkCssWidgetNode *widget_node = GTK_CSS_WIDGET_NODE (node); GtkStyleContext *context; if (widget_node->widget == NULL) return; context = _gtk_widget_peek_style_context (widget_node->widget); if (context) gtk_style_context_validate (context, widget_node->accumulated_changes); else _gtk_widget_style_context_invalidated (widget_node->widget); _gtk_bitmask_free (widget_node->accumulated_changes); widget_node->accumulated_changes = _gtk_bitmask_new (); }
GtkBitmask * _gtk_css_computed_values_compute_dependencies (GtkCssComputedValues *values, const GtkBitmask *parent_changes) { GtkBitmask *changes; gtk_internal_return_val_if_fail (GTK_IS_CSS_COMPUTED_VALUES (values), _gtk_bitmask_new ()); changes = _gtk_bitmask_copy (parent_changes); changes = _gtk_bitmask_intersect (changes, values->depends_on_parent); if (_gtk_bitmask_get (changes, GTK_CSS_PROPERTY_COLOR)) changes = _gtk_bitmask_union (changes, values->depends_on_color); if (_gtk_bitmask_get (changes, GTK_CSS_PROPERTY_FONT_SIZE)) changes = _gtk_bitmask_union (changes, values->depends_on_font_size); return changes; }
/** * _gtk_css_style_property_get_mask_affecting: * @flags: the flags that are affected * * Computes a bitmask for all properties that have at least one of @flags * set. * * Returns: (transfer full): A #GtkBitmask with the bit set for every * property that has at least one of @flags set. */ GtkBitmask * _gtk_css_style_property_get_mask_affecting (GtkCssAffects affects) { GtkBitmask *result; guint i; result = _gtk_bitmask_new (); for (i = 0; i < _gtk_css_style_property_get_n_properties (); i++) { GtkCssStyleProperty *prop = _gtk_css_style_property_lookup_by_id (i); if (_gtk_css_style_property_get_affects (prop) & affects) result = _gtk_bitmask_set (result, i, TRUE); } return result; }
static void gtk_css_path_node_invalidate (GtkCssNode *node) { GtkCssPathNode *path_node = GTK_CSS_PATH_NODE (node); if (path_node->context) { GtkBitmask *changes; changes = _gtk_bitmask_new (); changes = _gtk_bitmask_invert_range (changes, 0, _gtk_css_style_property_get_n_properties ()); gtk_style_context_validate (path_node->context, changes); _gtk_bitmask_free (changes); } }
GtkCssLookup * _gtk_css_lookup_new (const GtkBitmask *relevant) { GtkCssLookup *lookup; lookup = g_malloc0 (sizeof (GtkCssLookup)); if (relevant) { lookup->missing = _gtk_bitmask_copy (relevant); } else { lookup->missing = _gtk_bitmask_new (); lookup->missing = _gtk_bitmask_invert_range (lookup->missing, 0, GTK_CSS_PROPERTY_N_PROPERTIES); } return lookup; }
GtkCssLookup * _gtk_css_lookup_new (const GtkBitmask *relevant) { GtkCssLookup *lookup; guint n = _gtk_css_style_property_get_n_properties (); lookup = g_malloc0 (sizeof (GtkCssLookup) + sizeof (GtkCssLookupValue) * n); if (relevant) { lookup->missing = _gtk_bitmask_copy (relevant); } else { lookup->missing = _gtk_bitmask_new (); lookup->missing = _gtk_bitmask_invert_range (lookup->missing, 0, n); } return lookup; }
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; }
static void node_style_changed_cb (GtkCssNode *node, GtkCssStyle *old_style, GtkCssStyle *new_style, GtkWidget *widget) { GtkBitmask *changes; static GtkBitmask *affects_size = NULL; if (G_UNLIKELY (affects_size == NULL)) affects_size = _gtk_css_style_property_get_mask_affecting (GTK_CSS_AFFECTS_SIZE | GTK_CSS_AFFECTS_CLIP); changes = _gtk_bitmask_new (); changes = gtk_css_style_add_difference (changes, old_style, new_style); if (_gtk_bitmask_intersects (changes, affects_size)) gtk_widget_queue_resize (widget); else gtk_widget_queue_draw (widget); _gtk_bitmask_free (changes); }
static void gtk_css_widget_node_init (GtkCssWidgetNode *node) { node->accumulated_changes = _gtk_bitmask_new (); }