diff options
Diffstat (limited to 'libass/ass_cache_template.h')
-rw-r--r-- | libass/ass_cache_template.h | 122 |
1 files changed, 122 insertions, 0 deletions
diff --git a/libass/ass_cache_template.h b/libass/ass_cache_template.h new file mode 100644 index 0000000000..f335c6b27a --- /dev/null +++ b/libass/ass_cache_template.h @@ -0,0 +1,122 @@ +#ifdef CREATE_STRUCT_DEFINITIONS +#undef CREATE_STRUCT_DEFINITIONS +#define START(funcname, structname) \ + typedef struct structname { +#define GENERIC(type, member) \ + type member; +#define FTVECTOR(member) \ + FT_Vector member; +#define BITMAPHASHKEY(member) \ + BitmapHashKey member; +#define END(typedefnamename) \ + } typedefnamename; + +#elif defined(CREATE_COMPARISON_FUNCTIONS) +#undef CREATE_COMPARISON_FUNCTIONS +#define START(funcname, structname) \ + static int funcname##_compare(void *key1, void *key2, size_t key_size) \ + { \ + struct structname *a = key1; \ + struct structname *b = key2; \ + return // conditions follow +#define GENERIC(type, member) \ + a->member == b->member && +#define FTVECTOR(member) \ + a->member.x == b->member.x && a->member.y == b->member.y && +#define BITMAPHASHKEY(member) \ + bitmap_compare(&a->member, &b->member, sizeof(a->member)) && +#define END(typedefname) \ + 1; \ + } + +#elif defined(CREATE_HASH_FUNCTIONS) +#undef CREATE_HASH_FUNCTIONS +#define START(funcname, structname) \ + static unsigned funcname##_hash(void *buf, size_t len) \ + { \ + struct structname *p = buf; \ + unsigned hval = FNV1_32A_INIT; +#define GENERIC(type, member) \ + hval = fnv_32a_buf(&p->member, sizeof(p->member), hval); +#define FTVECTOR(member) GENERIC(, member.x); GENERIC(, member.y); +#define BITMAPHASHKEY(member) { \ + unsigned temp = bitmap_hash(&p->member, sizeof(p->member)); \ + hval = fnv_32a_buf(&temp, sizeof(temp), hval); \ + } +#define END(typedefname) \ + return hval; \ + } + +#else +#error missing defines +#endif + + + +// describes a bitmap; bitmaps with equivalents structs are considered identical +START(bitmap, bitmap_hash_key) + GENERIC(char, bitmap) // bool : true = bitmap, false = outline + GENERIC(ASS_Font *, font) + GENERIC(double, size) // font size + GENERIC(uint32_t, ch) // character code + FTVECTOR(outline) // border width, 16.16 fixed point value + GENERIC(int, bold) + GENERIC(int, italic) + GENERIC(char, be) // blur edges + GENERIC(double, blur) // gaussian blur + GENERIC(unsigned, scale_x) // 16.16 + GENERIC(unsigned, scale_y) // 16.16 + GENERIC(int, frx) // signed 16.16 + GENERIC(int, fry) // signed 16.16 + GENERIC(int, frz) // signed 16.16 + GENERIC(int, fax) // signed 16.16 + GENERIC(int, fay) // signed 16.16 + // shift vector that was added to glyph before applying rotation + // = 0, if frx = fry = frx = 0 + // = (glyph base point) - (rotation origin), otherwise + GENERIC(int, shift_x) + GENERIC(int, shift_y) + FTVECTOR(advance) // subpixel shift vector + FTVECTOR(shadow_offset) // shadow subpixel shift + GENERIC(unsigned, drawing_hash) // hashcode of a drawing + GENERIC(unsigned, flags) // glyph decoration + GENERIC(unsigned, border_style) +END(BitmapHashKey) + +// describes an outline glyph +START(glyph, glyph_hash_key) + GENERIC(ASS_Font *, font) + GENERIC(double, size) // font size + GENERIC(uint32_t, ch) // character code + GENERIC(int, bold) + GENERIC(int, italic) + GENERIC(unsigned, scale_x) // 16.16 + GENERIC(unsigned, scale_y) // 16.16 + FTVECTOR(outline) // border width, 16.16 + GENERIC(unsigned, drawing_hash) // hashcode of a drawing + GENERIC(unsigned, flags) // glyph decoration flags + GENERIC(unsigned, border_style) +END(GlyphHashKey) + +// Cache for composited bitmaps +START(composite, composite_hash_key) + GENERIC(int, aw) + GENERIC(int, ah) + GENERIC(int, bw) + GENERIC(int, bh) + GENERIC(int, ax) + GENERIC(int, ay) + GENERIC(int, bx) + GENERIC(int, by) + GENERIC(int, as) + GENERIC(int, bs) + GENERIC(unsigned char *, a) + GENERIC(unsigned char *, b) +END(CompositeHashKey) + + +#undef START +#undef GENERIC +#undef FTVECTOR +#undef BITMAPHASHKEY +#undef END |