cache: unified outline cache for glyphs/drawings
[libass.git] / libass / ass_cache_template.h
blobcdb5826d964fc3a37769b77619760fc5c1a38473
1 #ifdef CREATE_STRUCT_DEFINITIONS
2 #undef CREATE_STRUCT_DEFINITIONS
3 #define START(funcname, structname) \
4 typedef struct structname {
5 #define GENERIC(type, member) \
6 type member;
7 #define STRING(member) \
8 char *member;
9 #define FTVECTOR(member) \
10 FT_Vector member;
11 #define BITMAPHASHKEY(member) \
12 BitmapHashKey member;
13 #define END(typedefnamename) \
14 } typedefnamename;
16 #elif defined(CREATE_COMPARISON_FUNCTIONS)
17 #undef CREATE_COMPARISON_FUNCTIONS
18 #define START(funcname, structname) \
19 static unsigned funcname##_compare(void *key1, void *key2, size_t key_size) \
20 { \
21 struct structname *a = key1; \
22 struct structname *b = key2; \
23 return // conditions follow
24 #define GENERIC(type, member) \
25 a->member == b->member &&
26 #define STRING(member) \
27 strcmp(a->member, b->member) == 0 &&
28 #define FTVECTOR(member) \
29 a->member.x == b->member.x && a->member.y == b->member.y &&
30 #define BITMAPHASHKEY(member) \
31 bitmap_compare(&a->member, &b->member, sizeof(a->member)) &&
32 #define END(typedefname) \
33 1; \
36 #elif defined(CREATE_HASH_FUNCTIONS)
37 #undef CREATE_HASH_FUNCTIONS
38 #define START(funcname, structname) \
39 static unsigned funcname##_hash(void *buf, size_t len) \
40 { \
41 struct structname *p = buf; \
42 unsigned hval = FNV1_32A_INIT;
43 #define GENERIC(type, member) \
44 hval = fnv_32a_buf(&p->member, sizeof(p->member), hval);
45 #define STRING(member) \
46 hval = fnv_32a_str(p->member, hval);
47 #define FTVECTOR(member) GENERIC(, member.x); GENERIC(, member.y);
48 #define BITMAPHASHKEY(member) { \
49 unsigned temp = bitmap_hash(&p->member, sizeof(p->member)); \
50 hval = fnv_32a_buf(&temp, sizeof(temp), hval); \
52 #define END(typedefname) \
53 return hval; \
56 #else
57 #error missing defines
58 #endif
62 // describes a bitmap; bitmaps with equivalents structs are considered identical
63 START(bitmap, bitmap_hash_key)
64 GENERIC(char, bitmap) // bool : true = bitmap, false = outline
65 GENERIC(ASS_Font *, font)
66 GENERIC(double, size) // font size
67 GENERIC(uint32_t, ch) // character code
68 FTVECTOR(outline) // border width, 16.16 fixed point value
69 GENERIC(int, bold)
70 GENERIC(int, italic)
71 GENERIC(char, be) // blur edges
72 GENERIC(double, blur) // gaussian blur
73 GENERIC(unsigned, scale_x) // 16.16
74 GENERIC(unsigned, scale_y) // 16.16
75 GENERIC(int, frx) // signed 16.16
76 GENERIC(int, fry) // signed 16.16
77 GENERIC(int, frz) // signed 16.16
78 GENERIC(int, fax) // signed 16.16
79 GENERIC(int, fay) // signed 16.16
80 // shift vector that was added to glyph before applying rotation
81 // = 0, if frx = fry = frx = 0
82 // = (glyph base point) - (rotation origin), otherwise
83 GENERIC(int, shift_x)
84 GENERIC(int, shift_y)
85 FTVECTOR(advance) // subpixel shift vector
86 FTVECTOR(shadow_offset) // shadow subpixel shift
87 GENERIC(unsigned, drawing_hash) // hashcode of a drawing
88 GENERIC(unsigned, flags) // glyph decoration
89 GENERIC(unsigned, border_style)
90 END(BitmapHashKey)
92 // describes an outline glyph
93 START(glyph, glyph_hash_key)
94 GENERIC(ASS_Font *, font)
95 GENERIC(double, size) // font size
96 GENERIC(uint32_t, ch) // character code
97 GENERIC(int, bold)
98 GENERIC(int, italic)
99 GENERIC(unsigned, scale_x) // 16.16
100 GENERIC(unsigned, scale_y) // 16.16
101 FTVECTOR(outline) // border width, 16.16
102 GENERIC(unsigned, drawing_hash) // hashcode of a drawing
103 GENERIC(unsigned, flags) // glyph decoration flags
104 GENERIC(unsigned, border_style)
105 END(GlyphHashKey)
107 // describes an outline drawing
108 START(drawing, drawing_hash_key)
109 GENERIC(unsigned, scale_x)
110 GENERIC(unsigned, scale_y)
111 GENERIC(int, pbo)
112 FTVECTOR(outline)
113 GENERIC(unsigned, border_style)
114 GENERIC(int, scale)
115 GENERIC(unsigned, hash)
116 STRING(text)
117 END(DrawingHashKey)
119 // Cache for composited bitmaps
120 START(composite, composite_hash_key)
121 GENERIC(int, aw)
122 GENERIC(int, ah)
123 GENERIC(int, bw)
124 GENERIC(int, bh)
125 GENERIC(int, ax)
126 GENERIC(int, ay)
127 GENERIC(int, bx)
128 GENERIC(int, by)
129 GENERIC(int, as)
130 GENERIC(int, bs)
131 GENERIC(unsigned char *, a)
132 GENERIC(unsigned char *, b)
133 END(CompositeHashKey)
136 #undef START
137 #undef GENERIC
138 #undef STRING
139 #undef FTVECTOR
140 #undef BITMAPHASHKEY
141 #undef END