diff options
author | Dr.Smile <vabnick@gmail.com> | 2015-01-23 06:32:16 +0300 |
---|---|---|
committer | Dr.Smile <vabnick@gmail.com> | 2015-01-28 02:43:47 +0300 |
commit | b63d8931845af256523d1142abea5caf2f65685d (patch) | |
tree | bc71c7904e56d23dfa6e8022a6eee29437d1c799 /libass/ass_cache.c | |
parent | 1c4459b7d88f231fb832682d0a4e25888e8c12ee (diff) | |
download | libass-b63d8931845af256523d1142abea5caf2f65685d.tar.bz2 libass-b63d8931845af256523d1142abea5caf2f65685d.tar.xz |
Clean up bitmap combining
Now pre- and post-combining operations are clearly separated,
many parameters in cache keys are no longer necessary due to that.
Also an ambiguous (in case of multiple fonts) text string is replaced
with a list of direct bitmap references in composite cache key.
Fixes #153.
Fixes #82.
Diffstat (limited to 'libass/ass_cache.c')
-rw-r--r-- | libass/ass_cache.c | 51 |
1 files changed, 40 insertions, 11 deletions
diff --git a/libass/ass_cache.c b/libass/ass_cache.c index 062ddfa4..2381e88c 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 |