Index: third_party/harfbuzz/src/harfbuzz-tibetan.c |
diff --git a/third_party/harfbuzz/src/harfbuzz-tibetan.c b/third_party/harfbuzz/src/harfbuzz-tibetan.c |
deleted file mode 100644 |
index bfa31b1defa9c597420cef9756842e4cc556f174..0000000000000000000000000000000000000000 |
--- a/third_party/harfbuzz/src/harfbuzz-tibetan.c |
+++ /dev/null |
@@ -1,274 +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> |
- |
-/* |
- tibetan syllables are of the form: |
- head position consonant |
- first sub-joined consonant |
- ....intermediate sub-joined consonants (if any) |
- last sub-joined consonant |
- sub-joined vowel (a-chung U+0F71) |
- standard or compound vowel sign (or 'virama' for devanagari transliteration) |
-*/ |
- |
-typedef enum { |
- TibetanOther, |
- TibetanHeadConsonant, |
- TibetanSubjoinedConsonant, |
- TibetanSubjoinedVowel, |
- TibetanVowel |
-} TibetanForm; |
- |
-/* this table starts at U+0f40 */ |
-static const unsigned char tibetanForm[0x80] = { |
- TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant, |
- TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant, |
- TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant, |
- TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant, |
- |
- TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant, |
- TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant, |
- TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant, |
- TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant, |
- |
- TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant, |
- TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant, |
- TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant, |
- TibetanOther, TibetanOther, TibetanOther, TibetanOther, |
- |
- TibetanOther, TibetanVowel, TibetanVowel, TibetanVowel, |
- TibetanVowel, TibetanVowel, TibetanVowel, TibetanVowel, |
- TibetanVowel, TibetanVowel, TibetanVowel, TibetanVowel, |
- TibetanVowel, TibetanVowel, TibetanVowel, TibetanVowel, |
- |
- TibetanVowel, TibetanVowel, TibetanVowel, TibetanVowel, |
- TibetanVowel, TibetanVowel, TibetanVowel, TibetanVowel, |
- TibetanOther, TibetanOther, TibetanOther, TibetanOther, |
- TibetanOther, TibetanOther, TibetanOther, TibetanOther, |
- |
- TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, |
- TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, |
- TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, |
- TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, |
- |
- TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, |
- TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, |
- TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, |
- TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, |
- |
- TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, |
- TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, |
- TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, |
- TibetanSubjoinedConsonant, TibetanOther, TibetanOther, TibetanOther |
-}; |
- |
- |
-#define tibetan_form(c) \ |
- (TibetanForm)tibetanForm[c - 0x0f40] |
- |
-static const HB_OpenTypeFeature tibetan_features[] = { |
- { HB_MAKE_TAG('c', 'c', 'm', 'p'), CcmpProperty }, |
- { HB_MAKE_TAG('a', 'b', 'v', 's'), AboveSubstProperty }, |
- { HB_MAKE_TAG('b', 'l', 'w', 's'), BelowSubstProperty }, |
- { HB_MAKE_TAG('c', 'a', 'l', 't'), CaltProperty }, |
- {0, 0} |
-}; |
- |
-static HB_Bool tibetan_shape_syllable(HB_Bool openType, HB_ShaperItem *item, HB_Bool invalid) |
-{ |
- hb_uint32 i; |
- const HB_UChar16 *str = item->string + item->item.pos; |
- int len = item->item.length; |
-#ifndef NO_OPENTYPE |
- const int availableGlyphs = item->num_glyphs; |
-#endif |
- HB_Bool haveGlyphs; |
- HB_STACKARRAY(HB_UChar16, reordered, len + 4); |
- |
- if (item->num_glyphs < item->item.length + 4) { |
- item->num_glyphs = item->item.length + 4; |
- return FALSE; |
- } |
- |
- if (invalid) { |
- *reordered = 0x25cc; |
- memcpy(reordered+1, str, len*sizeof(HB_UChar16)); |
- len++; |
- str = reordered; |
- } |
- |
- haveGlyphs = item->font->klass->convertStringToGlyphIndices(item->font, |
- str, len, |
- item->glyphs, &item->num_glyphs, |
- item->item.bidiLevel % 2); |
- |
- HB_FREE_STACKARRAY(reordered); |
- |
- if (!haveGlyphs) |
- return FALSE; |
- |
- for (i = 0; i < item->item.length; i++) { |
- item->attributes[i].mark = FALSE; |
- item->attributes[i].clusterStart = FALSE; |
- item->attributes[i].justification = 0; |
- item->attributes[i].zeroWidth = FALSE; |
-/* IDEBUG(" %d: %4x", i, str[i]); */ |
- } |
- |
- /* now we have the syllable in the right order, and can start running it through open type. */ |
- |
-#ifndef NO_OPENTYPE |
- if (openType) { |
- HB_OpenTypeShape(item, /*properties*/0); |
- if (!HB_OpenTypePosition(item, availableGlyphs, /*doLogClusters*/FALSE)) |
- return FALSE; |
- } else { |
- HB_HeuristicPosition(item); |
- } |
-#endif |
- |
- item->attributes[0].clusterStart = TRUE; |
- return TRUE; |
-} |
- |
- |
-static int tibetan_nextSyllableBoundary(const HB_UChar16 *s, int start, int end, HB_Bool *invalid) |
-{ |
- const HB_UChar16 *uc = s + start; |
- |
- int pos = 0; |
- TibetanForm state = tibetan_form(*uc); |
- |
-/* qDebug("state[%d]=%d (uc=%4x)", pos, state, uc[pos]);*/ |
- pos++; |
- |
- if (state != TibetanHeadConsonant) { |
- if (state != TibetanOther) |
- *invalid = TRUE; |
- goto finish; |
- } |
- |
- while (pos < end - start) { |
- TibetanForm newState = tibetan_form(uc[pos]); |
- switch(newState) { |
- case TibetanSubjoinedConsonant: |
- case TibetanSubjoinedVowel: |
- if (state != TibetanHeadConsonant && |
- state != TibetanSubjoinedConsonant) |
- goto finish; |
- state = newState; |
- break; |
- case TibetanVowel: |
- if (state != TibetanHeadConsonant && |
- state != TibetanSubjoinedConsonant && |
- state != TibetanSubjoinedVowel) |
- goto finish; |
- break; |
- case TibetanOther: |
- case TibetanHeadConsonant: |
- goto finish; |
- } |
- pos++; |
- } |
- |
-finish: |
- *invalid = FALSE; |
- return start+pos; |
-} |
- |
-HB_Bool HB_TibetanShape(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; |
- |
- assert(item->item.script == HB_Script_Tibetan); |
- |
-#ifndef QT_NO_OPENTYPE |
- openType = HB_SelectScript(item, tibetan_features); |
-#endif |
- |
- while (sstart < end) { |
- HB_Bool invalid; |
- int i; |
- int send = tibetan_nextSyllableBoundary(item->string, sstart, end, &invalid); |
-/* IDEBUG("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.offsets = item->offsets + first_glyph; |
- syllable.advances = item->advances + first_glyph; |
- syllable.num_glyphs = item->num_glyphs - first_glyph; |
- if (!tibetan_shape_syllable(openType, &syllable, invalid)) { |
- item->num_glyphs += syllable.num_glyphs; |
- return FALSE; |
- } |
- /* fix logcluster array */ |
- for (i = sstart; i < send; ++i) |
- logClusters[i-item->item.pos] = first_glyph; |
- sstart = send; |
- first_glyph += syllable.num_glyphs; |
- } |
- item->num_glyphs = first_glyph; |
- return TRUE; |
-} |
- |
-void HB_TibetanAttributes(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 = tibetan_nextSyllableBoundary(text, from+i, end, &invalid) - from; |
- |
- attributes[i].charStop = TRUE; |
- |
- if (boundary > len-1) boundary = len; |
- i++; |
- while (i < boundary) { |
- attributes[i].charStop = FALSE; |
- ++uc; |
- ++i; |
- } |
- assert(i == boundary); |
- } |
-} |
- |
- |