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

2018-02-13 Thread Behdad Esfahbod
 src/Makefile.am|   32 +++
 src/Makefile.sources   |2 
 src/dump-indic-data.cc |   43 +
 src/dump-khmer-data.cc |   43 +
 src/dump-myanmar-data.cc   |   43 +
 src/dump-use-data.cc   |   38 
 src/gen-use-table.py   |2 
 src/hb-ot-shape-complex-indic-private.hh   |  244 +++--
 src/hb-ot-shape-complex-indic.cc   |  214 -
 src/hb-ot-shape-complex-khmer-private.hh   |  124 ++
 src/hb-ot-shape-complex-khmer.cc   |  118 --
 src/hb-ot-shape-complex-myanmar-private.hh |  171 
 src/hb-ot-shape-complex-myanmar.cc |  153 --
 src/hb-ot-shape-complex-use-private.hh |2 
 src/hb-ot-shape-complex-use-table.cc   |2 
 src/hb-ot-shape-complex-use.cc |4 
 16 files changed, 728 insertions(+), 507 deletions(-)

New commits:
commit 507804479a81672ec0c089313adad9fa308d78fd
Author: Behdad Esfahbod 
Date:   Tue Feb 13 21:46:28 2018 -0800

[use] Add dump-use-data

diff --git a/src/Makefile.am b/src/Makefile.am
index f90b2ac2..1ccd8438 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -355,6 +355,7 @@ check_PROGRAMS += \
dump-indic-data \
dump-khmer-data \
dump-myanmar-data \
+   dump-use-data \
$(NULL)
 dump_indic_data_SOURCES = dump-indic-data.cc hb-ot-shape-complex-indic-table.cc
 dump_indic_data_CPPFLAGS = $(HBCFLAGS)
@@ -365,6 +366,9 @@ dump_khmer_data_LDADD = libharfbuzz.la $(HBLIBS)
 dump_myanmar_data_SOURCES = dump-myanmar-data.cc 
hb-ot-shape-complex-indic-table.cc
 dump_myanmar_data_CPPFLAGS = $(HBCFLAGS)
 dump_myanmar_data_LDADD = libharfbuzz.la $(HBLIBS)
+dump_use_data_SOURCES = dump-use-data.cc hb-ot-shape-complex-use-table.cc
+dump_use_data_CPPFLAGS = $(HBCFLAGS)
+dump_use_data_LDADD = libharfbuzz.la $(HBLIBS)
 
 check_PROGRAMS += test-ot-tag
 TESTS += test-ot-tag
diff --git a/src/dump-use-data.cc b/src/dump-use-data.cc
new file mode 100644
index ..0e64688f
--- /dev/null
+++ b/src/dump-use-data.cc
@@ -0,0 +1,38 @@
+/*
+ * 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): Behdad Esfahbod
+ */
+
+#include "hb-ot-shape-complex-use-private.hh"
+
+int
+main (void)
+{
+  for (hb_codepoint_t u = 0; u <= 0x10; u++)
+  {
+unsigned int category = hb_use_get_category (u);
+if (category != USE_O)
+  printf("U+%04X   %u\n", u, category);
+  }
+}
diff --git a/src/gen-use-table.py b/src/gen-use-table.py
index 5391f27e..06817255 100755
--- a/src/gen-use-table.py
+++ b/src/gen-use-table.py
@@ -449,7 +449,7 @@ page_bits = 12
 print "}; /* Table items: %d; occupancy: %d%% */" % (offset, occupancy)
 print
 print "USE_TABLE_ELEMENT_TYPE"
-print "hb_use_get_categories (hb_codepoint_t u)"
+print "hb_use_get_category (hb_codepoint_t u)"
 print "{"
 print "  switch (u >> %d)" % page_bits
 print "  {"
diff --git a/src/hb-ot-shape-complex-use-private.hh 
b/src/hb-ot-shape-complex-use-private.hh
index 3e763ae3..f7ded133 100644
--- a/src/hb-ot-shape-complex-use-private.hh
+++ b/src/hb-ot-shape-complex-use-private.hh
@@ -92,6 +92,6 @@ enum use_category_t {
 };
 
 HB_INTERNAL USE_TABLE_ELEMENT_TYPE
