static int gtk_icon_helper_paintable_get_intrinsic_height (GdkPaintable *paintable) { GtkIconHelper *self = GTK_ICON_HELPER (paintable); return gtk_icon_helper_get_size (self); }
static void gtk_icon_helper_finalize (GObject *object) { GtkIconHelper *self = GTK_ICON_HELPER (object); _gtk_icon_helper_clear (self); G_OBJECT_CLASS (_gtk_icon_helper_parent_class)->finalize (object); }
static void gtk_icon_helper_style_changed (GtkCssGadget *gadget, GtkCssStyleChange *change) { gtk_icon_helper_invalidate_for_change (GTK_ICON_HELPER (gadget), change); if (!GTK_IS_CSS_TRANSIENT_NODE (gtk_css_gadget_get_node (gadget))) GTK_CSS_GADGET_CLASS (gtk_icon_helper_parent_class)->style_changed (gadget, change); }
static void gtk_icon_helper_finalize (GObject *object) { GtkIconHelper *self = GTK_ICON_HELPER (object); _gtk_icon_helper_clear (self); g_signal_handlers_disconnect_by_func (self->owner, G_CALLBACK (gtk_icon_helper_invalidate), self); gtk_image_definition_unref (self->def); G_OBJECT_CLASS (gtk_icon_helper_parent_class)->finalize (object); }
static GdkPaintable * gtk_icon_helper_paintable_get_current_image (GdkPaintable *paintable) { GtkIconHelper *self = GTK_ICON_HELPER (paintable); gtk_icon_helper_ensure_paintable (self); if (self->paintable == NULL) return NULL; return gtk_icon_helper_paintable_get_current_image (self->paintable); }
static void gtk_icon_helper_constructed (GObject *object) { GtkIconHelper *self = GTK_ICON_HELPER (object); GtkWidget *widget; widget = gtk_css_gadget_get_owner (GTK_CSS_GADGET (self)); g_signal_connect_swapped (widget, "direction-changed", G_CALLBACK (gtk_icon_helper_invalidate), self); g_signal_connect_swapped (widget, "notify::scale-factor", G_CALLBACK (gtk_icon_helper_invalidate), self); G_OBJECT_CLASS (gtk_icon_helper_parent_class)->constructed (object); }
static void gtk_icon_helper_finalize (GObject *object) { GtkIconHelper *self = GTK_ICON_HELPER (object); GtkWidget *widget; widget = gtk_css_gadget_get_owner (GTK_CSS_GADGET (self)); g_signal_handlers_disconnect_by_func (widget, G_CALLBACK (gtk_icon_helper_invalidate), self); _gtk_icon_helper_clear (self); gtk_image_definition_unref (self->priv->def); G_OBJECT_CLASS (gtk_icon_helper_parent_class)->finalize (object); }
static gboolean gtk_icon_helper_draw (GtkCssGadget *gadget, cairo_t *cr, int x, int y, int width, int height) { GtkIconHelper *self = GTK_ICON_HELPER (gadget); int icon_width, icon_height; _gtk_icon_helper_get_size (self, &icon_width, &icon_height); _gtk_icon_helper_draw (self, cr, x + (width - icon_width) / 2, y + (height - icon_height) / 2); return FALSE; }
static void gtk_icon_helper_get_preferred_size (GtkCssGadget *gadget, GtkOrientation orientation, gint for_size, gint *minimum, gint *natural, gint *minimum_baseline, gint *natural_baseline) { GtkIconHelper *self = GTK_ICON_HELPER (gadget); int icon_width, icon_height; _gtk_icon_helper_get_size (self, &icon_width, &icon_height); if (orientation == GTK_ORIENTATION_HORIZONTAL) *minimum = *natural = icon_width; else *minimum = *natural = icon_height; if (minimum_baseline) *minimum_baseline = 0; if (natural_baseline) *natural_baseline = 0; }
static void gtk_icon_helper_paintable_snapshot (GdkPaintable *paintable, GdkSnapshot *snapshot, double width, double height) { GtkIconHelper *self = GTK_ICON_HELPER (paintable); GtkCssStyle *style; style = gtk_css_node_get_style (self->node); gtk_icon_helper_ensure_paintable (self); if (self->paintable == NULL) return; switch (gtk_image_definition_get_storage_type (self->def)) { case GTK_IMAGE_ICON_NAME: case GTK_IMAGE_GICON: { double x, y, w, h; /* Never scale up icons. */ w = gdk_paintable_get_intrinsic_width (self->paintable); h = gdk_paintable_get_intrinsic_height (self->paintable); w = MIN (w, width); h = MIN (h, height); x = (width - w) / 2; y = (height - h) / 2; gtk_snapshot_offset (snapshot, x, y); gtk_css_style_snapshot_icon_paintable (style, snapshot, self->paintable, w, h, self->texture_is_symbolic); gtk_snapshot_offset (snapshot, -x, -y); } break; case GTK_IMAGE_PAINTABLE: case GTK_IMAGE_EMPTY: default: { double image_ratio = (double) width / height; double ratio; double x, y, w, h; if (self->paintable == NULL) break; ratio = gdk_paintable_get_intrinsic_aspect_ratio (self->paintable); if (ratio == 0) { w = width; h = height; } else if (ratio > image_ratio) { w = width; h = width / ratio; } else { w = height * ratio; h = height; } x = floor (width - ceil (w)) / 2; y = floor (height - ceil (h)) / 2; gtk_snapshot_offset (snapshot, x, y); gtk_css_style_snapshot_icon_paintable (style, snapshot, self->paintable, w, h, self->texture_is_symbolic); gtk_snapshot_offset (snapshot, -x, -y); } break; } }