Vignesh Raman | 24 Jun 14:19 2015

Dotted circles in harfbuzz

Hi All,

I was checking a thai webpage which has a virtual keyboard,

When I open this website in chrome, I do not see the dotted circles in
keyboard and
when top level thai characters are typed  nothing appears in text area.

Using a sample application (facybroswer) dotted circle is seen in the
keyboard and when the top level thai characters are typed, it is seen
in the text area along with dotted circle.

The Qt version used is Qt 4.7.4. I see the dotted circle was added in
harbuzz (harfbuzz old) bundled with Qt with the below patch,

From 44f415aafaf7eec56b31468a58e0ca768bbc082d Mon Sep 17 00:00:00 2001
From: Jiang Jiang <jiang.jiang <at>>
Date: Mon, 16 Jan 2012 15:39:56 +0100
Subject: [PATCH] Fix isolated Thai SARA AM handling

If I remove this patch the dotted circle is not seen. But when the
first level vocal is entered nothing
appears in the text area and the application crashes.

So my questions are,
1) Is this dotted circle a standard feature in harbuzz or any qt web browsers.
2) Is it possbile to make the behaviour similar to chrome? Dotted
circle hidden and no characters should be seen when top level thai
characters are pressed.
(Continue reading)

Behdad Esfahbod | 19 Jun 23:01 2015

A couple new APIs

Jonathan, others,

I just fixed a bug where cluster merging was not happening when we wanted to
hide default-ignorables and the font doesn't have a space glyph.  I'll make a
release for that on Monday.  Testing welcome.

Reminded me that I've wanted to add two new buffer properties…

A while back I added hb_buffer_[gs]et_replacement_codepoint(), which sets what
character value will be used when encountering errors during UTF-8/16/32 decoding.

I want to add two more buffer properties:

  - hb_buffer_[gs]et_invisible_glyph().  If set, we'd use this number instead
of using the space glyph, when hiding default-ignorables or otherwise deleting
a glyph.  If value is set to 0 (default), we do what we currently do.

  - hb_buffer_[gs]et_undefined_glyph().  We'd use this number to initialize
glyph before calling font_funcs->get_glyph(), so essentially, this becomes the
glyph number returned if a glyph is not found and the font funcs didn't
explicitly set *glyph to any number.  Default value of this is 0.  While a
custom font_funcs implementation can be used to do this, having this function
allows for faster font_funcs implementations by removing a layer of indirection.

Any comments on the functionality, naming, etc?


(Continue reading)

Behdad Esfahbod | 19 Jun 22:32 2015

harfbuzz: Branch 'master' - 3 commits

 src/hb-buffer-private.hh |   20 ++++++++++++++
 src/         |   36 ++++++++++++++++++++++++--
 src/       |   65 ++++++++++++++++++++++++++++-------------------
 test/api/test-shape.c    |   43 +++++++++++++++++++++++++++++++
 4 files changed, 136 insertions(+), 28 deletions(-)

New commits:
commit 5f13bbd9d4b0970851626e2ce3cf4ecb3cfde801
Author: Behdad Esfahbod <behdad <at>>
Date:   Fri Jun 19 13:31:49 2015 -0700

    When removing default-ignorables, merge clusters

    Fixes test-shape, and:

diff --git a/src/hb-buffer-private.hh b/src/hb-buffer-private.hh
index 6a33962..ced748f 100644
--- a/src/hb-buffer-private.hh
+++ b/src/hb-buffer-private.hh
 <at>  <at>  -192,6 +192,8  <at>  <at>  struct hb_buffer_t {
 				   unsigned int end);
   HB_INTERNAL void merge_out_clusters (unsigned int start,
 				       unsigned int end);
+  /* Merge clusters for deleting current glyph, and skip it. */
+  HB_INTERNAL void delete_glyph (void);

   /* Internal methods */
   HB_INTERNAL bool enlarge (unsigned int size);
diff --git a/src/ b/src/
(Continue reading)

Behdad Esfahbod | 18 Jun 20:15 2015

harfbuzz: Changes to 'refs/tags/0.9.41'

Tag '0.9.41' created by Behdad Esfahbod <behdad <at>> at 2015-06-18 19:15 -0700

Version: GnuPG v1


