| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright © 2009,2010 Red Hat, Inc. | 2 * Copyright © 2009,2010 Red Hat, Inc. |
| 3 * Copyright © 2010,2011,2013 Google, Inc. | 3 * Copyright © 2010,2011,2013 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 175 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 186 for (unsigned int i = 0; i < feature_infos.len; i++) | 186 for (unsigned int i = 0; i < feature_infos.len; i++) |
| 187 { | 187 { |
| 188 const feature_info_t *info = &feature_infos[i]; | 188 const feature_info_t *info = &feature_infos[i]; |
| 189 | 189 |
| 190 unsigned int bits_needed; | 190 unsigned int bits_needed; |
| 191 | 191 |
| 192 if ((info->flags & F_GLOBAL) && info->max_value == 1) | 192 if ((info->flags & F_GLOBAL) && info->max_value == 1) |
| 193 /* Uses the global bit */ | 193 /* Uses the global bit */ |
| 194 bits_needed = 0; | 194 bits_needed = 0; |
| 195 else | 195 else |
| 196 bits_needed = _hb_bit_storage (info->max_value); | 196 /* Limit to 8 bits per feature. */ |
| 197 bits_needed = MIN(8u, _hb_bit_storage (info->max_value)); |
| 197 | 198 |
| 198 if (!info->max_value || next_bit + bits_needed > 8 * sizeof (hb_mask_t)) | 199 if (!info->max_value || next_bit + bits_needed > 8 * sizeof (hb_mask_t)) |
| 199 continue; /* Feature disabled, or not enough bits. */ | 200 continue; /* Feature disabled, or not enough bits. */ |
| 200 | 201 |
| 201 | 202 |
| 202 hb_bool_t found = false; | 203 hb_bool_t found = false; |
| 203 unsigned int feature_index[2]; | 204 unsigned int feature_index[2]; |
| 204 for (unsigned int table_index = 0; table_index < 2; table_index++) | 205 for (unsigned int table_index = 0; table_index < 2; table_index++) |
| 205 { | 206 { |
| 206 if (required_feature_tag[table_index] == info->tag) | 207 if (required_feature_tag[table_index] == info->tag) |
| (...skipping 29 matching lines...) Expand all Loading... |
| 236 map->index[1] = feature_index[1]; | 237 map->index[1] = feature_index[1]; |
| 237 map->stage[0] = info->stage[0]; | 238 map->stage[0] = info->stage[0]; |
| 238 map->stage[1] = info->stage[1]; | 239 map->stage[1] = info->stage[1]; |
| 239 map->auto_zwj = !(info->flags & F_MANUAL_ZWJ); | 240 map->auto_zwj = !(info->flags & F_MANUAL_ZWJ); |
| 240 if ((info->flags & F_GLOBAL) && info->max_value == 1) { | 241 if ((info->flags & F_GLOBAL) && info->max_value == 1) { |
| 241 /* Uses the global bit */ | 242 /* Uses the global bit */ |
| 242 map->shift = 0; | 243 map->shift = 0; |
| 243 map->mask = 1; | 244 map->mask = 1; |
| 244 } else { | 245 } else { |
| 245 map->shift = next_bit; | 246 map->shift = next_bit; |
| 246 map->mask = (1 << (next_bit + bits_needed)) - (1 << next_bit); | 247 map->mask = (1u << (next_bit + bits_needed)) - (1u << next_bit); |
| 247 next_bit += bits_needed; | 248 next_bit += bits_needed; |
| 248 m.global_mask |= (info->default_value << map->shift) & map->mask; | 249 m.global_mask |= (info->default_value << map->shift) & map->mask; |
| 249 } | 250 } |
| 250 map->_1_mask = (1 << map->shift) & map->mask; | 251 map->_1_mask = (1u << map->shift) & map->mask; |
| 251 map->needs_fallback = !found; | 252 map->needs_fallback = !found; |
| 252 | 253 |
| 253 } | 254 } |
| 254 feature_infos.shrink (0); /* Done with these */ | 255 feature_infos.shrink (0); /* Done with these */ |
| 255 | 256 |
| 256 | 257 |
| 257 add_gsub_pause (NULL); | 258 add_gsub_pause (NULL); |
| 258 add_gpos_pause (NULL); | 259 add_gpos_pause (NULL); |
| 259 | 260 |
| 260 for (unsigned int table_index = 0; table_index < 2; table_index++) | 261 for (unsigned int table_index = 0; table_index < 2; table_index++) |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 303 if (likely (stage_map)) { | 304 if (likely (stage_map)) { |
| 304 stage_map->last_lookup = last_num_lookups; | 305 stage_map->last_lookup = last_num_lookups; |
| 305 stage_map->pause_func = stages[table_index][stage_index].pause_func; | 306 stage_map->pause_func = stages[table_index][stage_index].pause_func; |
| 306 } | 307 } |
| 307 | 308 |
| 308 stage_index++; | 309 stage_index++; |
| 309 } | 310 } |
| 310 } | 311 } |
| 311 } | 312 } |
| 312 } | 313 } |
| OLD | NEW |