-hb_use_get_categories (hb_codepoint_t u);
+hb_use_get_category (hb_codepoint_t u);
 
 #endif /* HB_OT_SHAPE_COMPLEX_USE_PRIVATE_HH */
diff --git a/src/hb-ot-shape-complex-use-table.cc 
b/src/hb-ot-shape-complex-use-table.cc
index a67ef061..6823392f 100644
--- a/src/hb-ot-shape-complex-use-table.cc
+++ b/src/hb-ot-shape-complex-use-table.cc
@@ -690,7 +690,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
 }; /* Table items: 5424; occupancy: 73% */
 
 USE_TABLE_ELEMENT_TYPE
-hb_use_get_categories (hb_codepoint_t u)
+hb_use_get_category (hb_codepoint_t u)
 {
   switch (u >> 12)
   {
diff --git a/src/hb-ot-shape-complex-use.cc b

[HarfBuzz] script segmentation

2018-02-13 Thread Martin Hosken
Dear All,

One problem I am facing as we add characters to Unicode, is that if a character 
is added to a block, it doesn't necessarily mean that an existing application 
will keep that character in the same run as other characters in the same script 
of that block. This means the app is broken until the character is published in 
a future Unicode standard, a library is updated, and the application is updated 
to use the new version of the library. It also makes it impossible to test out 
proposed changes to Unicode. It would be great if we could come up with a 
standard script segmentation algorithm for runs of text that is also somewhat 
future proof, even if it is not perfect and changes in the future. A best guess 
at what script an unknown character may take has a much higher probability of 
being correct than to give it a special script category of unknown, which is 
always going to be wrong.

So.

1. Do we have a standard algorithm for this?
2. Do we want one?
3. How can we make it more future resilient?

TIA,
Yours,
Martin
___
HarfBuzz mailing list
HarfBuzz@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/harfbuzz


[HarfBuzz] harfbuzz: Branch 'master'

2018-02-13 Thread Behdad Esfahbod
 src/hb-subset-glyf.cc |   30 +++---
 1 file changed, 11 insertions(+), 19 deletions(-)

New commits:
commit fd0bde6325a7dfe3ba54b683646ca0693c414446
Author: Behdad Esfahbod 
Date:   Tue Feb 13 16:35:30 2018 -0800

[subset] Fix loca offsets

Was writing source font's offsets. Ouch.

diff --git a/src/hb-subset-glyf.cc b/src/hb-subset-glyf.cc
index 0a06313e..6dc8199b 100644
--- a/src/hb-subset-glyf.cc
+++ b/src/hb-subset-glyf.cc
@@ -38,14 +38,12 @@ _calculate_glyf_and_loca_prime_size (const 
OT::glyf::accelerator_t &glyf,
 {
   unsigned int total = 0;
   unsigned int count = 0;
-  for (unsigned int i = 0; i < glyph_ids.len; i++) {
+  for (unsigned int i = 0; i < glyph_ids.len; i++)
+  {
 hb_codepoint_t next_glyph = glyph_ids[i];
 unsigned int start_offset, end_offset;
-if (unlikely (!glyf.get_offsets (next_glyph, &start_offset, &end_offset))) 
{
-  *glyf_size = 0;
-  *loca_size = sizeof(OT::HBUINT32);
-  return false;
-}
+if (unlikely (!glyf.get_offsets (next_glyph, &start_offset, &end_offset)))
+  end_offset = start_offset = 0;
 
 total += end_offset - start_offset;
 count++;
@@ -84,27 +82,21 @@ _write_glyf_and_loca_prime (const OT::glyf::accelerator_t 
&glyf,
 {
   char *glyf_prime_data_next = glyf_prime_data;
 
-  hb_codepoint_t new_glyph_id = 0;
-
-  unsigned int end_offset = 0;
-  for (unsigned int i = 0; i < glyph_ids.len; i++) {
-unsigned int start_offset;
-if (unlikely (!glyf.get_offsets (glyph_ids[i], &start_offset, 
&end_offset))) {
-  return false;
-}
+  for (unsigned int i = 0; i < glyph_ids.len; i++)
+  {
+unsigned int start_offset, end_offset;
+if (unlikely (!glyf.get_offsets (glyph_ids[i], &start_offset, 
&end_offset)))
+  end_offset = start_offset = 0;
 
 int length = end_offset - start_offset;
 memcpy (glyf_prime_data_next, glyf_data + start_offset, length);
 
-_write_loca_entry (i, start_offset, use_short_loca, loca_prime_data);
+_write_loca_entry (i, glyf_prime_data_next - glyf_prime_data, 
use_short_loca, loca_prime_data);
 
 glyf_prime_data_next += length;
-new_glyph_id++;
   }
 
-  // Add the last loca entry which doesn't correspond to a specific glyph
-  // but identifies the end of the last glyphs data.
-  _write_loca_entry (new_glyph_id, end_offset, use_short_loca, 
loca_prime_data);
+  _write_loca_entry (glyph_ids.len, glyf_prime_data_next - glyf_prime_data, 
use_short_loca, loca_prime_data);
 
   return true;
 }
___
HarfBuzz mailing list
HarfBuzz@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/harfbuzz


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

2018-02-13 Thread Behdad Esfahbod
 src/Makefile.am |6 +++---
 src/hb-aat-layout-morx-table.hh |   12 +++-
 2 files changed, 10 insertions(+), 8 deletions(-)

New commits:
commit aeed082e282b97e40c2e8590bdd8818affc7de6c
Author: Behdad Esfahbod 
Date:   Tue Feb 13 14:02:59 2018 -0800

Another tweak at libstdc++ things

To fix this warning:

cc1: warning: command line option ‘-fno-threadsafe-statics’ is valid for 
C++/ObjC++ but not for C

diff --git a/src/Makefile.am b/src/Makefile.am
index c4f1069a..ee8e1d56 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -36,7 +36,7 @@ else
 # Make sure we don't link to libstdc++
 # No threadsafe statics in C++ as we do it ourselves
 HBNOLIBCXXFLAGS = -fno-rtti -fno-exceptions
-HBCFLAGS += -fno-threadsafe-statics
+HBLIBCXXFLAGS = -fno-threadsafe-statics
 endif
 
 if HAVE_OT
@@ -178,7 +178,7 @@ FUZZING_CPPFLAGS = \
 EXTRA_LTLIBRARIES = libharfbuzz-fuzzing.la
 libharfbuzz_fuzzing_la_LINK = $(libharfbuzz_la_LINK)
 libharfbuzz_fuzzing_la_SOURCES = $(libharfbuzz_la_SOURCES)
-libharfbuzz_fuzzing_la_CPPFLAGS = $(HBCFLAGS) $(FUZZING_CPPFLAGS)
+libharfbuzz_fuzzing_la_CPPFLAGS = $(HBCFLAGS) $(HBLIBCXXFLAGS) 
$(FUZZING_CPPFLAGS)
 libharfbuzz_fuzzing_la_LDFLAGS = $(AM_LDFLAGS)
 libharfbuzz_fuzzing_la_LIBADD = $(libharfbuzz_la_LIBADD)
 EXTRA_libharfbuzz_fuzzing_la_DEPENDENCIES = 
$(EXTRA_libharfbuzz_la_DEPENDENCIES)
@@ -193,7 +193,7 @@ HBHEADERS += $(HB_ICU_headers)
 else
 lib_LTLIBRARIES += libharfbuzz-icu.la
 libharfbuzz_icu_la_SOURCES = $(HB_ICU_sources)
-libharfbuzz_icu_la_CPPFLAGS = $(HBCFLAGS) $(ICU_CFLAGS)
+libharfbuzz_icu_la_CPPFLAGS = $(HBCFLAGS) $(HBLIBCXXFLAGS) $(ICU_CFLAGS)
 libharfbuzz_icu_la_LDFLAGS = $(base_link_flags) $(export_symbols_icu)
 libharfbuzz_icu_la_LIBADD = $(ICU_LIBS) libharfbuzz.la
 EXTRA_libharfbuzz_icu_la_DEPENDENCIES = $(harfbuzz_icu_def_dependency)
commit c7d7c9898e22905888dc4304f6d8e79b55654174
Author: Behdad Esfahbod 
Date:   Tue Feb 13 14:00:14 2018 -0800

[aat] Minor

diff --git a/src/hb-aat-layout-morx-table.hh b/src/hb-aat-layout-morx-table.hh
index 6bd0267c..4cc28242 100644
--- a/src/hb-aat-layout-morx-table.hh
+++ b/src/hb-aat-layout-morx-table.hh
@@ -171,7 +171,7 @@ struct RearrangementSubtable
   }
 
   protected:
-  StateTable machine;
+  StateTablemachine;
   public:
   DEFINE_SIZE_STATIC (16);
 };
commit 2dbfeecf96c6993d42594f43133d945d67ddbdbc
Author: Behdad Esfahbod 
Date:   Tue Feb 13 13:59:39 2018 -0800

Minor

diff --git a/src/hb-aat-layout-morx-table.hh b/src/hb-aat-layout-morx-table.hh
index 2bb80891..6bd0267c 100644
--- a/src/hb-aat-layout-morx-table.hh
+++ b/src/hb-aat-layout-morx-table.hh
@@ -40,6 +40,8 @@ using namespace OT;
 
 struct RearrangementSubtable
 {
+  typedef void EntryData;
+
   struct driver_context_t
   {
 static const bool in_place = true;
@@ -60,13 +62,13 @@ struct RearrangementSubtable
ret (false),
start (0), end (0) {}
 
-inline bool is_actionable (StateTableDriver *driver,
-  const Entry *entry)
+inline bool is_actionable (StateTableDriver *driver,
+  const Entry *entry)
 {
   return (entry->flags & Verb) && start < end;
 }
-inline bool transition (StateTableDriver *driver,
-   const Entry *entry)
+inline bool transition (StateTableDriver *driver,
+   const Entry *entry)
 {
   hb_buffer_t *buffer = driver->buffer;
   unsigned int flags = entry->flags;
___
HarfBuzz mailing list
HarfBuzz@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/harfbuzz


[HarfBuzz] harfbuzz: Branch 'master'

2018-02-13 Thread Behdad Esfahbod
 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 
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_nil);
 }
 
diff --git a/src/hb-subset-input.cc b/src/hb-subset-input.cc
new file mode 100644
index ..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();
+
+  /* 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

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

2018-02-13 Thread Behdad Esfahbod
 .travis.yml |1 +
 src/Makefile.am |3 ++-
 2 files changed, 3 insertions(+), 1 deletion(-)

New commits:
commit 28e63a1287fd38a98eed6725c2f4d0820066b0d8
Author: Behdad Esfahbod 
Date:   Tue Feb 13 13:39:50 2018 -0800

Disable threadsafe static's for all libraries

Even in libharfbuzz-subset, we still will handle our own threadsafety
for statics.

diff --git a/src/Makefile.am b/src/Makefile.am
index 49d6640f..c4f1069a 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -35,7 +35,8 @@ HBNOLIBCXXCFLAGS =
 else
 # Make sure we don't link to libstdc++
 # No threadsafe statics in C++ as we do it ourselves
-HBNOLIBCXXFLAGS = -fno-rtti -fno-exceptions -fno-threadsafe-statics
+HBNOLIBCXXFLAGS = -fno-rtti -fno-exceptions
+HBCFLAGS += -fno-threadsafe-statics
 endif
 
 if HAVE_OT
commit 7caddb51b1e69a2803f86756e2ce2acff685c7d0
Author: Ebrahim Byagowi 
Date:   Tue Feb 13 15:12:43 2018 +0330

Specify the project name for coverity, trying to fix #785

diff --git a/.travis.yml b/.travis.yml
index e2de5038..fa9e5bc6 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -13,6 +13,7 @@ env:
 - NOCONFIGURE=1
 # COVERITY_SCAN_TOKEN
 - secure: 
"MRJtVu/fQoWNwMAamvIJBCX/1SMvEuEUk/ljAif/y2/3syyWgxFGp17UGnDILdoZYyCqTM+jQciY2P0nVqbjjOAUlML4QOAalqw8kPp8iTsnHUe+KOMVrOVP6p6qAQxk1im1O41cCMkmVKvk+NXe/on5euz6LGF2laHZaOAMoes="
+- PROJECT_NAME="behdad/harfbuzz" # the project name on coverity
 
 matrix:
   include:
___
HarfBuzz mailing list
HarfBuzz@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/harfbuzz