From 6008cfabcd93ccd0ca240f0863fe833b946fa4f8 Mon Sep 17 00:00:00 2001 From: Mike FABIAN Date: Thu, 6 Feb 2020 14:04:56 +0100 Subject: Update pango-emoji-table.h to Unicode Emoji Data 13.0 (was released on January 29, 2020) (cherry-picked from commit 06aab353) --- pango/pango-emoji-table.h | 79 +++++++++++++++++++++++++++-------------------- 1 file changed, 46 insertions(+), 33 deletions(-) diff --git a/pango/pango-emoji-table.h b/pango/pango-emoji-table.h index 053f9468..33b33b04 100644 --- a/pango/pango-emoji-table.h +++ b/pango/pango-emoji-table.h @@ -7,13 +7,13 @@ * on file with this header: * * # emoji-data.txt - * # Date: 2018-02-07, 07:55:18 GMT - * # © 2018 Unicode®, Inc. + * # Date: 2020-01-28, 20:52:38 GMT + * # © 2020 Unicode®, Inc. * # Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. * # For terms of use, see http://www.unicode.org/terms_of_use.html * # * # Emoji Data for UTS #51 - * # Version: 11.0 + * # Version: 13.0 * # * # For documentation and usage, see http://www.unicode.org/reports/tr51 */ @@ -75,6 +75,7 @@ static const struct Interval _pango_Emoji_table[] = {0x2699, 0x2699}, {0x269B, 0x269C}, {0x26A0, 0x26A1}, + {0x26A7, 0x26A7}, {0x26AA, 0x26AB}, {0x26B0, 0x26B1}, {0x26BD, 0x26BE}, @@ -161,21 +162,25 @@ static const struct Interval _pango_Emoji_table[] = {0x1F5FA, 0x1F64F}, {0x1F680, 0x1F6C5}, {0x1F6CB, 0x1F6D2}, + {0x1F6D5, 0x1F6D7}, {0x1F6E0, 0x1F6E5}, {0x1F6E9, 0x1F6E9}, {0x1F6EB, 0x1F6EC}, {0x1F6F0, 0x1F6F0}, - {0x1F6F3, 0x1F6F9}, - {0x1F910, 0x1F93A}, - {0x1F93C, 0x1F93E}, - {0x1F940, 0x1F945}, - {0x1F947, 0x1F970}, - {0x1F973, 0x1F976}, - {0x1F97A, 0x1F97A}, - {0x1F97C, 0x1F9A2}, - {0x1F9B0, 0x1F9B9}, - {0x1F9C0, 0x1F9C2}, - {0x1F9D0, 0x1F9FF}, + {0x1F6F3, 0x1F6FC}, + {0x1F7E0, 0x1F7EB}, + {0x1F90C, 0x1F93A}, + {0x1F93C, 0x1F945}, + {0x1F947, 0x1F978}, + {0x1F97A, 0x1F9CB}, + {0x1F9CD, 0x1F9FF}, + {0x1FA70, 0x1FA74}, + {0x1FA78, 0x1FA7A}, + {0x1FA80, 0x1FA86}, + {0x1FA90, 0x1FAA8}, + {0x1FAB0, 0x1FAB6}, + {0x1FAC0, 0x1FAC2}, + {0x1FAD0, 0x1FAD6}, }; static const struct Interval _pango_Emoji_Presentation_table[] = @@ -245,18 +250,22 @@ static const struct Interval _pango_Emoji_Presentation_table[] = {0x1F680, 0x1F6C5}, {0x1F6CC, 0x1F6CC}, {0x1F6D0, 0x1F6D2}, + {0x1F6D5, 0x1F6D7}, {0x1F6EB, 0x1F6EC}, - {0x1F6F4, 0x1F6F9}, - {0x1F910, 0x1F93A}, - {0x1F93C, 0x1F93E}, - {0x1F940, 0x1F945}, - {0x1F947, 0x1F970}, - {0x1F973, 0x1F976}, - {0x1F97A, 0x1F97A}, - {0x1F97C, 0x1F9A2}, - {0x1F9B0, 0x1F9B9}, - {0x1F9C0, 0x1F9C2}, - {0x1F9D0, 0x1F9FF}, + {0x1F6F4, 0x1F6FC}, + {0x1F7E0, 0x1F7EB}, + {0x1F90C, 0x1F93A}, + {0x1F93C, 0x1F945}, + {0x1F947, 0x1F978}, + {0x1F97A, 0x1F9CB}, + {0x1F9CD, 0x1F9FF}, + {0x1FA70, 0x1FA74}, + {0x1FA78, 0x1FA7A}, + {0x1FA80, 0x1FA86}, + {0x1FA90, 0x1FAA8}, + {0x1FAB0, 0x1FAB6}, + {0x1FAC0, 0x1FAC2}, + {0x1FAD0, 0x1FAD6}, }; static const struct Interval _pango_Emoji_Modifier_table[] = @@ -275,12 +284,12 @@ static const struct Interval _pango_Emoji_Modifier_Base_table[] = {0x1F3CA, 0x1F3CC}, {0x1F442, 0x1F443}, {0x1F446, 0x1F450}, - {0x1F466, 0x1F469}, - {0x1F46E, 0x1F46E}, - {0x1F470, 0x1F478}, + {0x1F466, 0x1F478}, {0x1F47C, 0x1F47C}, {0x1F481, 0x1F483}, {0x1F485, 0x1F487}, + {0x1F48F, 0x1F48F}, + {0x1F491, 0x1F491}, {0x1F4AA, 0x1F4AA}, {0x1F574, 0x1F575}, {0x1F57A, 0x1F57A}, @@ -292,13 +301,17 @@ static const struct Interval _pango_Emoji_Modifier_Base_table[] = {0x1F6B4, 0x1F6B6}, {0x1F6C0, 0x1F6C0}, {0x1F6CC, 0x1F6CC}, - {0x1F918, 0x1F91C}, - {0x1F91E, 0x1F91F}, + {0x1F90C, 0x1F90C}, + {0x1F90F, 0x1F90F}, + {0x1F918, 0x1F91F}, {0x1F926, 0x1F926}, {0x1F930, 0x1F939}, - {0x1F93D, 0x1F93E}, + {0x1F93C, 0x1F93E}, + {0x1F977, 0x1F977}, {0x1F9B5, 0x1F9B6}, {0x1F9B8, 0x1F9B9}, + {0x1F9BB, 0x1F9BB}, + {0x1F9CD, 0x1F9CF}, {0x1F9D1, 0x1F9DD}, }; @@ -380,10 +393,10 @@ static const struct Interval _pango_Extended_Pictographic_table[] = {0x1F8AE, 0x1F8FF}, {0x1F90C, 0x1F93A}, {0x1F93C, 0x1F945}, - {0x1F947, 0x1FFFD}, + {0x1F947, 0x1FAFF}, + {0x1FC00, 0x1FFFD}, }; #endif /* PANGO_EMOJI_TABLE_H */ /* == End of generated table == */ - -- cgit v1.2.1 From 091dbd46fb1301ed7bb40dab9085481a3395d670 Mon Sep 17 00:00:00 2001 From: Peng Wu Date: Thu, 20 Feb 2020 15:33:07 +0800 Subject: Update Grapheme and Word Boundary to Unicode 13 (cherry-picked from commit 631775d8) --- pango/break.c | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/pango/break.c b/pango/break.c index ca62a28f..00dc3db7 100644 --- a/pango/break.c +++ b/pango/break.c @@ -398,9 +398,8 @@ pango_default_break (const gchar *text, wc == 0x6DD || wc == 0x70F || wc == 0x8E2 || - wc == 0xD4E || wc == 0x110BD || - (wc >= 0x111C2 && wc <= 0x111C3))) + wc == 0x110CD)) { GB_type = GB_Prepend; break; @@ -426,6 +425,10 @@ pango_default_break (const gchar *text, case G_UNICODE_OTHER_LETTER: if (makes_hangul_syllable) GB_type = GB_InHangulSyllable; + + if (_pango_is_Consonant_Preceding_Repha (wc) || + _pango_is_Consonant_Prefixed (wc)) + GB_type = GB_Prepend; break; case G_UNICODE_MODIFIER_LETTER: @@ -570,7 +573,7 @@ pango_default_break (const gchar *text, WB_type = WB_ExtendFormat; /* Other_Grapheme_Extend */ break; case 0x05: - if (wc == 0x05F3) + if (wc == 0x058A) WB_type = WB_ALetter; /* ALetter exceptions */ break; } @@ -617,12 +620,16 @@ pango_default_break (const gchar *text, WB_type = WB_MidNumLet; /* MidNumLet */ break; case G_UNICODE_OTHER_PUNCTUATION: - if (wc == 0x0027 || wc == 0x002e || wc == 0x2024 || + if ((wc >= 0x055a && wc <= 0x055c) || + wc == 0x055e || wc == 0x05f3) + WB_type = WB_ALetter; /* ALetter */ + else if (wc == 0x0027 || wc == 0x002e || wc == 0x2024 || wc == 0xfe52 || wc == 0xff07 || wc == 0xff0e) WB_type = WB_MidNumLet; /* MidNumLet */ - else if (wc == 0x00b7 || wc == 0x05f4 || wc == 0x2027 || wc == 0x003a || wc == 0x0387 || + else if (wc == 0x00b7 || wc == 0x05f4 || wc == 0x2027 || + wc == 0x003a || wc == 0x0387 || wc == 0x055f || wc == 0xfe13 || wc == 0xfe55 || wc == 0xff1a) - WB_type = WB_MidLetter; /* WB_MidLetter */ + WB_type = WB_MidLetter; /* MidLetter */ else if (wc == 0x066c || wc == 0xfe50 || wc == 0xfe54 || wc == 0xff0c || wc == 0xff1b) WB_type = WB_MidNum; /* MidNum */ -- cgit v1.2.1 From f288eaafcccddde2f91606ca8f0785d9fd1b691b Mon Sep 17 00:00:00 2001 From: Peng Wu Date: Fri, 21 Feb 2020 15:24:25 +0800 Subject: Update gen-break-table.py for Unicode 13 (cherry-picked from commit 2ac57751) --- tools/gen-break-table.py | 27 +++++++++++++++++++-------- 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/tools/gen-break-table.py b/tools/gen-break-table.py index 2c8a7d70..5d346c8c 100755 --- a/tools/gen-break-table.py +++ b/tools/gen-break-table.py @@ -9,20 +9,21 @@ from collections import OrderedDict header = [] ranges = OrderedDict() -def load_data(filename): +def load_data(filename, prefix=""): global header, ranges f = open(filename) lines = f.readlines() for line in lines: - header.append(line) if not line.startswith("#"): break + header.append(line) for line in lines: line = line.strip() if not line or line[0] == '#': continue rang, typ = [s.strip() for s in line.split('#')[0].split(';')[:2]] + typ = prefix + typ rang = [int(s, 16) for s in rang.split('..')] if len(rang) > 1: @@ -87,6 +88,7 @@ def print_ranges(ranges): def print_balanced_search(ranges): if 4 >= len(ranges): print_ranges(ranges) + print("return FALSE;") return length = len(ranges) @@ -116,7 +118,7 @@ def print_table(): print("/*") print(" * The following tables are generated by running:") print(" *") - print(" * ./gen-break-table.py SentenceBreakProperty.txt IndicSyllabicCategory.txt | indent") + print(" * ./gen-break-table.py SentenceBreakProperty.txt IndicSyllabicCategory.txt EastAsianWidth.txt | indent") print(" *") print(" * on files with these headers:") print(" *") @@ -132,14 +134,22 @@ def print_table(): for typ,s in ranges.items(): if typ not in ['STerm', - 'Virama', - 'Vowel_Dependent']: continue + 'Virama', + 'Vowel_Dependent', + 'Consonant_Prefixed', + 'Consonant_Preceding_Repha']: continue print() print("static inline gboolean _pango_is_%s (gunichar wc)" % typ) print("{") - print_balanced_search(sorted(s)) + print_balanced_search(sorted(s)) print("}") + s = ranges["EastAsian_F"] + ranges["EastAsian_W"] + ranges["EastAsian_H"] + print("static inline gboolean _pango_is_EastAsianWide (gunichar wc)") + print("{") + print_balanced_search(sorted(s)) + print("}") + print() print("#endif /* PANGO_BREAK_TABLE_H */") print() @@ -147,10 +157,11 @@ def print_table(): if __name__ == "__main__": - if len (sys.argv) != 3: - print("usage: ./gen-break-table.py SentenceBreakProperty.txt IndicSyllabicCategory.txt | indent", file=sys.stderr) + if len (sys.argv) != 4: + print("usage: ./gen-break-table.py SentenceBreakProperty.txt IndicSyllabicCategory.txt EastAsianWidth.txt | indent", file=sys.stderr) sys.exit (1) load_data(sys.argv[1]) load_data(sys.argv[2]) + load_data(sys.argv[3], "EastAsian_") print_table() -- cgit v1.2.1 From 98b5cb1c808aee9e375ebb7454f98976e03677cc Mon Sep 17 00:00:00 2001 From: Peng Wu Date: Fri, 21 Feb 2020 15:34:59 +0800 Subject: Update Line Breaking to Unicode 13 (cherry-picked from commit 23b6d06e) --- pango/break.c | 24 ++++-------------------- 1 file changed, 4 insertions(+), 20 deletions(-) diff --git a/pango/break.c b/pango/break.c index 00dc3db7..5aa9d41e 100644 --- a/pango/break.c +++ b/pango/break.c @@ -1081,10 +1081,12 @@ pango_default_break (const gchar *text, if ((prev_break_type == G_UNICODE_BREAK_ALPHABETIC || prev_break_type == G_UNICODE_BREAK_HEBREW_LETTER || prev_break_type == G_UNICODE_BREAK_NUMERIC) && - break_type == G_UNICODE_BREAK_OPEN_PUNCTUATION) + break_type == G_UNICODE_BREAK_OPEN_PUNCTUATION && + !_pango_is_EastAsianWide (wc)) break_op = BREAK_PROHIBITED; if (prev_break_type == G_UNICODE_BREAK_CLOSE_PARANTHESIS && + !_pango_is_EastAsianWide (prev_wc)&& (break_type == G_UNICODE_BREAK_ALPHABETIC || break_type == G_UNICODE_BREAK_HEBREW_LETTER || break_type == G_UNICODE_BREAK_NUMERIC)) @@ -1226,25 +1228,7 @@ pango_default_break (const gchar *text, /* Rule LB22 */ if (break_type == G_UNICODE_BREAK_INSEPARABLE) - { - if (prev_break_type == G_UNICODE_BREAK_ALPHABETIC || - prev_break_type == G_UNICODE_BREAK_HEBREW_LETTER) - break_op = BREAK_PROHIBITED; - - if (prev_break_type == G_UNICODE_BREAK_EXCLAMATION) - break_op = BREAK_PROHIBITED; - - if (prev_break_type == G_UNICODE_BREAK_IDEOGRAPHIC || - prev_break_type == G_UNICODE_BREAK_EMOJI_BASE || - prev_break_type == G_UNICODE_BREAK_EMOJI_MODIFIER) - break_op = BREAK_PROHIBITED; - - if (prev_break_type == G_UNICODE_BREAK_INSEPARABLE) - break_op = BREAK_PROHIBITED; - - if (prev_break_type == G_UNICODE_BREAK_NUMERIC) - break_op = BREAK_PROHIBITED; - } + break_op = BREAK_PROHIBITED; if (break_type == G_UNICODE_BREAK_AFTER || break_type == G_UNICODE_BREAK_HYPHEN || -- cgit v1.2.1 From 26de336a5e90a32a9ef3369153b44e54f80e0153 Mon Sep 17 00:00:00 2001 From: Peng Wu Date: Tue, 10 Mar 2020 11:51:05 +0800 Subject: Update pango-break-table.h to Unicode 13 (cherry-picked from commit 145e3038) --- pango/pango-break-table.h | 718 +++++++++++++++++++++++++++++++++------------- 1 file changed, 523 insertions(+), 195 deletions(-) diff --git a/pango/pango-break-table.h b/pango/pango-break-table.h index 2361ede5..c587fd5a 100644 --- a/pango/pango-break-table.h +++ b/pango/pango-break-table.h @@ -2,22 +2,21 @@ /* * The following tables are generated by running: * - * ./gen-break-table.py SentenceBreakProperty.txt IndicSyllabicCategory.txt | indent + * ./gen-break-table.py SentenceBreakProperty.txt IndicSyllabicCategory.txt EastAsianWidth.txt | indent * * on files with these headers: * - * # SentenceBreakProperty-11.0.0.txt - * # Date: 2018-03-15, 04:28:45 GMT - * # © 2018 Unicode®, Inc. + * # SentenceBreakProperty-13.0.0.txt + * # Date: 2019-11-27, 03:13:39 GMT + * # © 2019 Unicode®, Inc. * # Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. * # For terms of use, see http://www.unicode.org/terms_of_use.html * # * # Unicode Character Database * # For documentation, see http://www.unicode.org/reports/tr44/ - * - * # IndicSyllabicCategory-11.0.0.txt - * # Date: 2018-05-21, 18:33:00 GMT [KW, RP] - * # © 2018 Unicode®, Inc. + * # IndicSyllabicCategory-13.0.0.txt + * # Date: 2019-07-22, 19:55:00 GMT [KW, RP] + * # © 2019 Unicode®, Inc. * # Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. * # For terms of use, see http://www.unicode.org/terms_of_use.html * # @@ -53,20 +52,62 @@ * # Indic_Syllabic_Category are the following: * # * # Ahom, Balinese, Batak, Bengali, Bhaiksuki, Brahmi, Buginese, Buhid, - * # Chakma, Cham, Devanagari, Dogra, Grantha, Gujarati, Gunjala Gondi, - * # Gurmukhi, Hanunoo, Javanese, Kaithi, Kannada, Kayah Li, Kharoshthi, - * # Khmer, Khojki, Khudawadi, Lao, Lepcha, Limbu, Mahajani, Makasar, - * # Malayalam, Marchen, Masaram Gondi, Meetei Mayek, Modi, Multani, - * # Myanmar, Newa, New Tai Lue, Oriya, Phags-pa, Rejang, Saurashtra, - * # Sharada, Siddham, Sinhala, Soyombo, Sundanese, Syloti Nagri, - * # Tagalog, Tagbanwa, Tai Le, Tai Tham, Tai Viet, Takri, Tamil, - * # Telugu, Thai, Tibetan, Tirhuta, and Zanabazar Square. + * # Chakma, Cham, Devanagari, Dives Akuru, Dogra, Grantha, Gujarati, + * # Gunjala Gondi, Gurmukhi, Hanunoo, Javanese, Kaithi, Kannada, + * # Kayah Li, Kharoshthi, Khmer, Khojki, Khudawadi, Lao, Lepcha, Limbu, + * # Mahajani, Makasar, Malayalam, Marchen, Masaram Gondi, Meetei Mayek, + * # Modi, Multani, Myanmar, Nandinagari, Newa, New Tai Lue, Oriya, + * # Phags-pa, Rejang, Saurashtra, Sharada, Siddham, Sinhala, Soyombo, + * # Sundanese, Syloti Nagri, Tagalog, Tagbanwa, Tai Le, Tai Tham, + * # Tai Viet, Takri, Tamil, Telugu, Thai, Tibetan, Tirhuta, and + * # Zanabazar Square. * # * # All characters for all other scripts not in that list * # take the default value for this property, unless they * # are individually listed in this data file. * # - * + * # EastAsianWidth-13.0.0.txt + * # Date: 2029-01-21, 18:14:00 GMT [KW, LI] + * # © 2020 Unicode®, Inc. + * # Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. + * # For terms of use, see http://www.unicode.org/terms_of_use.html + * # + * # Unicode Character Database + * # For documentation, see http://www.unicode.org/reports/tr44/ + * # + * # East_Asian_Width Property + * # + * # This file is a normative contributory data file in the + * # Unicode Character Database. + * # + * # The format is two fields separated by a semicolon. + * # Field 0: Unicode code point value or range of code point values + * # Field 1: East_Asian_Width property, consisting of one of the following values: + * # "A", "F", "H", "N", "Na", "W" + * # - All code points, assigned or unassigned, that are not listed + * # explicitly are given the value "N". + * # - The unassigned code points in the following blocks default to "W": + * # CJK Unified Ideographs Extension A: U+3400..U+4DBF + * # CJK Unified Ideographs: U+4E00..U+9FFF + * # CJK Compatibility Ideographs: U+F900..U+FAFF + * # - All undesignated code points in Planes 2 and 3, whether inside or + * # outside of allocated blocks, default to "W": + * # Plane 2: U+20000..U+2FFFD + * # Plane 3: U+30000..U+3FFFD + * # + * # Character ranges are specified as for other property files in the + * # Unicode Character Database. + * # + * # For legacy reasons, there are no spaces before or after the semicolon + * # which separates the two fields. The comments following the number sign + * # "#" list the General_Category property value or the L& alias of the + * # derived value LC, the Unicode character name or names, and, in lines + * # with ranges of code points, the code point count in square brackets. + * # + * # For more information, see UAX #11: East Asian Width, + * # at http://www.unicode.org/reports/tr11/ + * # + * # @missing: 0000..10FFFF; N */ #ifndef PANGO_BREAK_TABLE_H @@ -78,112 +119,130 @@ static inline gboolean _pango_is_STerm (gunichar wc) { - if ((wc >= 0x0021 && wc <= 0x1803)) + if ((wc >= 0x0021 && wc <= 0x1809)) { if (wc == 0x0021 || wc == 0x003F || wc == 0x0589 || (wc >= 0x061E && wc <= 0x061F)) return TRUE; - if (wc == 0x06D4 || - (wc >= 0x0700 && wc <= 0x0702) || wc == 0x07F9 || wc == 0x0837) - return TRUE; - if (wc == 0x0839 || - (wc >= 0x083D && wc <= 0x083E) || - (wc >= 0x0964 && wc <= 0x0965) || (wc >= 0x104A && wc <= 0x104B)) - return TRUE; - if ((wc >= 0x1362 && wc <= 0x1803)) + if ((wc >= 0x06D4 && wc <= 0x0839)) { - if (wc == 0x1362) + if (wc == 0x06D4) + return TRUE; + if ((wc >= 0x0700 && wc <= 0x0702)) + return TRUE; + if (wc == 0x07F9) return TRUE; + if (wc == 0x0837 || wc == 0x0839) + return TRUE; + return FALSE; + } + if ((wc >= 0x083D && wc <= 0x083E) || + (wc >= 0x0964 && wc <= 0x0965) || + (wc >= 0x104A && wc <= 0x104B) || wc == 0x1362) + return TRUE; + if ((wc >= 0x1367 && wc <= 0x1809)) + { if ((wc >= 0x1367 && wc <= 0x1368)) return TRUE; if (wc == 0x166E) return TRUE; - if ((wc >= 0x1735 && wc <= 0x1736) || wc == 0x1803) + if ((wc >= 0x1735 && wc <= 0x1736)) + return TRUE; + if (wc == 0x1803 || wc == 0x1809) return TRUE; return FALSE; } return FALSE; } - if ((wc >= 0x1809 && wc <= 0xA8CF)) + if ((wc >= 0x1944 && wc <= 0xA92F)) { - if (wc == 0x1809 || - (wc >= 0x1944 && wc <= 0x1945) || - (wc >= 0x1AA8 && wc <= 0x1AAB) || (wc >= 0x1B5A && wc <= 0x1B5B)) + if ((wc >= 0x1944 && wc <= 0x1945) || + (wc >= 0x1AA8 && wc <= 0x1AAB) || + (wc >= 0x1B5A && wc <= 0x1B5B) || (wc >= 0x1B5E && wc <= 0x1B5F)) return TRUE; - if ((wc >= 0x1B5E && wc <= 0x2049)) + if ((wc >= 0x1C3B && wc <= 0x2E2E)) { - if ((wc >= 0x1B5E && wc <= 0x1B5F)) - return TRUE; if ((wc >= 0x1C3B && wc <= 0x1C3C)) return TRUE; if ((wc >= 0x1C7E && wc <= 0x1C7F)) return TRUE; - if ((wc >= 0x203C && wc <= 0x203D) || - (wc >= 0x2047 && wc <= 0x2049)) + if ((wc >= 0x203C && wc <= 0x203D)) + return TRUE; + if ((wc >= 0x2047 && wc <= 0x2049) || wc == 0x2E2E) return TRUE; return FALSE; } - if (wc == 0x2E2E || wc == 0x2E3C || wc == 0x3002 || wc == 0xA4FF) + if (wc == 0x2E3C || + wc == 0x3002 || wc == 0xA4FF || (wc >= 0xA60E && wc <= 0xA60F)) return TRUE; - if ((wc >= 0xA60E && wc <= 0xA8CF)) + if ((wc >= 0xA6F3 && wc <= 0xA92F)) { - if ((wc >= 0xA60E && wc <= 0xA60F)) - return TRUE; if (wc == 0xA6F3) return TRUE; if (wc == 0xA6F7) return TRUE; - if ((wc >= 0xA876 && wc <= 0xA877) || - (wc >= 0xA8CE && wc <= 0xA8CF)) + if ((wc >= 0xA876 && wc <= 0xA877)) + return TRUE; + if ((wc >= 0xA8CE && wc <= 0xA8CF) || wc == 0xA92F) return TRUE; return FALSE; } return FALSE; } - if ((wc >= 0xA92F && wc <= 0x111DF)) + if ((wc >= 0xA9C8 && wc <= 0x1123C)) { - if (wc == 0xA92F || - (wc >= 0xA9C8 && wc <= 0xA9C9) || - (wc >= 0xAA5D && wc <= 0xAA5F) || (wc >= 0xAAF0 && wc <= 0xAAF1)) - return TRUE; - if (wc == 0xABEB || - (wc >= 0xFE56 && wc <= 0xFE57) || wc == 0xFF01 || wc == 0xFF1F) + if ((wc >= 0xA9C8 && wc <= 0xA9C9) || + (wc >= 0xAA5D && wc <= 0xAA5F) || + (wc >= 0xAAF0 && wc <= 0xAAF1) || wc == 0xABEB) return TRUE; - if (wc == 0xFF61 || - (wc >= 0x10A56 && wc <= 0x10A57) || - (wc >= 0x10F55 && wc <= 0x10F59) || - (wc >= 0x11047 && wc <= 0x11048)) - return TRUE; - if ((wc >= 0x110BE && wc <= 0x111DF)) + if ((wc >= 0xFE56 && wc <= 0x10A57)) { - if ((wc >= 0x110BE && wc <= 0x110C1)) + if ((wc >= 0xFE56 && wc <= 0xFE57)) + return TRUE; + if (wc == 0xFF01) + return TRUE; + if (wc == 0xFF1F) return TRUE; - if ((wc >= 0x11141 && wc <= 0x11143)) + if (wc == 0xFF61 || (wc >= 0x10A56 && wc <= 0x10A57)) return TRUE; + return FALSE; + } + if ((wc >= 0x10F55 && wc <= 0x10F59) || + (wc >= 0x11047 && wc <= 0x11048) || + (wc >= 0x110BE && wc <= 0x110C1) || + (wc >= 0x11141 && wc <= 0x11143)) + return TRUE; + if ((wc >= 0x111C5 && wc <= 0x1123C)) + { if ((wc >= 0x111C5 && wc <= 0x111C6)) return TRUE; - if (wc == 0x111CD || (wc >= 0x111DE && wc <= 0x111DF)) + if (wc == 0x111CD) + return TRUE; + if ((wc >= 0x111DE && wc <= 0x111DF)) + return TRUE; + if ((wc >= 0x11238 && wc <= 0x11239) || + (wc >= 0x1123B && wc <= 0x1123C)) return TRUE; return FALSE; } return FALSE; } - if ((wc >= 0x11238 && wc <= 0x1DA88)) + if ((wc >= 0x112A9 && wc <= 0x1DA88)) { - if ((wc >= 0x11238 && wc <= 0x11239) || - (wc >= 0x1123B && wc <= 0x1123C) || - wc == 0x112A9 || (wc >= 0x1144B && wc <= 0x1144C)) + if (wc == 0x112A9 || + (wc >= 0x1144B && wc <= 0x1144C) || + (wc >= 0x115C2 && wc <= 0x115C3) || + (wc >= 0x115C9 && wc <= 0x115D7)) return TRUE; - if ((wc >= 0x115C2 && wc <= 0x11A43)) + if ((wc >= 0x11641 && wc <= 0x11A43)) { - if ((wc >= 0x115C2 && wc <= 0x115C3)) + if ((wc >= 0x11641 && wc <= 0x11642)) return TRUE; - if ((wc >= 0x115C9 && wc <= 0x115D7)) + if ((wc >= 0x1173C && wc <= 0x1173E)) return TRUE; - if ((wc >= 0x11641 && wc <= 0x11642)) + if (wc == 0x11944) return TRUE; - if ((wc >= 0x1173C && wc <= 0x1173E) || - (wc >= 0x11A42 && wc <= 0x11A43)) + if (wc == 0x11946 || (wc >= 0x11A42 && wc <= 0x11A43)) return TRUE; return FALSE; } @@ -232,7 +291,7 @@ _pango_is_Virama (gunichar wc) return TRUE; if (wc == 0x0DCA) return TRUE; - if (wc == 0x1B44 || wc == 0xA8C4) + if (wc == 0x1B44 || wc == 0xA806 || wc == 0xA8C4) return TRUE; return FALSE; } @@ -250,13 +309,13 @@ _pango_is_Virama (gunichar wc) } if ((wc >= 0x11442 && wc <= 0x11C3F)) { - if (wc == 0x11442) + if (wc == 0x11442 || wc == 0x114C2) return TRUE; - if (wc == 0x114C2 || wc == 0x115BF) + if (wc == 0x115BF || wc == 0x1163F) return TRUE; - if (wc == 0x1163F) + if (wc == 0x116B6 || wc == 0x11839) return TRUE; - if (wc == 0x116B6 || wc == 0x11839 || wc == 0x11C3F) + if (wc == 0x119E0 || wc == 0x11C3F) return TRUE; return FALSE; } @@ -266,258 +325,257 @@ _pango_is_Virama (gunichar wc) static inline gboolean _pango_is_Vowel_Dependent (gunichar wc) { - if ((wc >= 0x093A && wc <= 0x0C63)) + if ((wc >= 0x093A && wc <= 0x0CC8)) { - if ((wc >= 0x093A && wc <= 0x09C8)) + if ((wc >= 0x093A && wc <= 0x09CC)) { - if ((wc >= 0x093A && wc <= 0x093B)) - return TRUE; - if ((wc >= 0x093E && wc <= 0x094C) || - (wc >= 0x094E && wc <= 0x094F)) + if ((wc >= 0x093A && wc <= 0x093B) || + (wc >= 0x093E && wc <= 0x094C)) return TRUE; - if ((wc >= 0x0955 && wc <= 0x0957)) + if ((wc >= 0x094E && wc <= 0x094F) || + (wc >= 0x0955 && wc <= 0x0957)) return TRUE; if ((wc >= 0x0962 && wc <= 0x0963) || - (wc >= 0x09BE && wc <= 0x09C4) || - (wc >= 0x09C7 && wc <= 0x09C8)) + (wc >= 0x09BE && wc <= 0x09C4)) + return TRUE; + if ((wc >= 0x09C7 && wc <= 0x09C8) || + (wc >= 0x09CB && wc <= 0x09CC)) return TRUE; return FALSE; } - if ((wc >= 0x09CB && wc <= 0x0AC9)) + if ((wc >= 0x09D7 && wc <= 0x0ACC)) { - if ((wc >= 0x09CB && wc <= 0x09CC) || wc == 0x09D7) + if (wc == 0x09D7 || (wc >= 0x09E2 && wc <= 0x09E3)) return TRUE; - if ((wc >= 0x09E2 && wc <= 0x09E3) || - (wc >= 0x0A3E && wc <= 0x0A42)) + if ((wc >= 0x0A3E && wc <= 0x0A42) || + (wc >= 0x0A47 && wc <= 0x0A48)) return TRUE; - if ((wc >= 0x0A47 && wc <= 0x0A48) || - (wc >= 0x0A4B && wc <= 0x0A4C)) + if ((wc >= 0x0A4B && wc <= 0x0A4C) || + (wc >= 0x0ABE && wc <= 0x0AC5)) return TRUE; - if ((wc >= 0x0ABE && wc <= 0x0AC5) || - (wc >= 0x0AC7 && wc <= 0x0AC9)) + if ((wc >= 0x0AC7 && wc <= 0x0AC9) || + (wc >= 0x0ACB && wc <= 0x0ACC)) return TRUE; return FALSE; } - if ((wc >= 0x0ACB && wc <= 0x0B63)) + if ((wc >= 0x0AE2 && wc <= 0x0BC8)) { - if ((wc >= 0x0ACB && wc <= 0x0ACC)) - return TRUE; if ((wc >= 0x0AE2 && wc <= 0x0AE3) || (wc >= 0x0B3E && wc <= 0x0B44)) return TRUE; - if ((wc >= 0x0B47 && wc <= 0x0B48)) + if ((wc >= 0x0B47 && wc <= 0x0B48) || + (wc >= 0x0B4B && wc <= 0x0B4C)) return TRUE; - if ((wc >= 0x0B4B && wc <= 0x0B4C) || - (wc >= 0x0B56 && wc <= 0x0B57) || + if ((wc >= 0x0B55 && wc <= 0x0B57) || (wc >= 0x0B62 && wc <= 0x0B63)) return TRUE; - return FALSE; - } - if ((wc >= 0x0BBE && wc <= 0x0C63)) - { if ((wc >= 0x0BBE && wc <= 0x0BC2) || (wc >= 0x0BC6 && wc <= 0x0BC8)) return TRUE; + return FALSE; + } + if ((wc >= 0x0BCA && wc <= 0x0CC8)) + { if ((wc >= 0x0BCA && wc <= 0x0BCC) || wc == 0x0BD7) return TRUE; if ((wc >= 0x0C3E && wc <= 0x0C44) || (wc >= 0x0C46 && wc <= 0x0C48)) return TRUE; if ((wc >= 0x0C4A && wc <= 0x0C4C) || - (wc >= 0x0C55 && wc <= 0x0C56) || - (wc >= 0x0C62 && wc <= 0x0C63)) + (wc >= 0x0C55 && wc <= 0x0C56)) + return TRUE; + if ((wc >= 0x0C62 && wc <= 0x0C63) || + (wc >= 0x0CBE && wc <= 0x0CC4) || + (wc >= 0x0CC6 && wc <= 0x0CC8)) return TRUE; return FALSE; } return FALSE; } - if ((wc >= 0x0CBE && wc <= 0x1733)) + if ((wc >= 0x0CCA && wc <= 0x17C8)) { - if ((wc >= 0x0CBE && wc <= 0x0D48)) + if ((wc >= 0x0CCA && wc <= 0x0D63)) { - if ((wc >= 0x0CBE && wc <= 0x0CC4)) + if ((wc >= 0x0CCA && wc <= 0x0CCC) || + (wc >= 0x0CD5 && wc <= 0x0CD6)) return TRUE; - if ((wc >= 0x0CC6 && wc <= 0x0CC8) || - (wc >= 0x0CCA && wc <= 0x0CCC)) + if ((wc >= 0x0CE2 && wc <= 0x0CE3) || + (wc >= 0x0D3E && wc <= 0x0D44)) return TRUE; - if ((wc >= 0x0CD5 && wc <= 0x0CD6)) + if ((wc >= 0x0D46 && wc <= 0x0D48) || + (wc >= 0x0D4A && wc <= 0x0D4C)) return TRUE; - if ((wc >= 0x0CE2 && wc <= 0x0CE3) || - (wc >= 0x0D3E && wc <= 0x0D44) || - (wc >= 0x0D46 && wc <= 0x0D48)) + if (wc == 0x0D57 || (wc >= 0x0D62 && wc <= 0x0D63)) return TRUE; return FALSE; } - if ((wc >= 0x0D4A && wc <= 0x0E39)) + if ((wc >= 0x0DCF && wc <= 0x0EB9)) { - if ((wc >= 0x0D4A && wc <= 0x0D4C) || wc == 0x0D57) + if ((wc >= 0x0DCF && wc <= 0x0DD4) || wc == 0x0DD6) return TRUE; - if ((wc >= 0x0D62 && wc <= 0x0D63) || - (wc >= 0x0DCF && wc <= 0x0DD4)) + if ((wc >= 0x0DD8 && wc <= 0x0DDF) || + (wc >= 0x0DF2 && wc <= 0x0DF3)) return TRUE; - if (wc == 0x0DD6 || (wc >= 0x0DD8 && wc <= 0x0DDF)) + if ((wc >= 0x0E30 && wc <= 0x0E39) || + (wc >= 0x0E40 && wc <= 0x0E45)) return TRUE; - if ((wc >= 0x0DF2 && wc <= 0x0DF3) || - (wc >= 0x0E30 && wc <= 0x0E39)) + if (wc == 0x0E47 || (wc >= 0x0EB0 && wc <= 0x0EB9)) return TRUE; return FALSE; } - if ((wc >= 0x0E40 && wc <= 0x0F81)) + if ((wc >= 0x0EBB && wc <= 0x1068)) { - if ((wc >= 0x0E40 && wc <= 0x0E45)) + if (wc == 0x0EBB || (wc >= 0x0EC0 && wc <= 0x0EC4)) return TRUE; - if (wc == 0x0E47 || (wc >= 0x0EB0 && wc <= 0x0EB9)) - return TRUE; - if (wc == 0x0EBB) - return TRUE; - if ((wc >= 0x0EC0 && wc <= 0x0EC4) || - (wc >= 0x0F71 && wc <= 0x0F7D) || + if ((wc >= 0x0F71 && wc <= 0x0F7D) || (wc >= 0x0F80 && wc <= 0x0F81)) return TRUE; - return FALSE; - } - if ((wc >= 0x102B && wc <= 0x1733)) - { if ((wc >= 0x102B && wc <= 0x1035) || (wc >= 0x1056 && wc <= 0x1059)) return TRUE; if (wc == 0x1062 || (wc >= 0x1067 && wc <= 0x1068)) return TRUE; + return FALSE; + } + if ((wc >= 0x1071 && wc <= 0x17C8)) + { if ((wc >= 0x1071 && wc <= 0x1074) || (wc >= 0x1083 && wc <= 0x1086)) return TRUE; if ((wc >= 0x109C && wc <= 0x109D) || - (wc >= 0x1712 && wc <= 0x1713) || - (wc >= 0x1732 && wc <= 0x1733)) + (wc >= 0x1712 && wc <= 0x1713)) + return TRUE; + if ((wc >= 0x1732 && wc <= 0x1733) || + (wc >= 0x1752 && wc <= 0x1753)) + return TRUE; + if ((wc >= 0x1772 && wc <= 0x1773) || + (wc >= 0x17B6 && wc <= 0x17C5) || wc == 0x17C8) return TRUE; return FALSE; } return FALSE; } - if ((wc >= 0x1752 && wc <= 0x111BF)) + if ((wc >= 0x1920 && wc <= 0x11344)) { - if ((wc >= 0x1752 && wc <= 0x19C0)) + if ((wc >= 0x1920 && wc <= 0x1BEF)) { - if ((wc >= 0x1752 && wc <= 0x1753)) + if ((wc >= 0x1920 && wc <= 0x1928) || wc == 0x193A) return TRUE; - if ((wc >= 0x1772 && wc <= 0x1773) || - (wc >= 0x17B6 && wc <= 0x17C5)) + if ((wc >= 0x19B0 && wc <= 0x19C0) || + (wc >= 0x1A17 && wc <= 0x1A1B)) return TRUE; - if (wc == 0x17C8) + if ((wc >= 0x1A61 && wc <= 0x1A73) || + (wc >= 0x1B35 && wc <= 0x1B43)) return TRUE; - if ((wc >= 0x1920 && wc <= 0x1928) || - wc == 0x193A || (wc >= 0x19B0 && wc <= 0x19C0)) + if ((wc >= 0x1BA4 && wc <= 0x1BA9) || + (wc >= 0x1BE7 && wc <= 0x1BEF)) return TRUE; return FALSE; } - if ((wc >= 0x1A17 && wc <= 0xA8C3)) + if ((wc >= 0x1C26 && wc <= 0xA9E5)) { - if ((wc >= 0x1A17 && wc <= 0x1A1B) || - (wc >= 0x1A61 && wc <= 0x1A73)) - return TRUE; - if ((wc >= 0x1B35 && wc <= 0x1B43) || - (wc >= 0x1BA4 && wc <= 0x1BA9)) - return TRUE; - if ((wc >= 0x1BE7 && wc <= 0x1BEF) || - (wc >= 0x1C26 && wc <= 0x1C2C)) + if ((wc >= 0x1C26 && wc <= 0x1C2C) || wc == 0xA802) return TRUE; if ((wc >= 0xA823 && wc <= 0xA827) || (wc >= 0xA8B5 && wc <= 0xA8C3)) return TRUE; + if (wc == 0xA8FF || (wc >= 0xA947 && wc <= 0xA94E)) + return TRUE; + if ((wc >= 0xA9B4 && wc <= 0xA9BC) || wc == 0xA9E5) + return TRUE; return FALSE; } - if ((wc >= 0xA8FF && wc <= 0xAAEF)) + if ((wc >= 0xAA29 && wc <= 0x11045)) { - if (wc == 0xA8FF) + if ((wc >= 0xAA29 && wc <= 0xAA32) || + (wc >= 0xAAB0 && wc <= 0xAABE)) return TRUE; - if ((wc >= 0xA947 && wc <= 0xA94E) || - (wc >= 0xA9B4 && wc <= 0xA9BC)) + if ((wc >= 0xAAEB && wc <= 0xAAEF) || + (wc >= 0xABE3 && wc <= 0xABEA)) return TRUE; - if (wc == 0xA9E5) + if ((wc >= 0x10A01 && wc <= 0x10A03) || + (wc >= 0x10A05 && wc <= 0x10A06)) return TRUE; - if ((wc >= 0xAA29 && wc <= 0xAA32) || - (wc >= 0xAAB0 && wc <= 0xAABE) || - (wc >= 0xAAEB && wc <= 0xAAEF)) + if ((wc >= 0x10A0C && wc <= 0x10A0D) || + (wc >= 0x11038 && wc <= 0x11045)) return TRUE; return FALSE; } - if ((wc >= 0xABE3 && wc <= 0x111BF)) + if ((wc >= 0x110B0 && wc <= 0x11344)) { - if ((wc >= 0xABE3 && wc <= 0xABEA) || - (wc >= 0x10A01 && wc <= 0x10A03)) + if ((wc >= 0x110B0 && wc <= 0x110B8) || + (wc >= 0x11127 && wc <= 0x11132)) return TRUE; - if ((wc >= 0x10A05 && wc <= 0x10A06) || - (wc >= 0x10A0C && wc <= 0x10A0D)) + if ((wc >= 0x11145 && wc <= 0x11146) || + (wc >= 0x111B3 && wc <= 0x111BF)) return TRUE; - if ((wc >= 0x11038 && wc <= 0x11045) || - (wc >= 0x110B0 && wc <= 0x110B8)) + if ((wc >= 0x111CB && wc <= 0x111CC) || wc == 0x111CE) return TRUE; - if ((wc >= 0x11127 && wc <= 0x11132) || - (wc >= 0x11145 && wc <= 0x11146) || - (wc >= 0x111B3 && wc <= 0x111BF)) + if ((wc >= 0x1122C && wc <= 0x11233) || + (wc >= 0x112E0 && wc <= 0x112E8) || + (wc >= 0x1133E && wc <= 0x11344)) return TRUE; return FALSE; } return FALSE; } - if ((wc >= 0x111CB && wc <= 0x11EF6)) + if ((wc >= 0x11347 && wc <= 0x11EF6)) { - if ((wc >= 0x111CB && wc <= 0x11363)) + if ((wc >= 0x11347 && wc <= 0x115BB)) { - if ((wc >= 0x111CB && wc <= 0x111CC) || - (wc >= 0x1122C && wc <= 0x11233)) - return TRUE; - if ((wc >= 0x112E0 && wc <= 0x112E8) || - (wc >= 0x1133E && wc <= 0x11344)) - return TRUE; if ((wc >= 0x11347 && wc <= 0x11348) || (wc >= 0x1134B && wc <= 0x1134C)) return TRUE; if (wc == 0x11357 || (wc >= 0x11362 && wc <= 0x11363)) return TRUE; - return FALSE; - } - if ((wc >= 0x11435 && wc <= 0x116B5)) - { if ((wc >= 0x11435 && wc <= 0x11441) || (wc >= 0x114B0 && wc <= 0x114BE)) return TRUE; if ((wc >= 0x115AF && wc <= 0x115B5) || (wc >= 0x115B8 && wc <= 0x115BB)) return TRUE; + return FALSE; + } + if ((wc >= 0x115DC && wc <= 0x11938)) + { if ((wc >= 0x115DC && wc <= 0x115DD) || (wc >= 0x11630 && wc <= 0x1163C)) return TRUE; if (wc == 0x11640 || (wc >= 0x116AD && wc <= 0x116B5)) return TRUE; + if ((wc >= 0x11720 && wc <= 0x1172A) || + (wc >= 0x1182C && wc <= 0x11836)) + return TRUE; + if ((wc >= 0x11930 && wc <= 0x11935) || + (wc >= 0x11937 && wc <= 0x11938)) + return TRUE; return FALSE; } - if ((wc >= 0x11720 && wc <= 0x11D36)) + if ((wc >= 0x119D1 && wc <= 0x11CB4)) { - if ((wc >= 0x11720 && wc <= 0x1172A) || - (wc >= 0x1182C && wc <= 0x11836)) + if ((wc >= 0x119D1 && wc <= 0x119D7) || + (wc >= 0x119DA && wc <= 0x119DD)) return TRUE; - if ((wc >= 0x11A01 && wc <= 0x11A0A) || - (wc >= 0x11A51 && wc <= 0x11A5B)) + if (wc == 0x119E4 || (wc >= 0x11A01 && wc <= 0x11A0A)) return TRUE; - if ((wc >= 0x11C2F && wc <= 0x11C36) || - (wc >= 0x11C38 && wc <= 0x11C3B)) + if ((wc >= 0x11A51 && wc <= 0x11A5B) || + (wc >= 0x11C2F && wc <= 0x11C36)) return TRUE; - if ((wc >= 0x11CB0 && wc <= 0x11CB4) || - (wc >= 0x11D31 && wc <= 0x11D36)) + if ((wc >= 0x11C38 && wc <= 0x11C3B) || + (wc >= 0x11CB0 && wc <= 0x11CB4)) return TRUE; return FALSE; } - if ((wc >= 0x11D3A && wc <= 0x11EF6)) + if ((wc >= 0x11D31 && wc <= 0x11EF6)) { - if (wc == 0x11D3A || (wc >= 0x11D3C && wc <= 0x11D3D)) + if ((wc >= 0x11D31 && wc <= 0x11D36) || wc == 0x11D3A) return TRUE; - if (wc == 0x11D3F || wc == 0x11D43) + if ((wc >= 0x11D3C && wc <= 0x11D3D) || wc == 0x11D3F) return TRUE; - if ((wc >= 0x11D8A && wc <= 0x11D8E) || - (wc >= 0x11D90 && wc <= 0x11D91)) + if (wc == 0x11D43 || (wc >= 0x11D8A && wc <= 0x11D8E)) return TRUE; - if ((wc >= 0x11D93 && wc <= 0x11D94) || + if ((wc >= 0x11D90 && wc <= 0x11D91) || + (wc >= 0x11D93 && wc <= 0x11D94) || (wc >= 0x11EF3 && wc <= 0x11EF6)) return TRUE; return FALSE; @@ -527,6 +585,276 @@ _pango_is_Vowel_Dependent (gunichar wc) return FALSE; } +static inline gboolean +_pango_is_Consonant_Prefixed (gunichar wc) +{ + if ((wc >= 0x111C2 && wc <= 0x111C3) || + wc == 0x1193F || wc == 0x11A3A || (wc >= 0x11A84 && wc <= 0x11A89)) + return TRUE; + return FALSE; +} + +static inline gboolean +_pango_is_Consonant_Preceding_Repha (gunichar wc) +{ + if (wc == 0x0D4E || wc == 0x11941 || wc == 0x11D46) + return TRUE; + return FALSE; +} + +static inline gboolean +_pango_is_EastAsianWide (gunichar wc) +{ + if ((wc >= 0x1100 && wc <= 0x2797)) + { + if ((wc >= 0x1100 && wc <= 0x23F3)) + { + if ((wc >= 0x1100 && wc <= 0x115F)) + return TRUE; + if (wc == 0x20A9 || (wc >= 0x231A && wc <= 0x231B)) + return TRUE; + if ((wc >= 0x2329 && wc <= 0x232A)) + return TRUE; + if ((wc >= 0x23E9 && wc <= 0x23EC) || wc == 0x23F0 || wc == 0x23F3) + return TRUE; + return FALSE; + } + if ((wc >= 0x25FD && wc <= 0x26BE)) + { + if ((wc >= 0x25FD && wc <= 0x25FE) || + (wc >= 0x2614 && wc <= 0x2615)) + return TRUE; + if ((wc >= 0x2648 && wc <= 0x2653) || wc == 0x267F) + return TRUE; + if (wc == 0x2693 || wc == 0x26A1) + return TRUE; + if ((wc >= 0x26AA && wc <= 0x26AB) || + (wc >= 0x26BD && wc <= 0x26BE)) + return TRUE; + return FALSE; + } + if ((wc >= 0x26C4 && wc <= 0x26FA)) + { + if ((wc >= 0x26C4 && wc <= 0x26C5)) + return TRUE; + if (wc == 0x26CE || wc == 0x26D4) + return TRUE; + if (wc == 0x26EA) + return TRUE; + if ((wc >= 0x26F2 && wc <= 0x26F3) || wc == 0x26F5 || wc == 0x26FA) + return TRUE; + return FALSE; + } + if ((wc >= 0x26FD && wc <= 0x2797)) + { + if (wc == 0x26FD || wc == 0x2705) + return TRUE; + if ((wc >= 0x270A && wc <= 0x270B) || wc == 0x2728) + return TRUE; + if (wc == 0x274C || wc == 0x274E) + return TRUE; + if ((wc >= 0x2753 && wc <= 0x2755) || + wc == 0x2757 || (wc >= 0x2795 && wc <= 0x2797)) + return TRUE; + return FALSE; + } + return FALSE; + } + if ((wc >= 0x27B0 && wc <= 0xFFC7)) + { + if ((wc >= 0x27B0 && wc <= 0x2EF3)) + { + if (wc == 0x27B0) + return TRUE; + if (wc == 0x27BF || (wc >= 0x2B1B && wc <= 0x2B1C)) + return TRUE; + if (wc == 0x2B50) + return TRUE; + if (wc == 0x2B55 || + (wc >= 0x2E80 && wc <= 0x2E99) || + (wc >= 0x2E9B && wc <= 0x2EF3)) + return TRUE; + return FALSE; + } + if ((wc >= 0x2F00 && wc <= 0x318E)) + { + if ((wc >= 0x2F00 && wc <= 0x2FD5) || + (wc >= 0x2FF0 && wc <= 0x2FFB)) + return TRUE; + if (wc == 0x3000 || (wc >= 0x3001 && wc <= 0x303E)) + return TRUE; + if ((wc >= 0x3041 && wc <= 0x3096) || + (wc >= 0x3099 && wc <= 0x30FF)) + return TRUE; + if ((wc >= 0x3105 && wc <= 0x312F) || + (wc >= 0x3131 && wc <= 0x318E)) + return TRUE; + return FALSE; + } + if ((wc >= 0x3190 && wc <= 0xA97C)) + { + if ((wc >= 0x3190 && wc <= 0x31E3)) + return TRUE; + if ((wc >= 0x31F0 && wc <= 0x321E) || + (wc >= 0x3220 && wc <= 0x3247)) + return TRUE; + if ((wc >= 0x3250 && wc <= 0x4DBF)) + return TRUE; + if ((wc >= 0x4E00 && wc <= 0xA48C) || + (wc >= 0xA490 && wc <= 0xA4C6) || + (wc >= 0xA960 && wc <= 0xA97C)) + return TRUE; + return FALSE; + } + if ((wc >= 0xAC00 && wc <= 0xFFC7)) + { + if ((wc >= 0xAC00 && wc <= 0xD7A3) || + (wc >= 0xF900 && wc <= 0xFAFF)) + return TRUE; + if ((wc >= 0xFE10 && wc <= 0xFE19) || + (wc >= 0xFE30 && wc <= 0xFE52)) + return TRUE; + if ((wc >= 0xFE54 && wc <= 0xFE66) || + (wc >= 0xFE68 && wc <= 0xFE6B)) + return TRUE; + if ((wc >= 0xFF01 && wc <= 0xFF60) || + (wc >= 0xFF61 && wc <= 0xFFBE) || + (wc >= 0xFFC2 && wc <= 0xFFC7)) + return TRUE; + return FALSE; + } + return FALSE; + } + if ((wc >= 0xFFCA && wc <= 0x1F3F4)) + { + if ((wc >= 0xFFCA && wc <= 0x16FF1)) + { + if ((wc >= 0xFFCA && wc <= 0xFFCF)) + return TRUE; + if ((wc >= 0xFFD2 && wc <= 0xFFD7) || + (wc >= 0xFFDA && wc <= 0xFFDC)) + return TRUE; + if ((wc >= 0xFFE0 && wc <= 0xFFE6)) + return TRUE; + if ((wc >= 0xFFE8 && wc <= 0xFFEE) || + (wc >= 0x16FE0 && wc <= 0x16FE4) || + (wc >= 0x16FF0 && wc <= 0x16FF1)) + return TRUE; + return FALSE; + } + if ((wc >= 0x17000 && wc <= 0x1F004)) + { + if ((wc >= 0x17000 && wc <= 0x187F7) || + (wc >= 0x18800 && wc <= 0x18CD5)) + return TRUE; + if ((wc >= 0x18D00 && wc <= 0x18D08) || + (wc >= 0x1B000 && wc <= 0x1B11E)) + return TRUE; + if ((wc >= 0x1B150 && wc <= 0x1B152) || + (wc >= 0x1B164 && wc <= 0x1B167)) + return TRUE; + if ((wc >= 0x1B170 && wc <= 0x1B2FB) || wc == 0x1F004) + return TRUE; + return FALSE; + } + if ((wc >= 0x1F0CF && wc <= 0x1F251)) + { + if (wc == 0x1F0CF) + return TRUE; + if (wc == 0x1F18E || (wc >= 0x1F191 && wc <= 0x1F19A)) + return TRUE; + if ((wc >= 0x1F200 && wc <= 0x1F202)) + return TRUE; + if ((wc >= 0x1F210 && wc <= 0x1F23B) || + (wc >= 0x1F240 && wc <= 0x1F248) || + (wc >= 0x1F250 && wc <= 0x1F251)) + return TRUE; + return FALSE; + } + if ((wc >= 0x1F260 && wc <= 0x1F3F4)) + { + if ((wc >= 0x1F260 && wc <= 0x1F265) || + (wc >= 0x1F300 && wc <= 0x1F320)) + return TRUE; + if ((wc >= 0x1F32D && wc <= 0x1F335) || + (wc >= 0x1F337 && wc <= 0x1F37C)) + return TRUE; + if ((wc >= 0x1F37E && wc <= 0x1F393) || + (wc >= 0x1F3A0 && wc <= 0x1F3CA)) + return TRUE; + if ((wc >= 0x1F3CF && wc <= 0x1F3D3) || + (wc >= 0x1F3E0 && wc <= 0x1F3F0) || wc == 0x1F3F4) + return TRUE; + return FALSE; + } + return FALSE; + } + if ((wc >= 0x1F3F8 && wc <= 0x3FFFD)) + { + if ((wc >= 0x1F3F8 && wc <= 0x1F57A)) + { + if ((wc >= 0x1F3F8 && wc <= 0x1F43E)) + return TRUE; + if (wc == 0x1F440 || (wc >= 0x1F442 && wc <= 0x1F4FC)) + return TRUE; + if ((wc >= 0x1F4FF && wc <= 0x1F53D)) + return TRUE; + if ((wc >= 0x1F54B && wc <= 0x1F54E) || + (wc >= 0x1F550 && wc <= 0x1F567) || wc == 0x1F57A) + return TRUE; + return FALSE; + } + if ((wc >= 0x1F595 && wc <= 0x1F6EC)) + { + if ((wc >= 0x1F595 && wc <= 0x1F596) || wc == 0x1F5A4) + return TRUE; + if ((wc >= 0x1F5FB && wc <= 0x1F64F) || + (wc >= 0x1F680 && wc <= 0x1F6C5)) + return TRUE; + if (wc == 0x1F6CC || (wc >= 0x1F6D0 && wc <= 0x1F6D2)) + return TRUE; + if ((wc >= 0x1F6D5 && wc <= 0x1F6D7) || + (wc >= 0x1F6EB && wc <= 0x1F6EC)) + return TRUE; + return FALSE; + } + if ((wc >= 0x1F6F4 && wc <= 0x1F9FF)) + { + if ((wc >= 0x1F6F4 && wc <= 0x1F6FC)) + return TRUE; + if ((wc >= 0x1F7E0 && wc <= 0x1F7EB) || + (wc >= 0x1F90C && wc <= 0x1F93A)) + return TRUE; + if ((wc >= 0x1F93C && wc <= 0x1F945)) + return TRUE; + if ((wc >= 0x1F947 && wc <= 0x1F978) || + (wc >= 0x1F97A && wc <= 0x1F9CB) || + (wc >= 0x1F9CD && wc <= 0x1F9FF)) + return TRUE; + return FALSE; + } + if ((wc >= 0x1FA70 && wc <= 0x3FFFD)) + { + if ((wc >= 0x1FA70 && wc <= 0x1FA74) || + (wc >= 0x1FA78 && wc <= 0x1FA7A)) + return TRUE; + if ((wc >= 0x1FA80 && wc <= 0x1FA86) || + (wc >= 0x1FA90 && wc <= 0x1FAA8)) + return TRUE; + if ((wc >= 0x1FAB0 && wc <= 0x1FAB6) || + (wc >= 0x1FAC0 && wc <= 0x1FAC2)) + return TRUE; + if ((wc >= 0x1FAD0 && wc <= 0x1FAD6) || + (wc >= 0x20000 && wc <= 0x2FFFD) || + (wc >= 0x30000 && wc <= 0x3FFFD)) + return TRUE; + return FALSE; + } + return FALSE; + } + return FALSE; +} + #endif /* PANGO_BREAK_TABLE_H */ /* == End of generated table == */ -- cgit v1.2.1 From d8ba812c27d40692d619a280b4cd269ce4cf8427 Mon Sep 17 00:00:00 2001 From: Peng Wu Date: Tue, 10 Mar 2020 12:04:20 +0800 Subject: Update break test cases to Unicode 13 (cherry-picked from commit 9d76aa66) --- tests/GraphemeBreakTest.txt | 78 +++------------------------------------------ tests/SentenceBreakTest.txt | 6 ++-- tests/WordBreakTest.txt | 6 ++-- 3 files changed, 10 insertions(+), 80 deletions(-) diff --git a/tests/GraphemeBreakTest.txt b/tests/GraphemeBreakTest.txt index 6847953c..5baf292a 100644 --- a/tests/GraphemeBreakTest.txt +++ b/tests/GraphemeBreakTest.txt @@ -1,6 +1,6 @@ -# GraphemeBreakTest-11.0.0.txt -# Date: 2018-03-18, 13:30:33 GMT -# © 2018 Unicode®, Inc. +# GraphemeBreakTest-13.0.0.txt +# Date: 2019-11-15, 19:49:10 GMT +# © 2019 Unicode®, Inc. # Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. # For terms of use, see http://www.unicode.org/terms_of_use.html # @@ -56,8 +56,6 @@ ÷ 0020 × 0308 × 200D ÷ # ÷ [0.2] SPACE (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] ÷ 0020 ÷ 0378 ÷ # ÷ [0.2] SPACE (Other) ÷ [999.0] (Other) ÷ [0.3] ÷ 0020 × 0308 ÷ 0378 ÷ # ÷ [0.2] SPACE (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] (Other) ÷ [0.3] -÷ 0020 ÷ D800 ÷ # ÷ [0.2] SPACE (Other) ÷ [5.0] (Control) ÷ [0.3] -÷ 0020 × 0308 ÷ D800 ÷ # ÷ [0.2] SPACE (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (Control) ÷ [0.3] ÷ 000D ÷ 0020 ÷ # ÷ [0.2] (CR) ÷ [4.0] SPACE (Other) ÷ [0.3] ÷ 000D ÷ 0308 ÷ 0020 ÷ # ÷ [0.2] (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] SPACE (Other) ÷ [0.3] ÷ 000D ÷ 000D ÷ # ÷ [0.2] (CR) ÷ [4.0] (CR) ÷ [0.3] @@ -92,8 +90,6 @@ ÷ 000D ÷ 0308 × 200D ÷ # ÷ [0.2] (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] ÷ 000D ÷ 0378 ÷ # ÷ [0.2] (CR) ÷ [4.0] (Other) ÷ [0.3] ÷ 000D ÷ 0308 ÷ 0378 ÷ # ÷ [0.2] (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] (Other) ÷ [0.3] -÷ 000D ÷ D800 ÷ # ÷ [0.2] (CR) ÷ [4.0] (Control) ÷ [0.3] -÷ 000D ÷ 0308 ÷ D800 ÷ # ÷ [0.2] (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (Control) ÷ [0.3] ÷ 000A ÷ 0020 ÷ # ÷ [0.2] (LF) ÷ [4.0] SPACE (Other) ÷ [0.3] ÷ 000A ÷ 0308 ÷ 0020 ÷ # ÷ [0.2] (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] SPACE (Other) ÷ [0.3] ÷ 000A ÷ 000D ÷ # ÷ [0.2] (LF) ÷ [4.0] (CR) ÷ [0.3] @@ -128,8 +124,6 @@ ÷ 000A ÷ 0308 × 200D ÷ # ÷ [0.2] (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] ÷ 000A ÷ 0378 ÷ # ÷ [0.2] (LF) ÷ [4.0] (Other) ÷ [0.3] ÷ 000A ÷ 0308 ÷ 0378 ÷ # ÷ [0.2] (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] (Other) ÷ [0.3] -÷ 000A ÷ D800 ÷ # ÷ [0.2] (LF) ÷ [4.0] (Control) ÷ [0.3] -÷ 000A ÷ 0308 ÷ D800 ÷ # ÷ [0.2] (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (Control) ÷ [0.3] ÷ 0001 ÷ 0020 ÷ # ÷ [0.2] (Control) ÷ [4.0] SPACE (Other) ÷ [0.3] ÷ 0001 ÷ 0308 ÷ 0020 ÷ # ÷ [0.2] (Control) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] SPACE (Other) ÷ [0.3] ÷ 0001 ÷ 000D ÷ # ÷ [0.2] (Control) ÷ [4.0] (CR) ÷ [0.3] @@ -164,8 +158,6 @@ ÷ 0001 ÷ 0308 × 200D ÷ # ÷ [0.2] (Control) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] ÷ 0001 ÷ 0378 ÷ # ÷ [0.2] (Control) ÷ [4.0] (Other) ÷ [0.3] ÷ 0001 ÷ 0308 ÷ 0378 ÷ # ÷ [0.2] (Control) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] (Other) ÷ [0.3] -÷ 0001 ÷ D800 ÷ # ÷ [0.2] (Control) ÷ [4.0] (Control) ÷ [0.3] -÷ 0001 ÷ 0308 ÷ D800 ÷ # ÷ [0.2] (Control) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (Control) ÷ [0.3] ÷ 034F ÷ 0020 ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) ÷ [999.0] SPACE (Other) ÷ [0.3] ÷ 034F × 0308 ÷ 0020 ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] SPACE (Other) ÷ [0.3] ÷ 034F ÷ 000D ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) ÷ [5.0] (CR) ÷ [0.3] @@ -200,8 +192,6 @@ ÷ 034F × 0308 × 200D ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] ÷ 034F ÷ 0378 ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) ÷ [999.0] (Other) ÷ [0.3] ÷ 034F × 0308 ÷ 0378 ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] (Other) ÷ [0.3] -÷ 034F ÷ D800 ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) ÷ [5.0] (Control) ÷ [0.3] -÷ 034F × 0308 ÷ D800 ÷ # ÷ [0.2] COMBINING GRAPHEME JOINER (Extend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (Control) ÷ [0.3] ÷ 1F1E6 ÷ 0020 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] SPACE (Other) ÷ [0.3] ÷ 1F1E6 × 0308 ÷ 0020 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] SPACE (Other) ÷ [0.3] ÷ 1F1E6 ÷ 000D ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [5.0] (CR) ÷ [0.3] @@ -236,8 +226,6 @@ ÷ 1F1E6 × 0308 × 200D ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] ÷ 1F1E6 ÷ 0378 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] (Other) ÷ [0.3] ÷ 1F1E6 × 0308 ÷ 0378 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] (Other) ÷ [0.3] -÷ 1F1E6 ÷ D800 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [5.0] (Control) ÷ [0.3] -÷ 1F1E6 × 0308 ÷ D800 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (Control) ÷ [0.3] ÷ 0600 × 0020 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.2] SPACE (Other) ÷ [0.3] ÷ 0600 × 0308 ÷ 0020 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] SPACE (Other) ÷ [0.3] ÷ 0600 ÷ 000D ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) ÷ [5.0] (CR) ÷ [0.3] @@ -272,8 +260,6 @@ ÷ 0600 × 0308 × 200D ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] ÷ 0600 × 0378 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.2] (Other) ÷ [0.3] ÷ 0600 × 0308 ÷ 0378 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] (Other) ÷ [0.3] -÷ 0600 ÷ D800 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) ÷ [5.0] (Control) ÷ [0.3] -÷ 0600 × 0308 ÷ D800 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (Control) ÷ [0.3] ÷ 0903 ÷ 0020 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [999.0] SPACE (Other) ÷ [0.3] ÷ 0903 × 0308 ÷ 0020 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] SPACE (Other) ÷ [0.3] ÷ 0903 ÷ 000D ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [5.0] (CR) ÷ [0.3] @@ -308,8 +294,6 @@ ÷ 0903 × 0308 × 200D ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] ÷ 0903 ÷ 0378 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [999.0] (Other) ÷ [0.3] ÷ 0903 × 0308 ÷ 0378 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] (Other) ÷ [0.3] -÷ 0903 ÷ D800 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [5.0] (Control) ÷ [0.3] -÷ 0903 × 0308 ÷ D800 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (Control) ÷ [0.3] ÷ 1100 ÷ 0020 ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) ÷ [999.0] SPACE (Other) ÷ [0.3] ÷ 1100 × 0308 ÷ 0020 ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] SPACE (Other) ÷ [0.3] ÷ 1100 ÷ 000D ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) ÷ [5.0] (CR) ÷ [0.3] @@ -344,8 +328,6 @@ ÷ 1100 × 0308 × 200D ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] ÷ 1100 ÷ 0378 ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) ÷ [999.0] (Other) ÷ [0.3] ÷ 1100 × 0308 ÷ 0378 ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] (Other) ÷ [0.3] -÷ 1100 ÷ D800 ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) ÷ [5.0] (Control) ÷ [0.3] -÷ 1100 × 0308 ÷ D800 ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (Control) ÷ [0.3] ÷ 1160 ÷ 0020 ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) ÷ [999.0] SPACE (Other) ÷ [0.3] ÷ 1160 × 0308 ÷ 0020 ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] SPACE (Other) ÷ [0.3] ÷ 1160 ÷ 000D ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) ÷ [5.0] (CR) ÷ [0.3] @@ -380,8 +362,6 @@ ÷ 1160 × 0308 × 200D ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] ÷ 1160 ÷ 0378 ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) ÷ [999.0] (Other) ÷ [0.3] ÷ 1160 × 0308 ÷ 0378 ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] (Other) ÷ [0.3] -÷ 1160 ÷ D800 ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) ÷ [5.0] (Control) ÷ [0.3] -÷ 1160 × 0308 ÷ D800 ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (Control) ÷ [0.3] ÷ 11A8 ÷ 0020 ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) ÷ [999.0] SPACE (Other) ÷ [0.3] ÷ 11A8 × 0308 ÷ 0020 ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] SPACE (Other) ÷ [0.3] ÷ 11A8 ÷ 000D ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) ÷ [5.0] (CR) ÷ [0.3] @@ -416,8 +396,6 @@ ÷ 11A8 × 0308 × 200D ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] ÷ 11A8 ÷ 0378 ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) ÷ [999.0] (Other) ÷ [0.3] ÷ 11A8 × 0308 ÷ 0378 ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] (Other) ÷ [0.3] -÷ 11A8 ÷ D800 ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) ÷ [5.0] (Control) ÷ [0.3] -÷ 11A8 × 0308 ÷ D800 ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (Control) ÷ [0.3] ÷ AC00 ÷ 0020 ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) ÷ [999.0] SPACE (Other) ÷ [0.3] ÷ AC00 × 0308 ÷ 0020 ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] SPACE (Other) ÷ [0.3] ÷ AC00 ÷ 000D ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) ÷ [5.0] (CR) ÷ [0.3] @@ -452,8 +430,6 @@ ÷ AC00 × 0308 × 200D ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] ÷ AC00 ÷ 0378 ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) ÷ [999.0] (Other) ÷ [0.3] ÷ AC00 × 0308 ÷ 0378 ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] (Other) ÷ [0.3] -÷ AC00 ÷ D800 ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) ÷ [5.0] (Control) ÷ [0.3] -÷ AC00 × 0308 ÷ D800 ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (Control) ÷ [0.3] ÷ AC01 ÷ 0020 ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) ÷ [999.0] SPACE (Other) ÷ [0.3] ÷ AC01 × 0308 ÷ 0020 ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] SPACE (Other) ÷ [0.3] ÷ AC01 ÷ 000D ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) ÷ [5.0] (CR) ÷ [0.3] @@ -488,8 +464,6 @@ ÷ AC01 × 0308 × 200D ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] ÷ AC01 ÷ 0378 ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) ÷ [999.0] (Other) ÷ [0.3] ÷ AC01 × 0308 ÷ 0378 ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] (Other) ÷ [0.3] -÷ AC01 ÷ D800 ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) ÷ [5.0] (Control) ÷ [0.3] -÷ AC01 × 0308 ÷ D800 ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (Control) ÷ [0.3] ÷ 231A ÷ 0020 ÷ # ÷ [0.2] WATCH (ExtPict) ÷ [999.0] SPACE (Other) ÷ [0.3] ÷ 231A × 0308 ÷ 0020 ÷ # ÷ [0.2] WATCH (ExtPict) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] SPACE (Other) ÷ [0.3] ÷ 231A ÷ 000D ÷ # ÷ [0.2] WATCH (ExtPict) ÷ [5.0] (CR) ÷ [0.3] @@ -524,8 +498,6 @@ ÷ 231A × 0308 × 200D ÷ # ÷ [0.2] WATCH (ExtPict) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] ÷ 231A ÷ 0378 ÷ # ÷ [0.2] WATCH (ExtPict) ÷ [999.0] (Other) ÷ [0.3] ÷ 231A × 0308 ÷ 0378 ÷ # ÷ [0.2] WATCH (ExtPict) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] (Other) ÷ [0.3] -÷ 231A ÷ D800 ÷ # ÷ [0.2] WATCH (ExtPict) ÷ [5.0] (Control) ÷ [0.3] -÷ 231A × 0308 ÷ D800 ÷ # ÷ [0.2] WATCH (ExtPict) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (Control) ÷ [0.3] ÷ 0300 ÷ 0020 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [999.0] SPACE (Other) ÷ [0.3] ÷ 0300 × 0308 ÷ 0020 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] SPACE (Other) ÷ [0.3] ÷ 0300 ÷ 000D ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [5.0] (CR) ÷ [0.3] @@ -560,8 +532,6 @@ ÷ 0300 × 0308 × 200D ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] ÷ 0300 ÷ 0378 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [999.0] (Other) ÷ [0.3] ÷ 0300 × 0308 ÷ 0378 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] (Other) ÷ [0.3] -÷ 0300 ÷ D800 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [5.0] (Control) ÷ [0.3] -÷ 0300 × 0308 ÷ D800 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (Control) ÷ [0.3] ÷ 200D ÷ 0020 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [999.0] SPACE (Other) ÷ [0.3] ÷ 200D × 0308 ÷ 0020 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] SPACE (Other) ÷ [0.3] ÷ 200D ÷ 000D ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [5.0] (CR) ÷ [0.3] @@ -596,8 +566,6 @@ ÷ 200D × 0308 × 200D ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] ÷ 200D ÷ 0378 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [999.0] (Other) ÷ [0.3] ÷ 200D × 0308 ÷ 0378 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] (Other) ÷ [0.3] -÷ 200D ÷ D800 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [5.0] (Control) ÷ [0.3] -÷ 200D × 0308 ÷ D800 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (Control) ÷ [0.3] ÷ 0378 ÷ 0020 ÷ # ÷ [0.2] (Other) ÷ [999.0] SPACE (Other) ÷ [0.3] ÷ 0378 × 0308 ÷ 0020 ÷ # ÷ [0.2] (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] SPACE (Other) ÷ [0.3] ÷ 0378 ÷ 000D ÷ # ÷ [0.2] (Other) ÷ [5.0] (CR) ÷ [0.3] @@ -632,44 +600,6 @@ ÷ 0378 × 0308 × 200D ÷ # ÷ [0.2] (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] ÷ 0378 ÷ 0378 ÷ # ÷ [0.2] (Other) ÷ [999.0] (Other) ÷ [0.3] ÷ 0378 × 0308 ÷ 0378 ÷ # ÷ [0.2] (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] (Other) ÷ [0.3] -÷ 0378 ÷ D800 ÷ # ÷ [0.2] (Other) ÷ [5.0] (Control) ÷ [0.3] -÷ 0378 × 0308 ÷ D800 ÷ # ÷ [0.2] (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (Control) ÷ [0.3] -÷ D800 ÷ 0020 ÷ # ÷ [0.2] (Control) ÷ [4.0] SPACE (Other) ÷ [0.3] -÷ D800 ÷ 0308 ÷ 0020 ÷ # ÷ [0.2] (Control) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] SPACE (Other) ÷ [0.3] -÷ D800 ÷ 000D ÷ # ÷ [0.2] (Control) ÷ [4.0] (CR) ÷ [0.3] -÷ D800 ÷ 0308 ÷ 000D ÷ # ÷ [0.2] (Control) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (CR) ÷ [0.3] -÷ D800 ÷ 000A ÷ # ÷ [0.2] (Control) ÷ [4.0] (LF) ÷ [0.3] -÷ D800 ÷ 0308 ÷ 000A ÷ # ÷ [0.2] (Control) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (LF) ÷ [0.3] -÷ D800 ÷ 0001 ÷ # ÷ [0.2] (Control) ÷ [4.0] (Control) ÷ [0.3] -÷ D800 ÷ 0308 ÷ 0001 ÷ # ÷ [0.2] (Control) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (Control) ÷ [0.3] -÷ D800 ÷ 034F ÷ # ÷ [0.2] (Control) ÷ [4.0] COMBINING GRAPHEME JOINER (Extend) ÷ [0.3] -÷ D800 ÷ 0308 × 034F ÷ # ÷ [0.2] (Control) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAPHEME JOINER (Extend) ÷ [0.3] -÷ D800 ÷ 1F1E6 ÷ # ÷ [0.2] (Control) ÷ [4.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] -÷ D800 ÷ 0308 ÷ 1F1E6 ÷ # ÷ [0.2] (Control) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] -÷ D800 ÷ 0600 ÷ # ÷ [0.2] (Control) ÷ [4.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] -÷ D800 ÷ 0308 ÷ 0600 ÷ # ÷ [0.2] (Control) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] -÷ D800 ÷ 0903 ÷ # ÷ [0.2] (Control) ÷ [4.0] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] -÷ D800 ÷ 0308 × 0903 ÷ # ÷ [0.2] (Control) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] -÷ D800 ÷ 1100 ÷ # ÷ [0.2] (Control) ÷ [4.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] -÷ D800 ÷ 0308 ÷ 1100 ÷ # ÷ [0.2] (Control) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] -÷ D800 ÷ 1160 ÷ # ÷ [0.2] (Control) ÷ [4.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] -÷ D800 ÷ 0308 ÷ 1160 ÷ # ÷ [0.2] (Control) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] -÷ D800 ÷ 11A8 ÷ # ÷ [0.2] (Control) ÷ [4.0] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3] -÷ D800 ÷ 0308 ÷ 11A8 ÷ # ÷ [0.2] (Control) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3] -÷ D800 ÷ AC00 ÷ # ÷ [0.2] (Control) ÷ [4.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] -÷ D800 ÷ 0308 ÷ AC00 ÷ # ÷ [0.2] (Control) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] -÷ D800 ÷ AC01 ÷ # ÷ [0.2] (Control) ÷ [4.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] -÷ D800 ÷ 0308 ÷ AC01 ÷ # ÷ [0.2] (Control) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] -÷ D800 ÷ 231A ÷ # ÷ [0.2] (Control) ÷ [4.0] WATCH (ExtPict) ÷ [0.3] -÷ D800 ÷ 0308 ÷ 231A ÷ # ÷ [0.2] (Control) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] -÷ D800 ÷ 0300 ÷ # ÷ [0.2] (Control) ÷ [4.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3] -÷ D800 ÷ 0308 × 0300 ÷ # ÷ [0.2] (Control) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3] -÷ D800 ÷ 200D ÷ # ÷ [0.2] (Control) ÷ [4.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] -÷ D800 ÷ 0308 × 200D ÷ # ÷ [0.2] (Control) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] -÷ D800 ÷ 0378 ÷ # ÷ [0.2] (Control) ÷ [4.0] (Other) ÷ [0.3] -÷ D800 ÷ 0308 ÷ 0378 ÷ # ÷ [0.2] (Control) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] (Other) ÷ [0.3] -÷ D800 ÷ D800 ÷ # ÷ [0.2] (Control) ÷ [4.0] (Control) ÷ [0.3] -÷ D800 ÷ 0308 ÷ D800 ÷ # ÷ [0.2] (Control) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (Control) ÷ [0.3] ÷ 000D × 000A ÷ 0061 ÷ 000A ÷ 0308 ÷ # ÷ [0.2] (CR) × [3.0] (LF) ÷ [4.0] LATIN SMALL LETTER A (Other) ÷ [5.0] (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [0.3] ÷ 0061 × 0308 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Other) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [0.3] ÷ 0020 × 200D ÷ 0646 ÷ # ÷ [0.2] SPACE (Other) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [999.0] ARABIC LETTER NOON (Other) ÷ [0.3] @@ -695,6 +625,6 @@ ÷ 2701 × 200D × 2701 ÷ # ÷ [0.2] UPPER BLADE SCISSORS (Other) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) × [11.0] UPPER BLADE SCISSORS (Other) ÷ [0.3] ÷ 0061 × 200D ÷ 2701 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Other) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [999.0] UPPER BLADE SCISSORS (Other) ÷ [0.3] # -# Lines: 672 +# Lines: 602 # # EOF diff --git a/tests/SentenceBreakTest.txt b/tests/SentenceBreakTest.txt index 70898a31..5ae1f881 100644 --- a/tests/SentenceBreakTest.txt +++ b/tests/SentenceBreakTest.txt @@ -1,6 +1,6 @@ -# SentenceBreakTest-11.0.0.txt -# Date: 2018-01-31, 08:20:29 GMT -# © 2018 Unicode®, Inc. +# SentenceBreakTest-13.0.0.txt +# Date: 2019-11-20, 22:27:22 GMT +# © 2019 Unicode®, Inc. # Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. # For terms of use, see http://www.unicode.org/terms_of_use.html # diff --git a/tests/WordBreakTest.txt b/tests/WordBreakTest.txt index c4c92550..3e85759b 100644 --- a/tests/WordBreakTest.txt +++ b/tests/WordBreakTest.txt @@ -1,6 +1,6 @@ -# WordBreakTest-11.0.0.txt -# Date: 2018-03-16, 20:34:16 GMT -# © 2018 Unicode®, Inc. +# WordBreakTest-13.0.0.txt +# Date: 2019-11-20, 22:27:23 GMT +# © 2019 Unicode®, Inc. # Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. # For terms of use, see http://www.unicode.org/terms_of_use.html # -- cgit v1.2.1 From 2c193f2bf951c6455d9347187511f1753c6bc6b5 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Thu, 17 Sep 2020 19:17:27 -0400 Subject: Fix handling of keycap sequences The last character of Emoji keycap sequences, 0x20E3, has a vertical orientation of U, according to Unicode. This unfortunately makes the width iter frequently break such sequences into multiple items, preventing them from being rendered as expected. Fix this by ignoring width changes inside Emoji sequences. Fixes: #502 (cherry-picked from commit b1718281) --- pango/pango-context.c | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/pango/pango-context.c b/pango/pango-context.c index a64eb79f..f0bf11c3 100644 --- a/pango/pango-context.c +++ b/pango/pango-context.c @@ -1063,6 +1063,9 @@ itemize_state_init (ItemizeState *state, width_iter_init (&state->width_iter, text + start_index, length); _pango_emoji_iter_init (&state->emoji_iter, text + start_index, length); + if (state->emoji_iter.is_emoji) + state->width_iter.end = MAX (state->width_iter.end, state->emoji_iter.end); + update_end (state); if (pango_font_description_get_set_fields (state->font_desc) & PANGO_FONT_MASK_GRAVITY) @@ -1110,15 +1113,18 @@ itemize_state_next (ItemizeState *state) &state->script_end, &state->script); state->changed |= SCRIPT_CHANGED; } - if (state->run_end == state->width_iter.end) - { - width_iter_next (&state->width_iter); - state->changed |= WIDTH_CHANGED; - } if (state->run_end == state->emoji_iter.end) { _pango_emoji_iter_next (&state->emoji_iter); state->changed |= EMOJI_CHANGED; + + if (state->emoji_iter.is_emoji) + state->width_iter.end = MAX (state->width_iter.end, state->emoji_iter.end); + } + if (state->run_end == state->width_iter.end) + { + width_iter_next (&state->width_iter); + state->changed |= WIDTH_CHANGED; } update_end (state); -- cgit v1.2.1 From 8fcf1f7c129bebc2136be4fca12f31cab35518f4 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Thu, 17 Sep 2020 18:32:17 -0400 Subject: Add a test for keycap sequences This tests that we are not breaking items up in the middle of a keycap sequence. (cherry-picked from commit 6253c71b) --- tests/layouts/valid-6.expected | 25 +++++++++++++++++++++++++ tests/layouts/valid-6.markup | 2 ++ 2 files changed, 27 insertions(+) create mode 100644 tests/layouts/valid-6.expected create mode 100644 tests/layouts/valid-6.markup diff --git a/tests/layouts/valid-6.expected b/tests/layouts/valid-6.expected new file mode 100644 index 00000000..b8f90c34 --- /dev/null +++ b/tests/layouts/valid-6.expected @@ -0,0 +1,25 @@ + 0️⃣ Keycap Digit Zero + +--- parameters + +wrapped: 0 +ellipsized: 0 +lines: 2 + +--- attributes + +range 0 2147483647 + +--- lines + +i=1, index=0, paragraph-start=1, dir=ltr ' 0️⃣ Keycap Digit Zero +' +i=2, index=27, paragraph-start=1, dir=ltr '' + +--- runs + +i=1, index=0, chars=1, level=0, gravity=south, flags=0, font=OMITTED, script=latin, language=en-us, ' ' +i=2, index=1, chars=3, level=0, gravity=south, flags=0, font=OMITTED, script=latin, language=en-us, '0️⃣' +i=3, index=8, chars=18, level=0, gravity=south, flags=0, font=OMITTED, script=latin, language=en-us, ' Keycap Digit Zero' +i=4, index=26, no run, line end +i=5, index=27, no run, line end diff --git a/tests/layouts/valid-6.markup b/tests/layouts/valid-6.markup new file mode 100644 index 00000000..92c53e28 --- /dev/null +++ b/tests/layouts/valid-6.markup @@ -0,0 +1,2 @@ + + 0️⃣ Keycap Digit Zero -- cgit v1.2.1 From 04031036fb1b80a47c7030053f4767363935c068 Mon Sep 17 00:00:00 2001 From: "Jan Alexander Steffens (heftig)" Date: Tue, 11 Feb 2020 03:51:19 +0100 Subject: Use shape flags for tab width We need to apply the right shape flags to the tab width calculation, otherwise (when glyph positions get rounded, which is the default) our tab width will be slightly off from what 8 spaces normally produce. https://gitlab.gnome.org/GNOME/pango/issues/425 (cherry-picked from commit c579c0a9) --- pango/pango-layout.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/pango/pango-layout.c b/pango/pango-layout.c index a1ebfbcc..16783941 100644 --- a/pango/pango-layout.c +++ b/pango/pango-layout.c @@ -3034,6 +3034,10 @@ ensure_tab_width (PangoLayout *layout) PangoAttrIterator *iter; PangoFontDescription *font_desc = pango_font_description_copy_static (pango_context_get_font_description (layout->context)); PangoLanguage *language; + PangoShapeFlags shape_flags = PANGO_SHAPE_NONE; + + if (pango_context_get_round_glyph_positions (layout->context)) + shape_flags |= PANGO_SHAPE_ROUND_POSITIONS; layout_attrs = pango_layout_get_effective_attributes (layout); iter = pango_attr_list_get_iterator (layout_attrs); @@ -3062,7 +3066,7 @@ ensure_tab_width (PangoLayout *layout) pango_attr_list_unref (tmp_attrs); item = items->data; - pango_shape (" ", 8, &item->analysis, glyphs); + pango_shape_with_flags (" ", 8, " ", 8, &item->analysis, glyphs, shape_flags); pango_item_free (item); g_list_free (items); -- cgit v1.2.1 From 1f75fc9089274a1fcb9ab7eb647e144f48c81fab Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Mon, 8 Jun 2020 12:06:40 -0400 Subject: renderer: Fix a division-by-zero We need to check if height is zero before dividing by it. For completeness, check width at the same time. This was pointed out in https://gitlab.gnome.org/GNOME/pango/-/merge_requests/167 (cherry-picked from commit dd867f41) --- pango/pango-renderer.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/pango/pango-renderer.c b/pango/pango-renderer.c index 889989dd..5e98fd16 100644 --- a/pango/pango-renderer.c +++ b/pango/pango-renderer.c @@ -974,15 +974,22 @@ pango_renderer_default_draw_error_underline (PangoRenderer *renderer, int width, int height) { - int square = height / HEIGHT_SQUARES; - int unit_width = (HEIGHT_SQUARES - 1) * square; - int width_units = (width + unit_width / 2) / unit_width; + int square; + int unit_width; + int width_units; const PangoMatrix identity = PANGO_MATRIX_INIT; const PangoMatrix *matrix; double dx, dx0, dy0; PangoMatrix total; int i; + if (width <= 0 || height <= 0) + return; + + square = height / HEIGHT_SQUARES; + unit_width = (HEIGHT_SQUARES - 1) * square; + width_units = (width + unit_width / 2) / unit_width; + x += (width - width_units * unit_width) / 2; if (renderer->matrix) -- cgit v1.2.1 From 800426849efd8a3d1e9d6d26fec3adaa67a50958 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Tue, 9 Jun 2020 11:23:44 -0400 Subject: layout: Fix a crash pango_layout_get_effective_attributes can return NULL. But not all callers were handling that. (cherry-picked from commit 1f06c915) --- pango/pango-layout.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/pango/pango-layout.c b/pango/pango-layout.c index 16783941..84dfb39f 100644 --- a/pango/pango-layout.c +++ b/pango/pango-layout.c @@ -3031,17 +3031,22 @@ ensure_tab_width (PangoLayout *layout) PangoAttribute *attr; PangoAttrList *layout_attrs; PangoAttrList *tmp_attrs; - PangoAttrIterator *iter; PangoFontDescription *font_desc = pango_font_description_copy_static (pango_context_get_font_description (layout->context)); - PangoLanguage *language; + PangoLanguage *language = NULL; PangoShapeFlags shape_flags = PANGO_SHAPE_NONE; if (pango_context_get_round_glyph_positions (layout->context)) shape_flags |= PANGO_SHAPE_ROUND_POSITIONS; layout_attrs = pango_layout_get_effective_attributes (layout); - iter = pango_attr_list_get_iterator (layout_attrs); - pango_attr_iterator_get_font (iter, font_desc, &language, NULL); + if (layout_attrs) + { + PangoAttrIterator *iter; + + iter = pango_attr_list_get_iterator (layout_attrs); + pango_attr_iterator_get_font (iter, font_desc, &language, NULL); + pango_attr_iterator_destroy (iter); + } tmp_attrs = pango_attr_list_new (); @@ -3057,7 +3062,6 @@ ensure_tab_width (PangoLayout *layout) items = pango_itemize (layout->context, " ", 0, 1, tmp_attrs, NULL); - pango_attr_iterator_destroy (iter); if (layout_attrs != layout->attrs) { pango_attr_list_unref (layout_attrs); -- cgit v1.2.1 From 6f0e6d7c97d90dd7a7c4b6404cd5c14172b00a6b Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Tue, 9 Jun 2020 11:41:43 -0400 Subject: Add a test for a crash in shape_tab This verifies the fix in the previous commit. (cherry-picked from commit 2751956b) --- tests/meson.build | 1 + tests/testmisc.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+) create mode 100644 tests/testmisc.c diff --git a/tests/meson.build b/tests/meson.build index c617331f..c0cd0e72 100644 --- a/tests/meson.build +++ b/tests/meson.build @@ -21,6 +21,7 @@ tests = [ [ 'testboundaries' ], [ 'testboundaries_ucd' ], [ 'testcolor' ], + [ 'testmisc', [ 'testmisc.c' ], [ libpangocairo_dep ] ], [ 'testscript' ], [ 'test-harfbuzz', [ 'test-harfbuzz.c' ], [ libpangocairo_dep ] ], [ 'cxx-test', [ 'cxx-test.cpp' ], [ libpangocairo_dep ] ], diff --git a/tests/testmisc.c b/tests/testmisc.c new file mode 100644 index 00000000..3e629f24 --- /dev/null +++ b/tests/testmisc.c @@ -0,0 +1,49 @@ +/* Pango + * testmisc.c: Test program for miscellaneous things + * + * Copyright (C) 2020 Matthias Clasen + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include "config.h" +#include +#include + +static void +test_shape_tab_crash (void) +{ + PangoContext *context; + PangoLayout *layout; + + context = pango_font_map_create_context (pango_cairo_font_map_get_default ()); + layout = pango_layout_new (context); + pango_layout_set_text (layout, "one\ttwo", -1); + pango_layout_is_ellipsized (layout); + + g_object_unref (layout); + g_object_unref (context); +} + +int +main (int argc, char *argv[]) +{ + g_test_init (&argc, &argv, NULL); + + g_test_add_func ("/layout/shape-tab-crash", test_shape_tab_crash); + + return g_test_run (); +} -- cgit v1.2.1 From ac07f75e9c1c560f0e8243426ef4f12a2ff1a7e8 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Wed, 10 Jun 2020 11:36:24 -0400 Subject: itemize: Work around gtk2 brokenness GTK 2 apparently manages to call pango_itemize_with_base_dir with a non-zero length for a string that contains 0 characters. That in turn causes pango_log2vis_get_embedding_levels to return NULL, and things go downhill from there. A test is included. Fixes: #480 (cherry-picked from commit 279bd525) --- pango/pango-context.c | 2 +- tests/testmisc.c | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/pango/pango-context.c b/pango/pango-context.c index f0bf11c3..d1c5a734 100644 --- a/pango/pango-context.c +++ b/pango/pango-context.c @@ -1571,7 +1571,7 @@ pango_itemize_with_base_dir (PangoContext *context, g_return_val_if_fail (length >= 0, NULL); g_return_val_if_fail (length == 0 || text != NULL, NULL); - if (length == 0) + if (length == 0 || g_utf8_strlen (text, length) == 0) return NULL; itemize_state_init (&state, context, text, base_dir, start_index, length, diff --git a/tests/testmisc.c b/tests/testmisc.c index 3e629f24..a2784f13 100644 --- a/tests/testmisc.c +++ b/tests/testmisc.c @@ -38,12 +38,26 @@ test_shape_tab_crash (void) g_object_unref (context); } +/* Test that itemizing a string with 0 characters works + */ +static void +test_itemize_empty_crash (void) +{ + PangoContext *context; + + context = pango_font_map_create_context (pango_cairo_font_map_get_default ()); + pango_itemize_with_base_dir (context, PANGO_DIRECTION_LTR, "", 0, 1, NULL, NULL); + + g_object_unref (context); +} + int main (int argc, char *argv[]) { g_test_init (&argc, &argv, NULL); g_test_add_func ("/layout/shape-tab-crash", test_shape_tab_crash); + g_test_add_func ("/layout/itemize-empty-crash", test_itemize_empty_crash); return g_test_run (); } -- cgit v1.2.1 From 8a744cd515f31daef4e9a95a751b11d777e6774e Mon Sep 17 00:00:00 2001 From: Khaled Hosny Date: Thu, 25 Jun 2020 10:02:21 +0200 Subject: fcfontmap: Always reject unsupported font formats Fixes https://gitlab.gnome.org/GNOME/pango/-/issues/484 and https://gitlab.gnome.org/GNOME/pango/-/issues/457 (cherry-picked from commit fe1ee773) --- pango/pangofc-fontmap.c | 52 ++++++++++++++++++++++++------------------------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/pango/pangofc-fontmap.c b/pango/pangofc-fontmap.c index 535a6f0e..ade3cffc 100644 --- a/pango/pangofc-fontmap.c +++ b/pango/pangofc-fontmap.c @@ -808,8 +808,15 @@ pango_fc_patterns_get_pattern (PangoFcPatterns *pats) } static gboolean -pango_fc_is_supported_font_format (const char *fontformat) +pango_fc_is_supported_font_format (FcPattern* pattern) { + FcResult res; + const char *fontformat; + + res = FcPatternGetString (pattern, FC_FONTFORMAT, 0, (FcChar8 **)(void*)&fontformat); + if (res != FcResultMatch) + return FALSE; + /* harfbuzz supports only SFNT fonts. */ /* FIXME: "CFF" is used for both CFF in OpenType and bare CFF files, but * HarfBuzz does not support the later and FontConfig does not seem @@ -831,11 +838,7 @@ filter_fontset_by_format (FcFontSet *fontset) for (i = 0; i < fontset->nfont; i++) { - FcResult res; - const char *s; - - res = FcPatternGetString (fontset->fonts[i], FC_FONTFORMAT, 0, (FcChar8 **)(void*)&s); - if (res == FcResultMatch && pango_fc_is_supported_font_format (s)) + if (pango_fc_is_supported_font_format (fontset->fonts[i])) FcFontSetAdd (result, FcPatternDuplicate (fontset->fonts[i])); } @@ -851,34 +854,32 @@ pango_fc_patterns_get_font_pattern (PangoFcPatterns *pats, int i, gboolean *prep if (!pats->match && !pats->fontset) pats->match = FcFontMatch (pats->fontmap->priv->config, pats->pattern, &result); - if (pats->match) + if (pats->match && pango_fc_is_supported_font_format (pats->match)) { *prepare = FALSE; return pats->match; } } - else + + if (!pats->fontset) { - if (!pats->fontset) - { - FcResult result; - FcFontSet *fontset; - FcFontSet *filtered; + FcResult result; + FcFontSet *fontset; + FcFontSet *filtered; - fontset = FcFontSort (pats->fontmap->priv->config, pats->pattern, FcFalse, NULL, &result); - filtered = filter_fontset_by_format (fontset); - FcFontSetDestroy (fontset); + fontset = FcFontSort (pats->fontmap->priv->config, pats->pattern, FcFalse, NULL, &result); + filtered = filter_fontset_by_format (fontset); + FcFontSetDestroy (fontset); - pats->fontset = FcFontSetSort (pats->fontmap->priv->config, &filtered, 1, pats->pattern, FcTrue, NULL, &result); + pats->fontset = FcFontSetSort (pats->fontmap->priv->config, &filtered, 1, pats->pattern, FcTrue, NULL, &result); - FcFontSetDestroy (filtered); + FcFontSetDestroy (filtered); - if (pats->match) - { - FcPatternDestroy (pats->match); - pats->match = NULL; - } - } + if (pats->match) + { + FcPatternDestroy (pats->match); + pats->match = NULL; + } } *prepare = TRUE; @@ -1404,8 +1405,7 @@ pango_fc_font_map_list_families (PangoFontMap *fontmap, int variable; PangoFcFamily *temp_family; - res = FcPatternGetString (fontset->fonts[i], FC_FONTFORMAT, 0, (FcChar8 **)(void*)&s); - if (res != FcResultMatch || !pango_fc_is_supported_font_format (s)) + if (!pango_fc_is_supported_font_format (fontset->fonts[i])) continue; res = FcPatternGetString (fontset->fonts[i], FC_FAMILY, 0, (FcChar8 **)(void*)&s); -- cgit v1.2.1 From 4b93e64a4d23a6ced2dd146f10e5fb10a1000d93 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Thu, 30 Jul 2020 10:06:53 -0400 Subject: layout: Avoid a crash with short strings You can call pango_layout_set_text() with a length that is longer than the string (and there's code in the wild that does that). We try to handle it by only looking at the initial segment of the text, but we are forgetting to set layout->length to the length of that segment, leading us to access beyond the string end later. This fixes #490 (cherry-picked from commit 6e04db81) --- pango/pango-layout.c | 1 + 1 file changed, 1 insertion(+) diff --git a/pango/pango-layout.c b/pango/pango-layout.c index 84dfb39f..c0939ca9 100644 --- a/pango/pango-layout.c +++ b/pango/pango-layout.c @@ -1149,6 +1149,7 @@ pango_layout_set_text (PangoLayout *layout, g_warning ("Invalid UTF-8 string passed to pango_layout_set_text()"); layout->n_chars = pango_utf8_strlen (layout->text, -1); + layout->length = strlen (layout->text); layout_changed (layout); -- cgit v1.2.1 From 7aaba05f7b8d7739fff7006f2933b0316a618315 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Thu, 30 Jul 2020 10:04:58 -0400 Subject: Add a reproducer for a pidgin crash This test is reproducing the crash reported in #490. (cherry-picked from commit c2c97330) --- tests/testmisc.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/tests/testmisc.c b/tests/testmisc.c index a2784f13..b2aac796 100644 --- a/tests/testmisc.c +++ b/tests/testmisc.c @@ -51,6 +51,25 @@ test_itemize_empty_crash (void) g_object_unref (context); } +/* Test that pango_layout_set_text (layout, "short", 200) + * does not lead to a crash. (pidgin does this) + */ +static void +test_short_string_crash (void) +{ + PangoContext *context; + PangoLayout *layout; + int width, height; + + context = pango_font_map_create_context (pango_cairo_font_map_get_default ()); + layout = pango_layout_new (context); + pango_layout_set_text (layout, "short text", 200); + pango_layout_get_pixel_size (layout, &width, &height); + + g_object_unref (layout); + g_object_unref (context); +} + int main (int argc, char *argv[]) { @@ -58,6 +77,7 @@ main (int argc, char *argv[]) g_test_add_func ("/layout/shape-tab-crash", test_shape_tab_crash); g_test_add_func ("/layout/itemize-empty-crash", test_itemize_empty_crash); + g_test_add_func ("/layout/short-string-crash", test_short_string_crash); return g_test_run (); } -- cgit v1.2.1 From c1821251e368025c5a7dea751e6be7d4cd8c1d4e Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Sat, 15 Aug 2020 15:28:40 -0400 Subject: Speed up font format filtering We were needlessly duplicating patters when we could have just referenced them. (cherry-picked from commit e9703ea3) --- pango/pangofc-fontmap.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/pango/pangofc-fontmap.c b/pango/pangofc-fontmap.c index ade3cffc..a3440673 100644 --- a/pango/pangofc-fontmap.c +++ b/pango/pangofc-fontmap.c @@ -839,7 +839,10 @@ filter_fontset_by_format (FcFontSet *fontset) for (i = 0; i < fontset->nfont; i++) { if (pango_fc_is_supported_font_format (fontset->fonts[i])) - FcFontSetAdd (result, FcPatternDuplicate (fontset->fonts[i])); + { + FcPatternReference (fontset->fonts[i]); + FcFontSetAdd (result, fontset->fonts[i]); + } } return result; -- cgit v1.2.1 From 1429598db2c01f62953de3b2bb37deb1abfcafaf Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Sat, 15 Aug 2020 15:49:58 -0400 Subject: Don't call FcFontSetSort twice We can do the format filtering on the unsorted font lists. Sorting the same list twice may be fast, but there's still some setup overhead. (cherry-picked from commit c4ae4782) --- pango/pangofc-fontmap.c | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/pango/pangofc-fontmap.c b/pango/pangofc-fontmap.c index a3440673..13334a44 100644 --- a/pango/pangofc-fontmap.c +++ b/pango/pangofc-fontmap.c @@ -867,16 +867,21 @@ pango_fc_patterns_get_font_pattern (PangoFcPatterns *pats, int i, gboolean *prep if (!pats->fontset) { FcResult result; - FcFontSet *fontset; - FcFontSet *filtered; + FcFontSet *filtered[2] = { NULL, }; + int i, n = 0; - fontset = FcFontSort (pats->fontmap->priv->config, pats->pattern, FcFalse, NULL, &result); - filtered = filter_fontset_by_format (fontset); - FcFontSetDestroy (fontset); + for (i = 0; i < 2; i++) + { + FcFontSet *fonts = FcConfigGetFonts (pats->fontmap->priv->config, i); + if (fonts) + filtered[n++] = filter_fontset_by_format (fonts); + } + + pats->fontset = FcFontSetSort (pats->fontmap->priv->config, filtered, n, pats->pattern, FcTrue, NULL, &result); - pats->fontset = FcFontSetSort (pats->fontmap->priv->config, &filtered, 1, pats->pattern, FcTrue, NULL, &result); + for (i = 0; i < n; i++) + FcFontSetDestroy (filtered[i]); - FcFontSetDestroy (filtered); if (pats->match) { -- cgit v1.2.1 From 51a3df39aec7f831cbb30fb8d0d890796ca4cdeb Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Tue, 18 Aug 2020 12:22:20 -0400 Subject: cairo: Use the proper FcConfig When calling into FcConfig api, passing NULL means "use the default config". But we may have a set config that we should be using for all fontconfig calls. (cherry-picked from commit da2e893b) --- pango/pangocairo-fcfontmap.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pango/pangocairo-fcfontmap.c b/pango/pangocairo-fcfontmap.c index bd3a8583..015b8170 100644 --- a/pango/pangocairo-fcfontmap.c +++ b/pango/pangocairo-fcfontmap.c @@ -103,7 +103,7 @@ pango_cairo_fc_font_map_fontset_key_substitute (PangoFcFontMap *fcfontmap G_G PangoFcFontsetKey *fontkey, FcPattern *pattern) { - FcConfigSubstitute (NULL, pattern, FcMatchPattern); + FcConfigSubstitute (pango_fc_font_map_get_config (fcfontmap), pattern, FcMatchPattern); if (fontkey) cairo_ft_font_options_substitute (pango_fc_fontset_key_get_context_key (fontkey), -- cgit v1.2.1 From 75e077b2e69ab207fa862b9002127b0a1174de05 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Tue, 8 Sep 2020 16:49:43 -0400 Subject: Don't assert in pango_language_get_scripts The assertion in pango_language_get_scripts can actually be triggered since we last regenerated the pango_script_for_lang table. It now includes an entry for und-zsye which has no scripts. Handle this case without asserting. This commit includes a test. (cherry-picked from commit 7db68865) --- pango/pango-language.c | 2 +- tests/testmisc.c | 15 +++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/pango/pango-language.c b/pango/pango-language.c index 575d4652..bb5ed470 100644 --- a/pango/pango-language.c +++ b/pango/pango-language.c @@ -662,7 +662,7 @@ pango_language_get_scripts (PangoLanguage *language, script_for_lang, pango_script_for_lang); - if (!script_for_lang) + if (!script_for_lang || script_for_lang->scripts[0] == 0) { if (num_scripts) *num_scripts = 0; diff --git a/tests/testmisc.c b/tests/testmisc.c index b2aac796..8cfd8e12 100644 --- a/tests/testmisc.c +++ b/tests/testmisc.c @@ -70,6 +70,20 @@ test_short_string_crash (void) g_object_unref (context); } +static void +test_language_emoji_crash (void) +{ + PangoLanguage *lang; + const PangoScript *scripts; + int num; + + lang = pango_language_from_string ("und-zsye"); + scripts = pango_language_get_scripts (lang, &num); + + g_assert (num >= 0); + g_assert (scripts == NULL || num > 0); +} + int main (int argc, char *argv[]) { @@ -78,6 +92,7 @@ main (int argc, char *argv[]) g_test_add_func ("/layout/shape-tab-crash", test_shape_tab_crash); g_test_add_func ("/layout/itemize-empty-crash", test_itemize_empty_crash); g_test_add_func ("/layout/short-string-crash", test_short_string_crash); + g_test_add_func ("/language/emoji-crash", test_language_emoji_crash); return g_test_run (); } -- cgit v1.2.1 From d0d45426170c8e233464e3a8d46370f1ac918e19 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Fri, 6 Nov 2020 22:29:28 -0500 Subject: tests: Don't free attributes prematurely test-shape was using one of its attribute lists after dropping the reference on it. Don't do that. (cherry-picked from commit 17d8202d) --- tests/test-shape.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/test-shape.c b/tests/test-shape.c index 6c1ae296..17eaa1e0 100644 --- a/tests/test-shape.c +++ b/tests/test-shape.c @@ -185,8 +185,6 @@ test_file (const gchar *filename, GString *string) pango_attr_list_unref (itemize_attrs); pango_attr_list_unref (shape_attrs); - pango_attr_list_unref (attrs); - for (l = items; l; l = l->next) { PangoItem *item = l->data; @@ -281,6 +279,8 @@ test_file (const gchar *filename, GString *string) g_list_free_full (items, (GDestroyNotify)pango_item_free); g_free (contents); g_free (text); + + pango_attr_list_unref (attrs); } static gchar * -- cgit v1.2.1 From 83ca22555b7a3c75ceaf93e7413864458bfd234b Mon Sep 17 00:00:00 2001 From: Weng Xuetian Date: Thu, 14 Jan 2021 20:37:05 -0800 Subject: Fix the length checking Closes #526 (cherry-picked from commit 0a816b49) --- pango/pango-context.c | 2 +- tests/testmisc.c | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/pango/pango-context.c b/pango/pango-context.c index d1c5a734..7139de0b 100644 --- a/pango/pango-context.c +++ b/pango/pango-context.c @@ -1571,7 +1571,7 @@ pango_itemize_with_base_dir (PangoContext *context, g_return_val_if_fail (length >= 0, NULL); g_return_val_if_fail (length == 0 || text != NULL, NULL); - if (length == 0 || g_utf8_strlen (text, length) == 0) + if (length == 0 || g_utf8_strlen (text + start_index, length) == 0) return NULL; itemize_state_init (&state, context, text, base_dir, start_index, length, diff --git a/tests/testmisc.c b/tests/testmisc.c index 8cfd8e12..5ba7c81b 100644 --- a/tests/testmisc.c +++ b/tests/testmisc.c @@ -51,6 +51,19 @@ test_itemize_empty_crash (void) g_object_unref (context); } +static void +test_itemize_utf8 (void) +{ + PangoContext *context; + GList *result = NULL; + + context = pango_font_map_create_context (pango_cairo_font_map_get_default ()); + result = pango_itemize_with_base_dir (context, PANGO_DIRECTION_LTR, "\xc3\xa1\na", 3, 1, NULL, NULL); + g_assert (result != NULL); + + g_object_unref (context); +} + /* Test that pango_layout_set_text (layout, "short", 200) * does not lead to a crash. (pidgin does this) */ @@ -91,6 +104,7 @@ main (int argc, char *argv[]) g_test_add_func ("/layout/shape-tab-crash", test_shape_tab_crash); g_test_add_func ("/layout/itemize-empty-crash", test_itemize_empty_crash); + g_test_add_func ("/layout/itemize-utf8", test_itemize_utf8); g_test_add_func ("/layout/short-string-crash", test_short_string_crash); g_test_add_func ("/language/emoji-crash", test_language_emoji_crash); -- cgit v1.2.1 From 1cac253753d25d8b3e17522e3ba07c9868fa17ba Mon Sep 17 00:00:00 2001 From: Peng Wu Date: Tue, 14 Jan 2020 16:15:17 +0800 Subject: Translate origin point for vertical layout The origin point for vertical layout needs to be translated for cairo rendering from the horizontal origin to the vertical origin. (cherry-picked from commit 4c6f0b3c) --- pango/pangofc-shape.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/pango/pangofc-shape.c b/pango/pangofc-shape.c index 9fe193f6..471d4f55 100644 --- a/pango/pangofc-shape.c +++ b/pango/pangofc-shape.c @@ -409,9 +409,12 @@ pango_hb_shape (PangoFont *font, for (i = 0; i < num_glyphs; i++) { /* 90 degrees rotation counter-clockwise. */ - infos[i].geometry.width = hb_position->y_advance; - infos[i].geometry.x_offset = hb_position->y_offset; - infos[i].geometry.y_offset = - hb_position->x_offset; + hb_position_t x_origin = 0, y_origin = 0; + hb_font_get_glyph_v_origin + (hb_font, infos[i].glyph, &x_origin, &y_origin); + infos[i].geometry.width = - hb_position->y_advance; + infos[i].geometry.x_offset = - hb_position->y_offset - y_origin; + infos[i].geometry.y_offset = - hb_position->x_offset - x_origin; hb_position++; } else /* horizontal */ -- cgit v1.2.1 From a7c32cfd053ce49193cba933c10bc25f1ffa5b9f Mon Sep 17 00:00:00 2001 From: Tavmjong Bah Date: Wed, 17 Mar 2021 14:37:13 +0100 Subject: Fix placement of marks in upright vertical text. (cherry-picked from commit 3396cc20) --- pango/pangofc-fontmap.c | 5 ++--- pango/pangofc-shape.c | 7 ++----- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/pango/pangofc-fontmap.c b/pango/pangofc-fontmap.c index 13334a44..86c6b619 100644 --- a/pango/pangofc-fontmap.c +++ b/pango/pangofc-fontmap.c @@ -1530,7 +1530,6 @@ pango_fc_make_pattern (const PangoFontDescription *description, int slant; double weight; PangoGravity gravity; - FcBool vertical; char **families; int i; int width; @@ -1541,7 +1540,6 @@ pango_fc_make_pattern (const PangoFontDescription *description, width = pango_fc_convert_width_to_fc (pango_font_description_get_stretch (description)); gravity = pango_font_description_get_gravity (description); - vertical = PANGO_GRAVITY_IS_VERTICAL (gravity) ? FcTrue : FcFalse; /* The reason for passing in FC_SIZE as well as FC_PIXEL_SIZE is * to work around a bug in libgnomeprint where it doesn't look @@ -1550,13 +1548,14 @@ pango_fc_make_pattern (const PangoFontDescription *description, * Putting FC_SIZE in here slightly reduces the efficiency * of caching of patterns and fonts when working with multiple different * dpi values. + * + * Do not pass FC_VERTICAL_LAYOUT true as HarfBuzz shaping assumes false. */ pattern = FcPatternBuild (NULL, PANGO_FC_VERSION, FcTypeInteger, pango_version(), FC_WEIGHT, FcTypeDouble, weight, FC_SLANT, FcTypeInteger, slant, FC_WIDTH, FcTypeInteger, width, - FC_VERTICAL_LAYOUT, FcTypeBool, vertical, #ifdef FC_VARIABLE FC_VARIABLE, FcTypeBool, FcDontCare, #endif diff --git a/pango/pangofc-shape.c b/pango/pangofc-shape.c index 471d4f55..69f5462b 100644 --- a/pango/pangofc-shape.c +++ b/pango/pangofc-shape.c @@ -409,12 +409,9 @@ pango_hb_shape (PangoFont *font, for (i = 0; i < num_glyphs; i++) { /* 90 degrees rotation counter-clockwise. */ - hb_position_t x_origin = 0, y_origin = 0; - hb_font_get_glyph_v_origin - (hb_font, infos[i].glyph, &x_origin, &y_origin); infos[i].geometry.width = - hb_position->y_advance; - infos[i].geometry.x_offset = - hb_position->y_offset - y_origin; - infos[i].geometry.y_offset = - hb_position->x_offset - x_origin; + infos[i].geometry.x_offset = - hb_position->y_offset; + infos[i].geometry.y_offset = - hb_position->x_offset; hb_position++; } else /* horizontal */ -- cgit v1.2.1 From af62cc0ff88c36a2647eb2fd6d7ad146c41fb304 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Sun, 24 Jan 2021 11:15:01 -0500 Subject: Fix pango_font_describe for Emoji fonts We are using the size from the FcPattern. For scalable bitmap fonts, this has been scaled to match the requested pixel size. To make a font description that can be turned back into a FcPattern and roundtrip successfully, we need to undo that scaling. Thankfully, fontconfig leaves the pixelsizefixupfactor in the pattern, so it is easy to do. Fixes: #530 (cherry-picked from commit bc973fdb) --- pango/pangofc-fontmap.c | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/pango/pangofc-fontmap.c b/pango/pangofc-fontmap.c index 86c6b619..cbe9f07e 100644 --- a/pango/pangofc-fontmap.c +++ b/pango/pangofc-fontmap.c @@ -2318,7 +2318,24 @@ pango_fc_font_description_from_pattern (FcPattern *pattern, gboolean include_siz pango_font_description_set_variant (desc, PANGO_VARIANT_NORMAL); if (include_size && FcPatternGetDouble (pattern, FC_SIZE, 0, &size) == FcResultMatch) - pango_font_description_set_size (desc, size * PANGO_SCALE); + { + FcMatrix *fc_matrix; + double scale_factor = 1; + + if (FcPatternGetMatrix (pattern, FC_MATRIX, 0, &fc_matrix) == FcResultMatch) + { + PangoMatrix mat = PANGO_MATRIX_INIT; + + mat.xx = fc_matrix->xx; + mat.xy = fc_matrix->xy; + mat.yx = fc_matrix->yx; + mat.yy = fc_matrix->yy; + + scale_factor = pango_matrix_get_font_scale_factor (&mat); + } + + pango_font_description_set_size (desc, scale_factor * size * PANGO_SCALE); + } /* gravity is a bit different. we don't want to set it if it was not set on * the pattern */ -- cgit v1.2.1 From 17f0d88e96ae4242c1f835f9eb1e429ae5687770 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Sun, 24 Jan 2021 11:02:21 -0500 Subject: tests: Add tests for pango_font_describe Test that round-tripping through pango_font_describe works. This is currently broken for scalable bitmap fonts, such as color Emoji fonts. We skip the test on OS X where we are most likely missing the fonts. (cherry-picked from commit 49b1f80a) --- tests/meson.build | 2 ++ tests/test-font.c | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 71 insertions(+) diff --git a/tests/meson.build b/tests/meson.build index c0cd0e72..4b0d4182 100644 --- a/tests/meson.build +++ b/tests/meson.build @@ -8,6 +8,8 @@ endif if host_system == 'windows' test_cflags += '-DHAVE_WIN32' +elif host_system == 'darwin' + test_cflags += '-DHAVE_CARBON' endif test_env = [ diff --git a/tests/test-font.c b/tests/test-font.c index 6b8f45be..dd110571 100644 --- a/tests/test-font.c +++ b/tests/test-font.c @@ -188,6 +188,73 @@ test_extents (void) g_object_unref (context); } +static void +test_roundtrip_plain (void) +{ + PangoFontMap *fontmap; + PangoContext *context; + PangoFontDescription *desc, *desc2; + PangoFont *font; + +#ifdef HAVE_CARBON + /* We probably don't have the right fonts */ + g_test_skip ("Skipping font-dependent tests on OS X"); + return; +#endif + + fontmap = pango_cairo_font_map_get_default (); + context = pango_font_map_create_context (fontmap); + + desc = pango_font_description_from_string ("Cantarell 11"); + + font = pango_context_load_font (context, desc); + desc2 = pango_font_describe (font); + + g_assert (pango_font_description_equal (desc2, desc)); + + pango_font_description_free (desc2); + g_object_unref (font); + pango_font_description_free (desc); + g_object_unref (context); +} + +static void +test_roundtrip_emoji (void) +{ + PangoFontMap *fontmap; + PangoContext *context; + PangoFontDescription *desc, *desc2; + PangoFont *font; + +#ifdef HAVE_CARBON + /* We probably don't have the right fonts */ + g_test_skip ("Skipping font-dependent tests on OS X"); + return; +#endif + + fontmap = pango_cairo_font_map_get_default (); + context = pango_font_map_create_context (fontmap); + + /* This is how pango_itemize creates the emoji font desc */ + desc = pango_font_description_from_string ("Cantarell 11"); + pango_font_description_set_family_static (desc, "emoji"); + + font = pango_context_load_font (context, desc); + desc2 = pango_font_describe (font); + + /* We can't expect the family name to match, since we go in with + * a generic family + */ + pango_font_description_unset_fields (desc, PANGO_FONT_MASK_FAMILY); + pango_font_description_unset_fields (desc2, PANGO_FONT_MASK_FAMILY); + g_assert (pango_font_description_equal (desc2, desc)); + + pango_font_description_free (desc2); + g_object_unref (font); + pango_font_description_free (desc); + g_object_unref (context); +} + int main (int argc, char *argv[]) { @@ -203,6 +270,8 @@ main (int argc, char *argv[]) g_test_add_func ("/pango/fontdescription/roundtrip", test_roundtrip); g_test_add_func ("/pango/fontdescription/variation", test_variation); g_test_add_func ("/pango/font/extents", test_extents); + g_test_add_func ("/pango/font/roundtrip/plain", test_roundtrip_plain); + g_test_add_func ("/pango/font/roundtrip/emoji", test_roundtrip_emoji); return g_test_run (); } -- cgit v1.2.1 From 2b40c8ec42e5c9af9f37147adc632b88d6bbaad3 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Tue, 2 Mar 2021 20:58:15 -0500 Subject: markup: Fix two bugs The docs state that all chars marked with the accel marker get an underline. But we were only underlining the first in each text chunk. Second, if an underline appears at the end of a text chunk, or at the end of the text, we would just eat it, which is unexpected. (cherry-picked from commit 8d1ea2ae) --- pango/pango-markup.c | 50 ++++++++++++++++++++------------------------------ 1 file changed, 20 insertions(+), 30 deletions(-) diff --git a/pango/pango-markup.c b/pango/pango-markup.c index 6dce1b2e..da281a62 100644 --- a/pango/pango-markup.c +++ b/pango/pango-markup.c @@ -665,8 +665,21 @@ text_handler (GMarkupParseContext *context G_GNUC_UNUSED, /* The underline should go underneath the char * we're setting as the next range_start */ - uline_index = md->index; - uline_len = g_utf8_next_char (p) - p; + if (md->attr_list != NULL) + { + /* Add the underline indicating the accelerator */ + PangoAttribute *attr; + + attr = pango_attr_underline_new (PANGO_UNDERLINE_LOW); + + uline_index = md->index; + uline_len = g_utf8_next_char (p) - p; + + attr->start_index = uline_index; + attr->end_index = uline_index + uline_len; + + pango_attr_list_change (md->attr_list, attr); + } /* set next range_start to include this char */ range_start = p; @@ -681,35 +694,12 @@ text_handler (GMarkupParseContext *context G_GNUC_UNUSED, } p = g_utf8_next_char (p); - } - - if (range_end) - { - g_string_append_len (md->text, - range_start, - range_end - range_start); - md->index += range_end - range_start; - } - else - { - g_string_append_len (md->text, - range_start, - end - range_start); - md->index += end - range_start; - } - - if (md->attr_list != NULL && uline_index >= 0) - { - /* Add the underline indicating the accelerator */ - PangoAttribute *attr; - - attr = pango_attr_underline_new (PANGO_UNDERLINE_LOW); - - attr->start_index = uline_index; - attr->end_index = uline_index + uline_len; + } - pango_attr_list_change (md->attr_list, attr); - } + g_string_append_len (md->text, + range_start, + end - range_start); + md->index += end - range_start; } } -- cgit v1.2.1 From 8e26d43f6713d52b1e5b93c0c38157b4d36d5fb3 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Wed, 17 Mar 2021 22:49:38 -0400 Subject: Improve letterspacing with marks harfbuzz puts marks into their own clusters, so we need to work a little harder to keep non-spacing marks placed over their base character. Fixes: #541 (cherry-picked from commit fdc432bc) --- pango/pango-glyph-item.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/pango/pango-glyph-item.c b/pango/pango-glyph-item.c index eb880608..a9f26aeb 100644 --- a/pango/pango-glyph-item.c +++ b/pango/pango-glyph-item.c @@ -751,7 +751,16 @@ pango_glyph_item_letter_space (PangoGlyphItem *glyph_item, have_cluster = pango_glyph_item_iter_next_cluster (&iter)) { if (!log_attrs[iter.start_char].is_cursor_position) - continue; + { + if (glyphs[iter.start_glyph].geometry.width == 0) + { + if (iter.start_glyph < iter.end_glyph) /* LTR */ + glyphs[iter.start_glyph].geometry.x_offset -= space_right; + else + glyphs[iter.start_glyph].geometry.x_offset += space_left; + } + continue; + } if (iter.start_glyph < iter.end_glyph) /* LTR */ { -- cgit v1.2.1 From f56697daed7a5d5255fe24a27102bc8c420c46cf Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Mon, 21 Sep 2020 12:52:42 -0400 Subject: fc: Sort faces of a family Make pango_font_family_list_faces() return faces sorted by slant and weight. This makes the font chooser look much less random. (cherry-picked from commit 99f4661a) --- pango/pangofc-fontmap.c | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/pango/pangofc-fontmap.c b/pango/pangofc-fontmap.c index cbe9f07e..e85cf54c 100644 --- a/pango/pangofc-fontmap.c +++ b/pango/pangofc-fontmap.c @@ -2572,6 +2572,32 @@ create_face (PangoFcFamily *fcfamily, return face; } +static int +compare_face (const void *p1, const void *p2) +{ + const PangoFcFace *f1 = *(const void **)p1; + const PangoFcFace *f2 = *(const void **)p2; + int w1, w2; + int s1, s2; + + if (FcPatternGetInteger (f1->pattern, FC_WEIGHT, 0, &w1) != FcResultMatch) + w1 = FC_WEIGHT_MEDIUM; + + if (FcPatternGetInteger (f1->pattern, FC_SLANT, 0, &s1) != FcResultMatch) + s1 = FC_SLANT_ROMAN; + + if (FcPatternGetInteger (f2->pattern, FC_WEIGHT, 0, &w2) != FcResultMatch) + w2 = FC_WEIGHT_MEDIUM; + + if (FcPatternGetInteger (f2->pattern, FC_SLANT, 0, &s2) != FcResultMatch) + s2 = FC_SLANT_ROMAN; + + if (s1 != s2) + return s1 - s2; /* roman < italic < oblique */ + + return w1 - w2; /* from light to heavy */ +} + static void pango_fc_family_list_faces (PangoFontFamily *family, PangoFontFace ***faces, @@ -2691,6 +2717,8 @@ pango_fc_family_list_faces (PangoFontFamily *family, faces = g_renew (PangoFcFace *, faces, num); + qsort (faces, num, sizeof (PangoFcFace *), compare_face); + fcfamily->n_faces = num; fcfamily->faces = faces; } -- cgit v1.2.1 From 5f2a5bbc95363ba25a6a7c107cd7daf260167e8b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Wed, 5 May 2021 17:39:38 +0200 Subject: ci: Build with fedora 32 image (containing gnome 3.36) --- .gitlab-ci.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 3758c576..317285da 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,4 +1,4 @@ -image: registry.gitlab.gnome.org/gnome/gnome-runtime-images/base:latest +image: registry.fedoraproject.org/fedora:32 stages: - build @@ -6,11 +6,13 @@ stages: gnome-runtime-linux: stage: build before_script: + - dnf update -y - > dnf install -y \ glibc-langpack-en \ gcc \ gcc-c++ \ + diffutils \ meson \ redhat-rpm-config \ glib2-devel \ -- cgit v1.2.1