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