[HarfBuzz] harfbuzz: Branch 'master' - 5 commits

Behdad Esfahbod behdad at kemper.freedesktop.org
Fri May 6 15:09:38 UTC 2016


 BUILD.md                                                                          |    9 +
 src/gen-indic-table.py                                                            |    1 
 src/hb-ot-shape-complex-indic-machine.rl                                          |    3 
 src/hb-ot-shape-complex-indic-private.hh                                          |    5 
 src/hb-ot-shape-complex-indic-table.cc                                            |   23 ----
 src/hb-ot-shape-complex-indic.cc                                                  |   54 +++-------
 src/hb-ot-shape-complex-private.hh                                                |    5 
 test/shaping/texts/in-tree/shaper-indic/south-east-asian/script-javanese/misc.txt |   54 ++++++++++
 8 files changed, 86 insertions(+), 68 deletions(-)

New commits:
commit 3c1666cfb589275de96d54eecb95a13a98e3819e
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Fri May 6 16:05:07 2016 +0100

    [indic] Remove more unused logic after Javanese is gone

diff --git a/src/hb-ot-shape-complex-indic.cc b/src/hb-ot-shape-complex-indic.cc
index 9355098..2451078 100644
--- a/src/hb-ot-shape-complex-indic.cc
+++ b/src/hb-ot-shape-complex-indic.cc
@@ -274,11 +274,6 @@ enum blwf_mode_t {
   BLWF_MODE_PRE_AND_POST, /* Below-forms feature applied to pre-base and post-base. */
   BLWF_MODE_POST_ONLY     /* Below-forms feature applied to post-base only. */
 };
-enum pref_len_t {
-  PREF_LEN_1 = 1,
-  PREF_LEN_2 = 2,
-  PREF_LEN_DONT_CARE = PREF_LEN_2
-};
 struct indic_config_t
 {
   hb_script_t     script;
@@ -288,25 +283,24 @@ struct indic_config_t
   reph_position_t reph_pos;
   reph_mode_t     reph_mode;
   blwf_mode_t     blwf_mode;
-  pref_len_t      pref_len;
 };
 
 static const indic_config_t indic_configs[] =
 {
   /* Default.  Should be first. */
-  {HB_SCRIPT_INVALID,	false,      0,BASE_POS_LAST, REPH_POS_BEFORE_POST,REPH_MODE_IMPLICIT, BLWF_MODE_PRE_AND_POST, PREF_LEN_1},
-  {HB_SCRIPT_DEVANAGARI,true, 0x094Du,BASE_POS_LAST, REPH_POS_BEFORE_POST,REPH_MODE_IMPLICIT, BLWF_MODE_PRE_AND_POST, PREF_LEN_DONT_CARE},
-  {HB_SCRIPT_BENGALI,	true, 0x09CDu,BASE_POS_LAST, REPH_POS_AFTER_SUB,  REPH_MODE_IMPLICIT, BLWF_MODE_PRE_AND_POST, PREF_LEN_DONT_CARE},
-  {HB_SCRIPT_GURMUKHI,	true, 0x0A4Du,BASE_POS_LAST, REPH_POS_BEFORE_SUB, REPH_MODE_IMPLICIT, BLWF_MODE_PRE_AND_POST, PREF_LEN_DONT_CARE},
-  {HB_SCRIPT_GUJARATI,	true, 0x0ACDu,BASE_POS_LAST, REPH_POS_BEFORE_POST,REPH_MODE_IMPLICIT, BLWF_MODE_PRE_AND_POST, PREF_LEN_DONT_CARE},
-  {HB_SCRIPT_ORIYA,	true, 0x0B4Du,BASE_POS_LAST, REPH_POS_AFTER_MAIN, REPH_MODE_IMPLICIT, BLWF_MODE_PRE_AND_POST, PREF_LEN_DONT_CARE},
-  {HB_SCRIPT_TAMIL,	true, 0x0BCDu,BASE_POS_LAST, REPH_POS_AFTER_POST, REPH_MODE_IMPLICIT, BLWF_MODE_PRE_AND_POST, PREF_LEN_2},
-  {HB_SCRIPT_TELUGU,	true, 0x0C4Du,BASE_POS_LAST, REPH_POS_AFTER_POST, REPH_MODE_EXPLICIT, BLWF_MODE_POST_ONLY,    PREF_LEN_2},
-  {HB_SCRIPT_KANNADA,	true, 0x0CCDu,BASE_POS_LAST, REPH_POS_AFTER_POST, REPH_MODE_IMPLICIT, BLWF_MODE_POST_ONLY,    PREF_LEN_2},
-  {HB_SCRIPT_MALAYALAM,	true, 0x0D4Du,BASE_POS_LAST, REPH_POS_AFTER_MAIN, REPH_MODE_LOG_REPHA,BLWF_MODE_PRE_AND_POST, PREF_LEN_2},
+  {HB_SCRIPT_INVALID,	false,      0,BASE_POS_LAST, REPH_POS_BEFORE_POST,REPH_MODE_IMPLICIT, BLWF_MODE_PRE_AND_POST},
+  {HB_SCRIPT_DEVANAGARI,true, 0x094Du,BASE_POS_LAST, REPH_POS_BEFORE_POST,REPH_MODE_IMPLICIT, BLWF_MODE_PRE_AND_POST},
+  {HB_SCRIPT_BENGALI,	true, 0x09CDu,BASE_POS_LAST, REPH_POS_AFTER_SUB,  REPH_MODE_IMPLICIT, BLWF_MODE_PRE_AND_POST},
+  {HB_SCRIPT_GURMUKHI,	true, 0x0A4Du,BASE_POS_LAST, REPH_POS_BEFORE_SUB, REPH_MODE_IMPLICIT, BLWF_MODE_PRE_AND_POST},
+  {HB_SCRIPT_GUJARATI,	true, 0x0ACDu,BASE_POS_LAST, REPH_POS_BEFORE_POST,REPH_MODE_IMPLICIT, BLWF_MODE_PRE_AND_POST},
+  {HB_SCRIPT_ORIYA,	true, 0x0B4Du,BASE_POS_LAST, REPH_POS_AFTER_MAIN, REPH_MODE_IMPLICIT, BLWF_MODE_PRE_AND_POST},
+  {HB_SCRIPT_TAMIL,	true, 0x0BCDu,BASE_POS_LAST, REPH_POS_AFTER_POST, REPH_MODE_IMPLICIT, BLWF_MODE_PRE_AND_POST},
+  {HB_SCRIPT_TELUGU,	true, 0x0C4Du,BASE_POS_LAST, REPH_POS_AFTER_POST, REPH_MODE_EXPLICIT, BLWF_MODE_POST_ONLY},
+  {HB_SCRIPT_KANNADA,	true, 0x0CCDu,BASE_POS_LAST, REPH_POS_AFTER_POST, REPH_MODE_IMPLICIT, BLWF_MODE_POST_ONLY},
+  {HB_SCRIPT_MALAYALAM,	true, 0x0D4Du,BASE_POS_LAST, REPH_POS_AFTER_MAIN, REPH_MODE_LOG_REPHA,BLWF_MODE_PRE_AND_POST},
   {HB_SCRIPT_SINHALA,	false,0x0DCAu,BASE_POS_LAST_SINHALA,
-						     REPH_POS_AFTER_MAIN, REPH_MODE_EXPLICIT, BLWF_MODE_PRE_AND_POST, PREF_LEN_DONT_CARE},
-  {HB_SCRIPT_KHMER,	false,0x17D2u,BASE_POS_FIRST,REPH_POS_DONT_CARE,  REPH_MODE_VIS_REPHA,BLWF_MODE_PRE_AND_POST, PREF_LEN_2},
+						     REPH_POS_AFTER_MAIN, REPH_MODE_EXPLICIT, BLWF_MODE_PRE_AND_POST},
+  {HB_SCRIPT_KHMER,	false,0x17D2u,BASE_POS_FIRST,REPH_POS_DONT_CARE,  REPH_MODE_VIS_REPHA,BLWF_MODE_PRE_AND_POST},
 };
 
 
