| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright © 2011,2012,2013 Google, Inc. | 2 * Copyright © 2011,2012,2013 Google, Inc. |
| 3 * | 3 * |
| 4 * This is part of HarfBuzz, a text shaping library. | 4 * This is part of HarfBuzz, a text shaping library. |
| 5 * | 5 * |
| 6 * Permission is hereby granted, without written agreement and without | 6 * Permission is hereby granted, without written agreement and without |
| 7 * license or royalty fees, to use, copy, modify, and distribute this | 7 * license or royalty fees, to use, copy, modify, and distribute this |
| 8 * software and its documentation for any purpose, provided that the | 8 * software and its documentation for any purpose, provided that the |
| 9 * above copyright notice and the following two paragraphs appear in | 9 * above copyright notice and the following two paragraphs appear in |
| 10 * all copies of this software. | 10 * all copies of this software. |
| (...skipping 361 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 372 | 372 |
| 373 OT::name &name = OT::StructAtOffset<OT::name> (new_sfnt_data, name_table_offse
t); | 373 OT::name &name = OT::StructAtOffset<OT::name> (new_sfnt_data, name_table_offse
t); |
| 374 name.format.set (0); | 374 name.format.set (0); |
| 375 name.count.set (ARRAY_LENGTH (name_IDs)); | 375 name.count.set (ARRAY_LENGTH (name_IDs)); |
| 376 name.stringOffset.set (name.get_size ()); | 376 name.stringOffset.set (name.get_size ()); |
| 377 for (unsigned int i = 0; i < ARRAY_LENGTH (name_IDs); i++) | 377 for (unsigned int i = 0; i < ARRAY_LENGTH (name_IDs); i++) |
| 378 { | 378 { |
| 379 OT::NameRecord &record = name.nameRecord[i]; | 379 OT::NameRecord &record = name.nameRecord[i]; |
| 380 record.platformID.set (3); | 380 record.platformID.set (3); |
| 381 record.encodingID.set (1); | 381 record.encodingID.set (1); |
| 382 record.languageID.set (0x0409); /* English */ | 382 record.languageID.set (0x0409u); /* English */ |
| 383 record.nameID.set (name_IDs[i]); | 383 record.nameID.set (name_IDs[i]); |
| 384 record.length.set (name_str_len * 2); | 384 record.length.set (name_str_len * 2); |
| 385 record.offset.set (0); | 385 record.offset.set (0); |
| 386 } | 386 } |
| 387 | 387 |
| 388 /* Copy string data from new_name, converting wchar_t to UTF16BE. */ | 388 /* Copy string data from new_name, converting wchar_t to UTF16BE. */ |
| 389 unsigned char *p = &OT::StructAfter<unsigned char> (name); | 389 unsigned char *p = &OT::StructAfter<unsigned char> (name); |
| 390 for (unsigned int i = 0; i < name_str_len; i++) | 390 for (unsigned int i = 0; i < name_str_len; i++) |
| 391 { | 391 { |
| 392 *p++ = new_name[i] >> 8; | 392 *p++ = new_name[i] >> 8; |
| (...skipping 231 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 624 event->start = true; | 624 event->start = true; |
| 625 event->feature = feature; | 625 event->feature = feature; |
| 626 | 626 |
| 627 event = feature_events.push (); | 627 event = feature_events.push (); |
| 628 if (unlikely (!event)) | 628 if (unlikely (!event)) |
| 629 goto fail_features; | 629 goto fail_features; |
| 630 event->index = features[i].end; | 630 event->index = features[i].end; |
| 631 event->start = false; | 631 event->start = false; |
| 632 event->feature = feature; | 632 event->feature = feature; |
| 633 } | 633 } |
| 634 feature_events.sort (); | 634 feature_events.qsort (); |
| 635 /* Add a strategic final event. */ | 635 /* Add a strategic final event. */ |
| 636 { | 636 { |
| 637 active_feature_t feature; | 637 active_feature_t feature; |
| 638 feature.rec.tagFeature = 0; | 638 feature.rec.tagFeature = 0; |
| 639 feature.rec.lParameter = 0; | 639 feature.rec.lParameter = 0; |
| 640 feature.order = num_features + 1; | 640 feature.order = num_features + 1; |
| 641 | 641 |
| 642 feature_event_t *event = feature_events.push (); | 642 feature_event_t *event = feature_events.push (); |
| 643 if (unlikely (!event)) | 643 if (unlikely (!event)) |
| 644 goto fail_features; | 644 goto fail_features; |
| (...skipping 11 matching lines...) Expand all Loading... |
| 656 | 656 |
| 657 if (event->index != last_index) | 657 if (event->index != last_index) |
| 658 { | 658 { |
| 659 /* Save a snapshot of active features and the range. */ | 659 /* Save a snapshot of active features and the range. */ |
| 660 range_record_t *range = range_records.push (); | 660 range_record_t *range = range_records.push (); |
| 661 if (unlikely (!range)) | 661 if (unlikely (!range)) |
| 662 goto fail_features; | 662 goto fail_features; |
| 663 | 663 |
| 664 unsigned int offset = feature_records.len; | 664 unsigned int offset = feature_records.len; |
| 665 | 665 |
| 666 » active_features.sort (); | 666 » active_features.qsort (); |
| 667 for (unsigned int j = 0; j < active_features.len; j++) | 667 for (unsigned int j = 0; j < active_features.len; j++) |
| 668 { | 668 { |
| 669 if (!j || active_features[j].rec.tagFeature != feature_records[feature
_records.len - 1].tagFeature) | 669 if (!j || active_features[j].rec.tagFeature != feature_records[feature
_records.len - 1].tagFeature) |
| 670 { | 670 { |
| 671 OPENTYPE_FEATURE_RECORD *feature = feature_records.push (); | 671 OPENTYPE_FEATURE_RECORD *feature = feature_records.push (); |
| 672 if (unlikely (!feature)) | 672 if (unlikely (!feature)) |
| 673 goto fail_features; | 673 goto fail_features; |
| 674 *feature = active_features[j].rec; | 674 *feature = active_features[j].rec; |
| 675 } | 675 } |
| 676 else | 676 else |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 742 | 742 |
| 743 #define utf16_index() var1.u32 | 743 #define utf16_index() var1.u32 |
| 744 | 744 |
| 745 ALLOCATE_ARRAY (WCHAR, pchars, buffer->len * 2); | 745 ALLOCATE_ARRAY (WCHAR, pchars, buffer->len * 2); |
| 746 | 746 |
| 747 unsigned int chars_len = 0; | 747 unsigned int chars_len = 0; |
| 748 for (unsigned int i = 0; i < buffer->len; i++) | 748 for (unsigned int i = 0; i < buffer->len; i++) |
| 749 { | 749 { |
| 750 hb_codepoint_t c = buffer->info[i].codepoint; | 750 hb_codepoint_t c = buffer->info[i].codepoint; |
| 751 buffer->info[i].utf16_index() = chars_len; | 751 buffer->info[i].utf16_index() = chars_len; |
| 752 if (likely (c < 0x10000)) | 752 if (likely (c <= 0xFFFFu)) |
| 753 pchars[chars_len++] = c; | 753 pchars[chars_len++] = c; |
| 754 else if (unlikely (c >= 0x110000)) | 754 else if (unlikely (c > 0x10FFFFu)) |
| 755 pchars[chars_len++] = 0xFFFD; | 755 pchars[chars_len++] = 0xFFFDu; |
| 756 else { | 756 else { |
| 757 pchars[chars_len++] = 0xD800 + ((c - 0x10000) >> 10); | 757 pchars[chars_len++] = 0xD800u + ((c - 0x10000u) >> 10); |
| 758 pchars[chars_len++] = 0xDC00 + ((c - 0x10000) & ((1 << 10) - 1)); | 758 pchars[chars_len++] = 0xDC00u + ((c - 0x10000u) & ((1 << 10) - 1)); |
| 759 } | 759 } |
| 760 } | 760 } |
| 761 | 761 |
| 762 ALLOCATE_ARRAY (WORD, log_clusters, chars_len); | 762 ALLOCATE_ARRAY (WORD, log_clusters, chars_len); |
| 763 ALLOCATE_ARRAY (SCRIPT_CHARPROP, char_props, chars_len); | 763 ALLOCATE_ARRAY (SCRIPT_CHARPROP, char_props, chars_len); |
| 764 | 764 |
| 765 if (num_features) | 765 if (num_features) |
| 766 { | 766 { |
| 767 /* Need log_clusters to assign features. */ | 767 /* Need log_clusters to assign features. */ |
| 768 chars_len = 0; | 768 chars_len = 0; |
| 769 for (unsigned int i = 0; i < buffer->len; i++) | 769 for (unsigned int i = 0; i < buffer->len; i++) |
| 770 { | 770 { |
| 771 hb_codepoint_t c = buffer->info[i].codepoint; | 771 hb_codepoint_t c = buffer->info[i].codepoint; |
| 772 unsigned int cluster = buffer->info[i].cluster; | 772 unsigned int cluster = buffer->info[i].cluster; |
| 773 log_clusters[chars_len++] = cluster; | 773 log_clusters[chars_len++] = cluster; |
| 774 if (c >= 0x10000 && c < 0x110000) | 774 if (hb_in_range (c, 0x10000u, 0x10FFFFu)) |
| 775 log_clusters[chars_len++] = cluster; /* Surrogates. */ | 775 log_clusters[chars_len++] = cluster; /* Surrogates. */ |
| 776 } | 776 } |
| 777 } | 777 } |
| 778 | 778 |
| 779 /* The -2 in the following is to compensate for possible | 779 /* The -2 in the following is to compensate for possible |
| 780 * alignment needed after the WORD array. sizeof(WORD) == 2. */ | 780 * alignment needed after the WORD array. sizeof(WORD) == 2. */ |
| 781 unsigned int glyphs_size = (scratch_size * sizeof (int) - 2) | 781 unsigned int glyphs_size = (scratch_size * sizeof (int) - 2) |
| 782 / (sizeof (WORD) + | 782 / (sizeof (WORD) + |
| 783 sizeof (SCRIPT_GLYPHPROP) + | 783 sizeof (SCRIPT_GLYPHPROP) + |
| 784 sizeof (int) + | 784 sizeof (int) + |
| (...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1010 } | 1010 } |
| 1011 | 1011 |
| 1012 if (backward) | 1012 if (backward) |
| 1013 hb_buffer_reverse (buffer); | 1013 hb_buffer_reverse (buffer); |
| 1014 | 1014 |
| 1015 /* Wow, done! */ | 1015 /* Wow, done! */ |
| 1016 return true; | 1016 return true; |
| 1017 } | 1017 } |
| 1018 | 1018 |
| 1019 | 1019 |
| OLD | NEW |