Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3)

Side by Side Diff: third_party/harfbuzz-ng/src/hb-ot-shape-complex-indic.cc

Issue 1408003004: Roll harfbuzz-ng to 1.0.5 (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@2526
Patch Set: Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright © 2011,2012 Google, Inc. 2 * Copyright © 2011,2012 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 994 matching lines...) Expand 10 before | Expand all | Expand 10 after
1005 } 1005 }
1006 1006
1007 1007
1008 { 1008 {
1009 /* Use syllable() for sort accounting temporarily. */ 1009 /* Use syllable() for sort accounting temporarily. */
1010 unsigned int syllable = info[start].syllable(); 1010 unsigned int syllable = info[start].syllable();
1011 for (unsigned int i = start; i < end; i++) 1011 for (unsigned int i = start; i < end; i++)
1012 info[i].syllable() = i - start; 1012 info[i].syllable() = i - start;
1013 1013
1014 /* Sit tight, rock 'n roll! */ 1014 /* Sit tight, rock 'n roll! */
1015 hb_bubble_sort (info + start, end - start, compare_indic_order); 1015 hb_stable_sort (info + start, end - start, compare_indic_order);
1016 /* Find base again */ 1016 /* Find base again */
1017 base = end; 1017 base = end;
1018 for (unsigned int i = start; i < end; i++) 1018 for (unsigned int i = start; i < end; i++)
1019 if (info[i].indic_position() == POS_BASE_C) 1019 if (info[i].indic_position() == POS_BASE_C)
1020 { 1020 {
1021 base = i; 1021 base = i;
1022 break; 1022 break;
1023 } 1023 }
1024 /* Things are out-of-control for post base positions, they may shuffle 1024 /* Things are out-of-control for post base positions, they may shuffle
1025 * around like crazy. In old-spec mode, we move halants around, so in 1025 * around like crazy. In old-spec mode, we move halants around, so in
1026 * that case merge all clusters after base. Otherwise, check the sort 1026 * that case merge all clusters after base. Otherwise, check the sort
1027 * order and merge as needed. 1027 * order and merge as needed.
1028 * For pre-base stuff, we handle cluster issues in final reordering. */ 1028 * For pre-base stuff, we handle cluster issues in final reordering.
1029 *
1030 * We could use buffer->sort() for this, if there was no special
1031 * reordering of pre-base stuff happening later...
1032 */
1029 if (indic_plan->is_old_spec || end - base > 127) 1033 if (indic_plan->is_old_spec || end - base > 127)
1030 buffer->merge_clusters (base, end); 1034 buffer->merge_clusters (base, end);
1031 else 1035 else
1032 { 1036 {
1033 /* Note! syllable() is a one-byte field. */ 1037 /* Note! syllable() is a one-byte field. */
1034 for (unsigned int i = base; i < end; i++) 1038 for (unsigned int i = base; i < end; i++)
1035 if (info[i].syllable() != 255) 1039 if (info[i].syllable() != 255)
1036 { 1040 {
1037 unsigned int max = i; 1041 unsigned int max = i;
1038 unsigned int j = start + info[i].syllable(); 1042 unsigned int j = start + info[i].syllable();
(...skipping 358 matching lines...) Expand 10 before | Expand all | Expand 10 after
1397 new_pos = start; /* No move. */ 1401 new_pos = start; /* No move. */
1398 } 1402 }
1399 1403
1400 if (start < new_pos && info[new_pos].indic_position () != POS_PRE_M) 1404 if (start < new_pos && info[new_pos].indic_position () != POS_PRE_M)
1401 { 1405 {
1402 /* Now go see if there's actually any matras... */ 1406 /* Now go see if there's actually any matras... */
1403 for (unsigned int i = new_pos; i > start; i--) 1407 for (unsigned int i = new_pos; i > start; i--)
1404 if (info[i - 1].indic_position () == POS_PRE_M) 1408 if (info[i - 1].indic_position () == POS_PRE_M)
1405 { 1409 {
1406 unsigned int old_pos = i - 1; 1410 unsigned int old_pos = i - 1;
1411 if (old_pos < base && base <= new_pos) /* Shouldn't actually happen. * /
1412 base--;
1413
1407 hb_glyph_info_t tmp = info[old_pos]; 1414 hb_glyph_info_t tmp = info[old_pos];
1408 memmove (&info[old_pos], &info[old_pos + 1], (new_pos - old_pos) * siz eof (info[0])); 1415 memmove (&info[old_pos], &info[old_pos + 1], (new_pos - old_pos) * siz eof (info[0]));
1409 info[new_pos] = tmp; 1416 info[new_pos] = tmp;
1410 » if (old_pos < base && base <= new_pos) /* Shouldn't actually happen. * / 1417
1411 » base--; 1418 » /* Note: this merge_clusters() is intentionally *after* the reordering .
1419 » * Indic matra reordering is special and tricky... */
1412 buffer->merge_clusters (new_pos, MIN (end, base + 1)); 1420 buffer->merge_clusters (new_pos, MIN (end, base + 1));
1421
1413 new_pos--; 1422 new_pos--;
1414 } 1423 }
1415 } else { 1424 } else {
1416 for (unsigned int i = start; i < base; i++) 1425 for (unsigned int i = start; i < base; i++)
1417 if (info[i].indic_position () == POS_PRE_M) { 1426 if (info[i].indic_position () == POS_PRE_M) {
1418 buffer->merge_clusters (i, MIN (end, base + 1)); 1427 buffer->merge_clusters (i, MIN (end, base + 1));
1419 break; 1428 break;
1420 } 1429 }
1421 } 1430 }
1422 } 1431 }
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after
1555 if (info[i].indic_category() == OT_M) { 1564 if (info[i].indic_category() == OT_M) {
1556 /* Ok, got it. */ 1565 /* Ok, got it. */
1557 new_reph_pos--; 1566 new_reph_pos--;
1558 } 1567 }
1559 } 1568 }
1560 goto reph_move; 1569 goto reph_move;
1561 } 1570 }
1562 1571
1563 reph_move: 1572 reph_move:
1564 { 1573 {
1574 /* Move */
1565 buffer->merge_clusters (start, new_reph_pos + 1); 1575 buffer->merge_clusters (start, new_reph_pos + 1);
1566
1567 /* Move */
1568 hb_glyph_info_t reph = info[start]; 1576 hb_glyph_info_t reph = info[start];
1569 memmove (&info[start], &info[start + 1], (new_reph_pos - start) * sizeof ( info[0])); 1577 memmove (&info[start], &info[start + 1], (new_reph_pos - start) * sizeof ( info[0]));
1570 info[new_reph_pos] = reph; 1578 info[new_reph_pos] = reph;
1579
1571 if (start < base && base <= new_reph_pos) 1580 if (start < base && base <= new_reph_pos)
1572 base--; 1581 base--;
1573 } 1582 }
1574 } 1583 }
1575 1584
1576 1585
1577 /* o Reorder pre-base reordering consonants: 1586 /* o Reorder pre-base reordering consonants:
1578 * 1587 *
1579 * If a pre-base reordering consonant is found, reorder it according to 1588 * If a pre-base reordering consonant is found, reorder it according to
1580 * the following rules: 1589 * the following rules:
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
1633 1642
1634 if (new_pos > start && is_halant_or_coeng (info[new_pos - 1])) 1643 if (new_pos > start && is_halant_or_coeng (info[new_pos - 1]))
1635 { 1644 {
1636 /* -> If ZWJ or ZWNJ follow this halant, position is moved after it. */ 1645 /* -> If ZWJ or ZWNJ follow this halant, position is moved after it. */
1637 if (new_pos < end && is_joiner (info[new_pos])) 1646 if (new_pos < end && is_joiner (info[new_pos]))
1638 new_pos++; 1647 new_pos++;
1639 } 1648 }
1640 1649
1641 { 1650 {
1642 unsigned int old_pos = i; 1651 unsigned int old_pos = i;
1652
1643 buffer->merge_clusters (new_pos, old_pos + 1); 1653 buffer->merge_clusters (new_pos, old_pos + 1);
1644 hb_glyph_info_t tmp = info[old_pos]; 1654 hb_glyph_info_t tmp = info[old_pos];
1645 memmove (&info[new_pos + 1], &info[new_pos], (old_pos - new_pos) * s izeof (info[0])); 1655 memmove (&info[new_pos + 1], &info[new_pos], (old_pos - new_pos) * s izeof (info[0]));
1646 info[new_pos] = tmp; 1656 info[new_pos] = tmp;
1657
1647 if (new_pos <= base && base < old_pos) 1658 if (new_pos <= base && base < old_pos)
1648 base++; 1659 base++;
1649 } 1660 }
1650 } 1661 }
1651 1662
1652 break; 1663 break;
1653 } 1664 }
1654 } 1665 }
1655 1666
1656 1667
(...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after
1823 data_create_indic, 1834 data_create_indic,
1824 data_destroy_indic, 1835 data_destroy_indic,
1825 NULL, /* preprocess_text */ 1836 NULL, /* preprocess_text */
1826 HB_OT_SHAPE_NORMALIZATION_MODE_COMPOSED_DIACRITICS_NO_SHORT_CIRCUIT, 1837 HB_OT_SHAPE_NORMALIZATION_MODE_COMPOSED_DIACRITICS_NO_SHORT_CIRCUIT,
1827 decompose_indic, 1838 decompose_indic,
1828 compose_indic, 1839 compose_indic,
1829 setup_masks_indic, 1840 setup_masks_indic,
1830 HB_OT_SHAPE_ZERO_WIDTH_MARKS_NONE, 1841 HB_OT_SHAPE_ZERO_WIDTH_MARKS_NONE,
1831 false, /* fallback_position */ 1842 false, /* fallback_position */
1832 }; 1843 };
OLDNEW
« no previous file with comments | « third_party/harfbuzz-ng/src/hb-ot-shape-complex-hangul.cc ('k') | third_party/harfbuzz-ng/src/hb-ot-shape-complex-myanmar.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698