Changes since 0.9.40-69:
 0 files changed
HarfBuzz mailing list
HarfBuzz <at>
Behdad Esfahbod | 18 Jun 20:15 2015

harfbuzz: Branch 'master' - 2 commits

 NEWS             |   10 ++++++++++     |    2 +-
 util/ |   28 ++++++++++++++--------------
 3 files changed, 25 insertions(+), 15 deletions(-)

New commits:
commit a6446d44e6d04e1eeea994682e29f9cb6265f7f6
Author: Behdad Esfahbod <behdad <at>>
Date:   Thu Jun 18 11:14:56 2015 -0700


diff --git a/NEWS b/NEWS
index c4950e2..d985427 100644
--- a/NEWS
+++ b/NEWS
 <at>  <at>  -1,3 +1,13  <at>  <at> 
+Overview of changes leading to 0.9.41
+Thursday, June 18, 2015
+- Fix hb-coretext with trailing whitespace in right-to-left.
+- New API: hb_buffer_reverse_range().
+- Allow implementing atomic ops in config.h.
+- Fix hb_language_t in language bindings.
+- Misc fixes.
 Overview of changes leading to 0.9.40
 Friday, March 20, 2015
(Continue reading)

Martin Hosken | 16 Jun 08:45 2015

fixing graphite rtl integration

Dear Behdad,

The enclosed patch fixes rtl integration of graphite in hb-graphite2. It handles the cluster reversals,
etc. and has received a modicum of testing. The only differences I see between running text through
graphite and through graphite with hb is reordering of ltr text in an rtl run. But I think that difference is
correct in that hb doesn't expect to do bidi reordering and assumes things are reordered first or called as
sub runs with the correct direction.

Sorry it's a patch, but the outstanding PR sort of made a hiccup in terms of another PR. I can do the necessary
jiggery pokery if you would prefer that.

In code terms the patch only affects the code following the cluster analysis, which is unchanged. The first
hunk fixes a memory management problem which valgrind spotted. The second hunk is the core of the change.


