Imported Upstream version 3.4.0
[platform/upstream/harfbuzz.git] / src / hb-ot-shape-complex-hangul.cc
index f5915f4..3bc9e9b 100644 (file)
@@ -80,7 +80,7 @@ struct hangul_shape_plan_t
 static void *
 data_create_hangul (const hb_ot_shape_plan_t *plan)
 {
-  hangul_shape_plan_t *hangul_plan = (hangul_shape_plan_t *) calloc (1, sizeof (hangul_shape_plan_t));
+  hangul_shape_plan_t *hangul_plan = (hangul_shape_plan_t *) hb_calloc (1, sizeof (hangul_shape_plan_t));
   if (unlikely (!hangul_plan))
     return nullptr;
 
@@ -93,7 +93,7 @@ data_create_hangul (const hb_ot_shape_plan_t *plan)
 static void
 data_destroy_hangul (void *data)
 {
-  free (data);
+  hb_free (data);
 }
 
 /* Constants for algorithmic hangul syllable [de]composition. */
@@ -119,7 +119,7 @@ data_destroy_hangul (void *data)
 #define isHangulTone(u) (hb_in_range<hb_codepoint_t> ((u), 0x302Eu, 0x302Fu))
 
 /* buffer var allocations */
-#define hangul_shaping_feature() complex_var_u8_0() /* hangul jamo shaping feature */
+#define hangul_shaping_feature() complex_var_u8_auxiliary() /* hangul jamo shaping feature */
 
 static bool
 is_zero_width_char (hb_font_t *font,
@@ -140,7 +140,7 @@ preprocess_text_hangul (const hb_ot_shape_plan_t *plan HB_UNUSED,
    *
    *   - LV can be precomposed, or decomposed.  Lets call those
    *     <LV> and <L,V>,
-   *   - LVT can be fully precomposed, partically precomposed, or
+   *   - LVT can be fully precomposed, partially precomposed, or
    *     fully decomposed.  Ie. <LVT>, <LV,T>, or <L,V,T>.
    *
    * The composition / decomposition is mechanical.  However, not
@@ -205,7 +205,7 @@ preprocess_text_hangul (const hb_ot_shape_plan_t *plan HB_UNUSED,
       {
        /* Tone mark follows a valid syllable; move it in front, unless it's zero width. */
        buffer->unsafe_to_break_from_outbuffer (start, buffer->idx);
-       buffer->next_glyph ();
+       if (unlikely (!buffer->next_glyph ())) break;
        if (!is_zero_width_char (font, u))
        {
          buffer->merge_out_clusters (start, end + 1);
@@ -218,23 +218,25 @@ preprocess_text_hangul (const hb_ot_shape_plan_t *plan HB_UNUSED,
       else
       {
        /* No valid syllable as base for tone mark; try to insert dotted circle. */
-      if (!(buffer->flags & HB_BUFFER_FLAG_DO_NOT_INSERT_DOTTED_CIRCLE) &&
-         font->has_glyph (0x25CCu))
+       if (!(buffer->flags & HB_BUFFER_FLAG_DO_NOT_INSERT_DOTTED_CIRCLE) &&
+           font->has_glyph (0x25CCu))
        {
          hb_codepoint_t chars[2];
-         if (!is_zero_width_char (font, u)) {
+         if (!is_zero_width_char (font, u))
+         {
            chars[0] = u;
            chars[1] = 0x25CCu;
-         } else {
+         } else
+         {
            chars[0] = 0x25CCu;
            chars[1] = u;
          }
-         buffer->replace_glyphs (1, 2, chars);
+         (void) buffer->replace_glyphs (1, 2, chars);
        }
        else
        {
          /* No dotted circle available in the font; just leave tone mark untouched. */
-         buffer->next_glyph ();
+         (void) buffer->next_glyph ();
        }
       }
       start = end = buffer->out_len;
@@ -271,9 +273,7 @@ preprocess_text_hangul (const hb_ot_shape_plan_t *plan HB_UNUSED,
          hb_codepoint_t s = SBase + (l - LBase) * NCount + (v - VBase) * TCount + tindex;
          if (font->has_glyph (s))
          {
-           buffer->replace_glyphs (t ? 3 : 2, 1, &s);
-           if (unlikely (!buffer->successful))
-             return;
+           (void) buffer->replace_glyphs (t ? 3 : 2, 1, &s);
            end = start + 1;
            continue;
          }
@@ -285,17 +285,19 @@ preprocess_text_hangul (const hb_ot_shape_plan_t *plan HB_UNUSED,
         * Set jamo features on the individual glyphs, and advance past them.
         */
        buffer->cur().hangul_shaping_feature() = LJMO;
-       buffer->next_glyph ();
+       (void) buffer->next_glyph ();
        buffer->cur().hangul_shaping_feature() = VJMO;
-       buffer->next_glyph ();
+       (void) buffer->next_glyph ();
        if (t)
        {
          buffer->cur().hangul_shaping_feature() = TJMO;
-         buffer->next_glyph ();
+         (void) buffer->next_glyph ();
          end = start + 3;
        }
        else
          end = start + 2;
+       if (unlikely (!buffer->successful))
+         break;
        if (buffer->cluster_level == HB_BUFFER_CLUSTER_LEVEL_MONOTONE_GRAPHEMES)
          buffer->merge_out_clusters (start, end);
        continue;
@@ -321,9 +323,7 @@ preprocess_text_hangul (const hb_ot_shape_plan_t *plan HB_UNUSED,
        hb_codepoint_t new_s = s + new_tindex;
        if (font->has_glyph (new_s))
        {
-         buffer->replace_glyphs (2, 1, &new_s);
-         if (unlikely (!buffer->successful))
-           return;
+         (void) buffer->replace_glyphs (2, 1, &new_s);
          end = start + 1;
          continue;
        }
@@ -347,19 +347,18 @@ preprocess_text_hangul (const hb_ot_shape_plan_t *plan HB_UNUSED,
            (!tindex || font->has_glyph (decomposed[2])))
        {
          unsigned int s_len = tindex ? 3 : 2;
-         buffer->replace_glyphs (1, s_len, decomposed);
+         (void) buffer->replace_glyphs (1, s_len, decomposed);
 
          /* If we decomposed an LV because of a non-combining T following,
           * we want to include this T in the syllable.
           */
          if (has_glyph && !tindex)
          {
-           buffer->next_glyph ();
+           (void) buffer->next_glyph ();
            s_len++;
          }
-
          if (unlikely (!buffer->successful))
-           return;
+           break;
 
          /* We decomposed S: apply jamo features to the individual glyphs
           * that are now in buffer->out_info.
@@ -383,19 +382,17 @@ preprocess_text_hangul (const hb_ot_shape_plan_t *plan HB_UNUSED,
 
       if (has_glyph)
       {
-       /* We didn't decompose the S, so just advance past it. */
+       /* We didn't decompose the S, so just advance past it and fall through. */
        end = start + 1;
-       buffer->next_glyph ();
-       continue;
       }
     }
 
     /* Didn't find a recognizable syllable, so we leave end <= start;
      * this will prevent tone-mark reordering happening.
      */
-    buffer->next_glyph ();
+    (void) buffer->next_glyph ();
   }
-  buffer->swap_buffers ();
+  buffer->sync ();
 }
 
 static void