gboolean gtk_icon_cache_has_icon_in_directory (GtkIconCache *cache, const gchar *icon_name, const gchar *directory) { guint32 hash_offset; guint32 n_buckets; guint32 chain_offset; gint hash; gboolean found_icon = FALSE; gint directory_index; directory_index = get_directory_index (cache, directory); if (directory_index == -1) return FALSE; hash_offset = GET_UINT32 (cache->buffer, 4); n_buckets = GET_UINT32 (cache->buffer, hash_offset); hash = icon_name_hash (icon_name) % n_buckets; chain_offset = GET_UINT32 (cache->buffer, hash_offset + 4 + 4 * hash); while (chain_offset != 0xffffffff) { guint32 name_offset = GET_UINT32 (cache->buffer, chain_offset + 4); gchar *name = cache->buffer + name_offset; if (strcmp (name, icon_name) == 0) { found_icon = TRUE; break; } chain_offset = GET_UINT32 (cache->buffer, chain_offset); } if (found_icon) { guint32 image_list_offset = GET_UINT32 (cache->buffer, chain_offset + 8); guint32 n_images = GET_UINT32 (cache->buffer, image_list_offset); guint32 image_offset = image_list_offset + 4; gint i; for (i = 0; i < n_images; i++) { guint16 index = GET_UINT16 (cache->buffer, image_offset); if (index == directory_index) return TRUE; image_offset += 8; } } return FALSE; }
static gint find_image_offset (GtkIconCache *cache, const gchar *icon_name, const gchar *directory) { guint32 hash_offset; guint32 n_buckets; guint32 chain_offset; int hash, directory_index; guint32 image_list_offset, n_images; gboolean found = FALSE; int i; hash_offset = GET_UINT32 (cache->buffer, 4); n_buckets = GET_UINT32 (cache->buffer, hash_offset); hash = icon_name_hash (icon_name) % n_buckets; chain_offset = GET_UINT32 (cache->buffer, hash_offset + 4 + 4 * hash); while (chain_offset != 0xffffffff) { guint32 name_offset = GET_UINT32 (cache->buffer, chain_offset + 4); gchar *name = cache->buffer + name_offset; if (strcmp (name, icon_name) == 0) { found = TRUE; break; } chain_offset = GET_UINT32 (cache->buffer, chain_offset); } if (!found) { return 0; } /* We've found an icon list, now check if we have the right icon in it */ directory_index = get_directory_index (cache, directory); image_list_offset = GET_UINT32 (cache->buffer, chain_offset + 8); n_images = GET_UINT32 (cache->buffer, image_list_offset); for (i = 0; i < n_images; i++) { if (GET_UINT16 (cache->buffer, image_list_offset + 4 + 8 * i) == directory_index) return image_list_offset + 4 + 8 * i; } return 0; }
void gtk_icon_cache_add_icons (GtkIconCache *cache, const gchar *directory, GHashTable *hash_table) { int directory_index; guint32 hash_offset, n_buckets; guint32 chain_offset; guint32 image_list_offset, n_images; int i, j; directory_index = get_directory_index (cache, directory); if (directory_index == -1) return; hash_offset = GET_UINT32 (cache->buffer, 4); n_buckets = GET_UINT32 (cache->buffer, hash_offset); for (i = 0; i < n_buckets; i++) { chain_offset = GET_UINT32 (cache->buffer, hash_offset + 4 + 4 * i); while (chain_offset != 0xffffffff) { guint32 name_offset = GET_UINT32 (cache->buffer, chain_offset + 4); gchar *name = cache->buffer + name_offset; image_list_offset = GET_UINT32 (cache->buffer, chain_offset + 8); n_images = GET_UINT32 (cache->buffer, image_list_offset); for (j = 0; j < n_images; j++) { if (GET_UINT16 (cache->buffer, image_list_offset + 4 + 8 * j) == directory_index) g_hash_table_insert (hash_table, name, NULL); } chain_offset = GET_UINT32 (cache->buffer, chain_offset); } } }
gboolean gtk_icon_cache_has_icons (GtkIconCache *cache, const gchar *directory) { int directory_index; guint32 hash_offset, n_buckets; guint32 chain_offset; guint32 image_list_offset, n_images; int i, j; directory_index = get_directory_index (cache, directory); if (directory_index == -1) return FALSE; hash_offset = GET_UINT32 (cache->buffer, 4); n_buckets = GET_UINT32 (cache->buffer, hash_offset); for (i = 0; i < n_buckets; i++) { chain_offset = GET_UINT32 (cache->buffer, hash_offset + 4 + 4 * i); while (chain_offset != 0xffffffff) { image_list_offset = GET_UINT32 (cache->buffer, chain_offset + 8); n_images = GET_UINT32 (cache->buffer, image_list_offset); for (j = 0; j < n_images; j++) { if (GET_UINT16 (cache->buffer, image_list_offset + 4 + 8 * j) == directory_index) return TRUE; } chain_offset = GET_UINT32 (cache->buffer, chain_offset); } } return FALSE; }
gint gtk_icon_cache_get_directory_index (GtkIconCache *cache, const gchar *directory) { return get_directory_index (cache, directory); }
gboolean _gtk_icon_cache_has_directory (GtkIconCache *cache, const gchar *directory) { return get_directory_index (cache, directory) != -1; }