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); }
static GtkCssImage * gtk_css_image_builtin_compute (GtkCssImage *image, guint property_id, GtkStyleProviderPrivate *provider, GtkCssStyle *style, GtkCssStyle *parent_style) { GtkCssImageBuiltin *result; GtkBorderStyle border_style; result = g_object_new (GTK_TYPE_CSS_IMAGE_BUILTIN, NULL); border_style = _gtk_css_border_style_value_get (gtk_css_style_get_value (style, GTK_CSS_PROPERTY_BORDER_TOP_STYLE)); if (border_style == GTK_BORDER_STYLE_SOLID) { GtkBorder border; border.top = _gtk_css_number_value_get (gtk_css_style_get_value (style, GTK_CSS_PROPERTY_BORDER_TOP_WIDTH), 100); border.right = _gtk_css_number_value_get (gtk_css_style_get_value (style, GTK_CSS_PROPERTY_BORDER_RIGHT_WIDTH), 100); border.bottom = _gtk_css_number_value_get (gtk_css_style_get_value (style, GTK_CSS_PROPERTY_BORDER_BOTTOM_WIDTH), 100); border.left = _gtk_css_number_value_get (gtk_css_style_get_value (style, GTK_CSS_PROPERTY_BORDER_LEFT_WIDTH), 100); result->border_width = MIN (MIN (border.top, border.bottom), MIN (border.left, border.right)); } result->fg_color = *_gtk_css_rgba_value_get_rgba (gtk_css_style_get_value (style, GTK_CSS_PROPERTY_COLOR)); result->bg_color = *_gtk_css_rgba_value_get_rgba (gtk_css_style_get_value (style, GTK_CSS_PROPERTY_BACKGROUND_COLOR)); result->border_color = *_gtk_css_rgba_value_get_rgba (gtk_css_style_get_value (style, GTK_CSS_PROPERTY_BORDER_TOP_COLOR)); return GTK_CSS_IMAGE (result); }
static void gtk_css_image_builtin_dispose (GObject *object) { if (the_one_true_image == GTK_CSS_IMAGE (object)) the_one_true_image = NULL; G_OBJECT_CLASS (gtk_css_image_builtin_parent_class)->dispose (object); }
static GtkCssImage * gtk_css_image_gradient_compute (GtkCssImage *image, GtkStyleContext *context) { GtkCssImageGradient *gradient = GTK_CSS_IMAGE_GRADIENT (image); GtkCssImageGradient *copy; if (gradient->pattern) return g_object_ref (gradient); copy = g_object_new (GTK_TYPE_CSS_IMAGE_GRADIENT, NULL); copy->gradient = gtk_gradient_ref (gradient->gradient); copy->pattern = gtk_gradient_resolve_for_context (copy->gradient, context); return GTK_CSS_IMAGE (copy); }
static GtkCssImage * gtk_css_image_radial_compute (GtkCssImage *image, guint property_id, GtkStyleProviderPrivate *provider, GtkCssStyle *style, GtkCssStyle *parent_style) { GtkCssImageRadial *radial = GTK_CSS_IMAGE_RADIAL (image); GtkCssImageRadial *copy; guint i; copy = g_object_new (GTK_TYPE_CSS_IMAGE_RADIAL, NULL); copy->repeating = radial->repeating; copy->circle = radial->circle; copy->size = radial->size; copy->position = _gtk_css_value_compute (radial->position, property_id, provider, style, parent_style); if (radial->sizes[0]) copy->sizes[0] = _gtk_css_value_compute (radial->sizes[0], property_id, provider, style, parent_style); if (radial->sizes[1]) copy->sizes[1] = _gtk_css_value_compute (radial->sizes[1], property_id, provider, style, parent_style); g_array_set_size (copy->stops, radial->stops->len); for (i = 0; i < radial->stops->len; i++) { GtkCssImageRadialColorStop *stop, *scopy; stop = &g_array_index (radial->stops, GtkCssImageRadialColorStop, i); scopy = &g_array_index (copy->stops, GtkCssImageRadialColorStop, i); scopy->color = _gtk_css_value_compute (stop->color, property_id, provider, style, parent_style); if (stop->offset) { scopy->offset = _gtk_css_value_compute (stop->offset, property_id, provider, style, parent_style); } else { scopy->offset = NULL; } } return GTK_CSS_IMAGE (copy); }
static GtkCssImage * gtk_css_image_fallback_compute (GtkCssImage *image, guint property_id, GtkStyleProviderPrivate *provider, GtkCssStyle *style, GtkCssStyle *parent_style) { GtkCssImageFallback *fallback = GTK_CSS_IMAGE_FALLBACK (image); GtkCssImageFallback *copy; int i; if (fallback->used < 0) { copy = g_object_new (_gtk_css_image_fallback_get_type (), NULL); copy->n_images = fallback->n_images; copy->images = g_new (GtkCssImage *, fallback->n_images); for (i = 0; i < fallback->n_images; i++) { copy->images[i] = _gtk_css_image_compute (fallback->images[i], property_id, provider, style, parent_style); /* Assume that failing to load an image leaves a 0x0 surface image */ if (GTK_IS_CSS_IMAGE_SURFACE (copy->images[i]) && _gtk_css_image_get_width (copy->images[i]) == 0 && _gtk_css_image_get_height (copy->images[i]) == 0) continue; if (copy->used < 0) copy->used = i; } if (fallback->color) copy->color = _gtk_css_value_compute (fallback->color, property_id, provider, style, parent_style); else copy->color = NULL; return GTK_CSS_IMAGE (copy); }
static GtkCssImage * gtk_css_image_icon_theme_compute (GtkCssImage *image, guint property_id, GtkStyleProviderPrivate *provider, GtkCssStyle *style, GtkCssStyle *parent_style) { GtkCssImageIconTheme *icon_theme = GTK_CSS_IMAGE_ICON_THEME (image); GtkCssImageIconTheme *copy; copy = g_object_new (GTK_TYPE_CSS_IMAGE_ICON_THEME, NULL); copy->name = g_strdup (icon_theme->name); copy->icon_theme = gtk_css_icon_theme_value_get_icon_theme (gtk_css_style_get_value (style, GTK_CSS_PROPERTY_ICON_THEME)); copy->scale = _gtk_style_provider_private_get_scale (provider); gtk_icon_theme_lookup_symbolic_colors (style, ©->color, ©->success, ©->warning, ©->error); return GTK_CSS_IMAGE (copy); }
GtkCssImage * _gtk_css_image_cross_fade_new (GtkCssImage *start, GtkCssImage *end, double progress) { GtkCssImageCrossFade *cross_fade; g_return_val_if_fail (start == NULL || GTK_IS_CSS_IMAGE (start), NULL); g_return_val_if_fail (end == NULL || GTK_IS_CSS_IMAGE (end), NULL); cross_fade = g_object_new (GTK_TYPE_CSS_IMAGE_CROSS_FADE, NULL); if (start) cross_fade->start = g_object_ref (start); if (end) cross_fade->end = g_object_ref (end); cross_fade->progress = progress; return GTK_CSS_IMAGE (cross_fade); }
static GtkCssImage * gtk_css_image_fallback_compute (GtkCssImage *image, guint property_id, GtkStyleProvider *provider, GtkCssStyle *style, GtkCssStyle *parent_style) { GtkCssImageFallback *fallback = GTK_CSS_IMAGE_FALLBACK (image); GtkCssImageFallback *copy; int i; if (fallback->used < 0) { copy = g_object_new (_gtk_css_image_fallback_get_type (), NULL); copy->n_images = fallback->n_images; copy->images = g_new (GtkCssImage *, fallback->n_images); for (i = 0; i < fallback->n_images; i++) { copy->images[i] = _gtk_css_image_compute (fallback->images[i], property_id, provider, style, parent_style); if (gtk_css_image_is_invalid (copy->images[i])) continue; if (copy->used < 0) copy->used = i; } if (fallback->color) copy->color = _gtk_css_value_compute (fallback->color, property_id, provider, style, parent_style); else copy->color = NULL; return GTK_CSS_IMAGE (copy); }
static GtkCssImage * gtk_css_image_gradient_compute (GtkCssImage *image, guint property_id, GtkStyleProviderPrivate *provider, GtkCssComputedValues *values, GtkCssComputedValues *parent_values, GtkCssDependencies *dependencies) { GtkCssImageGradient *gradient = GTK_CSS_IMAGE_GRADIENT (image); GtkCssImageGradient *copy; if (gradient->pattern) return g_object_ref (gradient); copy = g_object_new (GTK_TYPE_CSS_IMAGE_GRADIENT, NULL); copy->gradient = gtk_gradient_ref (gradient->gradient); copy->pattern = _gtk_gradient_resolve_full (copy->gradient, provider, values, parent_values, dependencies); return GTK_CSS_IMAGE (copy); }
static GtkCssImage * gtk_css_image_linear_compute (GtkCssImage *image, guint property_id, GtkStyleProviderPrivate *provider, GtkCssStyle *style, GtkCssStyle *parent_style) { GtkCssImageLinear *linear = GTK_CSS_IMAGE_LINEAR (image); GtkCssImageLinear *copy; guint i; copy = g_object_new (GTK_TYPE_CSS_IMAGE_LINEAR, NULL); copy->repeating = linear->repeating; copy->side = linear->side; if (linear->angle) copy->angle = _gtk_css_value_compute (linear->angle, property_id, provider, style, parent_style); g_array_set_size (copy->stops, linear->stops->len); for (i = 0; i < linear->stops->len; i++) { GtkCssImageLinearColorStop *stop, *scopy; stop = &g_array_index (linear->stops, GtkCssImageLinearColorStop, i); scopy = &g_array_index (copy->stops, GtkCssImageLinearColorStop, i); scopy->color = _gtk_css_value_compute (stop->color, property_id, provider, style, parent_style); if (stop->offset) { scopy->offset = _gtk_css_value_compute (stop->offset, property_id, provider, style, parent_style); } else { scopy->offset = NULL; } } return GTK_CSS_IMAGE (copy); }
static GtkCssImage * gtk_css_image_gradient_transition (GtkCssImage *start_image, GtkCssImage *end_image, guint property_id, double progress) { GtkGradient *start_gradient, *end_gradient, *gradient; cairo_pattern_t *start_pattern, *end_pattern; GtkCssImageGradient *result; start_gradient = GTK_CSS_IMAGE_GRADIENT (start_image)->gradient; start_pattern = GTK_CSS_IMAGE_GRADIENT (start_image)->pattern; if (end_image == NULL) { end_gradient = NULL; end_pattern = NULL; } else { if (!GTK_IS_CSS_IMAGE_GRADIENT (end_image)) return GTK_CSS_IMAGE_CLASS (_gtk_css_image_gradient_parent_class)->transition (start_image, end_image, property_id, progress); end_gradient = GTK_CSS_IMAGE_GRADIENT (end_image)->gradient; end_pattern = GTK_CSS_IMAGE_GRADIENT (end_image)->pattern; } gradient = _gtk_gradient_transition (start_gradient, end_gradient, property_id, progress); if (gradient == NULL) return GTK_CSS_IMAGE_CLASS (_gtk_css_image_gradient_parent_class)->transition (start_image, end_image, property_id, progress); result = g_object_new (GTK_TYPE_CSS_IMAGE_GRADIENT, NULL); result->gradient = gradient; result->pattern = transition_pattern (start_pattern, end_pattern, progress); return GTK_CSS_IMAGE (result); }
static GtkCssImage * gtk_css_image_radial_transition (GtkCssImage *start_image, GtkCssImage *end_image, guint property_id, double progress) { GtkCssImageRadial *start, *end, *result; guint i; start = GTK_CSS_IMAGE_RADIAL (start_image); if (end_image == NULL) return GTK_CSS_IMAGE_CLASS (_gtk_css_image_radial_parent_class)->transition (start_image, end_image, property_id, progress); if (!GTK_IS_CSS_IMAGE_RADIAL (end_image)) return GTK_CSS_IMAGE_CLASS (_gtk_css_image_radial_parent_class)->transition (start_image, end_image, property_id, progress); end = GTK_CSS_IMAGE_RADIAL (end_image); if (start->repeating != end->repeating || start->stops->len != end->stops->len || start->size != end->size || start->circle != end->circle) return GTK_CSS_IMAGE_CLASS (_gtk_css_image_radial_parent_class)->transition (start_image, end_image, property_id, progress); result = g_object_new (GTK_TYPE_CSS_IMAGE_RADIAL, NULL); result->repeating = start->repeating; result->circle = start->circle; result->size = start->size; result->position = _gtk_css_value_transition (start->position, end->position, property_id, progress); if (result->position == NULL) goto fail; if (start->sizes[0] && end->sizes[0]) { result->sizes[0] = _gtk_css_value_transition (start->sizes[0], end->sizes[0], property_id, progress); if (result->sizes[0] == NULL) goto fail; } else result->sizes[0] = 0; if (start->sizes[1] && end->sizes[1]) { result->sizes[1] = _gtk_css_value_transition (start->sizes[1], end->sizes[1], property_id, progress); if (result->sizes[1] == NULL) goto fail; } else result->sizes[1] = 0; for (i = 0; i < start->stops->len; i++) { GtkCssImageRadialColorStop stop, *start_stop, *end_stop; start_stop = &g_array_index (start->stops, GtkCssImageRadialColorStop, i); end_stop = &g_array_index (end->stops, GtkCssImageRadialColorStop, i); if ((start_stop->offset != NULL) != (end_stop->offset != NULL)) goto fail; if (start_stop->offset == NULL) { stop.offset = NULL; } else { stop.offset = _gtk_css_value_transition (start_stop->offset, end_stop->offset, property_id, progress); if (stop.offset == NULL) goto fail; } stop.color = _gtk_css_value_transition (start_stop->color, end_stop->color, property_id, progress); if (stop.color == NULL) { if (stop.offset) _gtk_css_value_unref (stop.offset); goto fail; } g_array_append_val (result->stops, stop); } return GTK_CSS_IMAGE (result); fail: g_object_unref (result); return GTK_CSS_IMAGE_CLASS (_gtk_css_image_radial_parent_class)->transition (start_image, end_image, property_id, progress); }
static GtkCssImage * gtk_css_image_linear_transition (GtkCssImage *start_image, GtkCssImage *end_image, guint property_id, double progress) { GtkCssImageLinear *start, *end, *result; guint i; start = GTK_CSS_IMAGE_LINEAR (start_image); if (end_image == NULL) return GTK_CSS_IMAGE_CLASS (_gtk_css_image_linear_parent_class)->transition (start_image, end_image, property_id, progress); if (!GTK_IS_CSS_IMAGE_LINEAR (end_image)) return GTK_CSS_IMAGE_CLASS (_gtk_css_image_linear_parent_class)->transition (start_image, end_image, property_id, progress); end = GTK_CSS_IMAGE_LINEAR (end_image); if ((start->repeating != end->repeating) || (start->stops->len != end->stops->len)) return GTK_CSS_IMAGE_CLASS (_gtk_css_image_linear_parent_class)->transition (start_image, end_image, property_id, progress); result = g_object_new (GTK_TYPE_CSS_IMAGE_LINEAR, NULL); result->repeating = start->repeating; if (start->side != end->side) goto fail; result->side = start->side; if (result->side == 0) result->angle = _gtk_css_value_transition (start->angle, end->angle, property_id, progress); if (result->angle == NULL) goto fail; for (i = 0; i < start->stops->len; i++) { GtkCssImageLinearColorStop stop, *start_stop, *end_stop; start_stop = &g_array_index (start->stops, GtkCssImageLinearColorStop, i); end_stop = &g_array_index (end->stops, GtkCssImageLinearColorStop, i); if ((start_stop->offset != NULL) != (end_stop->offset != NULL)) goto fail; if (start_stop->offset == NULL) { stop.offset = NULL; } else { stop.offset = _gtk_css_value_transition (start_stop->offset, end_stop->offset, property_id, progress); if (stop.offset == NULL) goto fail; } stop.color = _gtk_css_value_transition (start_stop->color, end_stop->color, property_id, progress); if (stop.color == NULL) { if (stop.offset) _gtk_css_value_unref (stop.offset); goto fail; } g_array_append_val (result->stops, stop); } return GTK_CSS_IMAGE (result); fail: g_object_unref (result); return GTK_CSS_IMAGE_CLASS (_gtk_css_image_linear_parent_class)->transition (start_image, end_image, property_id, progress); }