[HarfBuzz] harfbuzz: Branch 'master'

Behdad Esfahbod behdad at kemper.freedesktop.org
Tue Feb 13 21:56:01 UTC 2018


 src/Makefile.sources        |    1 
 src/hb-face.h               |    1 
 src/hb-set.cc               |   14 ++---
 src/hb-subset-input.cc      |  109 ++++++++++++++++++++++++++++++++++++++++++++
 src/hb-subset-plan.cc       |    2 
 src/hb-subset-private.hh    |   11 ++++
 src/hb-subset.cc            |   40 +---------------
 src/hb-subset.h             |   12 ++++
 test/api/test-subset-glyf.c |    4 -
 test/api/test-subset.c      |    2 
 util/hb-subset.cc           |   20 +++-----
 11 files changed, 153 insertions(+), 63 deletions(-)

New commits:
commit d5b33f2fe1603e894e21f45afb4c00c8d670fb5c
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Tue Feb 13 13:50:50 2018 -0800

    [subset] hb_subset_input_t changes

diff --git a/src/Makefile.sources b/src/Makefile.sources
index f2821e3d..f412a65d 100644
--- a/src/Makefile.sources
+++ b/src/Makefile.sources
@@ -185,6 +185,7 @@ HB_ICU_headers = hb-icu.h
 HB_SUBSET_sources = \
 	hb-subset.cc \
 	hb-subset-glyf.cc \
+	hb-subset-input.cc \
 	hb-subset-plan.cc \
 	$(NULL)
 
diff --git a/src/hb-face.h b/src/hb-face.h
index 9842d52b..0ce8d046 100644
--- a/src/hb-face.h
+++ b/src/hb-face.h
@@ -71,7 +71,6 @@ hb_face_set_user_data (hb_face_t          *face,
 		       hb_destroy_func_t   destroy,
 		       hb_bool_t           replace);
 
-
 HB_EXTERN void *
 hb_face_get_user_data (hb_face_t          *face,
 		       hb_user_data_key_t *key);
diff --git a/src/hb-set.cc b/src/hb-set.cc
index 0b4f871e..f3b864c1 100644
--- a/src/hb-set.cc
+++ b/src/hb-set.cc
@@ -50,6 +50,13 @@ hb_set_create (void)
   return set;
 }
 
+static const hb_set_t _hb_set_nil = {
+  HB_OBJECT_HEADER_STATIC,
+  true, /* in_error */
+
+  {0} /* elts */
+};
+
 /**
  * hb_set_get_empty:
  *
@@ -60,13 +67,6 @@ hb_set_create (void)
 hb_set_t *
 hb_set_get_empty (void)
 {
-  static const hb_set_t _hb_set_nil = {
-    HB_OBJECT_HEADER_STATIC,
-    true, /* in_error */
-
-    {0} /* elts */
-  };
-
   return const_cast<hb_set_t *> (&_hb_set_nil);
 }
 
