Index: third_party/harfbuzz/src/harfbuzz-hangul.c |
diff --git a/third_party/harfbuzz/src/harfbuzz-hangul.c b/third_party/harfbuzz/src/harfbuzz-hangul.c |
deleted file mode 100644 |
index a819dacf7fc16bb8d830a6476a9e0c6baeb99d5a..0000000000000000000000000000000000000000 |
--- a/third_party/harfbuzz/src/harfbuzz-hangul.c |
+++ /dev/null |
@@ -1,268 +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> |
- |
-/* |
-// Hangul is a syllable based script. Unicode reserves a large range |
-// for precomposed hangul, where syllables are already precomposed to |
-// their final glyph shape. In addition, a so called jamo range is |
-// defined, that can be used to express old Hangul. Modern hangul |
-// syllables can also be expressed as jamo, and should be composed |
-// into syllables. The operation is rather simple and mathematical. |
- |
-// Every hangul jamo is classified as being either a Leading consonant |
-// (L), and intermediat Vowel (V) or a trailing consonant (T). Modern |
-// hangul syllables (the ones in the precomposed area can be of type |
-// LV or LVT. |
-// |
-// Syllable breaks do _not_ occur between: |
-// |
-// L L, V or precomposed |
-// V, LV V, T |
-// LVT, T T |
-// |
-// A standard syllable is of the form L+V+T*. The above rules allow |
-// nonstandard syllables L*V*T*. To transform them into standard |
-// syllables fill characters L_f and V_f can be inserted. |
-*/ |
- |
-enum { |
- Hangul_SBase = 0xac00, |
- Hangul_LBase = 0x1100, |
- Hangul_VBase = 0x1161, |
- Hangul_TBase = 0x11a7, |
- Hangul_SCount = 11172, |
- Hangul_LCount = 19, |
- Hangul_VCount = 21, |
- Hangul_TCount = 28, |
- Hangul_NCount = 21*28 |
-}; |
- |
-#define hangul_isPrecomposed(uc) \ |
- (uc >= Hangul_SBase && uc < Hangul_SBase + Hangul_SCount) |
- |
-#define hangul_isLV(uc) \ |
- ((uc - Hangul_SBase) % Hangul_TCount == 0) |
- |
-typedef enum { |
- L, |
- V, |
- T, |
- LV, |
- LVT, |
- X |
-} HangulType; |
- |
-static HangulType hangul_type(unsigned short uc) { |
- if (uc > Hangul_SBase && uc < Hangul_SBase + Hangul_SCount) |
- return hangul_isLV(uc) ? LV : LVT; |
- if (uc < Hangul_LBase || uc > 0x11ff) |
- return X; |
- if (uc < Hangul_VBase) |
- return L; |
- if (uc < Hangul_TBase) |
- return V; |
- return T; |
-} |
- |
-static int hangul_nextSyllableBoundary(const HB_UChar16 *s, int start, int end) |
-{ |
- const HB_UChar16 *uc = s + start; |
- |
- HangulType state = hangul_type(*uc); |
- int pos = 1; |
- |
- while (pos < end - start) { |
- HangulType newState = hangul_type(uc[pos]); |
- switch(newState) { |
- case X: |
- goto finish; |
- case L: |
- case V: |
- case T: |
- if (state > newState) |
- goto finish; |
- state = newState; |
- break; |
- case LV: |
- if (state > L) |
- goto finish; |
- state = V; |
- break; |
- case LVT: |
- if (state > L) |
- goto finish; |
- state = T; |
- } |
- ++pos; |
- } |
- |
- finish: |
- return start+pos; |
-} |
- |
-#ifndef NO_OPENTYPE |
-static const HB_OpenTypeFeature hangul_features [] = { |
- { HB_MAKE_TAG('c', 'c', 'm', 'p'), CcmpProperty }, |
- { HB_MAKE_TAG('l', 'j', 'm', 'o'), CcmpProperty }, |
- { HB_MAKE_TAG('j', 'j', 'm', 'o'), CcmpProperty }, |
- { HB_MAKE_TAG('t', 'j', 'm', 'o'), CcmpProperty }, |
- { 0, 0 } |
-}; |
-#endif |
- |
-static HB_Bool hangul_shape_syllable(HB_ShaperItem *item, HB_Bool openType) |
-{ |
- const HB_UChar16 *ch = item->string + item->item.pos; |
- int len = item->item.length; |
-#ifndef NO_OPENTYPE |
- const int availableGlyphs = item->num_glyphs; |
-#endif |
- |
- int i; |
- HB_UChar16 composed = 0; |
- /* see if we can compose the syllable into a modern hangul */ |
- if (item->item.length == 2) { |
- int LIndex = ch[0] - Hangul_LBase; |
- int VIndex = ch[1] - Hangul_VBase; |
- if (LIndex >= 0 && LIndex < Hangul_LCount && |
- VIndex >= 0 && VIndex < Hangul_VCount) |
- composed = (LIndex * Hangul_VCount + VIndex) * Hangul_TCount + Hangul_SBase; |
- } else if (item->item.length == 3) { |
- int LIndex = ch[0] - Hangul_LBase; |
- int VIndex = ch[1] - Hangul_VBase; |
- int TIndex = ch[2] - Hangul_TBase; |
- if (LIndex >= 0 && LIndex < Hangul_LCount && |
- VIndex >= 0 && VIndex < Hangul_VCount && |
- TIndex >= 0 && TIndex < Hangul_TCount) |
- composed = (LIndex * Hangul_VCount + VIndex) * Hangul_TCount + TIndex + Hangul_SBase; |
- } |
- |
- |
- |
- /* if we have a modern hangul use the composed form */ |
- if (composed) { |
- ch = &composed; |
- len = 1; |
- } |
- |
- if (!item->font->klass->convertStringToGlyphIndices(item->font, |
- ch, len, |
- item->glyphs, &item->num_glyphs, |
- item->item.bidiLevel % 2)) |
- return FALSE; |
- 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; |
- /*IDEBUG(" %d: %4x", i, ch[i].unicode()); */ |
- } |
- |
-#ifndef NO_OPENTYPE |
- if (!composed && openType) { |
- HB_Bool positioned; |
- |
- HB_STACKARRAY(unsigned short, logClusters, len); |
- for (i = 0; i < len; ++i) |
- logClusters[i] = i; |
- item->log_clusters = logClusters; |
- |
- HB_OpenTypeShape(item, /*properties*/0); |
- |
- positioned = HB_OpenTypePosition(item, availableGlyphs, /*doLogClusters*/FALSE); |
- |
- HB_FREE_STACKARRAY(logClusters); |
- |
- if (!positioned) |
- return FALSE; |
- } else { |
- HB_HeuristicPosition(item); |
- } |
-#endif |
- |
- item->attributes[0].clusterStart = TRUE; |
- return TRUE; |
-} |
- |
-HB_Bool HB_HangulShape(HB_ShaperItem *item) |
-{ |
- const HB_UChar16 *uc = item->string + item->item.pos; |
- HB_Bool allPrecomposed = TRUE; |
- int i; |
- |
- assert(item->item.script == HB_Script_Hangul); |
- |
- for (i = 0; i < (int)item->item.length; ++i) { |
- if (!hangul_isPrecomposed(uc[i])) { |
- allPrecomposed = FALSE; |
- break; |
- } |
- } |
- |
- if (!allPrecomposed) { |
- HB_Bool openType = FALSE; |
- unsigned short *logClusters = item->log_clusters; |
- HB_ShaperItem syllable; |
- int first_glyph = 0; |
- int sstart = item->item.pos; |
- int end = sstart + item->item.length; |
- |
-#ifndef NO_OPENTYPE |
- openType = HB_SelectScript(item, hangul_features); |
-#endif |
- syllable = *item; |
- |
- while (sstart < end) { |
- int send = hangul_nextSyllableBoundary(item->string, sstart, end); |
- |
- 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 (!hangul_shape_syllable(&syllable, openType)) { |
- 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; |
- } |
- |
- return HB_BasicShape(item); |
-} |
- |
- |