Ticket #841: gtk_images_cache.patch

File gtk_images_cache.patch, 3.9 KB (added by woglinde, 10 years ago)
  • navit/graphics/gtk_drawing_area/graphics_gtk_drawing_area.c

     
    1919
    2020#define GDK_ENABLE_BROKEN
    2121#include "config.h"
    22 #include <gtk/gtk.h>
    23 #include <gdk/gdkkeysyms.h>
    2422#include <stdlib.h>
    2523#include <signal.h>
    2624#include <sys/time.h>
     25#include <gtk/gtk.h>
     26#include <gdk/gdkkeysyms.h>
    2727#if !defined(GDK_Book) || !defined(GDK_Calendar)
    2828#include <X11/XF86keysym.h>
    2929#endif
     
    110110static struct graphics_image_priv image_error;
    111111
    112112static void
    113 graphics_destroy_image(gpointer key, gpointer value, gpointer data)
     113graphics_destroy_image(gpointer data)
    114114{
    115         g_object_unref(((struct graphics_image_priv*)(value))->pixbuf);
     115        struct graphics_image_priv *priv = (struct graphics_image_priv*)data;
     116
     117        if (priv == &image_error)
     118                return;
     119
     120        if (priv->pixbuf)
     121                g_object_unref(priv->pixbuf);
     122        g_free(priv);
    116123}
    117124
    118125static void
    119126graphics_destroy(struct graphics_priv *gr)
    120127{
    121         g_hash_table_foreach(hImageData, graphics_destroy_image, NULL);
    122128        g_hash_table_destroy(hImageData);
    123129}
    124130
     
    210216        char* hash_key = g_strdup_printf("%s_%d_%d_%d",name,*w,*h,rotation);
    211217
    212218        //check if image already exists in hashmap
    213         struct graphics_image_priv*curr_elem = g_hash_table_lookup(hImageData,hash_key);
     219        struct graphics_image_priv *curr_elem = g_hash_table_lookup(hImageData, hash_key);
    214220        if(curr_elem == &image_error) {
    215221                //found but couldn't be loaded
    216222                g_free(hash_key);
    217223                return NULL;
    218224        }
    219225        else if(curr_elem) {
    220                 //found and OK -> use hastable entry
     226                //found and OK -> use hashtable entry
    221227                *w = curr_elem->w;
    222228                *h = curr_elem->h;
    223229                hot->x = curr_elem->w / 2 - 1;
     
    233239                        pixbuf=gdk_pixbuf_new_from_file(name, NULL);
    234240                else
    235241                        pixbuf=gdk_pixbuf_new_from_file_at_size(name, *w, *h, NULL);
    236                 if (! pixbuf) {
    237                         g_hash_table_insert(hImageData,g_strdup(hash_key),&image_error);
     242
     243                if (!pixbuf) {
     244                        g_hash_table_insert(hImageData, g_strdup(hash_key), &image_error);
    238245                        g_free(hash_key);
    239246                        return NULL;
    240247                }
     248
    241249                if (rotation) {
    242250                        GdkPixbuf *tmp;
    243251                        switch (rotation) {
     
    250258                                        rotation=90;
    251259                                        break;
    252260                                default:
    253                                         g_hash_table_insert(hImageData,g_strdup(hash_key),&image_error);
     261                                        g_hash_table_insert(hImageData, g_strdup(hash_key), &image_error);
    254262                                        g_free(hash_key);
    255263                                        return NULL;
    256264                        }
     265
    257266                        tmp=gdk_pixbuf_rotate_simple(pixbuf, rotation);
    258                         g_object_unref(pixbuf);
    259                         if (! tmp) {
    260                                 g_hash_table_insert(hImageData,g_strdup(hash_key),&image_error);
     267
     268                        if (!tmp) {
     269                                g_hash_table_insert(hImageData, g_strdup(hash_key), &image_error);
    261270                                g_free(hash_key);
     271                                g_object_unref(pixbuf);
    262272                                return NULL;
    263273                        }
     274
     275                        g_object_unref(pixbuf);
    264276                        pixbuf=tmp;
    265277                }
     278
    266279                ret=g_new0(struct graphics_image_priv, 1);
    267280                ret->pixbuf=pixbuf;
    268281                ret->w=gdk_pixbuf_get_width(pixbuf);
     
    283296                }
    284297                struct graphics_image_priv *cached = g_new0(struct graphics_image_priv, 1);
    285298                *cached = *ret;
    286                 g_hash_table_insert(hImageData,g_strdup(hash_key),cached);
     299                g_hash_table_insert(hImageData, g_strdup(hash_key), cached);
    287300                g_object_ref(pixbuf);
    288301                g_free(hash_key);
    289302                return ret;
     
    293306static void
    294307image_free(struct graphics_priv *gr, struct graphics_image_priv *priv)
    295308{
     309        g_object_unref(priv->pixbuf);
    296310        g_free(priv);
    297311}
    298312
     
    11401154#endif
    11411155        draw_restore,
    11421156        draw_drag,
    1143         NULL,
     1157        NULL, /* font_new */
    11441158        gc_new,
    11451159        background_gc,
    11461160        overlay_new,
    11471161        image_new,
    11481162        get_data,
    11491163        image_free,
    1150         NULL,
     1164        NULL, /* get_text_bbox */
    11511165        overlay_disable,
    11521166        overlay_resize,
    11531167        set_attr,
     
    12141228        }
    12151229
    12161230        //create hash table for uncompressed image data
    1217         hImageData = g_hash_table_new(g_str_hash, g_str_equal);
     1231        hImageData = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, graphics_destroy_image);
    12181232
    12191233        return this;
    12201234}