/* OpenIDA - Outil d'analyse de fichiers binaires * gfontcache.c - mise en cache avec actualisation des polices * * Copyright (C) 2012 Cyrille Bagard * * This file is part of OpenIDA. * * OpenIDA is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * OpenIDA 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Foobar. If not, see . */ #include "gfontcache.h" /* ----------------------- MISE EN PLACE D'UN CONTEXTE GLOBAL ----------------------- */ /* Utilisable par toutes les impressions. */ static PangoContext *_context = NULL; /* ---------------------------- CACHE DE POLICES PAR VUE ---------------------------- */ /* Description d'un cache pour polices (instance) */ struct _GFontCache { GObject parent; /* A laisser en premier */ GHashTable *table; /* Associations desc./police */ GtkWidget *widget; }; /* Description d'un cache pour polices (classe) */ struct _GFontCacheClass { GObjectClass parent; /* A laisser en premier */ }; /* Initialise la classe des caches pour polices. */ static void g_font_cache_class_init(GFontCacheClass *); /* Initialise un cache pour polices. */ static void g_font_cache_init(GFontCache *); /* Supprime toutes les références externes. */ static void g_font_cache_dispose(GFontCache *); /* Procède à la libération totale de la mémoire. */ static void g_font_cache_finalize(GFontCache *); /* ---------------------------------------------------------------------------------- */ /* MISE EN PLACE D'UN CONTEXTE GLOBAL */ /* ---------------------------------------------------------------------------------- */ /****************************************************************************** * * * Paramètres : - * * * * Description : Initialise le contexte Pango pour la gestion des textes. * * * * Retour : - * * * * Remarques : - * * * ******************************************************************************/ void init_global_pango_context(void) { PangoFontDescription *desc; /* Police de caractères */ _context = gdk_pango_context_get(); desc = pango_font_description_from_string("mono 10"); pango_context_set_font_description(_context, desc); pango_font_description_free(desc); pango_context_set_base_dir(_context, PANGO_DIRECTION_LTR); pango_context_set_language(_context, gtk_get_default_language()); } /****************************************************************************** * * * Paramètres : - * * * * Description : Fournit le contexte Pango global pour l'impression. * * * * Retour : Contexte prêt à emploi. * * * * Remarques : - * * * ******************************************************************************/ PangoContext *get_global_pango_context(void) { return _context; } /****************************************************************************** * * * Paramètres : - * * * * Description : Supprime le contexte Pango pour la gestion des textes. * * * * Retour : - * * * * Remarques : - * * * ******************************************************************************/ void exit_global_pango_context(void) { g_object_unref(G_OBJECT(_context)); } /* ---------------------------------------------------------------------------------- */ /* CACHE DE POLICES PAR VUE */ /* ---------------------------------------------------------------------------------- */ /* Indique le type défini pour un cache pour polices. */ G_DEFINE_TYPE(GFontCache, g_font_cache, G_TYPE_OBJECT); /****************************************************************************** * * * Paramètres : class = classe à initialiser. * * * * Description : Initialise la classe des caches pour polices. * * * * Retour : - * * * * Remarques : - * * * ******************************************************************************/ static void g_font_cache_class_init(GFontCacheClass *class) { GObjectClass *object; /* Autre version de la classe */ object = G_OBJECT_CLASS(class); object->dispose = (GObjectFinalizeFunc/* ! */)g_font_cache_dispose; object->finalize = (GObjectFinalizeFunc)g_font_cache_finalize; } /****************************************************************************** * * * Paramètres : fcache = instance à initialiser. * * * * Description : Initialise un cache pour polices. * * * * Retour : - * * * * Remarques : - * * * ******************************************************************************/ static void g_font_cache_init(GFontCache *fcache) { fcache->table = g_hash_table_new_full((GHashFunc)pango_font_description_hash, (GEqualFunc)pango_font_description_equal, (GDestroyNotify)pango_font_description_free, (GDestroyNotify)g_object_unref); } /****************************************************************************** * * * Paramètres : fcache = instance d'objet GLib à traiter. * * * * Description : Supprime toutes les références externes. * * * * Retour : - * * * * Remarques : - * * * ******************************************************************************/ static void g_font_cache_dispose(GFontCache *fcache) { g_hash_table_destroy(fcache->table); G_OBJECT_CLASS(g_font_cache_parent_class)->dispose(G_OBJECT(fcache)); } /****************************************************************************** * * * Paramètres : fcache = instance d'objet GLib à traiter. * * * * Description : Procède à la libération totale de la mémoire. * * * * Retour : - * * * * Remarques : - * * * ******************************************************************************/ static void g_font_cache_finalize(GFontCache *fcache) { G_OBJECT_CLASS(g_font_cache_parent_class)->finalize(G_OBJECT(fcache)); } /****************************************************************************** * * * Paramètres : - * * * * Description : Crée un bloc virtuel d'instructions. * * * * Retour : Adresse de la structure mise en place. * * * * Remarques : - * * * ******************************************************************************/ GFontCache *g_font_cache_new(void) { GFontCache *result; /* Structure à retourner */ result = g_object_new(G_TYPE_FONT_CACHE, NULL); return result; } /****************************************************************************** * * * Paramètres : fcache = instance à consulter, voire compléter. * * desc = description de la police recherchée. * * * * Description : Fournit une police utilisable répondant au besoin. * * * * Retour : Police prête à usage. * * * * Remarques : - * * * ******************************************************************************/ PangoFont *g_font_cache_lookup(GFontCache *fcache, const PangoFontDescription *desc) { PangoFont *result; /* Instance à retourner */ PangoFontDescription *key; /* Copie de la description */ result = (PangoFont *)g_hash_table_lookup(fcache->table, desc); if (result == NULL) { result = pango_context_load_font(get_global_pango_context(), desc); key = pango_font_description_copy(desc); g_hash_table_insert(fcache->table, key, result); } return result; }