1*2d1272b8SAndroid Build Coastguard Worker /* 2*2d1272b8SAndroid Build Coastguard Worker * Copyright © 2009 Red Hat, Inc. 3*2d1272b8SAndroid Build Coastguard Worker * Copyright © 2011 Codethink Limited 4*2d1272b8SAndroid Build Coastguard Worker * Copyright © 2010,2011,2012 Google, Inc. 5*2d1272b8SAndroid Build Coastguard Worker * 6*2d1272b8SAndroid Build Coastguard Worker * This is part of HarfBuzz, a text shaping library. 7*2d1272b8SAndroid Build Coastguard Worker * 8*2d1272b8SAndroid Build Coastguard Worker * Permission is hereby granted, without written agreement and without 9*2d1272b8SAndroid Build Coastguard Worker * license or royalty fees, to use, copy, modify, and distribute this 10*2d1272b8SAndroid Build Coastguard Worker * software and its documentation for any purpose, provided that the 11*2d1272b8SAndroid Build Coastguard Worker * above copyright notice and the following two paragraphs appear in 12*2d1272b8SAndroid Build Coastguard Worker * all copies of this software. 13*2d1272b8SAndroid Build Coastguard Worker * 14*2d1272b8SAndroid Build Coastguard Worker * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR 15*2d1272b8SAndroid Build Coastguard Worker * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES 16*2d1272b8SAndroid Build Coastguard Worker * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN 17*2d1272b8SAndroid Build Coastguard Worker * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH 18*2d1272b8SAndroid Build Coastguard Worker * DAMAGE. 19*2d1272b8SAndroid Build Coastguard Worker * 20*2d1272b8SAndroid Build Coastguard Worker * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, 21*2d1272b8SAndroid Build Coastguard Worker * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND 22*2d1272b8SAndroid Build Coastguard Worker * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS 23*2d1272b8SAndroid Build Coastguard Worker * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO 24*2d1272b8SAndroid Build Coastguard Worker * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. 25*2d1272b8SAndroid Build Coastguard Worker * 26*2d1272b8SAndroid Build Coastguard Worker * Red Hat Author(s): Behdad Esfahbod 27*2d1272b8SAndroid Build Coastguard Worker * Codethink Author(s): Ryan Lortie 28*2d1272b8SAndroid Build Coastguard Worker * Google Author(s): Behdad Esfahbod 29*2d1272b8SAndroid Build Coastguard Worker */ 30*2d1272b8SAndroid Build Coastguard Worker 31*2d1272b8SAndroid Build Coastguard Worker #ifndef HB_UNICODE_HH 32*2d1272b8SAndroid Build Coastguard Worker #define HB_UNICODE_HH 33*2d1272b8SAndroid Build Coastguard Worker 34*2d1272b8SAndroid Build Coastguard Worker #include "hb.hh" 35*2d1272b8SAndroid Build Coastguard Worker 36*2d1272b8SAndroid Build Coastguard Worker 37*2d1272b8SAndroid Build Coastguard Worker extern HB_INTERNAL const uint8_t _hb_modified_combining_class[256]; 38*2d1272b8SAndroid Build Coastguard Worker 39*2d1272b8SAndroid Build Coastguard Worker /* 40*2d1272b8SAndroid Build Coastguard Worker * hb_unicode_funcs_t 41*2d1272b8SAndroid Build Coastguard Worker */ 42*2d1272b8SAndroid Build Coastguard Worker 43*2d1272b8SAndroid Build Coastguard Worker #define HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS \ 44*2d1272b8SAndroid Build Coastguard Worker HB_UNICODE_FUNC_IMPLEMENT (combining_class) \ 45*2d1272b8SAndroid Build Coastguard Worker HB_IF_NOT_DEPRECATED (HB_UNICODE_FUNC_IMPLEMENT (eastasian_width)) \ 46*2d1272b8SAndroid Build Coastguard Worker HB_UNICODE_FUNC_IMPLEMENT (general_category) \ 47*2d1272b8SAndroid Build Coastguard Worker HB_UNICODE_FUNC_IMPLEMENT (mirroring) \ 48*2d1272b8SAndroid Build Coastguard Worker HB_UNICODE_FUNC_IMPLEMENT (script) \ 49*2d1272b8SAndroid Build Coastguard Worker HB_UNICODE_FUNC_IMPLEMENT (compose) \ 50*2d1272b8SAndroid Build Coastguard Worker HB_UNICODE_FUNC_IMPLEMENT (decompose) \ 51*2d1272b8SAndroid Build Coastguard Worker HB_IF_NOT_DEPRECATED (HB_UNICODE_FUNC_IMPLEMENT (decompose_compatibility)) \ 52*2d1272b8SAndroid Build Coastguard Worker /* ^--- Add new callbacks here */ 53*2d1272b8SAndroid Build Coastguard Worker 54*2d1272b8SAndroid Build Coastguard Worker /* Simple callbacks are those taking a hb_codepoint_t and returning a hb_codepoint_t */ 55*2d1272b8SAndroid Build Coastguard Worker #define HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS_SIMPLE \ 56*2d1272b8SAndroid Build Coastguard Worker HB_UNICODE_FUNC_IMPLEMENT (hb_unicode_combining_class_t, combining_class) \ 57*2d1272b8SAndroid Build Coastguard Worker HB_IF_NOT_DEPRECATED (HB_UNICODE_FUNC_IMPLEMENT (unsigned int, eastasian_width)) \ 58*2d1272b8SAndroid Build Coastguard Worker HB_UNICODE_FUNC_IMPLEMENT (hb_unicode_general_category_t, general_category) \ 59*2d1272b8SAndroid Build Coastguard Worker HB_UNICODE_FUNC_IMPLEMENT (hb_codepoint_t, mirroring) \ 60*2d1272b8SAndroid Build Coastguard Worker HB_UNICODE_FUNC_IMPLEMENT (hb_script_t, script) \ 61*2d1272b8SAndroid Build Coastguard Worker /* ^--- Add new simple callbacks here */ 62*2d1272b8SAndroid Build Coastguard Worker 63*2d1272b8SAndroid Build Coastguard Worker struct hb_unicode_funcs_t 64*2d1272b8SAndroid Build Coastguard Worker { 65*2d1272b8SAndroid Build Coastguard Worker hb_object_header_t header; 66*2d1272b8SAndroid Build Coastguard Worker 67*2d1272b8SAndroid Build Coastguard Worker hb_unicode_funcs_t *parent; 68*2d1272b8SAndroid Build Coastguard Worker 69*2d1272b8SAndroid Build Coastguard Worker #define HB_UNICODE_FUNC_IMPLEMENT(return_type, name) \ 70*2d1272b8SAndroid Build Coastguard Worker return_type name (hb_codepoint_t unicode) { return func.name (this, unicode, user_data.name); } 71*2d1272b8SAndroid Build Coastguard Worker HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS_SIMPLE 72*2d1272b8SAndroid Build Coastguard Worker #undef HB_UNICODE_FUNC_IMPLEMENT 73*2d1272b8SAndroid Build Coastguard Worker composehb_unicode_funcs_t74*2d1272b8SAndroid Build Coastguard Worker hb_bool_t compose (hb_codepoint_t a, hb_codepoint_t b, 75*2d1272b8SAndroid Build Coastguard Worker hb_codepoint_t *ab) 76*2d1272b8SAndroid Build Coastguard Worker { 77*2d1272b8SAndroid Build Coastguard Worker *ab = 0; 78*2d1272b8SAndroid Build Coastguard Worker if (unlikely (!a || !b)) return false; 79*2d1272b8SAndroid Build Coastguard Worker return func.compose (this, a, b, ab, user_data.compose); 80*2d1272b8SAndroid Build Coastguard Worker } 81*2d1272b8SAndroid Build Coastguard Worker decomposehb_unicode_funcs_t82*2d1272b8SAndroid Build Coastguard Worker hb_bool_t decompose (hb_codepoint_t ab, 83*2d1272b8SAndroid Build Coastguard Worker hb_codepoint_t *a, hb_codepoint_t *b) 84*2d1272b8SAndroid Build Coastguard Worker { 85*2d1272b8SAndroid Build Coastguard Worker *a = ab; *b = 0; 86*2d1272b8SAndroid Build Coastguard Worker return func.decompose (this, ab, a, b, user_data.decompose); 87*2d1272b8SAndroid Build Coastguard Worker } 88*2d1272b8SAndroid Build Coastguard Worker decompose_compatibilityhb_unicode_funcs_t89*2d1272b8SAndroid Build Coastguard Worker unsigned int decompose_compatibility (hb_codepoint_t u, 90*2d1272b8SAndroid Build Coastguard Worker hb_codepoint_t *decomposed) 91*2d1272b8SAndroid Build Coastguard Worker { 92*2d1272b8SAndroid Build Coastguard Worker #ifdef HB_DISABLE_DEPRECATED 93*2d1272b8SAndroid Build Coastguard Worker unsigned int ret = 0; 94*2d1272b8SAndroid Build Coastguard Worker #else 95*2d1272b8SAndroid Build Coastguard Worker unsigned int ret = func.decompose_compatibility (this, u, decomposed, user_data.decompose_compatibility); 96*2d1272b8SAndroid Build Coastguard Worker #endif 97*2d1272b8SAndroid Build Coastguard Worker if (ret == 1 && u == decomposed[0]) { 98*2d1272b8SAndroid Build Coastguard Worker decomposed[0] = 0; 99*2d1272b8SAndroid Build Coastguard Worker return 0; 100*2d1272b8SAndroid Build Coastguard Worker } 101*2d1272b8SAndroid Build Coastguard Worker decomposed[ret] = 0; 102*2d1272b8SAndroid Build Coastguard Worker return ret; 103*2d1272b8SAndroid Build Coastguard Worker } 104*2d1272b8SAndroid Build Coastguard Worker 105*2d1272b8SAndroid Build Coastguard Worker unsigned int modified_combining_classhb_unicode_funcs_t106*2d1272b8SAndroid Build Coastguard Worker modified_combining_class (hb_codepoint_t u) 107*2d1272b8SAndroid Build Coastguard Worker { 108*2d1272b8SAndroid Build Coastguard Worker /* Reorder SAKOT to ensure it comes after any tone marks. */ 109*2d1272b8SAndroid Build Coastguard Worker if (unlikely (u == 0x1A60u)) return 254; 110*2d1272b8SAndroid Build Coastguard Worker /* Reorder PADMA to ensure it comes after any vowel marks. */ 111*2d1272b8SAndroid Build Coastguard Worker if (unlikely (u == 0x0FC6u)) return 254; 112*2d1272b8SAndroid Build Coastguard Worker /* Reorder TSA -PHRU to reorder before U+0F74 */ 113*2d1272b8SAndroid Build Coastguard Worker if (unlikely (u == 0x0F39u)) return 127; 114*2d1272b8SAndroid Build Coastguard Worker 115*2d1272b8SAndroid Build Coastguard Worker return _hb_modified_combining_class[combining_class (u)]; 116*2d1272b8SAndroid Build Coastguard Worker } 117*2d1272b8SAndroid Build Coastguard Worker 118*2d1272b8SAndroid Build Coastguard Worker static hb_bool_t is_variation_selectorhb_unicode_funcs_t119*2d1272b8SAndroid Build Coastguard Worker is_variation_selector (hb_codepoint_t unicode) 120*2d1272b8SAndroid Build Coastguard Worker { 121*2d1272b8SAndroid Build Coastguard Worker /* U+180B..180D, U+180F MONGOLIAN FREE VARIATION SELECTORs are handled in the 122*2d1272b8SAndroid Build Coastguard Worker * Arabic shaper. No need to match them here. */ 123*2d1272b8SAndroid Build Coastguard Worker return unlikely (hb_in_ranges<hb_codepoint_t> (unicode, 124*2d1272b8SAndroid Build Coastguard Worker 0xFE00u, 0xFE0Fu, /* VARIATION SELECTOR-1..16 */ 125*2d1272b8SAndroid Build Coastguard Worker 0xE0100u, 0xE01EFu)); /* VARIATION SELECTOR-17..256 */ 126*2d1272b8SAndroid Build Coastguard Worker } 127*2d1272b8SAndroid Build Coastguard Worker 128*2d1272b8SAndroid Build Coastguard Worker /* Default_Ignorable codepoints: 129*2d1272b8SAndroid Build Coastguard Worker * 130*2d1272b8SAndroid Build Coastguard Worker * Note: While U+115F, U+1160, U+3164 and U+FFA0 are Default_Ignorable, 131*2d1272b8SAndroid Build Coastguard Worker * we do NOT want to hide them, as the way Uniscribe has implemented them 132*2d1272b8SAndroid Build Coastguard Worker * is with regular spacing glyphs, and that's the way fonts are made to work. 133*2d1272b8SAndroid Build Coastguard Worker * As such, we make exceptions for those four. 134*2d1272b8SAndroid Build Coastguard Worker * Also ignoring U+1BCA0..1BCA3. https://github.com/harfbuzz/harfbuzz/issues/503 135*2d1272b8SAndroid Build Coastguard Worker * 136*2d1272b8SAndroid Build Coastguard Worker * Unicode 14.0: 137*2d1272b8SAndroid Build Coastguard Worker * $ grep '; Default_Ignorable_Code_Point ' DerivedCoreProperties.txt | sed 's/;.*#/#/' 138*2d1272b8SAndroid Build Coastguard Worker * 00AD # Cf SOFT HYPHEN 139*2d1272b8SAndroid Build Coastguard Worker * 034F # Mn COMBINING GRAPHEME JOINER 140*2d1272b8SAndroid Build Coastguard Worker * 061C # Cf ARABIC LETTER MARK 141*2d1272b8SAndroid Build Coastguard Worker * 115F..1160 # Lo [2] HANGUL CHOSEONG FILLER..HANGUL JUNGSEONG FILLER 142*2d1272b8SAndroid Build Coastguard Worker * 17B4..17B5 # Mn [2] KHMER VOWEL INHERENT AQ..KHMER VOWEL INHERENT AA 143*2d1272b8SAndroid Build Coastguard Worker * 180B..180D # Mn [3] MONGOLIAN FREE VARIATION SELECTOR ONE..MONGOLIAN FREE VARIATION SELECTOR THREE 144*2d1272b8SAndroid Build Coastguard Worker * 180E # Cf MONGOLIAN VOWEL SEPARATOR 145*2d1272b8SAndroid Build Coastguard Worker * 180F # Mn MONGOLIAN FREE VARIATION SELECTOR FOUR 146*2d1272b8SAndroid Build Coastguard Worker * 200B..200F # Cf [5] ZERO WIDTH SPACE..RIGHT-TO-LEFT MARK 147*2d1272b8SAndroid Build Coastguard Worker * 202A..202E # Cf [5] LEFT-TO-RIGHT EMBEDDING..RIGHT-TO-LEFT OVERRIDE 148*2d1272b8SAndroid Build Coastguard Worker * 2060..2064 # Cf [5] WORD JOINER..INVISIBLE PLUS 149*2d1272b8SAndroid Build Coastguard Worker * 2065 # Cn <reserved-2065> 150*2d1272b8SAndroid Build Coastguard Worker * 2066..206F # Cf [10] LEFT-TO-RIGHT ISOLATE..NOMINAL DIGIT SHAPES 151*2d1272b8SAndroid Build Coastguard Worker * 3164 # Lo HANGUL FILLER 152*2d1272b8SAndroid Build Coastguard Worker * FE00..FE0F # Mn [16] VARIATION SELECTOR-1..VARIATION SELECTOR-16 153*2d1272b8SAndroid Build Coastguard Worker * FEFF # Cf ZERO WIDTH NO-BREAK SPACE 154*2d1272b8SAndroid Build Coastguard Worker * FFA0 # Lo HALFWIDTH HANGUL FILLER 155*2d1272b8SAndroid Build Coastguard Worker * FFF0..FFF8 # Cn [9] <reserved-FFF0>..<reserved-FFF8> 156*2d1272b8SAndroid Build Coastguard Worker * 1BCA0..1BCA3 # Cf [4] SHORTHAND FORMAT LETTER OVERLAP..SHORTHAND FORMAT UP STEP 157*2d1272b8SAndroid Build Coastguard Worker * 1D173..1D17A # Cf [8] MUSICAL SYMBOL BEGIN BEAM..MUSICAL SYMBOL END PHRASE 158*2d1272b8SAndroid Build Coastguard Worker * E0000 # Cn <reserved-E0000> 159*2d1272b8SAndroid Build Coastguard Worker * E0001 # Cf LANGUAGE TAG 160*2d1272b8SAndroid Build Coastguard Worker * E0002..E001F # Cn [30] <reserved-E0002>..<reserved-E001F> 161*2d1272b8SAndroid Build Coastguard Worker * E0020..E007F # Cf [96] TAG SPACE..CANCEL TAG 162*2d1272b8SAndroid Build Coastguard Worker * E0080..E00FF # Cn [128] <reserved-E0080>..<reserved-E00FF> 163*2d1272b8SAndroid Build Coastguard Worker * E0100..E01EF # Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256 164*2d1272b8SAndroid Build Coastguard Worker * E01F0..E0FFF # Cn [3600] <reserved-E01F0>..<reserved-E0FFF> 165*2d1272b8SAndroid Build Coastguard Worker */ 166*2d1272b8SAndroid Build Coastguard Worker static hb_bool_t is_default_ignorablehb_unicode_funcs_t167*2d1272b8SAndroid Build Coastguard Worker is_default_ignorable (hb_codepoint_t ch) 168*2d1272b8SAndroid Build Coastguard Worker { 169*2d1272b8SAndroid Build Coastguard Worker hb_codepoint_t plane = ch >> 16; 170*2d1272b8SAndroid Build Coastguard Worker if (likely (plane == 0)) 171*2d1272b8SAndroid Build Coastguard Worker { 172*2d1272b8SAndroid Build Coastguard Worker /* BMP */ 173*2d1272b8SAndroid Build Coastguard Worker hb_codepoint_t page = ch >> 8; 174*2d1272b8SAndroid Build Coastguard Worker switch (page) { 175*2d1272b8SAndroid Build Coastguard Worker case 0x00: return unlikely (ch == 0x00ADu); 176*2d1272b8SAndroid Build Coastguard Worker case 0x03: return unlikely (ch == 0x034Fu); 177*2d1272b8SAndroid Build Coastguard Worker case 0x06: return unlikely (ch == 0x061Cu); 178*2d1272b8SAndroid Build Coastguard Worker case 0x17: return hb_in_range<hb_codepoint_t> (ch, 0x17B4u, 0x17B5u); 179*2d1272b8SAndroid Build Coastguard Worker case 0x18: return hb_in_range<hb_codepoint_t> (ch, 0x180Bu, 0x180Eu); 180*2d1272b8SAndroid Build Coastguard Worker case 0x20: return hb_in_ranges<hb_codepoint_t> (ch, 0x200Bu, 0x200Fu, 181*2d1272b8SAndroid Build Coastguard Worker 0x202Au, 0x202Eu, 182*2d1272b8SAndroid Build Coastguard Worker 0x2060u, 0x206Fu); 183*2d1272b8SAndroid Build Coastguard Worker case 0xFE: return hb_in_range<hb_codepoint_t> (ch, 0xFE00u, 0xFE0Fu) || ch == 0xFEFFu; 184*2d1272b8SAndroid Build Coastguard Worker case 0xFF: return hb_in_range<hb_codepoint_t> (ch, 0xFFF0u, 0xFFF8u); 185*2d1272b8SAndroid Build Coastguard Worker default: return false; 186*2d1272b8SAndroid Build Coastguard Worker } 187*2d1272b8SAndroid Build Coastguard Worker } 188*2d1272b8SAndroid Build Coastguard Worker else 189*2d1272b8SAndroid Build Coastguard Worker { 190*2d1272b8SAndroid Build Coastguard Worker /* Other planes */ 191*2d1272b8SAndroid Build Coastguard Worker switch (plane) { 192*2d1272b8SAndroid Build Coastguard Worker case 0x01: return hb_in_range<hb_codepoint_t> (ch, 0x1D173u, 0x1D17Au); 193*2d1272b8SAndroid Build Coastguard Worker case 0x0E: return hb_in_range<hb_codepoint_t> (ch, 0xE0000u, 0xE0FFFu); 194*2d1272b8SAndroid Build Coastguard Worker default: return false; 195*2d1272b8SAndroid Build Coastguard Worker } 196*2d1272b8SAndroid Build Coastguard Worker } 197*2d1272b8SAndroid Build Coastguard Worker } 198*2d1272b8SAndroid Build Coastguard Worker 199*2d1272b8SAndroid Build Coastguard Worker /* Space estimates based on: 200*2d1272b8SAndroid Build Coastguard Worker * https://unicode.org/charts/PDF/U2000.pdf 201*2d1272b8SAndroid Build Coastguard Worker * https://docs.microsoft.com/en-us/typography/develop/character-design-standards/whitespace 202*2d1272b8SAndroid Build Coastguard Worker */ 203*2d1272b8SAndroid Build Coastguard Worker enum space_t { 204*2d1272b8SAndroid Build Coastguard Worker NOT_SPACE = 0, 205*2d1272b8SAndroid Build Coastguard Worker SPACE_EM = 1, 206*2d1272b8SAndroid Build Coastguard Worker SPACE_EM_2 = 2, 207*2d1272b8SAndroid Build Coastguard Worker SPACE_EM_3 = 3, 208*2d1272b8SAndroid Build Coastguard Worker SPACE_EM_4 = 4, 209*2d1272b8SAndroid Build Coastguard Worker SPACE_EM_5 = 5, 210*2d1272b8SAndroid Build Coastguard Worker SPACE_EM_6 = 6, 211*2d1272b8SAndroid Build Coastguard Worker SPACE_EM_16 = 16, 212*2d1272b8SAndroid Build Coastguard Worker SPACE_4_EM_18, /* 4/18th of an EM! */ 213*2d1272b8SAndroid Build Coastguard Worker SPACE, 214*2d1272b8SAndroid Build Coastguard Worker SPACE_FIGURE, 215*2d1272b8SAndroid Build Coastguard Worker SPACE_PUNCTUATION, 216*2d1272b8SAndroid Build Coastguard Worker SPACE_NARROW, 217*2d1272b8SAndroid Build Coastguard Worker }; 218*2d1272b8SAndroid Build Coastguard Worker static space_t space_fallback_typehb_unicode_funcs_t219*2d1272b8SAndroid Build Coastguard Worker space_fallback_type (hb_codepoint_t u) 220*2d1272b8SAndroid Build Coastguard Worker { 221*2d1272b8SAndroid Build Coastguard Worker switch (u) 222*2d1272b8SAndroid Build Coastguard Worker { 223*2d1272b8SAndroid Build Coastguard Worker /* All GC=Zs chars that can use a fallback. */ 224*2d1272b8SAndroid Build Coastguard Worker default: return NOT_SPACE; /* U+1680 OGHAM SPACE MARK */ 225*2d1272b8SAndroid Build Coastguard Worker case 0x0020u: return SPACE; /* U+0020 SPACE */ 226*2d1272b8SAndroid Build Coastguard Worker case 0x00A0u: return SPACE; /* U+00A0 NO-BREAK SPACE */ 227*2d1272b8SAndroid Build Coastguard Worker case 0x2000u: return SPACE_EM_2; /* U+2000 EN QUAD */ 228*2d1272b8SAndroid Build Coastguard Worker case 0x2001u: return SPACE_EM; /* U+2001 EM QUAD */ 229*2d1272b8SAndroid Build Coastguard Worker case 0x2002u: return SPACE_EM_2; /* U+2002 EN SPACE */ 230*2d1272b8SAndroid Build Coastguard Worker case 0x2003u: return SPACE_EM; /* U+2003 EM SPACE */ 231*2d1272b8SAndroid Build Coastguard Worker case 0x2004u: return SPACE_EM_3; /* U+2004 THREE-PER-EM SPACE */ 232*2d1272b8SAndroid Build Coastguard Worker case 0x2005u: return SPACE_EM_4; /* U+2005 FOUR-PER-EM SPACE */ 233*2d1272b8SAndroid Build Coastguard Worker case 0x2006u: return SPACE_EM_6; /* U+2006 SIX-PER-EM SPACE */ 234*2d1272b8SAndroid Build Coastguard Worker case 0x2007u: return SPACE_FIGURE; /* U+2007 FIGURE SPACE */ 235*2d1272b8SAndroid Build Coastguard Worker case 0x2008u: return SPACE_PUNCTUATION; /* U+2008 PUNCTUATION SPACE */ 236*2d1272b8SAndroid Build Coastguard Worker case 0x2009u: return SPACE_EM_5; /* U+2009 THIN SPACE */ 237*2d1272b8SAndroid Build Coastguard Worker case 0x200Au: return SPACE_EM_16; /* U+200A HAIR SPACE */ 238*2d1272b8SAndroid Build Coastguard Worker case 0x202Fu: return SPACE_NARROW; /* U+202F NARROW NO-BREAK SPACE */ 239*2d1272b8SAndroid Build Coastguard Worker case 0x205Fu: return SPACE_4_EM_18; /* U+205F MEDIUM MATHEMATICAL SPACE */ 240*2d1272b8SAndroid Build Coastguard Worker case 0x3000u: return SPACE_EM; /* U+3000 IDEOGRAPHIC SPACE */ 241*2d1272b8SAndroid Build Coastguard Worker } 242*2d1272b8SAndroid Build Coastguard Worker } 243*2d1272b8SAndroid Build Coastguard Worker 244*2d1272b8SAndroid Build Coastguard Worker struct { 245*2d1272b8SAndroid Build Coastguard Worker #define HB_UNICODE_FUNC_IMPLEMENT(name) hb_unicode_##name##_func_t name; 246*2d1272b8SAndroid Build Coastguard Worker HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS 247*2d1272b8SAndroid Build Coastguard Worker #undef HB_UNICODE_FUNC_IMPLEMENT 248*2d1272b8SAndroid Build Coastguard Worker } func; 249*2d1272b8SAndroid Build Coastguard Worker 250*2d1272b8SAndroid Build Coastguard Worker struct { 251*2d1272b8SAndroid Build Coastguard Worker #define HB_UNICODE_FUNC_IMPLEMENT(name) void *name; 252*2d1272b8SAndroid Build Coastguard Worker HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS 253*2d1272b8SAndroid Build Coastguard Worker #undef HB_UNICODE_FUNC_IMPLEMENT 254*2d1272b8SAndroid Build Coastguard Worker } user_data; 255*2d1272b8SAndroid Build Coastguard Worker 256*2d1272b8SAndroid Build Coastguard Worker struct { 257*2d1272b8SAndroid Build Coastguard Worker #define HB_UNICODE_FUNC_IMPLEMENT(name) hb_destroy_func_t name; 258*2d1272b8SAndroid Build Coastguard Worker HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS 259*2d1272b8SAndroid Build Coastguard Worker #undef HB_UNICODE_FUNC_IMPLEMENT 260*2d1272b8SAndroid Build Coastguard Worker } destroy; 261*2d1272b8SAndroid Build Coastguard Worker }; 262*2d1272b8SAndroid Build Coastguard Worker DECLARE_NULL_INSTANCE (hb_unicode_funcs_t); 263*2d1272b8SAndroid Build Coastguard Worker 264*2d1272b8SAndroid Build Coastguard Worker 265*2d1272b8SAndroid Build Coastguard Worker /* 266*2d1272b8SAndroid Build Coastguard Worker * Modified combining marks 267*2d1272b8SAndroid Build Coastguard Worker */ 268*2d1272b8SAndroid Build Coastguard Worker 269*2d1272b8SAndroid Build Coastguard Worker /* Hebrew 270*2d1272b8SAndroid Build Coastguard Worker * 271*2d1272b8SAndroid Build Coastguard Worker * We permute the "fixed-position" classes 10-26 into the order 272*2d1272b8SAndroid Build Coastguard Worker * described in the SBL Hebrew manual: 273*2d1272b8SAndroid Build Coastguard Worker * 274*2d1272b8SAndroid Build Coastguard Worker * https://www.sbl-site.org/Fonts/SBLHebrewUserManual1.5x.pdf 275*2d1272b8SAndroid Build Coastguard Worker * 276*2d1272b8SAndroid Build Coastguard Worker * (as recommended by: 277*2d1272b8SAndroid Build Coastguard Worker * https://forum.fontlab.com/archive-old-microsoft-volt-group/vista-and-diacritic-ordering/msg22823/) 278*2d1272b8SAndroid Build Coastguard Worker * 279*2d1272b8SAndroid Build Coastguard Worker * More details here: 280*2d1272b8SAndroid Build Coastguard Worker * https://bugzilla.mozilla.org/show_bug.cgi?id=662055 281*2d1272b8SAndroid Build Coastguard Worker */ 282*2d1272b8SAndroid Build Coastguard Worker #define HB_MODIFIED_COMBINING_CLASS_CCC10 22 /* sheva */ 283*2d1272b8SAndroid Build Coastguard Worker #define HB_MODIFIED_COMBINING_CLASS_CCC11 15 /* hataf segol */ 284*2d1272b8SAndroid Build Coastguard Worker #define HB_MODIFIED_COMBINING_CLASS_CCC12 16 /* hataf patah */ 285*2d1272b8SAndroid Build Coastguard Worker #define HB_MODIFIED_COMBINING_CLASS_CCC13 17 /* hataf qamats */ 286*2d1272b8SAndroid Build Coastguard Worker #define HB_MODIFIED_COMBINING_CLASS_CCC14 23 /* hiriq */ 287*2d1272b8SAndroid Build Coastguard Worker #define HB_MODIFIED_COMBINING_CLASS_CCC15 18 /* tsere */ 288*2d1272b8SAndroid Build Coastguard Worker #define HB_MODIFIED_COMBINING_CLASS_CCC16 19 /* segol */ 289*2d1272b8SAndroid Build Coastguard Worker #define HB_MODIFIED_COMBINING_CLASS_CCC17 20 /* patah */ 290*2d1272b8SAndroid Build Coastguard Worker #define HB_MODIFIED_COMBINING_CLASS_CCC18 21 /* qamats & qamats qatan */ 291*2d1272b8SAndroid Build Coastguard Worker #define HB_MODIFIED_COMBINING_CLASS_CCC19 14 /* holam & holam haser for vav*/ 292*2d1272b8SAndroid Build Coastguard Worker #define HB_MODIFIED_COMBINING_CLASS_CCC20 24 /* qubuts */ 293*2d1272b8SAndroid Build Coastguard Worker #define HB_MODIFIED_COMBINING_CLASS_CCC21 12 /* dagesh */ 294*2d1272b8SAndroid Build Coastguard Worker #define HB_MODIFIED_COMBINING_CLASS_CCC22 25 /* meteg */ 295*2d1272b8SAndroid Build Coastguard Worker #define HB_MODIFIED_COMBINING_CLASS_CCC23 13 /* rafe */ 296*2d1272b8SAndroid Build Coastguard Worker #define HB_MODIFIED_COMBINING_CLASS_CCC24 10 /* shin dot */ 297*2d1272b8SAndroid Build Coastguard Worker #define HB_MODIFIED_COMBINING_CLASS_CCC25 11 /* sin dot */ 298*2d1272b8SAndroid Build Coastguard Worker #define HB_MODIFIED_COMBINING_CLASS_CCC26 26 /* point varika */ 299*2d1272b8SAndroid Build Coastguard Worker 300*2d1272b8SAndroid Build Coastguard Worker /* 301*2d1272b8SAndroid Build Coastguard Worker * Arabic 302*2d1272b8SAndroid Build Coastguard Worker * 303*2d1272b8SAndroid Build Coastguard Worker * Modify to move Shadda (ccc=33) before other marks. See: 304*2d1272b8SAndroid Build Coastguard Worker * https://unicode.org/faq/normalization.html#8 305*2d1272b8SAndroid Build Coastguard Worker * https://unicode.org/faq/normalization.html#9 306*2d1272b8SAndroid Build Coastguard Worker */ 307*2d1272b8SAndroid Build Coastguard Worker #define HB_MODIFIED_COMBINING_CLASS_CCC27 28 /* fathatan */ 308*2d1272b8SAndroid Build Coastguard Worker #define HB_MODIFIED_COMBINING_CLASS_CCC28 29 /* dammatan */ 309*2d1272b8SAndroid Build Coastguard Worker #define HB_MODIFIED_COMBINING_CLASS_CCC29 30 /* kasratan */ 310*2d1272b8SAndroid Build Coastguard Worker #define HB_MODIFIED_COMBINING_CLASS_CCC30 31 /* fatha */ 311*2d1272b8SAndroid Build Coastguard Worker #define HB_MODIFIED_COMBINING_CLASS_CCC31 32 /* damma */ 312*2d1272b8SAndroid Build Coastguard Worker #define HB_MODIFIED_COMBINING_CLASS_CCC32 33 /* kasra */ 313*2d1272b8SAndroid Build Coastguard Worker #define HB_MODIFIED_COMBINING_CLASS_CCC33 27 /* shadda */ 314*2d1272b8SAndroid Build Coastguard Worker #define HB_MODIFIED_COMBINING_CLASS_CCC34 34 /* sukun */ 315*2d1272b8SAndroid Build Coastguard Worker #define HB_MODIFIED_COMBINING_CLASS_CCC35 35 /* superscript alef */ 316*2d1272b8SAndroid Build Coastguard Worker 317*2d1272b8SAndroid Build Coastguard Worker /* Syriac */ 318*2d1272b8SAndroid Build Coastguard Worker #define HB_MODIFIED_COMBINING_CLASS_CCC36 36 /* superscript alaph */ 319*2d1272b8SAndroid Build Coastguard Worker 320*2d1272b8SAndroid Build Coastguard Worker /* Telugu 321*2d1272b8SAndroid Build Coastguard Worker * 322*2d1272b8SAndroid Build Coastguard Worker * Modify Telugu length marks (ccc=84, ccc=91). 323*2d1272b8SAndroid Build Coastguard Worker * These are the only matras in the main Indic scripts range that have 324*2d1272b8SAndroid Build Coastguard Worker * a non-zero ccc. That makes them reorder with the Halant (ccc=9). 325*2d1272b8SAndroid Build Coastguard Worker * Assign 4 and 5, which are otherwise unassigned. 326*2d1272b8SAndroid Build Coastguard Worker */ 327*2d1272b8SAndroid Build Coastguard Worker #define HB_MODIFIED_COMBINING_CLASS_CCC84 4 /* length mark */ 328*2d1272b8SAndroid Build Coastguard Worker #define HB_MODIFIED_COMBINING_CLASS_CCC91 5 /* ai length mark */ 329*2d1272b8SAndroid Build Coastguard Worker 330*2d1272b8SAndroid Build Coastguard Worker /* Thai 331*2d1272b8SAndroid Build Coastguard Worker * 332*2d1272b8SAndroid Build Coastguard Worker * Modify U+0E38 and U+0E39 (ccc=103) to be reordered before U+0E3A (ccc=9). 333*2d1272b8SAndroid Build Coastguard Worker * Assign 3, which is unassigned otherwise. 334*2d1272b8SAndroid Build Coastguard Worker * Uniscribe does this reordering too. 335*2d1272b8SAndroid Build Coastguard Worker */ 336*2d1272b8SAndroid Build Coastguard Worker #define HB_MODIFIED_COMBINING_CLASS_CCC103 3 /* sara u / sara uu */ 337*2d1272b8SAndroid Build Coastguard Worker #define HB_MODIFIED_COMBINING_CLASS_CCC107 107 /* mai * */ 338*2d1272b8SAndroid Build Coastguard Worker 339*2d1272b8SAndroid Build Coastguard Worker /* Lao */ 340*2d1272b8SAndroid Build Coastguard Worker #define HB_MODIFIED_COMBINING_CLASS_CCC118 118 /* sign u / sign uu */ 341*2d1272b8SAndroid Build Coastguard Worker #define HB_MODIFIED_COMBINING_CLASS_CCC122 122 /* mai * */ 342*2d1272b8SAndroid Build Coastguard Worker 343*2d1272b8SAndroid Build Coastguard Worker /* Tibetan 344*2d1272b8SAndroid Build Coastguard Worker * 345*2d1272b8SAndroid Build Coastguard Worker * In case of multiple vowel-signs, use u first (but after achung) 346*2d1272b8SAndroid Build Coastguard Worker * this allows Dzongkha multi-vowel shortcuts to render correctly 347*2d1272b8SAndroid Build Coastguard Worker */ 348*2d1272b8SAndroid Build Coastguard Worker #define HB_MODIFIED_COMBINING_CLASS_CCC129 129 /* sign aa */ 349*2d1272b8SAndroid Build Coastguard Worker #define HB_MODIFIED_COMBINING_CLASS_CCC130 132 /* sign i */ 350*2d1272b8SAndroid Build Coastguard Worker #define HB_MODIFIED_COMBINING_CLASS_CCC132 131 /* sign u */ 351*2d1272b8SAndroid Build Coastguard Worker 352*2d1272b8SAndroid Build Coastguard Worker /* Misc */ 353*2d1272b8SAndroid Build Coastguard Worker 354*2d1272b8SAndroid Build Coastguard Worker #define HB_UNICODE_GENERAL_CATEGORY_IS_MARK(gen_cat) \ 355*2d1272b8SAndroid Build Coastguard Worker (FLAG_UNSAFE (gen_cat) & \ 356*2d1272b8SAndroid Build Coastguard Worker (FLAG (HB_UNICODE_GENERAL_CATEGORY_SPACING_MARK) | \ 357*2d1272b8SAndroid Build Coastguard Worker FLAG (HB_UNICODE_GENERAL_CATEGORY_ENCLOSING_MARK) | \ 358*2d1272b8SAndroid Build Coastguard Worker FLAG (HB_UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK))) 359*2d1272b8SAndroid Build Coastguard Worker 360*2d1272b8SAndroid Build Coastguard Worker #define HB_UNICODE_GENERAL_CATEGORY_IS_LETTER(gen_cat) \ 361*2d1272b8SAndroid Build Coastguard Worker (FLAG_UNSAFE (gen_cat) & \ 362*2d1272b8SAndroid Build Coastguard Worker (FLAG (HB_UNICODE_GENERAL_CATEGORY_LOWERCASE_LETTER) | \ 363*2d1272b8SAndroid Build Coastguard Worker FLAG (HB_UNICODE_GENERAL_CATEGORY_MODIFIER_LETTER) | \ 364*2d1272b8SAndroid Build Coastguard Worker FLAG (HB_UNICODE_GENERAL_CATEGORY_OTHER_LETTER) | \ 365*2d1272b8SAndroid Build Coastguard Worker FLAG (HB_UNICODE_GENERAL_CATEGORY_TITLECASE_LETTER) | \ 366*2d1272b8SAndroid Build Coastguard Worker FLAG (HB_UNICODE_GENERAL_CATEGORY_UPPERCASE_LETTER))) 367*2d1272b8SAndroid Build Coastguard Worker 368*2d1272b8SAndroid Build Coastguard Worker /* 369*2d1272b8SAndroid Build Coastguard Worker * Ranges, used for bsearch tables. 370*2d1272b8SAndroid Build Coastguard Worker */ 371*2d1272b8SAndroid Build Coastguard Worker 372*2d1272b8SAndroid Build Coastguard Worker struct hb_unicode_range_t 373*2d1272b8SAndroid Build Coastguard Worker { 374*2d1272b8SAndroid Build Coastguard Worker static int cmphb_unicode_range_t375*2d1272b8SAndroid Build Coastguard Worker cmp (const void *_key, const void *_item) 376*2d1272b8SAndroid Build Coastguard Worker { 377*2d1272b8SAndroid Build Coastguard Worker hb_codepoint_t cp = *((hb_codepoint_t *) _key); 378*2d1272b8SAndroid Build Coastguard Worker const hb_unicode_range_t *range = (hb_unicode_range_t *) _item; 379*2d1272b8SAndroid Build Coastguard Worker 380*2d1272b8SAndroid Build Coastguard Worker if (cp < range->start) 381*2d1272b8SAndroid Build Coastguard Worker return -1; 382*2d1272b8SAndroid Build Coastguard Worker else if (cp <= range->end) 383*2d1272b8SAndroid Build Coastguard Worker return 0; 384*2d1272b8SAndroid Build Coastguard Worker else 385*2d1272b8SAndroid Build Coastguard Worker return +1; 386*2d1272b8SAndroid Build Coastguard Worker } 387*2d1272b8SAndroid Build Coastguard Worker 388*2d1272b8SAndroid Build Coastguard Worker hb_codepoint_t start; 389*2d1272b8SAndroid Build Coastguard Worker hb_codepoint_t end; 390*2d1272b8SAndroid Build Coastguard Worker }; 391*2d1272b8SAndroid Build Coastguard Worker 392*2d1272b8SAndroid Build Coastguard Worker /* 393*2d1272b8SAndroid Build Coastguard Worker * Emoji. 394*2d1272b8SAndroid Build Coastguard Worker */ 395*2d1272b8SAndroid Build Coastguard Worker 396*2d1272b8SAndroid Build Coastguard Worker HB_INTERNAL bool 397*2d1272b8SAndroid Build Coastguard Worker _hb_unicode_is_emoji_Extended_Pictographic (hb_codepoint_t cp); 398*2d1272b8SAndroid Build Coastguard Worker 399*2d1272b8SAndroid Build Coastguard Worker 400*2d1272b8SAndroid Build Coastguard Worker extern "C" HB_INTERNAL hb_unicode_funcs_t *hb_ucd_get_unicode_funcs (); 401*2d1272b8SAndroid Build Coastguard Worker 402*2d1272b8SAndroid Build Coastguard Worker 403*2d1272b8SAndroid Build Coastguard Worker #endif /* HB_UNICODE_HH */ 404