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