GdkPixbuf* vfs_load_icon( GtkIconTheme* theme, const char* icon_name, int size ) { GdkPixbuf* icon = NULL; const char* file; if ( !icon_name ) return NULL; GtkIconInfo* inf = gtk_icon_theme_lookup_icon( theme, icon_name, size, GTK_ICON_LOOKUP_USE_BUILTIN | GTK_ICON_LOOKUP_FORCE_SIZE ); if ( !inf && icon_name[0] == '/' ) return gdk_pixbuf_new_from_file_at_size ( icon_name, size, size, NULL ); if( G_UNLIKELY( ! inf ) ) return NULL; file = gtk_icon_info_get_filename( inf ); if( G_LIKELY( file ) ) icon = gdk_pixbuf_new_from_file_at_size( file, size, size, NULL ); else { icon = gtk_icon_info_get_builtin_pixbuf( inf ); g_object_ref( icon ); } gtk_icon_info_free( inf ); /* if( G_LIKELY( icon ) ) { // scale down the icon if it's too big int width, height; height = gdk_pixbuf_get_height(icon); width = gdk_pixbuf_get_width(icon); if( G_UNLIKELY( height > size || width > size ) ) { GdkPixbuf* scaled; if( height > width ) { width = size * height / width; height = size; } else if( height < width ) { height = size * width / height; width = size; } else height = width = size; scaled = gdk_pixbuf_scale_simple( icon, width, height, GDK_INTERP_BILINEAR ); g_object_unref( icon ); icon = scaled; } } */ return icon; }
/*! \fn GdkPixbuf* CDesktopAppChooser::m_LoadThemeIcon(GtkIconTheme* theme, const char* icon_name, int size) \brief To load a icon contents found in theme icon pool. \param[in] theme. \param[in] icon_name. \param[in] size. \return PixelBuffer object representing the designated icon. */ GdkPixbuf* CDesktopAppChooser::m_LoadThemeIcon(GtkIconTheme* theme, const char* icon_name, int size) { GdkPixbuf *icon = NULL; const char *file = NULL; GtkIconInfo *info = gtk_icon_theme_lookup_icon(theme, icon_name, size, GTK_ICON_LOOKUP_USE_BUILTIN); if( G_UNLIKELY(!info) ) return NULL; file = gtk_icon_info_get_filename( info ); if( G_LIKELY( file ) ) icon = gdk_pixbuf_new_from_file( file, NULL ); else icon = gtk_icon_info_get_builtin_pixbuf( info ); gtk_icon_info_free( info ); if( G_LIKELY( icon ) ) { int height = gdk_pixbuf_get_height(icon); int width = gdk_pixbuf_get_width(icon); /* Scale down the icon if it's too big to be shown. */ if(G_UNLIKELY( (height > size) || (width > size) )) { GdkPixbuf *scaled = NULL; if( height > width ) { width = size * height / width; height = size; } else if( height < width ) { height = size * width / height; width = size; } else height = width = size; scaled = gdk_pixbuf_scale_simple( icon, width, height, GDK_INTERP_BILINEAR ); g_object_unref( icon ); icon = scaled; } } return icon; }
static VALUE rg_builtin_pixbuf(VALUE self) { return GOBJ2RVAL(gtk_icon_info_get_builtin_pixbuf(_SELF(self))); }
/* Load image from file */ static void _xfdashboard_image_content_load_from_file(XfdashboardImageContent *self) { XfdashboardImageContentPrivate *priv; gchar *lookupFilename; gchar *filename; g_return_if_fail(XFDASHBOARD_IS_IMAGE_CONTENT(self)); priv=self->priv; filename=NULL; /* Check if type of image is valid and all needed parameters are set */ g_return_if_fail(priv->type==XFDASHBOARD_IMAGE_TYPE_FILE); g_return_if_fail(priv->iconName); g_return_if_fail(priv->iconSize>0); /* If path of icon filename is relative build absolute path by prefixing theme path ... */ if(!g_path_is_absolute(priv->iconName)) { XfdashboardTheme *theme; const gchar *themePath; /* Get theme path */ theme=xfdashboard_application_get_theme(); g_object_ref(theme); themePath=xfdashboard_theme_get_path(theme); /* Build absolute path from theme path and given relative path to icon */ lookupFilename=g_build_filename(themePath, priv->iconName, NULL); /* Release allocated resources */ g_object_unref(theme); } /* ... otherwise it is an absolute path already so just copy it */ else lookupFilename=g_strdup(priv->iconName); /* If file does not exists then load fallback icon */ if(!g_file_test(lookupFilename, G_FILE_TEST_EXISTS)) { GtkIconInfo *iconInfo; g_warning(_("Icon file '%s' does not exist - trying fallback icon '%s'"), priv->iconName, priv->missingIconName); iconInfo=gtk_icon_theme_lookup_icon(priv->iconTheme, priv->missingIconName, priv->iconSize, #ifdef USE_GTK_BUILTIN_ICONS GTK_ICON_LOOKUP_USE_BUILTIN); #else 0); #endif if(!iconInfo) { g_error(_("Could not load fallback icon for file '%s'"), priv->iconName); _xfdashboard_image_content_set_empty_image(self); g_free(lookupFilename); return; } /* Check if have to use built-in GdkPixbuf for icon ... */ filename=g_strdup(gtk_icon_info_get_filename(iconInfo)); #ifdef USE_GTK_BUILTIN_ICONS if(!filename) { GdkPixbuf *iconPixbuf; GError *error=NULL; iconPixbuf=gtk_icon_info_get_builtin_pixbuf(iconInfo); if(!clutter_image_set_data(CLUTTER_IMAGE(self), gdk_pixbuf_get_pixels(iconPixbuf), gdk_pixbuf_get_has_alpha(iconPixbuf) ? COGL_PIXEL_FORMAT_RGBA_8888 : COGL_PIXEL_FORMAT_RGB_888, gdk_pixbuf_get_width(iconPixbuf), gdk_pixbuf_get_height(iconPixbuf), gdk_pixbuf_get_rowstride(iconPixbuf), &error)) { g_warning(_("Failed to load image data into content for icon '%s': %s"), priv->iconName, error ? error->message : _("Unknown error")); if(error) { g_error_free(error); error=NULL; } } else g_debug("Loaded fallback icon for file '%s' from built-in pixbuf", priv->iconName); g_object_unref(iconPixbuf); } #endif /* Release allocated resources */ g_object_unref(iconInfo); }