mirror of
https://gitlab.gnome.org/GNOME/gtk.git
synced 2024-12-27 22:20:24 +00:00
3fc42d7ab9
2005-03-15 Anders Carlsson <andersca@imendio.com> * docs/iconcache.txt: Update spec. * gtk/gtkiconcache.c: (find_image_offset), (_gtk_icon_cache_get_icon_flags), (_gtk_icon_cache_add_icons), (_gtk_icon_cache_get_icon), (_gtk_icon_cache_get_icon_data): * gtk/gtkiconcache.h: Update to be able to fetch pixbuf data and icon metadata. * gtk/gtkicontheme.c: (theme_lookup_icon), (gtk_icon_info_free), (icon_info_ensure_scale_and_pixbuf): Use new cache functions. * gtk/updateiconcache.c: (foreach_remove_func), (load_icon_data), (maybe_cache_image_data), (scan_directory), (write_pixdata), (get_image_meta_data_size), (get_image_pixel_data_size), (get_image_data_size), (get_single_node_size), (get_bucket_size), (write_bucket), (main): Update to write pixbuf data as well as information from .icon files.
164 lines
4.2 KiB
Plaintext
164 lines
4.2 KiB
Plaintext
Information about the icon theme cache format used by GTK+
|
|
for more information, see the mailing list threads at
|
|
|
|
http://mail.gnome.org/archives/gtk-devel-list/2004-April/msg00065.html
|
|
http://lists.freedesktop.org/archives/xdg/2004-October/005140.html
|
|
|
|
|
|
Back in May, Owen Taylor proposed [1] caching scheme for icon theme
|
|
information, to reduce the amount of stating and disk seeking at
|
|
application startup, and to reduce the memory overhead if each app
|
|
allocates all the icon theme data separately.
|
|
|
|
The proposal is to keep the information about the icons in the
|
|
directory tree below each icon theme directory in an mmap()able
|
|
cache file (There is basically one cache file per index.theme file).
|
|
|
|
The cache doesn't try to hold all information from the index.theme files
|
|
that you would need to do lookups; it turns out that with the icon theme
|
|
specification, this isn't even sensible - you can install a
|
|
|
|
$HOME/.local/share/icons/Bluecurve/index.theme
|
|
|
|
That overrides
|
|
|
|
/usr/share/icons/Bluecurve/index.theme
|
|
|
|
and chances how lookup happens for icons in /usr/share/icons/Bluecurve.
|
|
|
|
We would like to propose the cache file format as an appendix to the
|
|
icon theme specification. One thing which still needs to be investigated
|
|
is caching of the actual image data; the file format is has an
|
|
IMAGE_DATA_OFFSET member to allow adding that compatibly. An
|
|
implementation of the caching scheme for GTK+ can be found at [2]. The
|
|
cache generator which is included in the patch depends only on glib, and
|
|
it may be a good idea to move it to freedesktop.org as well.
|
|
|
|
|
|
Regards, Matthias Clasen
|
|
|
|
|
|
The cache file format:
|
|
|
|
Header:
|
|
2 CARD16 MAJOR_VERSION 1
|
|
2 CARD16 MINOR_VERSION 0
|
|
4 CARD32 HASH_OFFSET
|
|
4 CARD32 DIRECTORY_LIST_OFFSET
|
|
|
|
DirectoryList:
|
|
4 CARD32 N_DIRECTORIES
|
|
4*N_DIRECTORIES CARD32 DIRECTORY_OFFSET
|
|
|
|
Hash:
|
|
4 CARD32 N_BUCKETS
|
|
4*N_BUCKETS CARD32 ICON_OFFSET
|
|
|
|
Icon:
|
|
4 CARD32 CHAIN_OFFSET
|
|
4 CARD32 NAME_OFFSET
|
|
4 CARD32 IMAGE_LIST_OFFSET
|
|
|
|
ImageList:
|
|
4 CARD32 N_IMAGES
|
|
8*N_IMAGES Image IMAGES
|
|
|
|
Image:
|
|
2 CARD16 DIRECTORY_INDEX
|
|
2 ICON_FLAGS FLAGS
|
|
4 CARD32 IMAGE_DATA_OFFSET
|
|
|
|
ICON_FLAGS
|
|
HAS_SUFFIX_PNG 1
|
|
HAS_SUFFIX_XPM 2
|
|
HAS_SUFFIX_SVG 4
|
|
HAS_ICON_FILE 8
|
|
|
|
ImageData:
|
|
4 CARD32 IMAGE_PIXEL_DATA_OFFSET
|
|
4 CARD32 IMAGE_META_DATA_OFFSET
|
|
|
|
4 CARD32 IMAGE_PIXEL_DATA_TYPE
|
|
4 CARD32 IMAGE_PIXEL_DATA_LENGTH
|
|
N/A N/A PIXEL_DATA
|
|
|
|
IMAGE_PIXEL_DATA_TYPE
|
|
0 GdkPixdata format
|
|
|
|
MetaData:
|
|
4 CARD32 EMBEDDED_RECT_OFFSET
|
|
4 CARD32 ATTACH_POINT_LIST_OFFSET
|
|
4 CARD32 DISPLAY_NAME_LIST_OFFSET
|
|
|
|
EmbeddedRect:
|
|
2 CARD16 X0
|
|
2 CARD16 Y0
|
|
2 CARD16 X1
|
|
2 CARD16 Y1
|
|
|
|
AttachPointList:
|
|
4 CARD32 N_ATTACH_POINTS
|
|
4*N_ATTACH_POINTS AttachPoint
|
|
|
|
AttachPoint:
|
|
2 CARD16 X
|
|
2 CARD16 Y
|
|
|
|
DisplayNameList:
|
|
4 CARD32 N_DISPLAY_NAMES
|
|
4*N_DISPLAY_NAMES DisplayName
|
|
|
|
DisplayName:
|
|
4 CARD32 DISPLAY_LANG_OFFSET
|
|
4 CARD32 DISPLAY_NAME_OFFSET
|
|
|
|
|
|
Notes:
|
|
|
|
* All offsets are from in bytes from the beginning of the file
|
|
|
|
* Strings are zero-terminated
|
|
|
|
* Directories are stored as relative paths.
|
|
|
|
* All numbers are in network (big-endian) order. This is
|
|
necessary because the data will be stored in arch-independent
|
|
directories like /usr/share/icons or even in user's
|
|
home directories.
|
|
|
|
* The hash function is that used by g_str_hash()
|
|
|
|
unsigned int
|
|
icon_str_hash (gconstpointer key)
|
|
{
|
|
const char *p = key;
|
|
unsigned int h = *p;
|
|
|
|
if (h)
|
|
for (p += 1; *p != '\0'; p++)
|
|
h = (h << 5) - h + *p;
|
|
|
|
return h;
|
|
}
|
|
|
|
This should not be implemented by calling g_str_hash(). For
|
|
optimal results, N_BUCKETS should be typically be prime.
|
|
|
|
* The same file format is used for icon themes (e.g.,
|
|
/usr/share/icons/Bluecurve) and for unthemed icon directories
|
|
(e.g., /usr/share/pixmaps)
|
|
|
|
For an unthemed directory, N_DIRECTORIES==0 and each
|
|
image has a DIRECTORY_INDEX field of 0xFFFF.
|
|
|
|
* Up-to-dateness of a cache file is determined simply:
|
|
|
|
If the mod-time on the directory where the cache file
|
|
lives is newer than the mod-time of the cache file,
|
|
the cache file is out of date.
|
|
|
|
* Cache files have to be written atomically - write to a
|
|
temporary name, then move over the old file - so that
|
|
clients that have the old cache file open and mmap'ed
|
|
won't get corrupt data.
|