diff --git a/src/hb-subset-input.cc b/src/hb-subset-input.cc
new file mode 100644
index 00000000..75c01684
--- /dev/null
+++ b/src/hb-subset-input.cc
@@ -0,0 +1,109 @@
+/*
+ * Copyright © 2018  Google, Inc.
+ *
+ *  This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Garret Rieger, Rod Sheeter, Behdad Esfahbod
+ */
+
+#include "hb-object-private.hh"
+#include "hb-subset-private.hh"
+#include "hb-set-private.hh"
+
+/**
+ * hb_subset_input_create:
+ *
+ * Return value: New subset input.
+ *
+ * Since: 1.8.0
+ **/
+hb_subset_input_t *
+hb_subset_input_create (void)
+{
+  hb_subset_input_t *input = hb_object_create<hb_subset_input_t>();
+
+  /* Unlike libharfbuzz, in this lib we return nullptr
+   * in case of allocation failure. */
+  if (unlikely (!input))
+    return nullptr;
+
+  input->unicodes = hb_set_create ();
+  input->glyphs = hb_set_create ();
+
+  return input;
+}
+
+/**
+ * hb_subset_input_reference: (skip)
+ * @subset_input: a subset_input.
+ *
+ * 
+ *
+ * Return value: 
+ *
+ * Since: 1.8.0
+ **/
+hb_subset_input_t *
+hb_subset_input_reference (hb_subset_input_t *subset_input)
+{
+  return hb_object_reference (subset_input);
+}
+
+/**
+ * hb_subset_input_destroy:
+ * @subset_input: a subset_input.
+ *
+ * Since: 1.8.0
+ **/
+void
+hb_subset_input_destroy(hb_subset_input_t *subset_input)
+{
+  if (!hb_object_destroy (subset_input)) return;
+
+  hb_set_destroy (subset_input->unicodes);
+  hb_set_destroy (subset_input->glyphs);
+
+  free (subset_input);
+}
+
+/**
+ * hb_subset_input_unicode_set:
+ * @subset_input: a subset_input.
+ *
+ * Since: 1.8.0
+ **/
+HB_EXTERN hb_set_t *
+hb_subset_input_unicode_set (hb_subset_input_t *subset_input)
+{
+  return subset_input->unicodes;
+}
+
+/**
+ * hb_subset_input_glyph_set:
+ * @subset_input: a subset_input.
+ *
+ * Since: 1.8.0
+ **/
+HB_EXTERN hb_set_t *
+hb_subset_input_glyph_set (hb_subset_input_t *subset_input)
+{
+  return subset_input->glyphs;
+}
diff --git a/src/hb-subset-plan.cc b/src/hb-subset-plan.cc
index a06d38ae..c9d39c5b 100644
--- a/src/hb-subset-plan.cc
+++ b/src/hb-subset-plan.cc
@@ -140,7 +140,7 @@ hb_subset_plan_create (hb_face_t           *face,
   plan->gids_to_retain.init();
   plan->gids_to_retain_sorted.init();
 
-  _populate_codepoints (input->codepoints, plan->codepoints);
+  _populate_codepoints (input->unicodes, plan->codepoints);
   _populate_gids_to_retain (face,
                             plan->codepoints,
                             plan->gids_to_retain,
diff --git a/src/hb-subset-private.hh b/src/hb-subset-private.hh
index 9689da80..4ef1b954 100644
--- a/src/hb-subset-private.hh
+++ b/src/hb-subset-private.hh
@@ -38,7 +38,16 @@ struct hb_subset_input_t {
   hb_object_header_t header;
   ASSERT_POD ();
 
-  hb_set_t *codepoints;
+  hb_set_t *unicodes;
+  hb_set_t *glyphs;
+
+  /* TODO
+   *
+   * features
+   * lookups
+   * nameIDs
+   * ...
+   */
 };
 
 #endif /* HB_SUBSET_PRIVATE_HH */
diff --git a/src/hb-subset.cc b/src/hb-subset.cc
index 3b022dd4..09ae19fb 100644
--- a/src/hb-subset.cc
+++ b/src/hb-subset.cc
@@ -21,14 +21,12 @@
  * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
  * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
  *
- * Google Author(s): Garret Rieger, Rod Sheeter
+ * Google Author(s): Garret Rieger, Rod Sheeter, Behdad Esfahbod
  */
 
 #include "hb-object-private.hh"
 #include "hb-open-type-private.hh"
 
-#include "hb-private.hh"
-
 #include "hb-subset-glyf.hh"
 #include "hb-subset-private.hh"
 #include "hb-subset-plan.hh"
@@ -53,7 +51,7 @@ struct hb_subset_profile_t {
  *
  * Return value: New profile with default settings.
  *
- * Since: 1.7.5
+ * Since: 1.8.0
  **/
 hb_subset_profile_t *
 hb_subset_profile_create ()
@@ -64,7 +62,7 @@ hb_subset_profile_create ()
 /**
  * hb_subset_profile_destroy:
  *
- * Since: 1.7.5
+ * Since: 1.8.0
  **/
 void
 hb_subset_profile_destroy (hb_subset_profile_t *profile)
@@ -74,38 +72,6 @@ hb_subset_profile_destroy (hb_subset_profile_t *profile)
   free (profile);
 }
 
-/**
- * hb_subset_input_create:
- *
- * Return value: New subset input.
- *
- * Since: 1.7.5
- **/
-hb_subset_input_t *
-hb_subset_input_create (hb_set_t *codepoints)
-{
-  if (unlikely (!codepoints))
-    codepoints = hb_set_get_empty();
-
-  hb_subset_input_t *input = hb_object_create<hb_subset_input_t>();
-  input->codepoints = hb_set_reference(codepoints);
-  return input;
-}
-
-/**
- * hb_subset_input_destroy:
- *
- * Since: 1.7.5
- **/
-void
-hb_subset_input_destroy(hb_subset_input_t *subset_input)
-{
-  if (!hb_object_destroy (subset_input)) return;
-
-  hb_set_destroy (subset_input->codepoints);
-  free (subset_input);
-}
-
 template<typename TableType>
 static hb_blob_t *
 _subset (hb_subset_plan_t *plan, hb_face_t *source)
diff --git a/src/hb-subset.h b/src/hb-subset.h
index 3eb41de8..81e11fe6 100644
--- a/src/hb-subset.h
+++ b/src/hb-subset.h
@@ -47,17 +47,27 @@ hb_subset_profile_destroy (hb_subset_profile_t *profile);
 
 /*
  * hb_subset_input_t
+ *
  * Things that change based on the input. Characters to keep, etc.
  */
 
 typedef struct hb_subset_input_t hb_subset_input_t;
 
 HB_EXTERN hb_subset_input_t *
-hb_subset_input_create (hb_set_t *codepoints);
+hb_subset_input_create (void);
+
+HB_EXTERN hb_subset_input_t *
+hb_subset_input_reference (hb_subset_input_t *subset_input);
 
 HB_EXTERN void
 hb_subset_input_destroy (hb_subset_input_t *subset_input);
 
+HB_EXTERN hb_set_t *
+hb_subset_input_unicode_set (hb_subset_input_t *subset_input);
+
+HB_EXTERN hb_set_t *
+hb_subset_input_glyph_set (hb_subset_input_t *subset_input);
+
 
 /* hb_subset() */
 
diff --git a/test/api/test-subset-glyf.c b/test/api/test-subset-glyf.c
index fa41800b..014f2433 100644
--- a/test/api/test-subset-glyf.c
+++ b/test/api/test-subset-glyf.c
@@ -94,9 +94,9 @@ test_subset_glyf (void)
   hb_face_t *face_abc_subset;
   hb_blob_t *glyf_expected_blob;
   hb_blob_t *glyf_actual_blob;
-  hb_set_t *codepoints = hb_set_create();
   hb_subset_profile_t *profile = hb_subset_profile_create();
-  hb_subset_input_t *input = hb_subset_input_create (codepoints);
+  hb_subset_input_t *input = hb_subset_input_create ();
+  hb_set_t *codepoints = hb_set_reference (hb_subset_input_unicode_set (input));
 
   g_assert (face_abc);
   g_assert (face_ac);
diff --git a/test/api/test-subset.c b/test/api/test-subset.c
index 4184a563..44eba158 100644
--- a/test/api/test-subset.c
+++ b/test/api/test-subset.c
@@ -43,7 +43,7 @@ test_subset (void)
   hb_face_t *face = hb_face_create(font_blob, 0);
 
   hb_subset_profile_t *profile = hb_subset_profile_create();
-  hb_subset_input_t *input = hb_subset_input_create (hb_set_get_empty ());
+  hb_subset_input_t *input = hb_subset_input_create ();
 
   hb_face_t *out_face = hb_subset(face, profile, input);
   g_assert(out_face);
diff --git a/util/hb-subset.cc b/util/hb-subset.cc
index a3505a81..16abd14d 100644
--- a/util/hb-subset.cc
+++ b/util/hb-subset.cc
@@ -37,13 +37,13 @@
 struct subset_consumer_t
 {
   subset_consumer_t (option_parser_t *parser)
-      : failed (false), options (parser), font (nullptr), codepoints (nullptr) {}
+      : failed (false), options (parser), font (nullptr), input (nullptr) {}
 
   void init (hb_buffer_t  *buffer_,
              const font_options_t *font_opts)
   {
     font = hb_font_reference (font_opts->get_font ());
-    codepoints = hb_set_create();
+    input = hb_subset_input_create ();
   }
 
   void consume_line (const char   *text,
@@ -51,14 +51,13 @@ struct subset_consumer_t
                      const char   *text_before,
                      const char   *text_after)
   {
-    // text appears to be a g_string when set by --unicodes
-    // TODO(Q1) are gunichar and hbcodepoint_t interchangeable?
     // TODO(Q1) does this only get called with at least 1 codepoint?
+    hb_set_t *codepoints = hb_subset_input_unicode_set (input);
     gchar *c = (gchar *)text;
     do {
       gunichar cp = g_utf8_get_char(c);
-      hb_codepoint_t hb_cp = cp; // TODO(Q1) is this safe?
-      hb_set_add(codepoints, hb_cp);
+      hb_codepoint_t hb_cp = cp;
+      hb_set_add (codepoints, hb_cp);
     } while ((c = g_utf8_find_next_char(c, text + text_len)) != nullptr);
   }
 
@@ -90,12 +89,10 @@ struct subset_consumer_t
 
   void finish (const font_options_t *font_opts)
   {
-    // TODO(Q1) check for errors from creates and such
     hb_subset_profile_t *subset_profile = hb_subset_profile_create();
-    hb_subset_input_t *subset_input = hb_subset_input_create (codepoints);
     hb_face_t *face = hb_font_get_face (font);
 
-    hb_face_t *new_face = hb_subset(face, subset_profile, subset_input);
+    hb_face_t *new_face = hb_subset(face, subset_profile, input);
     hb_blob_t *result = hb_face_reference_blob (new_face);
 
     failed = !hb_blob_get_length (result);
@@ -103,8 +100,7 @@ struct subset_consumer_t
       write_file (options.output_file, result);
 
     hb_subset_profile_destroy (subset_profile);
-    hb_subset_input_destroy (subset_input);
-    hb_set_destroy (codepoints);
+    hb_subset_input_destroy (input);
     hb_blob_destroy (result);
     hb_face_destroy (new_face);
     hb_font_destroy (font);
@@ -116,7 +112,7 @@ struct subset_consumer_t
   private:
   output_options_t options;
   hb_font_t *font;
-  hb_set_t *codepoints;
+  hb_subset_input_t *input;
 };
 
 int


More information about the HarfBuzz mailing list