📄 pangox-fontcache.c
字号:
/* Pango * pango-fontcache.c: Cache of XFontStructs by XLFD * * Copyright (C) 2000 Red Hat Software * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */#include <config.h>#include "pangox.h"/* Font cache *//* Number of fonts to retain after they are not otherwise referenced. */#define CACHE_SIZE 16typedef struct _CacheEntry CacheEntry;struct _PangoXFontCache{ Display *display; GHashTable *forward; GHashTable *back; GList *mru; GList *mru_tail; int mru_count;};struct _CacheEntry{ char *xlfd; XFontStruct *fs; gint ref_count; GList *mru;};static voidfree_cache_entry (char *xlfd, CacheEntry *entry, PangoXFontCache *cache){ g_free (entry->xlfd); XFreeFont (cache->display, entry->fs); g_free (entry);}/** * pango_x_font_cache_free: * @cache: a #PangoXFontCache * * Frees a #PangoXFontCache and all associated memory. All fonts loaded * through this font cache will be freed along with the cache. **/voidpango_x_font_cache_free (PangoXFontCache *cache){ g_return_if_fail (cache != NULL); g_hash_table_foreach (cache->forward, (GHFunc)free_cache_entry, cache); g_hash_table_destroy (cache->forward); g_hash_table_destroy (cache->back); g_list_free (cache->mru);}/** * pango_x_font_cache_new: * @display: an X display. * * Creates a font cache for the specified display. * * Return value: The newly allocated #PangoXFontCache, which should be * freed with pango_x_font_cache_free(). **/PangoXFontCache *pango_x_font_cache_new (Display *display){ PangoXFontCache *cache; g_return_val_if_fail (display != NULL, NULL); cache = g_new (PangoXFontCache, 1); cache->display = display; cache->forward = g_hash_table_new (g_str_hash, g_str_equal); cache->back = g_hash_table_new (g_direct_hash, g_direct_equal); cache->mru = NULL; cache->mru_tail = NULL; cache->mru_count = 0; return cache;}static voidcache_entry_unref (PangoXFontCache *cache, CacheEntry *entry){ entry->ref_count--; if (entry->ref_count == 0) { g_hash_table_remove (cache->forward, entry->xlfd); g_hash_table_remove (cache->back, entry->fs); free_cache_entry (NULL, entry, cache); }}/** * pango_x_font_cache_load: * @cache: a #PangoXFontCache * @xlfd: the X Logical Font Description to load. * * Loads a #XFontStruct from a X Logical Font Description. The * result may be newly loaded, or it may have been previously * stored. * * Return value: The font structure, or %NULL if the font could * not be loaded. In order to free this structure, you must call * pango_x_font_cache_unload(). **/XFontStruct *pango_x_font_cache_load (PangoXFontCache *cache, const char *xlfd){ CacheEntry *entry; g_return_val_if_fail (cache != NULL, NULL); g_return_val_if_fail (xlfd != NULL, NULL); entry = g_hash_table_lookup (cache->forward, xlfd); if (entry) { entry->ref_count++; } else { XFontStruct *fs = XLoadQueryFont (cache->display, xlfd); if (!fs) return NULL; entry = g_new (CacheEntry, 1); entry->xlfd = g_strdup (xlfd); entry->fs = fs; entry->ref_count = 1; entry->mru = NULL; g_hash_table_insert (cache->forward, entry->xlfd, entry); g_hash_table_insert (cache->back, entry->fs, entry); } if (entry->mru) { if (cache->mru_count > 1 && entry->mru->prev) { /* Move to the head of the mru list */ if (entry->mru == cache->mru_tail) { cache->mru_tail = cache->mru_tail->prev; cache->mru_tail->next = NULL; } else { entry->mru->prev->next = entry->mru->next; entry->mru->next->prev = entry->mru->prev; } entry->mru->next = cache->mru; entry->mru->prev = NULL; cache->mru->prev = entry->mru; cache->mru = entry->mru; } } else { entry->ref_count++; /* Insert into the mru list */ if (cache->mru_count == CACHE_SIZE) { CacheEntry *old_entry = cache->mru_tail->data; cache->mru_tail = cache->mru_tail->prev; cache->mru_tail->next = NULL; g_list_free_1 (old_entry->mru); old_entry->mru = NULL; cache_entry_unref (cache, old_entry); } else cache->mru_count++; cache->mru = g_list_prepend (cache->mru, entry); if (!cache->mru_tail) cache->mru_tail = cache->mru; entry->mru = cache->mru; } return entry->fs;}/** * pango_x_font_cache_unload: * @cache: a #PangoXFontCache * @fs: the font structure to unload * * Frees a font structure previously loaded with pango_x_font_cache_load(). **/voidpango_x_font_cache_unload (PangoXFontCache *cache, XFontStruct *fs){ CacheEntry *entry; g_return_if_fail (cache != NULL); g_return_if_fail (fs != NULL); entry = g_hash_table_lookup (cache->back, fs); g_return_if_fail (entry != NULL); cache_entry_unref (cache, entry);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -