GtkIconTheme: Add helpers to load to cairo_surface_t
Right now this just uses the pixbuf load code and converts it to a surface. In the future we could cache the pattern to allow reusing the surface.
This commit is contained in:
@ -2080,6 +2080,69 @@ gtk_icon_theme_load_icon_for_scale (GtkIconTheme *icon_theme,
|
|||||||
return pixbuf;
|
return pixbuf;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gtk_icon_theme_load_surface:
|
||||||
|
* @icon_theme: a #GtkIconTheme
|
||||||
|
* @icon_name: the name of the icon to lookup
|
||||||
|
* @size: the desired icon size. The resulting icon may not be
|
||||||
|
* exactly this size; see gtk_icon_info_load_icon().
|
||||||
|
* @scale: desired scale
|
||||||
|
* @for_window: (allow-none): #GdkWindow to optimize drawing for, or %NULL
|
||||||
|
* @flags: flags modifying the behavior of the icon lookup
|
||||||
|
* @error: (allow-none): Location to store error information on failure,
|
||||||
|
* or %NULL.
|
||||||
|
*
|
||||||
|
* Looks up an icon in an icon theme for a particular window scale,
|
||||||
|
* scales it to the given size and renders it into a cairo surface. This is a
|
||||||
|
* convenience function; if more details about the icon are needed,
|
||||||
|
* use gtk_icon_theme_lookup_icon() followed by
|
||||||
|
* gtk_icon_info_load_surface().
|
||||||
|
*
|
||||||
|
* Note that you probably want to listen for icon theme changes and
|
||||||
|
* update the icon. This is usually done by connecting to the
|
||||||
|
* GtkWidget::style-set signal.
|
||||||
|
*
|
||||||
|
* Return value: (transfer full): the rendered icon; this may be a
|
||||||
|
* newly created icon or a new reference to an internal icon, so
|
||||||
|
* you must not modify the icon. Use cairo_surface_destroy() to release
|
||||||
|
* your reference to the icon. %NULL if the icon isn't found.
|
||||||
|
*
|
||||||
|
* Since: 3.10
|
||||||
|
**/
|
||||||
|
cairo_surface_t *
|
||||||
|
gtk_icon_theme_load_surface (GtkIconTheme *icon_theme,
|
||||||
|
const gchar *icon_name,
|
||||||
|
gint size,
|
||||||
|
gint scale,
|
||||||
|
GdkWindow *for_window,
|
||||||
|
GtkIconLookupFlags flags,
|
||||||
|
GError **error)
|
||||||
|
{
|
||||||
|
GtkIconInfo *icon_info;
|
||||||
|
cairo_surface_t *surface = NULL;
|
||||||
|
|
||||||
|
g_return_val_if_fail (GTK_IS_ICON_THEME (icon_theme), NULL);
|
||||||
|
g_return_val_if_fail (icon_name != NULL, NULL);
|
||||||
|
g_return_val_if_fail ((flags & GTK_ICON_LOOKUP_NO_SVG) == 0 ||
|
||||||
|
(flags & GTK_ICON_LOOKUP_FORCE_SVG) == 0, NULL);
|
||||||
|
g_return_val_if_fail (error == NULL || *error == NULL, NULL);
|
||||||
|
g_return_val_if_fail (scale >= 1, NULL);
|
||||||
|
|
||||||
|
icon_info = gtk_icon_theme_lookup_icon_for_scale (icon_theme, icon_name, size, scale,
|
||||||
|
flags | GTK_ICON_LOOKUP_USE_BUILTIN);
|
||||||
|
if (!icon_info)
|
||||||
|
{
|
||||||
|
g_set_error (error, GTK_ICON_THEME_ERROR, GTK_ICON_THEME_NOT_FOUND,
|
||||||
|
_("Icon '%s' not present in theme"), icon_name);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
surface = gtk_icon_info_load_surface (icon_info, for_window, error);
|
||||||
|
g_object_unref (icon_info);
|
||||||
|
|
||||||
|
return surface;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* gtk_icon_theme_has_icon:
|
* gtk_icon_theme_has_icon:
|
||||||
* @icon_theme: a #GtkIconTheme
|
* @icon_theme: a #GtkIconTheme
|
||||||
@ -3802,6 +3865,54 @@ gtk_icon_info_load_icon (GtkIconInfo *icon_info,
|
|||||||
return icon_info->proxy_pixbuf;
|
return icon_info->proxy_pixbuf;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gtk_icon_info_load_surface:
|
||||||
|
* @icon_info: a #GtkIconInfo structure from gtk_icon_theme_lookup_icon()
|
||||||
|
* @for_window: (allow-none): #GdkWindow to optimize drawing for, or %NULL
|
||||||
|
* @error: (allow-none): location to store error information on failure,
|
||||||
|
* or %NULL.
|
||||||
|
*
|
||||||
|
* Renders an icon previously looked up in an icon theme using
|
||||||
|
* gtk_icon_theme_lookup_icon(); the size will be based on the size
|
||||||
|
* passed to gtk_icon_theme_lookup_icon(). Note that the resulting
|
||||||
|
* surface may not be exactly this size; an icon theme may have icons
|
||||||
|
* that differ slightly from their nominal sizes, and in addition GTK+
|
||||||
|
* will avoid scaling icons that it considers sufficiently close to the
|
||||||
|
* requested size or for which the source image would have to be scaled
|
||||||
|
* up too far. (This maintains sharpness.). This behaviour can be changed
|
||||||
|
* by passing the %GTK_ICON_LOOKUP_FORCE_SIZE flag when obtaining
|
||||||
|
* the #GtkIconInfo. If this flag has been specified, the pixbuf
|
||||||
|
* returned by this function will be scaled to the exact size.
|
||||||
|
*
|
||||||
|
* Return value: (transfer full): the rendered icon; this may be a newly
|
||||||
|
* created icon or a new reference to an internal icon, so you must
|
||||||
|
* not modify the icon. Use cairo_surface_destroy() to release your reference
|
||||||
|
* to the icon.
|
||||||
|
*
|
||||||
|
* Since: 3.10
|
||||||
|
**/
|
||||||
|
cairo_surface_t *
|
||||||
|
gtk_icon_info_load_surface (GtkIconInfo *icon_info,
|
||||||
|
GdkWindow *for_window,
|
||||||
|
GError **error)
|
||||||
|
{
|
||||||
|
GdkPixbuf *pixbuf;
|
||||||
|
cairo_surface_t *surface;
|
||||||
|
|
||||||
|
g_return_val_if_fail (icon_info != NULL, NULL);
|
||||||
|
g_return_val_if_fail (error == NULL || *error == NULL, NULL);
|
||||||
|
|
||||||
|
pixbuf = gtk_icon_info_load_icon (icon_info, error);
|
||||||
|
|
||||||
|
if (pixbuf == NULL)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
surface = gdk_cairo_surface_create_from_pixbuf (pixbuf, icon_info->desired_scale, for_window);
|
||||||
|
g_object_unref (pixbuf);
|
||||||
|
|
||||||
|
return surface;
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
load_icon_thread (GTask *task,
|
load_icon_thread (GTask *task,
|
||||||
gpointer source_object,
|
gpointer source_object,
|
||||||
|
|||||||
@ -210,6 +210,14 @@ GdkPixbuf * gtk_icon_theme_load_icon_for_scale (GtkIconTheme
|
|||||||
gint scale,
|
gint scale,
|
||||||
GtkIconLookupFlags flags,
|
GtkIconLookupFlags flags,
|
||||||
GError **error);
|
GError **error);
|
||||||
|
GDK_AVAILABLE_IN_3_10
|
||||||
|
cairo_surface_t * gtk_icon_theme_load_surface (GtkIconTheme *icon_theme,
|
||||||
|
const gchar *icon_name,
|
||||||
|
gint size,
|
||||||
|
gint scale,
|
||||||
|
GdkWindow *for_window,
|
||||||
|
GtkIconLookupFlags flags,
|
||||||
|
GError **error);
|
||||||
|
|
||||||
GDK_AVAILABLE_IN_ALL
|
GDK_AVAILABLE_IN_ALL
|
||||||
GtkIconInfo * gtk_icon_theme_lookup_by_gicon (GtkIconTheme *icon_theme,
|
GtkIconInfo * gtk_icon_theme_lookup_by_gicon (GtkIconTheme *icon_theme,
|
||||||
@ -261,6 +269,10 @@ GdkPixbuf * gtk_icon_info_get_builtin_pixbuf (GtkIconInfo *icon_info
|
|||||||
GDK_AVAILABLE_IN_ALL
|
GDK_AVAILABLE_IN_ALL
|
||||||
GdkPixbuf * gtk_icon_info_load_icon (GtkIconInfo *icon_info,
|
GdkPixbuf * gtk_icon_info_load_icon (GtkIconInfo *icon_info,
|
||||||
GError **error);
|
GError **error);
|
||||||
|
GDK_AVAILABLE_IN_3_10
|
||||||
|
cairo_surface_t * gtk_icon_info_load_surface (GtkIconInfo *icon_info,
|
||||||
|
GdkWindow *for_window,
|
||||||
|
GError **error);
|
||||||
GDK_AVAILABLE_IN_3_8
|
GDK_AVAILABLE_IN_3_8
|
||||||
void gtk_icon_info_load_icon_async (GtkIconInfo *icon_info,
|
void gtk_icon_info_load_icon_async (GtkIconInfo *icon_info,
|
||||||
GCancellable *cancellable,
|
GCancellable *cancellable,
|
||||||
|
|||||||
Reference in New Issue
Block a user