[serialize] Implement for ClassDefFormat2
authorBehdad Esfahbod <behdad@behdad.org>
Thu, 13 Dec 2018 20:57:12 +0000 (15:57 -0500)
committerBehdad Esfahbod <behdad@behdad.org>
Thu, 13 Dec 2018 20:57:12 +0000 (15:57 -0500)
src/hb-ot-layout-common.hh

index 3e24cf6..e533aac 100644 (file)
@@ -928,14 +928,15 @@ struct CoverageFormat2
     rangeRecord[range].start = glyphs[0];
     rangeRecord[range].value.set (0);
     for (unsigned int i = 1; i < num_glyphs; i++)
-      if (glyphs[i - 1] + 1 != glyphs[i]) {
+    {
+      if (glyphs[i - 1] + 1 != glyphs[i])
+      {
        range++;
        rangeRecord[range].start = glyphs[i];
        rangeRecord[range].value.set (i);
-       rangeRecord[range].end = glyphs[i];
-      } else {
-       rangeRecord[range].end = glyphs[i];
       }
+      rangeRecord[range].end = glyphs[i];
+    }
     glyphs += num_glyphs;
     return_trace (true);
   }
@@ -1314,6 +1315,47 @@ struct ClassDefFormat2
     return rangeRecord.bsearch (glyph_id).value;
   }
 
+  inline bool serialize (hb_serialize_context_t *c,
+                        hb_codepoint_t first_glyph,
+                        Supplier<HBUINT16> &glyphs,
+                        Supplier<HBUINT16> &klasses,
+                        unsigned int num_glyphs)
+  {
+    TRACE_SERIALIZE (this);
+    if (unlikely (!c->extend_min (*this))) return_trace (false);
+
+    if (unlikely (!num_glyphs))
+    {
+      rangeRecord.len.set (0);
+      return_trace (true);
+    }
+
+    unsigned int num_ranges = 1;
+    for (unsigned int i = 1; i < num_glyphs; i++)
+      if (glyphs[i - 1] + 1 != glyphs[i] ||
+         klasses[i - 1] != klasses[i])
+       num_ranges++;
+    rangeRecord.len.set (num_ranges);
+    if (unlikely (!c->extend (rangeRecord))) return_trace (false);
+
+    unsigned int range = 0;
+    rangeRecord[range].start = glyphs[0];
+    rangeRecord[range].value.set (klasses[0]);
+    for (unsigned int i = 1; i < num_glyphs; i++)
+    {
+      if (glyphs[i - 1] + 1 != glyphs[i] ||
+         klasses[i - 1] != klasses[i])
+      {
+       range++;
+       rangeRecord[range].start = glyphs[i];
+       rangeRecord[range].value = klasses[i];
+      }
+      rangeRecord[range].end = glyphs[i];
+    }
+    glyphs += num_glyphs;
+    return_trace (true);
+  }
+
   inline bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);