コード例 #1
0
ファイル: gtkcsscomputedvalues.c プロジェクト: soreau/gtk
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);
        }
    }
}
コード例 #2
0
ファイル: gtkcssimageicontheme.c プロジェクト: 3v1n0/gtk
static GtkCssImage *
gtk_css_image_icon_theme_compute (GtkCssImage             *image,
                                  guint                    property_id,
                                  GtkStyleProviderPrivate *provider,
                                  int                      scale,
                                  GtkCssComputedValues    *values,
                                  GtkCssComputedValues    *parent_values,
                                  GtkCssDependencies      *dependencies)
{
  GtkCssImageIconTheme *icon_theme = GTK_CSS_IMAGE_ICON_THEME (image);
  GtkCssImageIconTheme *copy;
  GtkSettings *settings;
  GdkScreen *screen;

  settings = _gtk_style_provider_private_get_settings (provider);
  if (settings == NULL)
    screen = gdk_screen_get_default ();
  else
    screen = _gtk_settings_get_screen (settings);

  copy = g_object_new (GTK_TYPE_CSS_IMAGE_ICON_THEME, NULL);
  copy->name = g_strdup (icon_theme->name);
  copy->icon_theme = gtk_icon_theme_get_for_screen (screen);
  copy->scale = scale;
  copy->color = *_gtk_css_rgba_value_get_rgba (_gtk_css_computed_values_get_value (values, GTK_CSS_PROPERTY_COLOR));

  *dependencies = GTK_CSS_DEPENDS_ON_COLOR;

  return GTK_CSS_IMAGE (copy);
}
コード例 #3
0
ファイル: gtkcsscomputedvalues.c プロジェクト: 3v1n0/gtk
void
gtk_css_computed_values_print (GtkCssComputedValues *values,
                               GString              *string)
{
  guint i;

  g_return_if_fail (GTK_IS_CSS_COMPUTED_VALUES (values));
  g_return_if_fail (string != NULL);

  for (i = 0; i < _gtk_css_style_property_get_n_properties (); i++)
    {
      GtkCssSection *section = _gtk_css_computed_values_get_section (values, i);
      g_string_append (string, _gtk_style_property_get_name (GTK_STYLE_PROPERTY (_gtk_css_style_property_lookup_by_id (i))));
      g_string_append (string, ": ");
      _gtk_css_value_print (_gtk_css_computed_values_get_value (values, i), string);
      g_string_append (string, ";");
      if (section)
        {
          g_string_append (string, " /* ");
          _gtk_css_section_print (section, string);
          g_string_append (string, " */");
        }
      g_string_append (string, "\n");
    }
}
コード例 #4
0
ファイル: gtkgradient.c プロジェクト: 3dfxmadscientist/gtk
cairo_pattern_t *
_gtk_gradient_resolve_full (GtkGradient             *gradient,
                            GtkStyleProviderPrivate *provider,
                            GtkCssComputedValues    *values,
                            GtkCssComputedValues    *parent_values,
                            GtkCssDependencies      *dependencies)
{
  cairo_pattern_t *pattern;
  guint i;

  g_return_val_if_fail (gradient != NULL, NULL);
  g_return_val_if_fail (GTK_IS_STYLE_PROVIDER (provider), NULL);
  g_return_val_if_fail (GTK_IS_CSS_COMPUTED_VALUES (values), NULL);
  g_return_val_if_fail (parent_values == NULL || GTK_IS_CSS_COMPUTED_VALUES (parent_values), NULL);
  g_return_val_if_fail (*dependencies == 0, NULL);

  if (gradient->radius0 == 0 && gradient->radius1 == 0)
    pattern = cairo_pattern_create_linear (gradient->x0, gradient->y0,
                                           gradient->x1, gradient->y1);
  else
    pattern = cairo_pattern_create_radial (gradient->x0, gradient->y0,
                                           gradient->radius0,
                                           gradient->x1, gradient->y1,
                                           gradient->radius1);

  for (i = 0; i < gradient->stops->len; i++)
    {
      ColorStop *stop;
      GtkCssValue *val;
      GdkRGBA rgba;
      GtkCssDependencies stop_deps;

      stop = &g_array_index (gradient->stops, ColorStop, i);

      /* if color resolving fails, assume transparency */
      val = _gtk_css_color_value_resolve (_gtk_symbolic_color_get_css_value (stop->color),
                                          provider,
                                          _gtk_css_computed_values_get_value (values, GTK_CSS_PROPERTY_COLOR),
                                          GTK_CSS_DEPENDS_ON_COLOR,
                                          &stop_deps,
                                          NULL);
      if (val)
        {
          rgba = *_gtk_css_rgba_value_get_rgba (val);
          *dependencies = _gtk_css_dependencies_union (*dependencies, stop_deps);
          _gtk_css_value_unref (val);
        }
      else
        {
          rgba.red = rgba.green = rgba.blue = rgba.alpha = 0.0;
        }

      cairo_pattern_add_color_stop_rgba (pattern, stop->offset,
                                         rgba.red, rgba.green,
                                         rgba.blue, rgba.alpha);
    }

  return pattern;
}
コード例 #5
0
static double
get_base_font_size (guint                    property_id,
                    GtkStyleProviderPrivate *provider,
                    GtkCssComputedValues    *values,
                    GtkCssComputedValues    *parent_values,
                    GtkCssDependencies      *dependencies)
{
  if (property_id == GTK_CSS_PROPERTY_FONT_SIZE)
    {
      *dependencies = GTK_CSS_DEPENDS_ON_PARENT;
      if (parent_values)
        return _gtk_css_number_value_get (_gtk_css_computed_values_get_value (parent_values, GTK_CSS_PROPERTY_FONT_SIZE), 100);
      else
        return _gtk_css_font_size_get_default (provider);
    }

  *dependencies = GTK_CSS_DEPENDS_ON_FONT_SIZE;
  return _gtk_css_number_value_get (_gtk_css_computed_values_get_value (values, GTK_CSS_PROPERTY_FONT_SIZE), 100);
}
コード例 #6
0
static GtkCssValue *
gtk_css_value_inherit_compute (GtkCssValue             *value,
                               guint                    property_id,
                               GtkStyleProviderPrivate *provider,
                               GtkCssComputedValues    *values,
                               GtkCssComputedValues    *parent_values,
                               GtkCssDependencies      *dependencies)
{
  if (parent_values)
    {
      *dependencies = GTK_CSS_EQUALS_PARENT;
      return _gtk_css_value_ref (_gtk_css_computed_values_get_value (parent_values, property_id));
    }
  else
    {
      return _gtk_css_value_compute (_gtk_css_initial_value_get (),
                                     property_id,
                                     provider,
                                     values,
                                     parent_values,
                                     dependencies);
    }
}
コード例 #7
0
ファイル: gtkcsscomputedvalues.c プロジェクト: soreau/gtk
static void
gtk_css_computed_values_create_css_animations (GtkCssComputedValues    *values,
        GtkCssComputedValues    *parent_values,
        gint64                   timestamp,
        GtkStyleProviderPrivate *provider,
        GtkCssComputedValues    *source)
{
    GtkCssValue *durations, *delays, *timing_functions, *animations;
    GtkCssValue *iteration_counts, *directions, *play_states, *fill_modes;
    guint i;

    animations = _gtk_css_computed_values_get_value (values, GTK_CSS_PROPERTY_ANIMATION_NAME);
    durations = _gtk_css_computed_values_get_value (values, GTK_CSS_PROPERTY_ANIMATION_DURATION);
    delays = _gtk_css_computed_values_get_value (values, GTK_CSS_PROPERTY_ANIMATION_DELAY);
    timing_functions = _gtk_css_computed_values_get_value (values, GTK_CSS_PROPERTY_ANIMATION_TIMING_FUNCTION);
    iteration_counts = _gtk_css_computed_values_get_value (values, GTK_CSS_PROPERTY_ANIMATION_ITERATION_COUNT);
    directions = _gtk_css_computed_values_get_value (values, GTK_CSS_PROPERTY_ANIMATION_DIRECTION);
    play_states = _gtk_css_computed_values_get_value (values, GTK_CSS_PROPERTY_ANIMATION_PLAY_STATE);
    fill_modes = _gtk_css_computed_values_get_value (values, GTK_CSS_PROPERTY_ANIMATION_FILL_MODE);

    for (i = 0; i < _gtk_css_array_value_get_n_values (animations); i++)
    {
        GtkStyleAnimation *animation;
        GtkCssKeyframes *keyframes;
        const char *name;

        name = _gtk_css_ident_value_get (_gtk_css_array_value_get_nth (animations, i));
        if (g_ascii_strcasecmp (name, "none") == 0)
            continue;

        animation = gtk_css_computed_values_find_animation (values, name);
        if (animation)
            continue;

        if (source)
            animation = gtk_css_computed_values_find_animation (source, name);

        if (animation)
        {
            animation = _gtk_css_animation_copy (GTK_CSS_ANIMATION (animation),
                                                 timestamp,
                                                 _gtk_css_play_state_value_get (_gtk_css_array_value_get_nth (play_states, i)));
        }
        else
        {
            keyframes = _gtk_style_provider_private_get_keyframes (provider, name);
            if (keyframes == NULL)
                continue;

            keyframes = _gtk_css_keyframes_compute (keyframes, provider, values, parent_values);

            animation = _gtk_css_animation_new (name,
                                                keyframes,
                                                timestamp,
                                                _gtk_css_number_value_get (_gtk_css_array_value_get_nth (delays, i), 100) * G_USEC_PER_SEC,
                                                _gtk_css_number_value_get (_gtk_css_array_value_get_nth (durations, i), 100) * G_USEC_PER_SEC,
                                                _gtk_css_array_value_get_nth (timing_functions, i),
                                                _gtk_css_direction_value_get (_gtk_css_array_value_get_nth (directions, i)),
                                                _gtk_css_play_state_value_get (_gtk_css_array_value_get_nth (play_states, i)),
                                                _gtk_css_fill_mode_value_get (_gtk_css_array_value_get_nth (fill_modes, i)),
                                                _gtk_css_number_value_get (_gtk_css_array_value_get_nth (iteration_counts, i), 100));
            _gtk_css_keyframes_unref (keyframes);
        }
        values->animations = g_slist_prepend (values->animations, animation);
    }
}