示例#1
0
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 ();
}
示例#2
0
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;
}
示例#3
0
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;
}
示例#4
0
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 ();
}
示例#5
0
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;
}
示例#6
0
/**
 * _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;
}
示例#7
0
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);
    }
}
示例#8
0
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;
}
示例#9
0
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;
}
示例#10
0
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;
}
示例#11
0
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);
}
示例#12
0
static void
gtk_css_widget_node_init (GtkCssWidgetNode *node)
{
  node->accumulated_changes = _gtk_bitmask_new ();
}