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 BINSTRING(member) \
10         struct { size_t size; void *data; } member;
11 #define FTVECTOR(member) \
12         FT_Vector member;
13 #define BITMAPHASHKEY(member) \
14         BitmapHashKey member;
15 #define END(typedefnamename) \
16     } typedefnamename;
17 
18 #elif defined(CREATE_COMPARISON_FUNCTIONS)
19 #undef CREATE_COMPARISON_FUNCTIONS
20 #define START(funcname, structname) \
21     static unsigned funcname##_compare(void *key1, void *key2, size_t key_size) \
22     { \
23         struct structname *a = key1; \
24         struct structname *b = key2; \
25         return // conditions follow
26 #define GENERIC(type, member) \
27             a->member == b->member &&
28 #define STRING(member) \
29             strcmp(a->member, b->member) == 0 &&
30 #define BINSTRING(member) \
31             a->member.size == b->member.size && \
32             memcmp(a->member.data, b->member.data, a->member.size) == 0 &&
33 #define FTVECTOR(member) \
34             a->member.x == b->member.x && a->member.y == b->member.y &&
35 #define BITMAPHASHKEY(member) \
36             bitmap_compare(&a->member, &b->member, sizeof(a->member)) &&
37 #define END(typedefname) \
38             1; \
39     }
40 
41 #elif defined(CREATE_HASH_FUNCTIONS)
42 #undef CREATE_HASH_FUNCTIONS
43 #define START(funcname, structname) \
44     static unsigned funcname##_hash(void *buf, size_t len) \
45     { \
46         struct structname *p = buf; \
47         unsigned hval = FNV1_32A_INIT;
48 #define GENERIC(type, member) \
49         hval = fnv_32a_buf(&p->member, sizeof(p->member), hval);
50 #define STRING(member) \
51         hval = fnv_32a_str(p->member, hval);
52 #define BINSTRING(member) \
53         hval = fnv_32a_buf(&p->member.size, sizeof(p->member.size), hval); \
54         hval = fnv_32a_buf(p->member.data, p->member.size, hval);
55 #define FTVECTOR(member) GENERIC(, member.x); GENERIC(, member.y);
56 #define BITMAPHASHKEY(member) { \
57         unsigned temp = bitmap_hash(&p->member, sizeof(p->member)); \
58         hval = fnv_32a_buf(&temp, sizeof(temp), hval); \
59         }
60 #define END(typedefname) \
61         return hval; \
62     }
63 
64 #else
65 #error missing defines
66 #endif
67 
68 
69 
70 // describes an outline bitmap
71 START(outline_bitmap, outline_bitmap_hash_key)
72     GENERIC(OutlineHashValue *, outline)
73     GENERIC(int, frx) // signed 10.22
74     GENERIC(int, fry) // signed 10.22
75     GENERIC(int, frz) // signed 10.22
76     GENERIC(int, fax) // signed 16.16
77     GENERIC(int, fay) // signed 16.16
78     // shift vector that was added to glyph before applying rotation
79     // = 0, if frx = fry = frx = 0
80     // = (glyph base point) - (rotation origin), otherwise
81     GENERIC(int, shift_x)
82     GENERIC(int, shift_y)
83     FTVECTOR(advance) // subpixel shift vector
84 END(OutlineBitmapHashKey)
85 
86 // describe a clip mask bitmap
87 START(clip_bitmap, clip_bitmap_hash_key)
88     STRING(text)
89 END(ClipMaskHashKey)
90 
91 // describes an outline glyph
92 START(glyph, glyph_hash_key)
93     GENERIC(ASS_Font *, font)
94     GENERIC(double, size) // font size
95     GENERIC(int, face_index)
96     GENERIC(int, glyph_index)
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, flags)    // glyph decoration flags
103     GENERIC(unsigned, border_style)
104     GENERIC(int, hspacing) // 16.16
105 END(GlyphHashKey)
106 
107 START(glyph_metrics, glyph_metrics_hash_key)
108     GENERIC(ASS_Font *, font)
109     GENERIC(double, size)
110     GENERIC(int, face_index)
111     GENERIC(int, glyph_index)
112     GENERIC(unsigned, scale_x)
113     GENERIC(unsigned, scale_y)
114 END(GlyphMetricsHashKey)
115 
116 // describes an outline drawing
117 START(drawing, drawing_hash_key)
118     GENERIC(unsigned, scale_x)
119     GENERIC(unsigned, scale_y)
120     GENERIC(int, pbo)
121     FTVECTOR(outline)
122     GENERIC(unsigned, border_style)
123     GENERIC(int, hspacing)
124     GENERIC(int, scale)
125     GENERIC(unsigned, hash)
126     STRING(text)
127 END(DrawingHashKey)
128 
129 // describes post-combining effects
130 START(filter, filter_desc)
131     GENERIC(int, flags)
132     GENERIC(int, be)
133     GENERIC(double, blur)
134     FTVECTOR(shadow)
135 END(FilterDesc)
136 
137 #undef START
138 #undef GENERIC
139 #undef STRING
140 #undef FTVECTOR
141 #undef BITMAPHASHKEY
142 #undef BINSTRING
143 #undef END
144