Thanks for the commit, have been waiting for this one.

As for the first issue: there's only so much you can do to workaround broken fonts.

--
Tom.

On 02/09/12 03:40, Behdad Esfahbod wrote:
  src/hb-ot-shape.cc |   32 ++++++++++++++++++++++++++++++++
  1 file changed, 32 insertions(+)

New commits:
commit 6912e476dd92639c3ddf07ca51c8d4a262c8b3a5
Author: Behdad Esfahbod <[email protected]>
Date:   Sat Sep 1 20:38:45 2012 -0400

     [OT] Insert dotted-circle for run-initial marks

     Unfortunately if the font has GPOS and 'mark' feature does
     not position mark on dotted-circle, our inserted dotted-circle
     will not get the mark repositioned to itself.  Uniscribe cheats
     here.

     If there is no GPOS however, the fallback positioning kicks in
     and sorts this out.

     I'm not willing to address the first case.

diff --git a/src/hb-ot-shape.cc b/src/hb-ot-shape.cc
index 26b21ce..a19c8b2 100644
--- a/src/hb-ot-shape.cc
+++ b/src/hb-ot-shape.cc
@@ -235,6 +235,37 @@ hb_set_unicode_props (hb_buffer_t *buffer)
  }

  static void
+hb_insert_dotted_circle (hb_buffer_t *buffer, hb_font_t *font)
+{
+  /* TODO One day, when we keep _before_ text for the buffer, take
+   * that into consideration.  For now, insert dotted-circle if the
+   * very first character is a non-spacing mark. */
+  if (_hb_glyph_info_get_general_category (&buffer->info[0]) !=
+      HB_UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK)
+    return;
+
+  hb_codepoint_t dottedcircle_glyph;
+  if (!font->get_glyph (0x25CC, 0, &dottedcircle_glyph))
+    return;
+
+  hb_glyph_info_t dottedcircle;
+  dottedcircle.codepoint = 0x25CC;
+  _hb_glyph_info_set_unicode_props (&dottedcircle, buffer->unicode);
+
+  buffer->clear_output ();
+
+  buffer->idx = 0;
+  hb_glyph_info_t info = dottedcircle;
+  info.cluster = buffer->cur().cluster;
+  info.mask = buffer->cur().mask;
+  buffer->output_info (info);
+  while (buffer->idx < buffer->len)
+    buffer->next_glyph ();
+
+  buffer->swap_buffers ();
+}
+
+static void
  hb_form_clusters (hb_buffer_t *buffer)
  {
    unsigned int count = buffer->len;
@@ -526,6 +557,7 @@ hb_ot_shape_internal (hb_ot_shape_context_t *c)
    c->buffer->clear_output ();

    hb_set_unicode_props (c->buffer);
+  hb_insert_dotted_circle (c->buffer, c->font);
    hb_form_clusters (c->buffer);

    hb_ensure_native_direction (c->buffer);
_______________________________________________
HarfBuzz mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/harfbuzz


_______________________________________________
HarfBuzz mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/harfbuzz

Reply via email to