GdkPixbuf * _gtk_icon_cache_get_icon (GtkIconCache *cache, const gchar *icon_name, gint directory_index) { guint32 offset, image_data_offset, pixel_data_offset; guint32 length, type; GdkPixbuf *pixbuf; GdkPixdata pixdata; GError *error = NULL; offset = find_image_offset (cache, icon_name, directory_index); image_data_offset = GET_UINT32 (cache->buffer, offset + 4); if (!image_data_offset) return NULL; pixel_data_offset = GET_UINT32 (cache->buffer, image_data_offset); type = GET_UINT32 (cache->buffer, pixel_data_offset); if (type != 0) { GTK_NOTE (ICONTHEME, g_print ("invalid pixel data type %u\n", type)); return NULL; } length = GET_UINT32 (cache->buffer, pixel_data_offset + 4); if (!gdk_pixdata_deserialize (&pixdata, length, (guchar *)(cache->buffer + pixel_data_offset + 8), &error)) { GTK_NOTE (ICONTHEME, g_print ("could not deserialize data: %s\n", error->message)); g_error_free (error); return NULL; } pixbuf = gdk_pixbuf_new_from_data (pixdata.pixel_data, GDK_COLORSPACE_RGB, (pixdata.pixdata_type & GDK_PIXDATA_COLOR_TYPE_MASK) == GDK_PIXDATA_COLOR_TYPE_RGBA, 8, pixdata.width, pixdata.height, pixdata.rowstride, (GdkPixbufDestroyNotify)pixbuf_destroy_cb, cache); if (!pixbuf) { GTK_NOTE (ICONTHEME, g_print ("could not convert pixdata to pixbuf: %s\n", error->message)); g_error_free (error); return NULL; } _gtk_icon_cache_ref (cache); return pixbuf; }
gint gtk_icon_cache_get_icon_flags (GtkIconCache *cache, const gchar *icon_name, gint directory_index) { guint32 image_offset; image_offset = find_image_offset (cache, icon_name, directory_index); if (!image_offset) return 0; return GET_UINT16 (cache->buffer, image_offset + 2); }
GtkIconData * _gtk_icon_cache_get_icon_data (GtkIconCache *cache, const gchar *icon_name, gint directory_index) { guint32 offset, image_data_offset, meta_data_offset; GtkIconData *data; int i; offset = find_image_offset (cache, icon_name, directory_index); if (!offset) return NULL; image_data_offset = GET_UINT32 (cache->buffer, offset + 4); if (!image_data_offset) return NULL; meta_data_offset = GET_UINT32 (cache->buffer, image_data_offset + 4); if (!meta_data_offset) return NULL; data = g_slice_new0 (GtkIconData); data->ref = 1; offset = GET_UINT32 (cache->buffer, meta_data_offset); if (offset) { data->has_embedded_rect = TRUE; data->x0 = GET_UINT16 (cache->buffer, offset); data->y0 = GET_UINT16 (cache->buffer, offset + 2); data->x1 = GET_UINT16 (cache->buffer, offset + 4); data->y1 = GET_UINT16 (cache->buffer, offset + 6); } offset = GET_UINT32 (cache->buffer, meta_data_offset + 4); if (offset) { data->n_attach_points = GET_UINT32 (cache->buffer, offset); data->attach_points = g_new (GdkPoint, data->n_attach_points); for (i = 0; i < data->n_attach_points; i++) { data->attach_points[i].x = GET_UINT16 (cache->buffer, offset + 4 + 4 * i); data->attach_points[i].y = GET_UINT16 (cache->buffer, offset + 4 + 4 * i + 2); } } offset = GET_UINT32 (cache->buffer, meta_data_offset + 8); if (offset) { gint n_names; gchar *lang, *name; gchar **langs; GHashTable *table = g_hash_table_new (g_str_hash, g_str_equal); n_names = GET_UINT32 (cache->buffer, offset); for (i = 0; i < n_names; i++) { lang = cache->buffer + GET_UINT32 (cache->buffer, offset + 4 + 8 * i); name = cache->buffer + GET_UINT32 (cache->buffer, offset + 4 + 8 * i + 4); g_hash_table_insert (table, lang, name); } langs = (gchar **)g_get_language_names (); for (i = 0; langs[i]; i++) { name = g_hash_table_lookup (table, langs[i]); if (name) { data->display_name = g_strdup (name); break; } } g_hash_table_destroy (table); } return data; }