Index: third_party/harfbuzz/src/harfbuzz-myanmar.c |
diff --git a/third_party/harfbuzz/src/harfbuzz-myanmar.c b/third_party/harfbuzz/src/harfbuzz-myanmar.c |
deleted file mode 100644 |
index 7cd82bb1e6371e7bc8a4dc0e31bddd6864689f02..0000000000000000000000000000000000000000 |
--- a/third_party/harfbuzz/src/harfbuzz-myanmar.c |
+++ /dev/null |
@@ -1,542 +0,0 @@ |
-/* |
- * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies) |
- * |
- * This is part of HarfBuzz, an OpenType Layout engine library. |
- * |
- * Permission is hereby granted, without written agreement and without |
- * license or royalty fees, to use, copy, modify, and distribute this |
- * software and its documentation for any purpose, provided that the |
- * above copyright notice and the following two paragraphs appear in |
- * all copies of this software. |
- * |
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR |
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES |
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN |
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH |
- * DAMAGE. |
- * |
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, |
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND |
- * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS |
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO |
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. |
- */ |
- |
-#include "harfbuzz-shaper.h" |
-#include "harfbuzz-shaper-private.h" |
- |
-#include <assert.h> |
-#include <stdio.h> |
- |
-enum MymrCharClassValues |
-{ |
- Mymr_CC_RESERVED = 0, |
- Mymr_CC_CONSONANT = 1, /* Consonant of type 1, that has subscript form */ |
- Mymr_CC_CONSONANT2 = 2, /* Consonant of type 2, that has no subscript form */ |
- Mymr_CC_NGA = 3, /* Consonant NGA */ |
- Mymr_CC_YA = 4, /* Consonant YA */ |
- Mymr_CC_RA = 5, /* Consonant RA */ |
- Mymr_CC_WA = 6, /* Consonant WA */ |
- Mymr_CC_HA = 7, /* Consonant HA */ |
- Mymr_CC_IND_VOWEL = 8, /* Independent vowel */ |
- Mymr_CC_ZERO_WIDTH_NJ_MARK = 9, /* Zero Width non joiner character (0x200C) */ |
- Mymr_CC_VIRAMA = 10, /* Subscript consonant combining character */ |
- Mymr_CC_PRE_VOWEL = 11, /* Dependent vowel, prebase (Vowel e) */ |
- Mymr_CC_BELOW_VOWEL = 12, /* Dependent vowel, prebase (Vowel u, uu) */ |
- Mymr_CC_ABOVE_VOWEL = 13, /* Dependent vowel, prebase (Vowel i, ii, ai) */ |
- Mymr_CC_POST_VOWEL = 14, /* Dependent vowel, prebase (Vowel aa) */ |
- Mymr_CC_SIGN_ABOVE = 15, |
- Mymr_CC_SIGN_BELOW = 16, |
- Mymr_CC_SIGN_AFTER = 17, |
- Mymr_CC_ZERO_WIDTH_J_MARK = 18, /* Zero width joiner character */ |
- Mymr_CC_COUNT = 19 /* This is the number of character classes */ |
-}; |
- |
-enum MymrCharClassFlags |
-{ |
- Mymr_CF_CLASS_MASK = 0x0000FFFF, |
- |
- Mymr_CF_CONSONANT = 0x01000000, /* flag to speed up comparing */ |
- Mymr_CF_MEDIAL = 0x02000000, /* flag to speed up comparing */ |
- Mymr_CF_IND_VOWEL = 0x04000000, /* flag to speed up comparing */ |
- Mymr_CF_DEP_VOWEL = 0x08000000, /* flag to speed up comparing */ |
- Mymr_CF_DOTTED_CIRCLE = 0x10000000, /* add a dotted circle if a character with this flag is the first in a syllable */ |
- Mymr_CF_VIRAMA = 0x20000000, /* flag to speed up comparing */ |
- |
- /* position flags */ |
- Mymr_CF_POS_BEFORE = 0x00080000, |
- Mymr_CF_POS_BELOW = 0x00040000, |
- Mymr_CF_POS_ABOVE = 0x00020000, |
- Mymr_CF_POS_AFTER = 0x00010000, |
- Mymr_CF_POS_MASK = 0x000f0000, |
- |
- Mymr_CF_AFTER_KINZI = 0x00100000 |
-}; |
- |
-/* Characters that get refrered to by name */ |
-enum MymrChar |
-{ |
- Mymr_C_SIGN_ZWNJ = 0x200C, |
- Mymr_C_SIGN_ZWJ = 0x200D, |
- Mymr_C_DOTTED_CIRCLE = 0x25CC, |
- Mymr_C_RA = 0x101B, |
- Mymr_C_YA = 0x101A, |
- Mymr_C_NGA = 0x1004, |
- Mymr_C_VOWEL_E = 0x1031, |
- Mymr_C_VIRAMA = 0x1039 |
-}; |
- |
-enum |
-{ |
- Mymr_xx = Mymr_CC_RESERVED, |
- Mymr_c1 = Mymr_CC_CONSONANT | Mymr_CF_CONSONANT | Mymr_CF_POS_BELOW, |
- Mymr_c2 = Mymr_CC_CONSONANT2 | Mymr_CF_CONSONANT, |
- Mymr_ng = Mymr_CC_NGA | Mymr_CF_CONSONANT | Mymr_CF_POS_ABOVE, |
- Mymr_ya = Mymr_CC_YA | Mymr_CF_CONSONANT | Mymr_CF_MEDIAL | Mymr_CF_POS_AFTER | Mymr_CF_AFTER_KINZI, |
- Mymr_ra = Mymr_CC_RA | Mymr_CF_CONSONANT | Mymr_CF_MEDIAL | Mymr_CF_POS_BEFORE, |
- Mymr_wa = Mymr_CC_WA | Mymr_CF_CONSONANT | Mymr_CF_MEDIAL | Mymr_CF_POS_BELOW, |
- Mymr_ha = Mymr_CC_HA | Mymr_CF_CONSONANT | Mymr_CF_MEDIAL | Mymr_CF_POS_BELOW, |
- Mymr_id = Mymr_CC_IND_VOWEL | Mymr_CF_IND_VOWEL, |
- Mymr_vi = Mymr_CC_VIRAMA | Mymr_CF_VIRAMA | Mymr_CF_POS_ABOVE | Mymr_CF_DOTTED_CIRCLE, |
- Mymr_dl = Mymr_CC_PRE_VOWEL | Mymr_CF_DEP_VOWEL | Mymr_CF_POS_BEFORE | Mymr_CF_DOTTED_CIRCLE | Mymr_CF_AFTER_KINZI, |
- Mymr_db = Mymr_CC_BELOW_VOWEL | Mymr_CF_DEP_VOWEL | Mymr_CF_POS_BELOW | Mymr_CF_DOTTED_CIRCLE | Mymr_CF_AFTER_KINZI, |
- Mymr_da = Mymr_CC_ABOVE_VOWEL | Mymr_CF_DEP_VOWEL | Mymr_CF_POS_ABOVE | Mymr_CF_DOTTED_CIRCLE | Mymr_CF_AFTER_KINZI, |
- Mymr_dr = Mymr_CC_POST_VOWEL | Mymr_CF_DEP_VOWEL | Mymr_CF_POS_AFTER | Mymr_CF_DOTTED_CIRCLE | Mymr_CF_AFTER_KINZI, |
- Mymr_sa = Mymr_CC_SIGN_ABOVE | Mymr_CF_DOTTED_CIRCLE | Mymr_CF_POS_ABOVE | Mymr_CF_AFTER_KINZI, |
- Mymr_sb = Mymr_CC_SIGN_BELOW | Mymr_CF_DOTTED_CIRCLE | Mymr_CF_POS_BELOW | Mymr_CF_AFTER_KINZI, |
- Mymr_sp = Mymr_CC_SIGN_AFTER | Mymr_CF_DOTTED_CIRCLE | Mymr_CF_AFTER_KINZI |
-}; |
- |
- |
-typedef int MymrCharClass; |
- |
- |
-static const MymrCharClass mymrCharClasses[] = |
-{ |
- Mymr_c1, Mymr_c1, Mymr_c1, Mymr_c1, Mymr_ng, Mymr_c1, Mymr_c1, Mymr_c1, |
- Mymr_c1, Mymr_c1, Mymr_c2, Mymr_c1, Mymr_c1, Mymr_c1, Mymr_c1, Mymr_c1, /* 1000 - 100F */ |
- Mymr_c1, Mymr_c1, Mymr_c1, Mymr_c1, Mymr_c1, Mymr_c1, Mymr_c1, Mymr_c1, |
- Mymr_c1, Mymr_c1, Mymr_ya, Mymr_ra, Mymr_c1, Mymr_wa, Mymr_c1, Mymr_ha, /* 1010 - 101F */ |
- Mymr_c2, Mymr_c2, Mymr_xx, Mymr_id, Mymr_id, Mymr_id, Mymr_id, Mymr_id, |
- Mymr_xx, Mymr_id, Mymr_id, Mymr_xx, Mymr_dr, Mymr_da, Mymr_da, Mymr_db, /* 1020 - 102F */ |
- Mymr_db, Mymr_dl, Mymr_da, Mymr_xx, Mymr_xx, Mymr_xx, Mymr_sa, Mymr_sb, |
- Mymr_sp, Mymr_vi, Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, /* 1030 - 103F */ |
- Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, |
- Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, /* 1040 - 104F */ |
- Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, |
- Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, /* 1050 - 105F */ |
-}; |
- |
-static MymrCharClass |
-getMyanmarCharClass (HB_UChar16 ch) |
-{ |
- if (ch == Mymr_C_SIGN_ZWJ) |
- return Mymr_CC_ZERO_WIDTH_J_MARK; |
- |
- if (ch == Mymr_C_SIGN_ZWNJ) |
- return Mymr_CC_ZERO_WIDTH_NJ_MARK; |
- |
- if (ch < 0x1000 || ch > 0x105f) |
- return Mymr_CC_RESERVED; |
- |
- return mymrCharClasses[ch - 0x1000]; |
-} |
- |
-static const signed char mymrStateTable[][Mymr_CC_COUNT] = |
-{ |
-/* xx c1, c2 ng ya ra wa ha id zwnj vi dl db da dr sa sb sp zwj */ |
- { 1, 4, 4, 2, 4, 4, 4, 4, 24, 1, 27, 17, 18, 19, 20, 21, 1, 1, 4}, /* 0 - ground state */ |
- {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, /* 1 - exit state (or sp to the right of the syllable) */ |
- {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3, 17, 18, 19, 20, 21, -1, -1, 4}, /* 2 - NGA */ |
- {-1, 4, 4, 4, 4, 4, 4, 4, -1, 23, -1, -1, -1, -1, -1, -1, -1, -1, -1}, /* 3 - Virama after NGA */ |
- {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5, 17, 18, 19, 20, 21, 1, 1, -1}, /* 4 - Base consonant */ |
- {-2, 6, -2, -2, 7, 8, 9, 10, -2, 23, -2, -2, -2, -2, -2, -2, -2, -2, -2}, /* 5 - First virama */ |
- {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 25, 17, 18, 19, 20, 21, -1, -1, -1}, /* 6 - c1 after virama */ |
- {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 12, 17, 18, 19, 20, 21, -1, -1, -1}, /* 7 - ya after virama */ |
- {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 12, 17, 18, 19, 20, 21, -1, -1, -1}, /* 8 - ra after virama */ |
- {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 12, 17, 18, 19, 20, 21, -1, -1, -1}, /* 9 - wa after virama */ |
- {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 17, 18, 19, 20, 21, -1, -1, -1}, /* 10 - ha after virama */ |
- {-1, -1, -1, -1, 7, 8, 9, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, /* 11 - Virama after NGA+zwj */ |
- {-2, -2, -2, -2, -2, -2, 13, 14, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2}, /* 12 - Second virama */ |
- {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 15, 17, 18, 19, 20, 21, -1, -1, -1}, /* 13 - wa after virama */ |
- {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 17, 18, 19, 20, 21, -1, -1, -1}, /* 14 - ha after virama */ |
- {-2, -2, -2, -2, -2, -2, -2, 16, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2}, /* 15 - Third virama */ |
- {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 17, 18, 19, 20, 21, -1, -1, -1}, /* 16 - ha after virama */ |
- {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 20, 21, 1, 1, -1}, /* 17 - dl, Dependent vowel e */ |
- {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 19, -1, 21, 1, 1, -1}, /* 18 - db, Dependent vowel u,uu */ |
- {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 1, 1, -1}, /* 19 - da, Dependent vowel i,ii,ai */ |
- {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 22, -1, -1, -1, -1, -1, 1, 1, -1}, /* 20 - dr, Dependent vowel aa */ |
- {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 1, -1}, /* 21 - sa, Sign anusvara */ |
- {-1, -1, -1, -1, -1, -1, -1, -1, -1, 23, -1, -1, -1, -1, -1, -1, -1, -1, -1}, /* 22 - atha */ |
- {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 1, -1}, /* 23 - zwnj for atha */ |
- {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, -1}, /* 24 - Independent vowel */ |
- {-2, -2, -2, -2, 26, 26, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2}, /* 25 - Virama after subscript consonant */ |
- {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 12, 17, 18, 19, 20, 21, -1, 1, -1}, /* 26 - ra/ya after subscript consonant + virama */ |
- {-1, 6, -1, -1, 7, 8, 9, 10, -1, 23, -1, -1, -1, -1, -1, -1, -1, -1, -1}, /* 27 - Virama after ground state */ |
-/* exit state -2 is for invalid order of medials and combination of invalids |
- with virama where virama should treat as start of next syllable |
- */ |
-}; |
- |
- |
- |
-/*#define MYANMAR_DEBUG */ |
-#ifdef MYANMAR_DEBUG |
-#define MMDEBUG qDebug |
-#else |
-#define MMDEBUG if(0) printf |
-#endif |
- |
-/* |
-// Given an input string of characters and a location in which to start looking |
-// calculate, using the state table, which one is the last character of the syllable |
-// that starts in the starting position. |
-*/ |
-static int myanmar_nextSyllableBoundary(const HB_UChar16 *s, int start, int end, HB_Bool *invalid) |
-{ |
- const HB_UChar16 *uc = s + start; |
- int state = 0; |
- int pos = start; |
- *invalid = FALSE; |
- |
- while (pos < end) { |
- MymrCharClass charClass = getMyanmarCharClass(*uc); |
- state = mymrStateTable[state][charClass & Mymr_CF_CLASS_MASK]; |
- if (pos == start) |
- *invalid = (HB_Bool)(charClass & Mymr_CF_DOTTED_CIRCLE); |
- |
- MMDEBUG("state[%d]=%d class=%8x (uc=%4x)", pos - start, state, charClass, *uc); |
- |
- if (state < 0) { |
- if (state < -1) |
- --pos; |
- break; |
- } |
- ++uc; |
- ++pos; |
- } |
- return pos; |
-} |
- |
-#ifndef NO_OPENTYPE |
-/* ###### might have to change order of above and below forms and substitutions, |
- but according to Unicode below comes before above */ |
-static const HB_OpenTypeFeature myanmar_features[] = { |
- { HB_MAKE_TAG('p', 'r', 'e', 'f'), PreFormProperty }, |
- { HB_MAKE_TAG('b', 'l', 'w', 'f'), BelowFormProperty }, |
- { HB_MAKE_TAG('a', 'b', 'v', 'f'), AboveFormProperty }, |
- { HB_MAKE_TAG('p', 's', 't', 'f'), PostFormProperty }, |
- { HB_MAKE_TAG('p', 'r', 'e', 's'), PreSubstProperty }, |
- { HB_MAKE_TAG('b', 'l', 'w', 's'), BelowSubstProperty }, |
- { HB_MAKE_TAG('a', 'b', 'v', 's'), AboveSubstProperty }, |
- { HB_MAKE_TAG('p', 's', 't', 's'), PostSubstProperty }, |
- { HB_MAKE_TAG('r', 'l', 'i', 'g'), CligProperty }, /* Myanmar1 uses this instead of the other features */ |
- { 0, 0 } |
-}; |
-#endif |
- |
- |
-/* |
-// Visual order before shaping should be: |
-// |
-// [Vowel Mark E] |
-// [Virama + Medial Ra] |
-// [Base] |
-// [Virama + Consonant] |
-// [Nga + Virama] (Kinzi) ### should probably come before post forms (medial ya) |
-// [Vowels] |
-// [Marks] |
-// |
-// This means that we can keep the logical order apart from having to |
-// move the pre vowel, medial ra and kinzi |
-*/ |
- |
-static HB_Bool myanmar_shape_syllable(HB_Bool openType, HB_ShaperItem *item, HB_Bool invalid) |
-{ |
- /* |
-// MMDEBUG("\nsyllable from %d len %d, str='%s'", item->item.pos, item->item.length, |
-// item->string->mid(item->from, item->length).toUtf8().data()); |
- */ |
- |
-#ifndef NO_OPENTYPE |
- const int availableGlyphs = item->num_glyphs; |
-#endif |
- const HB_UChar16 *uc = item->string + item->item.pos; |
- int vowel_e = -1; |
- int kinzi = -1; |
- int medial_ra = -1; |
- int base = -1; |
- int i; |
- int len = 0; |
- unsigned short reordered[32]; |
- unsigned char properties[32]; |
- enum { |
- AboveForm = 0x01, |
- PreForm = 0x02, |
- PostForm = 0x04, |
- BelowForm = 0x08 |
- }; |
- HB_Bool lastWasVirama = FALSE; |
- int basePos = -1; |
- |
- memset(properties, 0, 32*sizeof(unsigned char)); |
- |
- /* according to the table the max length of a syllable should be around 14 chars */ |
- assert(item->item.length < 32); |
- |
-#ifdef MYANMAR_DEBUG |
- printf("original:"); |
- for (i = 0; i < (int)item->item.length; i++) { |
- printf(" %d: %4x", i, uc[i]); |
- } |
-#endif |
- for (i = 0; i < (int)item->item.length; ++i) { |
- HB_UChar16 chr = uc[i]; |
- |
- if (chr == Mymr_C_VOWEL_E) { |
- vowel_e = i; |
- continue; |
- } |
- if (i == 0 |
- && chr == Mymr_C_NGA |
- && i + 2 < (int)item->item.length |
- && uc[i+1] == Mymr_C_VIRAMA) { |
- int mc = getMyanmarCharClass(uc[i+2]); |
- /*MMDEBUG("maybe kinzi: mc=%x", mc);*/ |
- if ((mc & Mymr_CF_CONSONANT) == Mymr_CF_CONSONANT) { |
- kinzi = i; |
- continue; |
- } |
- } |
- if (base >= 0 |
- && chr == Mymr_C_VIRAMA |
- && i + 1 < (int)item->item.length |
- && uc[i+1] == Mymr_C_RA) { |
- medial_ra = i; |
- continue; |
- } |
- if (base < 0) |
- base = i; |
- } |
- |
- MMDEBUG("\n base=%d, vowel_e=%d, kinzi=%d, medial_ra=%d", base, vowel_e, kinzi, medial_ra); |
- /* write vowel_e if found */ |
- if (vowel_e >= 0) { |
- reordered[0] = Mymr_C_VOWEL_E; |
- len = 1; |
- } |
- /* write medial_ra */ |
- if (medial_ra >= 0) { |
- reordered[len] = Mymr_C_VIRAMA; |
- reordered[len+1] = Mymr_C_RA; |
- properties[len] = PreForm; |
- properties[len+1] = PreForm; |
- len += 2; |
- } |
- |
- /* shall we add a dotted circle? |
- If in the position in which the base should be (first char in the string) there is |
- a character that has the Dotted circle flag (a character that cannot be a base) |
- then write a dotted circle */ |
- if (invalid) { |
- reordered[len] = C_DOTTED_CIRCLE; |
- ++len; |
- } |
- |
- /* copy the rest of the syllable to the output, inserting the kinzi |
- at the correct place */ |
- for (i = 0; i < (int)item->item.length; ++i) { |
- hb_uint16 chr = uc[i]; |
- MymrCharClass cc; |
- if (i == vowel_e) |
- continue; |
- if (i == medial_ra || i == kinzi) { |
- ++i; |
- continue; |
- } |
- |
- cc = getMyanmarCharClass(uc[i]); |
- if (kinzi >= 0 && i > base && (cc & Mymr_CF_AFTER_KINZI)) { |
- reordered[len] = Mymr_C_NGA; |
- reordered[len+1] = Mymr_C_VIRAMA; |
- properties[len-1] = AboveForm; |
- properties[len] = AboveForm; |
- len += 2; |
- kinzi = -1; |
- } |
- |
- if (lastWasVirama) { |
- int prop = 0; |
- switch(cc & Mymr_CF_POS_MASK) { |
- case Mymr_CF_POS_BEFORE: |
- prop = PreForm; |
- break; |
- case Mymr_CF_POS_BELOW: |
- prop = BelowForm; |
- break; |
- case Mymr_CF_POS_ABOVE: |
- prop = AboveForm; |
- break; |
- case Mymr_CF_POS_AFTER: |
- prop = PostForm; |
- break; |
- default: |
- break; |
- } |
- properties[len-1] = prop; |
- properties[len] = prop; |
- if(basePos >= 0 && basePos == len-2) |
- properties[len-2] = prop; |
- } |
- lastWasVirama = (chr == Mymr_C_VIRAMA); |
- if(i == base) |
- basePos = len; |
- |
- if ((chr != Mymr_C_SIGN_ZWNJ && chr != Mymr_C_SIGN_ZWJ) || !len) { |
- reordered[len] = chr; |
- ++len; |
- } |
- } |
- if (kinzi >= 0) { |
- reordered[len] = Mymr_C_NGA; |
- reordered[len+1] = Mymr_C_VIRAMA; |
- properties[len] = AboveForm; |
- properties[len+1] = AboveForm; |
- len += 2; |
- } |
- |
- if (!item->font->klass->convertStringToGlyphIndices(item->font, |
- reordered, len, |
- item->glyphs, &item->num_glyphs, |
- item->item.bidiLevel % 2)) |
- return FALSE; |
- |
- MMDEBUG("after shaping: len=%d", len); |
- for (i = 0; i < len; i++) { |
- item->attributes[i].mark = FALSE; |
- item->attributes[i].clusterStart = FALSE; |
- item->attributes[i].justification = 0; |
- item->attributes[i].zeroWidth = FALSE; |
- MMDEBUG(" %d: %4x property=%x", i, reordered[i], properties[i]); |
- } |
- |
- /* now we have the syllable in the right order, and can start running it through open type. */ |
- |
-#ifndef NO_OPENTYPE |
- if (openType) { |
- unsigned short logClusters[32]; |
- hb_uint32 where[32]; |
- |
- for (i = 0; i < len; ++i) |
- logClusters[i] = i; |
- |
- for (i = 0; i < len; ++i) { |
- where[i] = ~(PreSubstProperty |
- | BelowSubstProperty |
- | AboveSubstProperty |
- | PostSubstProperty |
- | CligProperty |
- | PositioningProperties); |
- if (properties[i] & PreForm) |
- where[i] &= ~PreFormProperty; |
- if (properties[i] & BelowForm) |
- where[i] &= ~BelowFormProperty; |
- if (properties[i] & AboveForm) |
- where[i] &= ~AboveFormProperty; |
- if (properties[i] & PostForm) |
- where[i] &= ~PostFormProperty; |
- } |
- |
- HB_OpenTypeShape(item, where); |
- if (!HB_OpenTypePosition(item, availableGlyphs, /*doLogClusters*/FALSE)) |
- return FALSE; |
- } else |
-#endif |
- { |
- MMDEBUG("Not using openType"); |
- HB_HeuristicPosition(item); |
- } |
- |
- item->attributes[0].clusterStart = TRUE; |
- return TRUE; |
-} |
- |
-HB_Bool HB_MyanmarShape(HB_ShaperItem *item) |
-{ |
- HB_Bool openType = FALSE; |
- unsigned short *logClusters = item->log_clusters; |
- |
- HB_ShaperItem syllable = *item; |
- int first_glyph = 0; |
- |
- int sstart = item->item.pos; |
- int end = sstart + item->item.length; |
- int i = 0; |
- |
- assert(item->item.script == HB_Script_Myanmar); |
-#ifndef NO_OPENTYPE |
- openType = HB_SelectScript(item, myanmar_features); |
-#endif |
- |
- MMDEBUG("myanmar_shape: from %d length %d", item->item.pos, item->item.length); |
- while (sstart < end) { |
- HB_Bool invalid; |
- int send = myanmar_nextSyllableBoundary(item->string, sstart, end, &invalid); |
- MMDEBUG("syllable from %d, length %d, invalid=%s", sstart, send-sstart, |
- invalid ? "TRUE" : "FALSE"); |
- syllable.item.pos = sstart; |
- syllable.item.length = send-sstart; |
- syllable.glyphs = item->glyphs + first_glyph; |
- syllable.attributes = item->attributes + first_glyph; |
- syllable.advances = item->advances + first_glyph; |
- syllable.offsets = item->offsets + first_glyph; |
- syllable.num_glyphs = item->num_glyphs - first_glyph; |
- if (!myanmar_shape_syllable(openType, &syllable, invalid)) { |
- MMDEBUG("syllable shaping failed, syllable requests %d glyphs", syllable.num_glyphs); |
- item->num_glyphs += syllable.num_glyphs; |
- return FALSE; |
- } |
- |
- /* fix logcluster array */ |
- MMDEBUG("syllable:"); |
- for (i = first_glyph; i < first_glyph + (int)syllable.num_glyphs; ++i) |
- MMDEBUG(" %d -> glyph %x", i, item->glyphs[i]); |
- MMDEBUG(" logclusters:"); |
- for (i = sstart; i < send; ++i) { |
- MMDEBUG(" %d -> glyph %d", i, first_glyph); |
- logClusters[i-item->item.pos] = first_glyph; |
- } |
- sstart = send; |
- first_glyph += syllable.num_glyphs; |
- } |
- item->num_glyphs = first_glyph; |
- return TRUE; |
-} |
- |
-void HB_MyanmarAttributes(HB_Script script, const HB_UChar16 *text, hb_uint32 from, hb_uint32 len, HB_CharAttributes *attributes) |
-{ |
- int end = from + len; |
- const HB_UChar16 *uc = text + from; |
- hb_uint32 i = 0; |
- HB_UNUSED(script); |
- attributes += from; |
- while (i < len) { |
- HB_Bool invalid; |
- hb_uint32 boundary = myanmar_nextSyllableBoundary(text, from+i, end, &invalid) - from; |
- |
- attributes[i].charStop = TRUE; |
- if (i) |
- attributes[i-1].lineBreakType = HB_Break; |
- |
- if (boundary > len-1) |
- boundary = len; |
- i++; |
- while (i < boundary) { |
- attributes[i].charStop = FALSE; |
- ++uc; |
- ++i; |
- } |
- assert(i == boundary); |
- } |
-} |
- |