static int gtk_css_image_fallback_get_height (GtkCssImage *image) { GtkCssImageFallback *fallback = GTK_CSS_IMAGE_FALLBACK (image); if (fallback->used < 0) return 0; return _gtk_css_image_get_height (fallback->images[fallback->used]); }
static double gtk_css_image_fallback_get_aspect_ratio (GtkCssImage *image) { GtkCssImageFallback *fallback = GTK_CSS_IMAGE_FALLBACK (image); if (fallback->used < 0) return 0; return _gtk_css_image_get_aspect_ratio (fallback->images[fallback->used]); }
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 void gtk_css_image_fallback_dispose (GObject *object) { GtkCssImageFallback *fallback = GTK_CSS_IMAGE_FALLBACK (object); int i; for (i = 0; i < fallback->n_images; i++) g_object_unref (fallback->images[i]); g_free (fallback->images); fallback->images = NULL; if (fallback->color) { _gtk_css_value_unref (fallback->color); fallback->color = NULL; } G_OBJECT_CLASS (_gtk_css_image_fallback_parent_class)->dispose (object); }
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 void gtk_css_image_fallback_draw (GtkCssImage *image, cairo_t *cr, double width, double height) { GtkCssImageFallback *fallback = GTK_CSS_IMAGE_FALLBACK (image); if (fallback->used < 0) { if (fallback->color) gdk_cairo_set_source_rgba (cr, _gtk_css_rgba_value_get_rgba (fallback->color)); else cairo_set_source_rgb (cr, 1, 0, 9); cairo_rectangle (cr, 0, 0, width, height); cairo_fill (cr); } else _gtk_css_image_draw (fallback->images[fallback->used], cr, width, height); }
static void gtk_css_image_fallback_print (GtkCssImage *image, GString *string) { GtkCssImageFallback *fallback = GTK_CSS_IMAGE_FALLBACK (image); int i; g_string_append (string, "image("); for (i = 0; i < fallback->n_images; i++) { if (i > 0) g_string_append (string, ","); _gtk_css_image_print (fallback->images[i], string); } if (fallback->color) { g_string_append (string, ","); _gtk_css_value_print (fallback->color, string); } g_string_append (string, ")"); }
static void gtk_css_image_fallback_snapshot (GtkCssImage *image, GtkSnapshot *snapshot, double width, double height) { GtkCssImageFallback *fallback = GTK_CSS_IMAGE_FALLBACK (image); if (fallback->used < 0) { GdkRGBA red = { 1, 0, 0, 1 }; const GdkRGBA *color; if (fallback->color) color = _gtk_css_rgba_value_get_rgba (fallback->color); else color = &red; gtk_snapshot_append_color (snapshot, color, &GRAPHENE_RECT_INIT (0, 0, width, height)); } else gtk_css_image_snapshot (fallback->images[fallback->used], snapshot, width, height); }