static GdkPaintable * gtk_icon_helper_load_paintable (GtkIconHelper *self, gboolean *out_symbolic) { GdkPaintable *paintable; GIcon *gicon; gboolean symbolic; switch (gtk_image_definition_get_storage_type (self->def)) { case GTK_IMAGE_PAINTABLE: paintable = g_object_ref (gtk_image_definition_get_paintable (self->def)); symbolic = FALSE; break; case GTK_IMAGE_ICON_NAME: if (self->use_fallback) gicon = g_themed_icon_new_with_default_fallbacks (gtk_image_definition_get_icon_name (self->def)); else gicon = g_themed_icon_new (gtk_image_definition_get_icon_name (self->def)); paintable = ensure_paintable_for_gicon (self, gtk_css_node_get_style (self->node), gtk_widget_get_direction (self->owner), gtk_widget_get_scale_factor (self->owner), gicon, &symbolic); g_object_unref (gicon); break; case GTK_IMAGE_GICON: paintable = ensure_paintable_for_gicon (self, gtk_css_node_get_style (self->node), gtk_widget_get_direction (self->owner), gtk_widget_get_scale_factor (self->owner), gtk_image_definition_get_gicon (self->def), &symbolic); break; case GTK_IMAGE_EMPTY: default: paintable = NULL; symbolic = FALSE; break; } *out_symbolic = symbolic; return paintable; }
void gtk_css_node_print (GtkCssNode *cssnode, GtkStyleContextPrintFlags flags, GString *string, guint indent) { gboolean need_newline = FALSE; g_string_append_printf (string, "%*s", indent, ""); if (!cssnode->visible) g_string_append_c (string, '['); gtk_css_node_declaration_print (cssnode->decl, string); if (!cssnode->visible) g_string_append_c (string, ']'); g_string_append_c (string, '\n'); if (flags & GTK_STYLE_CONTEXT_PRINT_SHOW_STYLE) need_newline = gtk_css_style_print (gtk_css_node_get_style (cssnode), string, indent + 2, TRUE); if (flags & GTK_STYLE_CONTEXT_PRINT_RECURSE) { GtkCssNode *node; if (need_newline && gtk_css_node_get_first_child (cssnode)) g_string_append_c (string, '\n'); for (node = gtk_css_node_get_first_child (cssnode); node; node = gtk_css_node_get_next_sibling (node)) gtk_css_node_print (node, flags, string, indent + 2); } }
int gtk_icon_helper_get_size (GtkIconHelper *self) { GtkCssStyle *style; if (self->pixel_size != -1) return self->pixel_size; style = gtk_css_node_get_style (self->node); return _gtk_css_number_value_get (gtk_css_style_get_value (style, GTK_CSS_PROPERTY_ICON_SIZE), 100); }
static GtkCssStyle * gtk_css_node_real_update_style (GtkCssNode *cssnode, GtkCssChange change, gint64 timestamp, GtkCssStyle *style) { GtkCssStyle *static_style, *new_static_style, *new_style; if (GTK_IS_CSS_ANIMATED_STYLE (style)) { static_style = GTK_CSS_ANIMATED_STYLE (style)->style; } else { static_style = style; } if (gtk_css_style_needs_recreation (static_style, change)) new_static_style = gtk_css_node_create_style (cssnode); else new_static_style = g_object_ref (static_style); if (new_static_style != static_style || (change & GTK_CSS_CHANGE_ANIMATIONS)) { GtkCssNode *parent = gtk_css_node_get_parent (cssnode); new_style = gtk_css_animated_style_new (new_static_style, parent ? gtk_css_node_get_style (parent) : NULL, timestamp, gtk_css_node_get_style_provider (cssnode), should_create_transitions (change) ? style : NULL); } else if (static_style != style && (change & GTK_CSS_CHANGE_TIMESTAMP)) { new_style = gtk_css_animated_style_new_advance (GTK_CSS_ANIMATED_STYLE (style), static_style, timestamp); } else { new_style = g_object_ref (style); } if (!gtk_css_style_is_static (new_style)) gtk_css_node_set_invalid (cssnode, TRUE); g_object_unref (new_static_style); return new_style; }
void _gtk_icon_helper_draw (GtkIconHelper *self, cairo_t *cr, gdouble x, gdouble y) { gtk_icon_helper_ensure_surface (self); if (self->priv->rendered_surface != NULL) { gtk_css_style_render_icon_surface (gtk_css_node_get_style (gtk_css_gadget_get_node (GTK_CSS_GADGET (self))), cr, self->priv->rendered_surface, x, y); } }
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; } }
cairo_surface_t * gtk_icon_helper_load_surface (GtkIconHelper *self, int scale) { cairo_surface_t *surface; GtkIconSet *icon_set; GIcon *gicon; switch (gtk_image_definition_get_storage_type (self->priv->def)) { case GTK_IMAGE_SURFACE: surface = ensure_surface_from_surface (self, gtk_image_definition_get_surface (self->priv->def)); break; case GTK_IMAGE_PIXBUF: surface = ensure_surface_from_pixbuf (self, gtk_css_node_get_style (gtk_css_gadget_get_node (GTK_CSS_GADGET (self))), scale, gtk_image_definition_get_pixbuf (self->priv->def), gtk_image_definition_get_scale (self->priv->def)); break; case GTK_IMAGE_STOCK: G_GNUC_BEGIN_IGNORE_DEPRECATIONS; icon_set = gtk_icon_factory_lookup_default (gtk_image_definition_get_stock (self->priv->def)); G_GNUC_END_IGNORE_DEPRECATIONS; if (icon_set != NULL) surface = ensure_surface_for_icon_set (self, gtk_css_node_get_style (gtk_css_gadget_get_node (GTK_CSS_GADGET (self))), gtk_widget_get_direction (gtk_css_gadget_get_owner (GTK_CSS_GADGET (self))), scale, icon_set); else surface = NULL; break; case GTK_IMAGE_ICON_SET: icon_set = gtk_image_definition_get_icon_set (self->priv->def); surface = ensure_surface_for_icon_set (self, gtk_css_node_get_style (gtk_css_gadget_get_node (GTK_CSS_GADGET (self))), gtk_widget_get_direction (gtk_css_gadget_get_owner (GTK_CSS_GADGET (self))), scale, icon_set); break; case GTK_IMAGE_ICON_NAME: if (self->priv->use_fallback) gicon = g_themed_icon_new_with_default_fallbacks (gtk_image_definition_get_icon_name (self->priv->def)); else gicon = g_themed_icon_new (gtk_image_definition_get_icon_name (self->priv->def)); surface = ensure_surface_for_gicon (self, gtk_css_node_get_style (gtk_css_gadget_get_node (GTK_CSS_GADGET (self))), gtk_widget_get_direction (gtk_css_gadget_get_owner (GTK_CSS_GADGET (self))), scale, gicon); g_object_unref (gicon); break; case GTK_IMAGE_GICON: surface = ensure_surface_for_gicon (self, gtk_css_node_get_style (gtk_css_gadget_get_node (GTK_CSS_GADGET (self))), gtk_widget_get_direction (gtk_css_gadget_get_owner (GTK_CSS_GADGET (self))), scale, gtk_image_definition_get_gicon (self->priv->def)); break; case GTK_IMAGE_ANIMATION: case GTK_IMAGE_EMPTY: default: surface = NULL; break; } return surface; }