| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright © 2009,2010 Red Hat, Inc. | 2 * Copyright © 2009,2010 Red Hat, Inc. |
| 3 * Copyright © 2010,2011,2012 Google, Inc. | 3 * Copyright © 2010,2011,2012 Google, Inc. |
| 4 * | 4 * |
| 5 * This is part of HarfBuzz, a text shaping library. | 5 * This is part of HarfBuzz, a text shaping library. |
| 6 * | 6 * |
| 7 * Permission is hereby granted, without written agreement and without | 7 * Permission is hereby granted, without written agreement and without |
| 8 * license or royalty fees, to use, copy, modify, and distribute this | 8 * license or royalty fees, to use, copy, modify, and distribute this |
| 9 * software and its documentation for any purpose, provided that the | 9 * software and its documentation for any purpose, provided that the |
| 10 * above copyright notice and the following two paragraphs appear in | 10 * above copyright notice and the following two paragraphs appear in |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 42 | 42 |
| 43 public: | 43 public: |
| 44 | 44 |
| 45 struct feature_map_t { | 45 struct feature_map_t { |
| 46 hb_tag_t tag; /* should be first for our bsearch to work */ | 46 hb_tag_t tag; /* should be first for our bsearch to work */ |
| 47 unsigned int index[2]; /* GSUB/GPOS */ | 47 unsigned int index[2]; /* GSUB/GPOS */ |
| 48 unsigned int stage[2]; /* GSUB/GPOS */ | 48 unsigned int stage[2]; /* GSUB/GPOS */ |
| 49 unsigned int shift; | 49 unsigned int shift; |
| 50 hb_mask_t mask; | 50 hb_mask_t mask; |
| 51 hb_mask_t _1_mask; /* mask for value=1, for quick access */ | 51 hb_mask_t _1_mask; /* mask for value=1, for quick access */ |
| 52 hb_bool_t needs_fallback; | 52 unsigned int needs_fallback : 1; |
| 53 unsigned int auto_zwj : 1; |
| 53 | 54 |
| 54 static int cmp (const feature_map_t *a, const feature_map_t *b) | 55 static int cmp (const feature_map_t *a, const feature_map_t *b) |
| 55 { return a->tag < b->tag ? -1 : a->tag > b->tag ? 1 : 0; } | 56 { return a->tag < b->tag ? -1 : a->tag > b->tag ? 1 : 0; } |
| 56 }; | 57 }; |
| 57 | 58 |
| 58 struct lookup_map_t { | 59 struct lookup_map_t { |
| 59 unsigned int index; | 60 unsigned short index; |
| 61 unsigned short auto_zwj : 1; |
| 60 hb_mask_t mask; | 62 hb_mask_t mask; |
| 61 | 63 |
| 62 static int cmp (const lookup_map_t *a, const lookup_map_t *b) | 64 static int cmp (const lookup_map_t *a, const lookup_map_t *b) |
| 63 { return a->index < b->index ? -1 : a->index > b->index ? 1 : 0; } | 65 { return a->index < b->index ? -1 : a->index > b->index ? 1 : 0; } |
| 64 }; | 66 }; |
| 65 | 67 |
| 66 typedef void (*pause_func_t) (const struct hb_ot_shape_plan_t *plan, hb_font_t
*font, hb_buffer_t *buffer); | 68 typedef void (*pause_func_t) (const struct hb_ot_shape_plan_t *plan, hb_font_t
*font, hb_buffer_t *buffer); |
| 67 | 69 |
| 68 struct pause_map_t { | 70 struct pause_map_t { |
| 69 unsigned int num_lookups; /* Cumulative */ | 71 unsigned int num_lookups; /* Cumulative */ |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 129 | 131 |
| 130 public: | 132 public: |
| 131 hb_tag_t chosen_script[2]; | 133 hb_tag_t chosen_script[2]; |
| 132 bool found_script[2]; | 134 bool found_script[2]; |
| 133 | 135 |
| 134 private: | 136 private: |
| 135 | 137 |
| 136 HB_INTERNAL void add_lookups (hb_face_t *face, | 138 HB_INTERNAL void add_lookups (hb_face_t *face, |
| 137 unsigned int table_index, | 139 unsigned int table_index, |
| 138 unsigned int feature_index, | 140 unsigned int feature_index, |
| 139 » » » » hb_mask_t mask); | 141 » » » » hb_mask_t mask, |
| 142 » » » » bool auto_zwj); |
| 140 | 143 |
| 141 hb_mask_t global_mask; | 144 hb_mask_t global_mask; |
| 142 | 145 |
| 143 hb_prealloced_array_t<feature_map_t, 8> features; | 146 hb_prealloced_array_t<feature_map_t, 8> features; |
| 144 hb_prealloced_array_t<lookup_map_t, 32> lookups[2]; /* GSUB/GPOS */ | 147 hb_prealloced_array_t<lookup_map_t, 32> lookups[2]; /* GSUB/GPOS */ |
| 145 hb_prealloced_array_t<pause_map_t, 1> pauses[2]; /* GSUB/GPOS */ | 148 hb_prealloced_array_t<pause_map_t, 1> pauses[2]; /* GSUB/GPOS */ |
| 146 }; | 149 }; |
| 147 | 150 |
| 151 enum hb_ot_map_feature_flags_t { |
| 152 F_NONE = 0x0000, |
| 153 F_GLOBAL = 0x0001, |
| 154 F_HAS_FALLBACK = 0x0002, |
| 155 F_MANUAL_ZWJ = 0x0004 |
| 156 }; |
| 157 /* Macro version for where const is desired. */ |
| 158 #define F_COMBINE(l,r) (hb_ot_map_feature_flags_t ((unsigned int) (l) | (unsigne
d int) (r))) |
| 159 inline hb_ot_map_feature_flags_t |
| 160 operator | (hb_ot_map_feature_flags_t l, hb_ot_map_feature_flags_t r) |
| 161 { return hb_ot_map_feature_flags_t ((unsigned int) l | (unsigned int) r); } |
| 162 inline hb_ot_map_feature_flags_t |
| 163 operator & (hb_ot_map_feature_flags_t l, hb_ot_map_feature_flags_t r) |
| 164 { return hb_ot_map_feature_flags_t ((unsigned int) l & (unsigned int) r); } |
| 165 inline hb_ot_map_feature_flags_t |
| 166 operator ~ (hb_ot_map_feature_flags_t r) |
| 167 { return hb_ot_map_feature_flags_t (~(unsigned int) r); } |
| 168 inline hb_ot_map_feature_flags_t& |
| 169 operator |= (hb_ot_map_feature_flags_t &l, hb_ot_map_feature_flags_t r) |
| 170 { l = l | r; return l; } |
| 171 inline hb_ot_map_feature_flags_t& |
| 172 operator &= (hb_ot_map_feature_flags_t& l, hb_ot_map_feature_flags_t r) |
| 173 { l = l & r; return l; } |
| 174 |
| 148 | 175 |
| 149 struct hb_ot_map_builder_t | 176 struct hb_ot_map_builder_t |
| 150 { | 177 { |
| 151 public: | 178 public: |
| 152 | 179 |
| 153 HB_INTERNAL hb_ot_map_builder_t (hb_face_t *face_, | 180 HB_INTERNAL hb_ot_map_builder_t (hb_face_t *face_, |
| 154 const hb_segment_properties_t *props_); | 181 const hb_segment_properties_t *props_); |
| 155 | 182 |
| 156 HB_INTERNAL void add_feature (hb_tag_t tag, unsigned int value, bool global, b
ool has_fallback = false); | 183 HB_INTERNAL void add_feature (hb_tag_t tag, unsigned int value, |
| 184 » » » » hb_ot_map_feature_flags_t flags); |
| 157 | 185 |
| 158 inline void add_bool_feature (hb_tag_t tag, bool global = true, bool has_fallb
ack = false) | 186 inline void add_global_bool_feature (hb_tag_t tag) |
| 159 { add_feature (tag, 1, global, has_fallback); } | 187 { add_feature (tag, 1, F_GLOBAL); } |
| 160 | 188 |
| 161 inline void add_gsub_pause (hb_ot_map_t::pause_func_t pause_func) | 189 inline void add_gsub_pause (hb_ot_map_t::pause_func_t pause_func) |
| 162 { add_pause (0, pause_func); } | 190 { add_pause (0, pause_func); } |
| 163 inline void add_gpos_pause (hb_ot_map_t::pause_func_t pause_func) | 191 inline void add_gpos_pause (hb_ot_map_t::pause_func_t pause_func) |
| 164 { add_pause (1, pause_func); } | 192 { add_pause (1, pause_func); } |
| 165 | 193 |
| 166 HB_INTERNAL void compile (struct hb_ot_map_t &m); | 194 HB_INTERNAL void compile (struct hb_ot_map_t &m); |
| 167 | 195 |
| 168 inline void finish (void) { | 196 inline void finish (void) { |
| 169 feature_infos.finish (); | 197 feature_infos.finish (); |
| 170 pauses[0].finish (); | 198 pauses[0].finish (); |
| 171 pauses[1].finish (); | 199 pauses[1].finish (); |
| 172 } | 200 } |
| 173 | 201 |
| 174 private: | 202 private: |
| 175 | 203 |
| 176 struct feature_info_t { | 204 struct feature_info_t { |
| 177 hb_tag_t tag; | 205 hb_tag_t tag; |
| 178 unsigned int seq; /* sequence#, used for stable sorting only */ | 206 unsigned int seq; /* sequence#, used for stable sorting only */ |
| 179 unsigned int max_value; | 207 unsigned int max_value; |
| 180 bool global; /* whether the feature applies value to every glyph in the buff
er */ | 208 hb_ot_map_feature_flags_t flags; |
| 181 bool has_fallback; /* whether to allocate bits even if feature not found */ | |
| 182 unsigned int default_value; /* for non-global features, what should the unse
t glyphs take */ | 209 unsigned int default_value; /* for non-global features, what should the unse
t glyphs take */ |
| 183 unsigned int stage[2]; /* GSUB/GPOS */ | 210 unsigned int stage[2]; /* GSUB/GPOS */ |
| 184 | 211 |
| 185 static int cmp (const feature_info_t *a, const feature_info_t *b) | 212 static int cmp (const feature_info_t *a, const feature_info_t *b) |
| 186 { return (a->tag != b->tag) ? (a->tag < b->tag ? -1 : 1) : (a->seq < b->seq
? -1 : 1); } | 213 { return (a->tag != b->tag) ? (a->tag < b->tag ? -1 : 1) : (a->seq < b->seq
? -1 : 1); } |
| 187 }; | 214 }; |
| 188 | 215 |
| 189 struct pause_info_t { | 216 struct pause_info_t { |
| 190 unsigned int stage; | 217 unsigned int stage; |
| 191 hb_ot_map_t::pause_func_t callback; | 218 hb_ot_map_t::pause_func_t callback; |
| (...skipping 13 matching lines...) Expand all Loading... |
| 205 private: | 232 private: |
| 206 | 233 |
| 207 unsigned int current_stage[2]; /* GSUB/GPOS */ | 234 unsigned int current_stage[2]; /* GSUB/GPOS */ |
| 208 hb_prealloced_array_t<feature_info_t,16> feature_infos; | 235 hb_prealloced_array_t<feature_info_t,16> feature_infos; |
| 209 hb_prealloced_array_t<pause_info_t, 1> pauses[2]; /* GSUB/GPOS */ | 236 hb_prealloced_array_t<pause_info_t, 1> pauses[2]; /* GSUB/GPOS */ |
| 210 }; | 237 }; |
| 211 | 238 |
| 212 | 239 |
| 213 | 240 |
| 214 #endif /* HB_OT_MAP_PRIVATE_HH */ | 241 #endif /* HB_OT_MAP_PRIVATE_HH */ |
| OLD | NEW |