diff --git a/src/ b/src/
index 6214403..6c2ea24 100644
--- a/src/
+++ b/src/
 <at>  <at>  -359,6 +359,7  <at>  <at>  _hb_graphite2_shape (hb_shape_plan_t    *shape_plan,
     return false;

+  buffer->ensure (glyph_count);     // since sizeof(pos) > sizeof(cluster)+sizeof(codepoint)
   scratch = buffer->get_scratch_buffer (&scratch_size);
   while ((DIV_CEIL (sizeof (hb_graphite2_cluster_t) * buffer->len, sizeof (*scratch)) +
 	  DIV_CEIL (sizeof (hb_codepoint_t) * glyph_count, sizeof (*scratch))) > scratch_size)
(Continue reading)

David M. Jones | 13 Jun 18:47 2015

Indic shaping: Tone Marks, Visargas, and insert_dotted_circles() Considered Harmful

Before I submit a formal bug report, can anyone comment on whether I'm
on the right track here?

Consider this output from hb-shape (edited slightly for readability):

    lt-hb-shape (HarfBuzz) 0.9.40
    Available shapers: ot,fallback

    [ {"g":"dTa",      "cl":0,"dx":0,"dy":0,"ax":573,"ay":0},
      {"g":"dUdatta",  "cl":0,"dx":0,"dy":0,"ax":0,"ay":0},
      {"g":"BASE",     "cl":0,"dx":0,"dy":0,"ax":724,"ay":0},
      {"g":"dVisarga", "cl":0,"dx":0,"dy":0,"ax":262,"ay":0} ]

BASE is the glyph name for U+25CC DOTTED CIRCLE in Murty Hindi [1],
but similar results obtain with other fonts.

Clearly, the dotted circle isn't wanted here.  As far as I can tell
from poking around in the source code, it's the result of two
interacting problems.

First, it looks like the Indic shaping module has a faulty model [2]
for analyzing Indic syllables -- at the very least, it doesn't
incorporate tone marks in Devanagari syllables correctly.  Rather than
treating the above sequence as a consonant_syllable, it's treating it
as a broken_cluster (I admit I don't quite follow the code, so I might
have the details wrong).  That, in turn, causes insert_dotted_circles()
to come into play.

(Continue reading)

Behdad Esfahbod | 13 Jun 02:46 2015

harfbuzz: Branch 'master'

 src/ |    2 +-
 src/ |    9 +++++++++
 2 files changed, 10 insertions(+), 1 deletion(-)

New commits:
commit 351f68f4e01a107f62e4eb3458d7c7ae379939fb
Author: Behdad Esfahbod <behdad <at>>
Date:   Fri Jun 12 17:46:06 2015 -0700

    [bindings] Fix hb_language_get_default() and hb_ot_tag_to_language()

    Part of

diff --git a/src/ b/src/
index 82b8320..21d3b41 100644
--- a/src/
+++ b/src/
 <at>  <at>  -334,7 +334,7  <at>  <at>  hb_language_to_string (hb_language_t language)
- * Return value: 
+ * Return value: (transfer none):
  * Since: 1.0
diff --git a/src/ b/src/
index 69d435e..61c38b1 100644
--- a/src/
+++ b/src/
(Continue reading)

Behdad Esfahbod | 13 Jun 02:37 2015

harfbuzz: Branch 'master'

 .travis.yml |   13 +++++++++++++
 1 file changed, 13 insertions(+)

New commits:
commit f0c80060763475aa34a18ecbef600b6811855cb6
Author: Behdad Esfahbod <behdad <at>>
Date:   Fri Jun 12 17:37:41 2015 -0700

    [TravisCI] Hook up Coverity

    First try...

diff --git a/.travis.yml b/.travis.yml
index 894b613..3f7378b 100644
--- a/.travis.yml
+++ b/.travis.yml
 <at>  <at>  -8,6 +8,9  <at>  <at>  env:
     - CFLAGS="-Werror --coverage"
     - CXXFLAGS="-Werror --coverage"
     - LDFLAGS="--coverage"
+    # The next declaration is the encrypted COVERITY_SCAN_TOKEN, created
+    #   via the "travis encrypt" command using the project repo's public key
+    - secure: "RoR4NtzEDTR8QKmLVuy2wN+YGXuq8VcgVvDuFJDdOdIbtX+kQStesJXDcf1y0G1T8Ripjn9JGXBd9eoUwNc8sJpxNwKZBkIPi42FuK6e/cZZRYlgUyi5df0fQJ8VSCDU7OoZJq3pAtTe8mQPeeuk5G7cKRSsJVt8e03K7PQcU6Y="
   - sudo apt-get install pkg-config ragel gtk-doc-tools # for
   - sudo apt-get install libfreetype6-dev # for font functions
 <at>  <at>  -24,3 +27,13  <at>  <at>  script:
   irc: ""
   email: harfbuzz <at>
(Continue reading)

Behdad Esfahbod | 13 Jun 02:29 2015

harfbuzz: Branch 'master'

 README |    1 +
 1 file changed, 1 insertion(+)

New commits:
commit 8ac446908ca75bea989414a0f551a6da8885bf52
Author: Behdad Esfahbod <behdad <at>>
Date:   Fri Jun 12 17:29:05 2015 -0700

    Add Coverity Scan badge

diff --git a/README b/README
index d34bc74..dea1068 100644
--- a/README
+++ b/README
 <at>  <at>  -1,5 +1,6  <at>  <at> 
 [![Build Status](](
 [![Coverage Status](](
+[![Coverity Scan](](

 This is HarfBuzz, a text shaping library.

HarfBuzz mailing list
HarfBuzz <at>
Simon Cozens | 11 Jun 09:14 2015

Problems with TTB Japanese

Hello! I am working on adding vertical typesetting support to SILE, and
have come across a couple of issues.

The first is that all characters with direction set to TTB seem to have
x_offset and y_offset positions set even when this does not make sense:

> a = "aあ"

>"font", { family = "MS Gothic", direction = "TTB" })
> SILE.shaper:shapeToken(a, SILE.font.loadDefaults({}))
    codepoint = 68,
    depth = -0.078125,
    height = 5.4296875,
    name = "",
    width = 5,
    x_offset = -2,
    y_offset = -8,
    codepoint = 2102,
    depth = 0.8984375,
    height = 8.0859375,
    name = "",
    width = 10,
    x_offset = -5,
    y_offset = -8,
(Continue reading)