@@ -584,12 +578,8 @@ consonant_position_from_face (const indic_shape_plan_t *indic_plan,
   if (indic_plan->pstf.would_substitute (glyphs  , 2, face) ||
       indic_plan->pstf.would_substitute (glyphs+1, 2, face))
     return POS_POST_C;
-  unsigned int pref_len = indic_plan->config->pref_len;
-  if ((pref_len == PREF_LEN_2 &&
-       (indic_plan->pref.would_substitute (glyphs  , 2, face) ||
-        indic_plan->pref.would_substitute (glyphs+1, 2, face)))
-   || (pref_len == PREF_LEN_1 &&
-       indic_plan->pref.would_substitute (glyphs+1, 1, face)))
+  if (indic_plan->pref.would_substitute (glyphs  , 2, face) ||
+      indic_plan->pref.would_substitute (glyphs+1, 2, face))
     return POS_POST_C;
   return POS_BASE_C;
 }
@@ -1095,10 +1085,9 @@ initial_reordering_consonant_syllable (const hb_ot_shape_plan_t *plan,
       }
   }
 
-  unsigned int pref_len = indic_plan->config->pref_len;
+  unsigned int pref_len = 2;
   if (indic_plan->mask_array[PREF] && base + pref_len < end)
   {
-    assert (1 <= pref_len && pref_len <= 2);
     /* Find a Halant,Ra sequence and mark it for pre-base reordering processing. */
     for (unsigned int i = base + 1; i + pref_len - 1 < end; i++) {
       hb_codepoint_t glyphs[2];
@@ -1308,7 +1297,7 @@ final_reordering_syllable (const hb_ot_shape_plan_t *plan,
   for (base = start; base < end; base++)
     if (info[base].indic_position() >= POS_BASE_C)
     {
-      if (try_pref && base + 1 < end && indic_plan->config->pref_len == 2)
+      if (try_pref && base + 1 < end)
       {
 	for (unsigned int i = base + 1; i < end; i++)
 	  if ((info[i].mask & indic_plan->mask_array[PREF]) != 0)
@@ -1590,7 +1579,6 @@ final_reordering_syllable (const hb_ot_shape_plan_t *plan,
 
   if (try_pref && base + 1 < end) /* Otherwise there can't be any pre-base reordering Ra. */
   {
-    unsigned int pref_len = indic_plan->config->pref_len;
     for (unsigned int i = base + 1; i < end; i++)
       if ((info[i].mask & indic_plan->mask_array[PREF]) != 0)
       {
@@ -1601,10 +1589,8 @@ final_reordering_syllable (const hb_ot_shape_plan_t *plan,
         /* Note: We just check that something got substituted.  We don't check that
 	 * the <pref> feature actually did it...
 	 *
-	 * If pref len is longer than one, then only reorder if it ligated.  If
-	 * pref len is one, only reorder if it didn't ligate with other things. */
-	if (_hb_glyph_info_substituted (&info[i]) &&
-	    ((pref_len == 1) ^ _hb_glyph_info_ligated_and_didnt_multiply (&info[i])))
+	 * Reorder pref only if it ligated. */
+	if (_hb_glyph_info_ligated_and_didnt_multiply (&info[i]))
 	{
 	  /*
 	   *       2. Try to find a target position the same way as for pre-base matra.
commit 8b5d6e755b271d0d22b31a7726d5bfbf2aae8b2f
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Fri May 6 15:59:27 2016 +0100

    [indic] Remove unused Javanese bits

diff --git a/src/hb-ot-shape-complex-indic-machine.rl b/src/hb-ot-shape-complex-indic-machine.rl
index 694b235..86a7ceb 100644
--- a/src/hb-ot-shape-complex-indic-machine.rl
+++ b/src/hb-ot-shape-complex-indic-machine.rl
@@ -57,7 +57,6 @@ Repha = 15;
 Ra    = 16;
 CM    = 17;
 Symbol= 18;
-CM2   = 31;
 
 c = (C | Ra);			# is_consonant
 n = ((ZWNJ?.RS)? (N.N?)?);	# is_consonant_modifier
@@ -73,7 +72,7 @@ syllable_tail = (z?.SM.SM?.ZWNJ?)? A{0,3}? VD{0,2};
 place_holder = PLACEHOLDER | DOTTEDCIRCLE;
 halant_group = (z?.h.(ZWJ.N?)?);
 final_halant_group = halant_group | h.ZWNJ;
-medial_group = CM?.CM2?;
+medial_group = CM?;
 halant_or_matra_group = (final_halant_group | (h.ZWJ)? matra_group{0,4}) (Coeng (cn|V))?;
 
 
diff --git a/src/hb-ot-shape-complex-indic-private.hh b/src/hb-ot-shape-complex-indic-private.hh
index 326b364..5879c3e 100644
--- a/src/hb-ot-shape-complex-indic-private.hh
+++ b/src/hb-ot-shape-complex-indic-private.hh
@@ -60,11 +60,10 @@ enum indic_category_t {
   OT_Repha = 15, /* Atomically-encoded logical or visual repha. */
   OT_Ra = 16,
   OT_CM = 17,  /* Consonant-Medial. */
-  OT_Symbol = 18, /* Avagraha, etc that take marks (SM,A,VD). */
-  OT_CM2 = 31 /* Consonant-Medial, second slot. */
+  OT_Symbol = 18 /* Avagraha, etc that take marks (SM,A,VD). */
 };
 
-#define MEDIAL_FLAGS (FLAG (OT_CM) | FLAG (OT_CM2))
+#define MEDIAL_FLAGS (FLAG (OT_CM))
 
 /* Note:
  *
diff --git a/src/hb-ot-shape-complex-indic.cc b/src/hb-ot-shape-complex-indic.cc
index 1e151a7..9355098 100644
--- a/src/hb-ot-shape-complex-indic.cc
+++ b/src/hb-ot-shape-complex-indic.cc
@@ -209,9 +209,6 @@ set_indic_properties (hb_glyph_info_t &info)
   else if (unlikely (hb_in_range (u, 0x2010u, 0x2011u)))
 				    cat = OT_PLACEHOLDER;
   else if (unlikely (u == 0x25CCu)) cat = OT_DOTTEDCIRCLE;
-  else if (unlikely (u == 0xA982u)) cat = OT_SM; /* Javanese repha. */
-  else if (unlikely (u == 0xA9BEu)) cat = OT_CM2; /* Javanese medial ya. */
-  else if (unlikely (u == 0xA9BDu)) { cat = OT_M; pos = POS_POST_C; } /* Javanese vocalic r. */
 
 
   /*
@@ -310,7 +307,6 @@ static const indic_config_t indic_configs[] =
   {HB_SCRIPT_SINHALA,	false,0x0DCAu,BASE_POS_LAST_SINHALA,
 						     REPH_POS_AFTER_MAIN, REPH_MODE_EXPLICIT, BLWF_MODE_PRE_AND_POST, PREF_LEN_DONT_CARE},
   {HB_SCRIPT_KHMER,	false,0x17D2u,BASE_POS_FIRST,REPH_POS_DONT_CARE,  REPH_MODE_VIS_REPHA,BLWF_MODE_PRE_AND_POST, PREF_LEN_2},
-  {HB_SCRIPT_JAVANESE,	false,0xA9C0u,BASE_POS_FIRST,REPH_POS_DONT_CARE,  REPH_MODE_VIS_REPHA,BLWF_MODE_PRE_AND_POST, PREF_LEN_1},
 };
 
 
commit 30e6e29f0f0f77eb65bfd1c4576b38c2da555017
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Fri May 6 15:52:27 2016 +0100

    [indic/use] Move Javanese from Indic shaper to USE
    
    Fixes https://github.com/behdad/harfbuzz/issues/243
    
    With javatext.ttf, the reodering medial Ra gets its advance width
    zero'ed in Uniscribe implementation, and the font adds the advance
    back.  Our Indic shaper does not do that, but USE does.  So, route
    Javanese through USE.  That's what Microsoft does anyway.  Test:
    
      U+A9A5,U+A9BA
    
    This also seems to fix the following sequence, and variations thereof:
    
      U+A99F,U+A9C0,U+A9A2,U+A9BF

diff --git a/src/gen-indic-table.py b/src/gen-indic-table.py
index cc39481..3016cd0 100755
--- a/src/gen-indic-table.py
+++ b/src/gen-indic-table.py
@@ -26,7 +26,6 @@ ALLOWED_BLOCKS = [
 	'General Punctuation',
 	'Superscripts and Subscripts',
 	'Devanagari Extended',
-	'Javanese',
 	'Myanmar Extended-B',
 	'Myanmar Extended-A',
 ]
diff --git a/src/hb-ot-shape-complex-indic-table.cc b/src/hb-ot-shape-complex-indic-table.cc
index 36157c0..e5054d1 100644
--- a/src/hb-ot-shape-complex-indic-table.cc
+++ b/src/hb-ot-shape-complex-indic-table.cc
@@ -370,24 +370,9 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
   /* A8E8 */ _(Ca,T), _(Ca,T), _(Ca,T), _(Ca,T), _(Ca,T), _(Ca,T), _(Ca,T), _(Ca,T),
   /* A8F0 */ _(Ca,T), _(Ca,T),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
 
-#define indic_offset_0xa980u 1720
+#define indic_offset_0xa9e0u 1720
 
 
-  /* Javanese */
-
-  /* A980 */ _(Bi,T), _(Bi,T),_(CSR,T), _(Vs,R), _(VI,x), _(VI,x), _(VI,x), _(VI,x),
-  /* A988 */ _(VI,x),  _(C,x),  _(C,x),  _(C,x), _(VI,x), _(VI,x), _(VI,x),  _(C,x),
-  /* A990 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* A998 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* A9A0 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* A9A8 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),
-  /* A9B0 */  _(C,x),  _(C,x),  _(C,x),  _(N,T),  _(M,R),  _(M,R),  _(M,T),  _(M,T),
-  /* A9B8 */  _(M,B),  _(M,B),  _(M,L),  _(M,L),  _(M,T), _(CS,R), _(CM,R), _(CM,R),
-  /* A9C0 */ _(V,BR),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* A9C8 */  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-  /* A9D0 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
-  /* A9D8 */ _(Nd,x), _(Nd,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
-
   /* Myanmar Extended-B */
 
   /* A9E0 */  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(M,T),  _(x,x),  _(C,x),
@@ -395,7 +380,7 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
   /* A9F0 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
   /* A9F8 */ _(Nd,x), _(Nd,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(C,x),  _(x,x),
 
-#define indic_offset_0xaa60u 1848
+#define indic_offset_0xaa60u 1752
 
 
   /* Myanmar Extended-A */
@@ -405,7 +390,7 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
   /* AA70 */  _(x,x),  _(C,x),  _(C,x),  _(C,x),  _(x,x),  _(x,x),  _(x,x),  _(x,x),
   /* AA78 */  _(x,x),  _(x,x),  _(C,x), _(TM,R), _(TM,T), _(TM,R),  _(C,x),  _(C,x),
 
-}; /* Table items: 1880; occupancy: 70% */
+}; /* Table items: 1784; occupancy: 69% */
 
 INDIC_TABLE_ELEMENT_TYPE
 hb_indic_get_categories (hb_codepoint_t u)
@@ -433,7 +418,7 @@ hb_indic_get_categories (hb_codepoint_t u)
 
     case 0xAu:
       if (hb_in_range (u, 0xA8E0u, 0xA8F7u)) return indic_table[u - 0xA8E0u + indic_offset_0xa8e0u];
-      if (hb_in_range (u, 0xA980u, 0xA9FFu)) return indic_table[u - 0xA980u + indic_offset_0xa980u];
+      if (hb_in_range (u, 0xA9E0u, 0xA9FFu)) return indic_table[u - 0xA9E0u + indic_offset_0xa9e0u];
       if (hb_in_range (u, 0xAA60u, 0xAA7Fu)) return indic_table[u - 0xAA60u + indic_offset_0xaa60u];
       break;
 
diff --git a/src/hb-ot-shape-complex-private.hh b/src/hb-ot-shape-complex-private.hh
index 36d945a..fb0c704 100644
--- a/src/hb-ot-shape-complex-private.hh
+++ b/src/hb-ot-shape-complex-private.hh
@@ -241,9 +241,6 @@ hb_ot_shape_complex_categorize (const hb_ot_shape_planner_t *planner)
     /* Unicode-3.0 additions */
     case HB_SCRIPT_SINHALA:
 
-    /* Unicode-5.2 additions */
-    case HB_SCRIPT_JAVANESE:
-
       /* If the designer designed the font for the 'DFLT' script,
        * use the default shaper.  Otherwise, use the specific shaper.
        * Note that for some simple scripts, there may not be *any*
@@ -316,7 +313,7 @@ hb_ot_shape_complex_categorize (const hb_ot_shape_planner_t *planner)
 
     /* Unicode-5.2 additions */
     case HB_SCRIPT_EGYPTIAN_HIEROGLYPHS:
-    //case HB_SCRIPT_JAVANESE:
+    case HB_SCRIPT_JAVANESE:
     case HB_SCRIPT_KAITHI:
     case HB_SCRIPT_MEETEI_MAYEK:
     case HB_SCRIPT_TAI_THAM:
diff --git a/test/shaping/texts/in-tree/shaper-indic/south-east-asian/script-javanese/misc.txt b/test/shaping/texts/in-tree/shaper-indic/south-east-asian/script-javanese/misc.txt
index 762330c..16c3d9c 100644
--- a/test/shaping/texts/in-tree/shaper-indic/south-east-asian/script-javanese/misc.txt
+++ b/test/shaping/texts/in-tree/shaper-indic/south-east-asian/script-javanese/misc.txt
@@ -1,4 +1,5 @@
 ꦥꦺ
+ꦟ꧀ꦢꦿ
 ꦥꦺꦴꦂꦠꦸꦒꦭ꧀
 ꧋
 ​꧅
commit c6ee5f5f06a27a6f147f63aaf51186622821f20b
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Fri May 6 15:39:02 2016 +0100

    Add Javanese sample text

diff --git a/test/shaping/texts/in-tree/shaper-indic/south-east-asian/script-javanese/misc.txt b/test/shaping/texts/in-tree/shaper-indic/south-east-asian/script-javanese/misc.txt
new file mode 100644
index 0000000..762330c
--- /dev/null
+++ b/test/shaping/texts/in-tree/shaper-indic/south-east-asian/script-javanese/misc.txt
@@ -0,0 +1,53 @@
+ꦥꦺ
+ꦥꦺꦴꦂꦠꦸꦒꦭ꧀
+꧋
+​꧅
+꧑꧐꧇
+꧒꧐꧐꧔
+꧑꧘꧘꧕꧇
+ꦥꦤꦶꦠꦿ꧇
+ꦏꦠꦿꦁꦔꦤ꧀
+꧅꧉ꦟ꧀ꦢꦿ꧉꧅
+ꦥꦺꦔꦼꦠ꧀ꦠꦤ꧀
+ꦄꦒꦸꦱ꧀ꦠꦸꦱ꧀꧇
+ꦮꦸꦭꦤ꧀ꦗꦤꦸꦮꦫꦶ
+ꦠꦸꦮꦤ꧀​ꦯꦶꦏꦺꦕꦶ
+ꦲꦶꦁ​ꦱꦸꦂꦪ​ꦏꦥꦶꦁ꧇
+ꦯꦺꦟꦦꦡꦶ​ꦲꦶꦁ​ꦔꦭꦓ꧈
+ꦲꦸꦠꦮꦶ​ꦯꦸꦂꦪ​ꦏꦥꦶꦁ꧇
+ꦥꦩꦼꦁꦏꦸꦤꦶꦫꦺꦁ​ꦨꦸꦮꦤ꧈
+ꦩꦁꦏꦾ​ꦲꦶꦁ​ꦔꦪꦸꦓꦾꦏꦂꦡ꧈
+ꦠꦤ꧀ꦧꦁꦏꦶꦠ꧀ꦲꦔꦸꦕꦥ꧀ꦥꦼꦤ꧈
+ꦠꦸꦮꦤ꧀​ꦈꦤ꧀​ꦕꦸꦤ꧀​ꦲꦺꦴꦏ꧀
+ꦲꦢꦶꦤꦶꦁꦔꦿꦠ꧀ꦏꦿꦡꦺꦴꦤ꧀ꦲꦗꦶ꧈
+ꦥꦔꦿꦺꦃꦲꦶꦁꦩꦱ꧀ꦗꦶꦢ꧀ꦱꦭꦶꦏꦶꦤ꧀
+ꦠꦼꦤ꧀ꦠꦽꦩ꧀ꦥꦿꦢꦱꦶꦃ​ꦒꦼꦁꦲꦭꦶꦠ꧀
+ꦲꦶꦁꦏꦁ​ꦲꦁꦒꦫꦥ꧀​ꦫꦢꦺꦤ꧀​ꦯꦸꦰꦺꦗ
+ꦫꦢꦺꦤ꧀ꦲꦗꦶꦩ꦳ꦸꦃꦏ꦳ꦩ꦳ꦢ꧀‌ꦔꦢ꧀ꦤꦤ꧀
+ꦮꦸꦭꦤ꧀ꦗꦸꦩꦢꦶꦭꦮꦭ꧀ꦠꦲꦸꦤ꧀ꦗꦶꦩ꧀ꦩꦮꦭ꧀
+ꦑꦭꦶꦦꦡꦸꦭ꧀ꦭꦃ​ꦲꦶꦁꦏꦁ​ꦗꦸꦩꦼꦤꦼꦁ​ꦏꦥꦶꦁ
+ꦠꦤ꧀ꦝꦶꦁꦔꦤ꧀ꦤꦶꦥꦸꦤ꧀ꦱꦮꦸꦁ​ꦧꦭ꧀ꦧꦭ꧀ꦭꦤ꧀꧈
+ꦩꦶꦤꦺꦴꦁꦏ​ꦥꦺꦔꦼꦠ꧀ꦠꦤ꧀ꦗꦸꦩꦼꦤꦼꦁ​ꦢꦊꦩ꧀ꦟꦡ꧈
+ꦏꦑꦒꦓꦔꦕꦖꦗꦙꦚꦛꦜꦝꦞꦟꦠꦡꦢꦣꦤꦥꦦꦧꦨꦩꦪꦫꦭꦮꦯꦰꦱꦲ
+ꦢꦺꦤ꧀ꦤꦶꦁ​ꦫꦢꦺꦤ꧀ꦔꦤ꧀ꦠꦺꦤ꧀ꦡꦸꦩꦼꦁꦒꦸꦁ​ꦦꦿꦮꦶꦫꦢꦶꦂꦗ꧉
+ꦲꦶꦁꦩꦡꦫꦩ꧀ꦢꦸꦏ꧀ꦫꦸꦩꦸꦲꦸꦤ꧀​ꦠꦼꦊꦁꦔꦶꦁ​ꦏꦫꦡꦺꦴꦤ꧀ꦗꦮꦶ꧈
+ꦮꦼꦝꦶ​ꦒꦩ꧀ꦥꦶꦁ​ꦏꦗꦼꦁ​ꦭꦤ꧀ꦱꦤ꧀ꦤꦺꦱ꧀ꦱꦤ꧀ꦤꦺꦱ꧀ꦱꦶꦥꦸꦤ꧀​
+ꦩꦺꦴꦁꦏ​ꦱꦫꦮꦺꦢꦶꦤꦶꦁꦫꦠ꧀​ꦢꦺꦫꦤꦿꦸꦱ꧀ꦏꦼꦤ꧀ꦲꦸꦗ꧀ꦮꦭꦤ꧀ꦤꦶꦁ꧈
+ꦩꦶꦤꦺꦴꦁꦏ​ꦮꦏꦶꦭ꧀ꦪꦪꦱꦤ꧀ꦏꦭ꧀ꦭꦺꦴꦲꦸꦱ꧀ꦠꦼ​ꦒꦸꦭ꧀ꦧꦺꦤꦏꦶꦲꦤ꧀꧇
+ꦥꦶꦤꦽꦤꦃꦏꦼꦤ꧀ꦩꦁꦒꦺꦤ꧀ꦤꦶꦥꦸꦤ꧀​ꦲꦶꦁ​ꦥꦥꦤ꧀ꦲꦶꦁꦏꦁ​ꦥꦏꦺꦴꦭꦶꦃ꧈
+ꦠꦸꦩꦸꦗ꧀ꦮꦺꦁ​ꦊꦉꦱ꧀ꦤꦼꦂꦫꦶꦥꦸꦤ꧀​ꦱꦸꦱꦠꦾ​ꦠꦼꦩꦼꦤ꧀ꦤꦸꦲꦺꦴꦤ꧀ꦤꦶ꧈
+ꦲꦶꦁꦏꦁ​ꦲꦔꦽꦁꦒꦤ꧀ꦤꦶ​ꦑꦫꦡꦺꦴꦤ꧀ꦢꦊꦩ꧀ꦲꦶꦁ​ꦔꦪꦸꦓꦾꦏꦂꦡ​ꦲꦢꦶꦟꦶꦁꦔꦿꦠ꧀꧈
+ꦗꦸꦩꦼꦤꦼꦁ​ꦢꦊꦩ꧀ꦟꦡ​ꦲꦩꦉꦁꦔꦶ​ꦢꦶꦤ꧀ꦠꦼꦤ꧀ꦱꦼꦤꦺꦤ꧀ꦥꦺꦴꦤ꧀​ꦠꦁꦒꦭ꧀ꦏꦥꦶꦁ꧇
+꧋ꦱꦧꦼꦤ꧀ꦲꦸꦮꦺꦴꦁꦏꦭꦲꦶꦫꦏꦺꦏꦤ꧀ꦛꦶꦩꦂꦢꦶꦏꦭꦤ꧀ꦢꦂꦧꦺꦩꦂꦠꦧꦠ꧀ꦭꦤ꧀ꦲꦏ꧀ꦲꦏ꧀ꦏꦁꦥꦝ꧉
+ꦱꦁꦏꦶꦁ​ꦥꦫ​ꦧꦺꦴꦁꦱ​ꦡꦾꦺꦴꦁꦲ꧀ꦮ​ꦒꦺꦴꦭꦺꦴꦁꦔꦤ꧀ꦲꦶꦁ​ꦔꦪꦸꦓꦾꦏꦂꦡ​ꦲꦢꦶꦤꦶꦁꦔꦿꦠ꧀
+ꦔꦂꦰ​ꦢꦊꦩ꧀​ꦯꦩ꧀ꦦꦺꦪꦤ꧀ꦢꦊꦩ꧀​ꦲꦶꦁꦑꦁ​ꦯꦶꦟꦸꦮꦸꦤ꧀ꦏꦗꦼꦁ​ꦯꦸꦭ꧀ꦡꦤ꧀​ꦲꦩꦼꦁꦑꦸꦨꦸꦮꦟ꧈
+ꦲꦢꦼꦒ꧀ꦒꦶꦁ​ꦩꦱ꧀ꦗꦶꦢ꧀ꦱꦭꦶꦏꦶꦤ꧀​ꦪꦱꦤ꧀ꦤꦶꦥꦸꦤ꧀ꦫꦢꦺꦤ꧀ꦔꦤ꧀ꦠꦺꦤ꧀ꦡꦸꦩꦼꦁꦒꦸꦁ​ꦦꦿꦮꦶꦫꦢꦶꦂꦗ꧈
+ꦒꦸꦧꦼꦂꦤꦸꦂ​ꦝꦃꦲꦺꦫꦃ​ꦆꦱ꧀ꦠꦶꦩꦺꦮꦃ​ꦪꦺꦴꦒꦾꦏꦂꦠ​ꦠꦸꦮꦶꦤ꧀ꦲꦶꦁꦏꦁ​ꦩꦶꦤꦸꦭ꧀ꦪ​ꦠꦸꦮꦤ꧀ꦪꦺꦴꦱꦺ​ꦧ꧀ꦭꦤ꧀ꦕꦺꦴ꧈
+ꦲꦶꦁꦒꦶꦃ​ꦥꦸꦤꦶꦏ​ꦧꦧ꧀ꦮꦺꦴꦤ꧀ꦠꦼꦤ꧀ꦤꦶꦥꦸꦤ꧀ꦱꦮꦸꦁ​ꦧꦭ꧀ꦧꦭ꧀ꦭꦤ꧀ꦠꦤꦃ​ꦔꦿꦶꦏꦶ​ꦲꦶꦁꦏꦁ​ꦱꦩꦶ​ꦔ꧀ꦭꦸꦫꦸꦒ꧀ꦝꦠꦼꦁ​ꦌꦫꦺꦴꦦꦃ꧈
+ꦱꦺꦴꦏꦺꦴꦁꦔꦤ꧀ꦱꦏꦶꦁ​ꦥꦫ​ꦩꦸꦱ꧀ꦭꦶꦩꦶꦤ꧀​ꦢꦺꦤ꧀ꦤꦺ​ꦲꦶꦁꦏꦁ​ꦔꦿꦚ꧀ꦕꦁ​ꦱꦲ​ꦔꦮꦠ꧀ꦲꦮꦠ꧀ꦠꦶ​ꦥꦁꦒꦫꦥ꧀ꦥꦶꦥꦸꦤ꧀ꦩꦱ꧀ꦗꦶꦢ꧀​ꦫꦢꦺꦤ꧀ꦔꦧꦺꦲꦶ​ꦕꦺꦴꦤ꧀ꦢꦿꦢꦶꦥꦿꦗ꧈
+ꦭꦗꦼꦁ​ꦏꦮꦏꦥ꧀ꦥꦏꦼꦤ꧀ꦏꦁꦒꦺ​ꦥꦂꦭꦸꦤꦶꦁ​ꦆꦱ꧀ꦭꦩ꧀ꦭꦤ꧀ꦩꦸꦱ꧀ꦭꦶꦩꦶꦤ꧀ꦲꦶꦁ​ꦱꦭꦩꦶꦭꦩꦶꦤꦶꦥꦸꦤ꧀​ꦥꦩ꧀ꦧꦶꦏꦏ꧀ꦏꦶꦥꦸꦤ꧀ꦲꦶꦁ​ꦢꦶꦤ꧀ꦠꦼꦤ꧀ꦏꦼꦩꦶꦱ꧀ꦏꦭꦶꦮꦺꦴꦤ꧀ꦠꦁꦒꦭ꧀ꦏꦥꦶꦁ꧇
+ꦲꦶꦁ​ꦔꦿꦶꦏꦶ​ꦔꦼꦕꦿꦠ꧀ꦒꦩ꧀ꦧꦂꦫꦶꦥꦸꦤ꧀ꦱꦮꦸꦁ​ꦱꦮꦸꦁ​ꦮꦲꦸ​ꦤꦭꦶꦏ​ꦤꦸꦗꦸ​ꦠꦤ꧀ꦝꦶꦁꦔꦤ꧀ꦏꦭꦶꦪꦤ꧀ꦱꦮꦸꦁ​ꦧꦭ꧀ꦧꦭ꧀ꦭꦤ꧀ꦱꦏꦶꦁ​ꦲꦺꦴꦁꦓꦫꦶꦪꦼ​ꦮꦺꦴꦤ꧀ꦠꦼꦤ꧀ꦲꦶꦁ​ꦲꦭꦸꦤ꧀ꦲꦭꦸꦤ꧀꧇
+ꦱꦢꦺꦫꦺꦁꦔꦶꦥꦸꦤ꧀ꦩꦱ꧀ꦗꦶꦢ꧀ꦱꦭꦶꦏꦶꦤ꧀ꦏꦒꦫꦥ꧀​ꦱꦩ꧀ꦥꦸꦤ꧀ꦮꦺꦴꦤ꧀ꦠꦼꦤ꧀ꦩꦲꦸꦗꦸꦢ꧀ꦥꦤ꧀ꦝꦼꦩꦺꦤ꧀ꦤꦶꦁ​ꦩꦱ꧀ꦗꦶꦢ꧀​ꦯꦸꦫꦩ꧀ꦧꦶ​ꦱꦲ​ꦥꦭꦩ꧀ꦥꦃꦲꦤ꧀​ꦱꦂꦠ​ꦧꦺꦴꦤ꧀ꦝꦱꦮꦠꦮꦶꦱ꧀​ꦏꦢꦺꦴꦱ꧀ꦠ꧇
+ꦩꦸꦭ꧀ꦪꦏ꧀ꦏꦏꦺ​ꦈꦩ꧀ꦧꦸꦭ꧀ꦧꦶꦤꦁꦔꦸꦤ꧀ꦠꦩ꧀ꦩꦤ꧀ꦱꦂꦫꦶ​ꦏꦊꦏ꧀ꦱꦤ꧀ꦤꦏ꧀ꦏꦏꦼꦤ꧀ꦏꦤ꧀ꦛꦶ​ꦥꦚꦼꦁꦏꦸꦪꦸꦁꦔꦶꦥꦸꦤ꧀ꦪꦪꦱ꧀ꦱꦤ꧀ꦏꦭ꧀ꦭꦲꦸꦱ꧀ꦠꦼ​ꦒꦸꦭ꧀ꦧꦼꦤ꧀ꦏꦶꦲꦤ꧀ꦱꦲ​ꦏꦂꦉꦱ꧀ꦩꦺꦏ꧀ꦏꦏꦼꦤ꧀ꦢꦶꦤꦶꦁ​ꦲꦶꦁꦏꦁ​ꦩꦶꦤꦸꦭ꧀ꦪ​ꦯꦿꦶ​ꦯꦸꦭ꧀ꦠꦤ꧀ꦲꦩꦁꦏꦸꦨꦸꦮꦤ꧇
+ꦠꦸꦮꦤ꧀Dr꧇ꦯꦶꦩ꧀​ꦏꦶꦄꦌ
+ꦠꦸꦮꦤ꧀Ir꧇ꦭꦶꦩ꧀​ꦆꦁꦲ꧀ꦮꦶ
commit e21921a68a959b7e929f71a4260a6cbe055ab4e6
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Fri May 6 15:24:39 2016 +0100

    Minor

diff --git a/BUILD.md b/BUILD.md
index 86285c6..7518c2e 100644
--- a/BUILD.md
+++ b/BUILD.md
@@ -1,5 +1,4 @@
-On Linux, install the development packages for
-[FreeType](http://www.freedesktop.org/wiki/Software/FreeType/),
+On Linux, install the development packages for FreeType,
 Cairo, and GLib. For example, on Ubuntu / Debian, you would do:
 * sudo apt-get install gcc g++ libfreetype6-dev libglib2.0-dev libcairo2-dev
 
@@ -30,4 +29,8 @@ on the Mac, using MacPorts:
 * sudo port install autoconf automake libtool pkgconfig ragel gtk-doc
 
 or using Homebrew:
-* brew port install autoconf automake libtool pkgconfig ragel gtk-doc
+* brew install autoconf automake libtool pkgconfig ragel gtk-doc
+
+To build the Python bindings, you also need:
+
+* brew install pygobject3


More information about the HarfBuzz mailing list