Esempio n. 1
0
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;
}
Esempio n. 2
0
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;
}
Esempio n. 3
0
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)));
}
Esempio n. 4
0
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);
        }
    }
}
Esempio n. 5
0
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;
}
Esempio n. 6
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;
}
Esempio n. 7
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;
}
Esempio n. 8
0
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;
}
Esempio n. 9
0
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;
}