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         ASS_StringView member;
9 #define VECTOR(member) \
10         ASS_Vector member;
11 #define END(typedefnamename) \
12     } typedefnamename;
13 
14 #elif defined(CREATE_COMPARISON_FUNCTIONS)
15 #undef CREATE_COMPARISON_FUNCTIONS
16 #define START(funcname, structname) \
17     static bool funcname##_compare(void *key1, void *key2) \
18     { \
19         struct structname *a = key1; \
20         struct structname *b = key2; \
21         return // conditions follow
22 #define GENERIC(type, member) \
23             a->member == b->member &&
24 #define STRING(member) \
25             ass_string_equal(a->member, b->member) &&
26 #define VECTOR(member) \
27             a->member.x == b->member.x && a->member.y == b->member.y &&
28 #define END(typedefname) \
29             true; \
30     }
31 
32 #elif defined(CREATE_HASH_FUNCTIONS)
33 #undef CREATE_HASH_FUNCTIONS
34 #define START(funcname, structname) \
35     static uint32_t funcname##_hash(void *buf, uint32_t hval) \
36     { \
37         struct structname *p = buf;
38 #define GENERIC(type, member) \
39         hval = fnv_32a_buf(&p->member, sizeof(p->member), hval);
40 #define STRING(member) \
41         hval = fnv_32a_buf(p->member.str, p->member.len, hval);
42 #define VECTOR(member) GENERIC(, member.x); GENERIC(, member.y);
43 #define END(typedefname) \
44         return hval; \
45     }
46 
47 #else
48 #error missing defines
49 #endif
50 
51 
52 
53 START(font, ass_font_desc )
54     STRING(family)
55     GENERIC(unsigned, bold)
56     GENERIC(unsigned, italic)
57     GENERIC(int, vertical)  // @font vertical layout
58 END(ASS_FontDesc)
59 
60 // describes an outline bitmap
61 START(bitmap, bitmap_hash_key)
62     GENERIC(OutlineHashValue *, outline)
63     // quantized transform matrix
64     VECTOR(offset)
65     VECTOR(matrix_x)
66     VECTOR(matrix_y)
67     VECTOR(matrix_z)
68 END(BitmapHashKey)
69 
70 START(glyph_metrics, glyph_metrics_hash_key)
71     GENERIC(ASS_Font *, font)
72     GENERIC(double, size)
73     GENERIC(int, face_index)
74     GENERIC(int, glyph_index)
75 END(GlyphMetricsHashKey)
76 
77 // describes an outline glyph
78 START(glyph, glyph_hash_key)
79     GENERIC(ASS_Font *, font)
80     GENERIC(double, size) // font size
81     GENERIC(int, face_index)
82     GENERIC(int, glyph_index)
83     GENERIC(int, bold)
84     GENERIC(int, italic)
85     GENERIC(unsigned, flags) // glyph decoration flags
86 END(GlyphHashKey)
87 
88 // describes an outline drawing
89 START(drawing, drawing_hash_key)
90     STRING(text)
91 END(DrawingHashKey)
92 
93 // describes an offset outline
94 START(border, border_hash_key)
95     GENERIC(OutlineHashValue *, outline)
96     // outline is scaled by 2^scale_ord_x|y before stroking
97     // to keep stoker error in allowable range
98     GENERIC(int, scale_ord_x)
99     GENERIC(int, scale_ord_y)
100     VECTOR(border)  // border size in STROKER_ACCURACY units
101 END(BorderHashKey)
102 
103 // describes post-combining effects
104 START(filter, filter_desc)
105     GENERIC(int, flags)
106     GENERIC(int, be)
107     GENERIC(int, blur)
108     VECTOR(shadow)
109 END(FilterDesc)
110 
111 // describes glyph bitmap reference
112 START(bitmap_ref, bitmap_ref_key)
113     GENERIC(Bitmap *, bm)
114     GENERIC(Bitmap *, bm_o)
115     VECTOR(pos)
116     VECTOR(pos_o)
117 END(BitmapRef)
118 
119 #undef START
120 #undef GENERIC
121 #undef STRING
122 #undef VECTOR
123 #undef END
124