summaryrefslogtreecommitdiffstats
path: root/libass/ass_cache.h
diff options
context:
space:
mode:
authorgreg <greg@blackbox>2009-06-18 14:09:35 +0200
committergreg <greg@blackbox>2009-06-19 05:17:22 +0200
commit2f59cd0e21b3f4a953b67525fa56b133d4d6b352 (patch)
tree14d1c2ebf7cb0aa2f147f13472d4536c3c34c908 /libass/ass_cache.h
parent3dcfa5a61e58068b38fb97477e8935550ca8c683 (diff)
downloadlibass-2f59cd0e21b3f4a953b67525fa56b133d4d6b352.tar.bz2
libass-2f59cd0e21b3f4a953b67525fa56b133d4d6b352.tar.xz
Remove cache globals; move cache data into a separate cache_store struct
that is part of ass_renderer.
Diffstat (limited to 'libass/ass_cache.h')
-rw-r--r--libass/ass_cache.h81
1 files changed, 50 insertions, 31 deletions
diff --git a/libass/ass_cache.h b/libass/ass_cache.h
index f227303..55c543e 100644
--- a/libass/ass_cache.h
+++ b/libass/ass_cache.h
@@ -27,10 +27,41 @@
#include "ass_font.h"
#include "ass_bitmap.h"
-void ass_font_cache_init(void);
-ass_font_t* ass_font_cache_find(ass_font_desc_t* desc);
-void* ass_font_cache_add(ass_font_t* font);
-void ass_font_cache_done(void);
+typedef void (*hashmap_item_dtor_t)(void* key, size_t key_size, void* value, size_t value_size);
+typedef int (*hashmap_key_compare_t)(void* key1, void* key2, size_t key_size);
+typedef unsigned (*hashmap_hash_t)(void* key, size_t key_size);
+
+typedef struct hashmap_item_s {
+ void* key;
+ void* value;
+ struct hashmap_item_s* next;
+} hashmap_item_t;
+typedef hashmap_item_t* hashmap_item_p;
+
+typedef struct hashmap_s {
+ int nbuckets;
+ size_t key_size, value_size;
+ hashmap_item_p* root;
+ hashmap_item_dtor_t item_dtor; // a destructor for hashmap key/value pairs
+ hashmap_key_compare_t key_compare;
+ hashmap_hash_t hash;
+ // stats
+ int hit_count;
+ int miss_count;
+ int count;
+} hashmap_t;
+
+hashmap_t* hashmap_init(size_t key_size, size_t value_size, int nbuckets,
+ hashmap_item_dtor_t item_dtor, hashmap_key_compare_t key_compare,
+ hashmap_hash_t hash);
+void hashmap_done(hashmap_t* map);
+void* hashmap_insert(hashmap_t* map, void* key, void* value);
+void* hashmap_find(hashmap_t* map, void* key);
+
+hashmap_t* ass_font_cache_init(void);
+ass_font_t* ass_font_cache_find(hashmap_t*, ass_font_desc_t* desc);
+void* ass_font_cache_add(hashmap_t*, ass_font_t* font);
+void ass_font_cache_done(hashmap_t*);
// Create definitions for bitmap_hash_key and glyph_hash_key
#define CREATE_STRUCT_DEFINITIONS
@@ -42,11 +73,11 @@ typedef struct bitmap_hash_val_s {
bitmap_t* bm_s;
} bitmap_hash_val_t;
-void ass_bitmap_cache_init(void);
-void* cache_add_bitmap(bitmap_hash_key_t* key, bitmap_hash_val_t* val);
-bitmap_hash_val_t* cache_find_bitmap(bitmap_hash_key_t* key);
-void ass_bitmap_cache_reset(void);
-void ass_bitmap_cache_done(void);
+hashmap_t* ass_bitmap_cache_init(void);
+void* cache_add_bitmap(hashmap_t*, bitmap_hash_key_t* key, bitmap_hash_val_t* val);
+bitmap_hash_val_t* cache_find_bitmap(hashmap_t* bitmap_cache, bitmap_hash_key_t* key);
+hashmap_t* ass_bitmap_cache_reset(hashmap_t* bitmap_cache);
+void ass_bitmap_cache_done(hashmap_t* bitmap_cache);
// Cache for composited bitmaps
@@ -62,11 +93,11 @@ typedef struct composite_hash_val_s {
unsigned char* b;
} composite_hash_val_t;
-void ass_composite_cache_init(void);
-void* cache_add_composite(composite_hash_key_t* key, composite_hash_val_t* val);
-composite_hash_val_t* cache_find_composite(composite_hash_key_t* key);
-void ass_composite_cache_reset(void);
-void ass_composite_cache_done(void);
+hashmap_t* ass_composite_cache_init(void);
+void* cache_add_composite(hashmap_t*, composite_hash_key_t* key, composite_hash_val_t* val);
+composite_hash_val_t* cache_find_composite(hashmap_t* composite_cache, composite_hash_key_t* key);
+hashmap_t* ass_composite_cache_reset(hashmap_t* composite_cache);
+void ass_composite_cache_done(hashmap_t* composite_cache);
typedef struct glyph_hash_val_s {
@@ -76,22 +107,10 @@ typedef struct glyph_hash_val_s {
FT_Vector advance; // 26.6, advance distance to the next bitmap in line
} glyph_hash_val_t;
-void ass_glyph_cache_init(void);
-void* cache_add_glyph(glyph_hash_key_t* key, glyph_hash_val_t* val);
-glyph_hash_val_t* cache_find_glyph(glyph_hash_key_t* key);
-void ass_glyph_cache_reset(void);
-void ass_glyph_cache_done(void);
-
-typedef struct hashmap_s hashmap_t;
-typedef void (*hashmap_item_dtor_t)(void* key, size_t key_size, void* value, size_t value_size);
-typedef int (*hashmap_key_compare_t)(void* key1, void* key2, size_t key_size);
-typedef unsigned (*hashmap_hash_t)(void* key, size_t key_size);
-
-hashmap_t* hashmap_init(size_t key_size, size_t value_size, int nbuckets,
- hashmap_item_dtor_t item_dtor, hashmap_key_compare_t key_compare,
- hashmap_hash_t hash);
-void hashmap_done(hashmap_t* map);
-void* hashmap_insert(hashmap_t* map, void* key, void* value);
-void* hashmap_find(hashmap_t* map, void* key);
+hashmap_t* ass_glyph_cache_init(void);
+void* cache_add_glyph(hashmap_t*, glyph_hash_key_t* key, glyph_hash_val_t* val);
+glyph_hash_val_t* cache_find_glyph(hashmap_t* glyph_cache, glyph_hash_key_t* key);
+hashmap_t* ass_glyph_cache_reset(hashmap_t* glyph_cache);
+void ass_glyph_cache_done(hashmap_t* glyph_cache);
#endif /* LIBASS_CACHE_H */