summaryrefslogtreecommitdiffstats
path: root/libass/ass_cache.c
diff options
context:
space:
mode:
Diffstat (limited to 'libass/ass_cache.c')
-rw-r--r--libass/ass_cache.c51
1 files changed, 40 insertions, 11 deletions
diff --git a/libass/ass_cache.c b/libass/ass_cache.c
index 062ddfa..2381e88 100644
--- a/libass/ass_cache.c
+++ b/libass/ass_cache.c
@@ -81,8 +81,6 @@ static void bitmap_destruct(void *key, void *value)
ass_free_bitmap(v->bm);
if (v->bm_o)
ass_free_bitmap(v->bm_o);
- if (v->bm_s)
- ass_free_bitmap(v->bm_s);
if (k->type == BITMAP_CLIP)
free(k->u.clip.text);
free(key);
@@ -92,11 +90,12 @@ static void bitmap_destruct(void *key, void *value)
static size_t bitmap_size(void *value, size_t value_size)
{
BitmapHashValue *val = value;
+ size_t size = sizeof(BitmapHashKey) + sizeof(BitmapHashValue);
+ if (val->bm)
+ size += sizeof(Bitmap) + val->bm->stride * val->bm->h;
if (val->bm_o)
- return val->bm_o->w * val->bm_o->h * 3;
- else if (val->bm)
- return val->bm->w * val->bm->h * 3;
- return 0;
+ size += sizeof(Bitmap) + val->bm_o->stride * val->bm_o->h;
+ return size;
}
static unsigned bitmap_hash(void *key, size_t key_size)
@@ -132,7 +131,7 @@ static void composite_destruct(void *key, void *value)
ass_free_bitmap(v->bm_o);
if (v->bm_s)
ass_free_bitmap(v->bm_s);
- free(k->str.data);
+ free(k->bitmaps);
free(key);
free(value);
}
@@ -140,11 +139,41 @@ static void composite_destruct(void *key, void *value)
static size_t composite_size(void *value, size_t value_size)
{
CompositeHashValue *val = value;
+ size_t size = sizeof(CompositeHashKey) + sizeof(CompositeHashValue);
+ if (val->bm)
+ size += sizeof(Bitmap) + val->bm->stride * val->bm->h;
if (val->bm_o)
- return val->bm_o->w * val->bm_o->h * 3;
- else if (val->bm)
- return val->bm->w * val->bm->h * 3;
- return 0;
+ size += sizeof(Bitmap) + val->bm_o->stride * val->bm_o->h;
+ if (val->bm_s)
+ size += sizeof(Bitmap) + val->bm_s->stride * val->bm_s->h;
+ return size;
+}
+
+static unsigned composite_hash(void *key, size_t key_size)
+{
+ CompositeHashKey *k = key;
+ unsigned hval = filter_hash(&k->filter, key_size);
+ for (size_t i = 0; i < k->bitmap_count; ++i) {
+ hval = fnv_32a_buf(&k->bitmaps[i].image, sizeof(k->bitmaps[i].image), hval);
+ hval = fnv_32a_buf(&k->bitmaps[i].x, sizeof(k->bitmaps[i].x), hval);
+ hval = fnv_32a_buf(&k->bitmaps[i].y, sizeof(k->bitmaps[i].y), hval);
+ }
+ return hval;
+}
+
+static unsigned composite_compare(void *a, void *b, size_t key_size)
+{
+ CompositeHashKey *ak = a;
+ CompositeHashKey *bk = b;
+ if (ak->bitmap_count != bk->bitmap_count)
+ return 0;
+ for (size_t i = 0; i < ak->bitmap_count; ++i) {
+ if (ak->bitmaps[i].image != bk->bitmaps[i].image ||
+ ak->bitmaps[i].x != bk->bitmaps[i].x ||
+ ak->bitmaps[i].y != bk->bitmaps[i].y)
+ return 0;
+ }
+ return filter_compare(&ak->filter, &bk->filter, key_size);
}
// outline cache