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

Behdad Esfahbod behdad at kemper.freedesktop.org
Thu Aug 4 19:38:47 PDT 2011


 TODO                             |    2 
 configure.ac                     |    9 ++
 src/Makefile.am                  |   14 ++--
 src/hb-buffer-private.hh         |    1 
 src/hb-buffer.cc                 |   35 ++++++++++
 src/hb-buffer.h                  |    3 
 src/hb-fallback-shape-private.hh |   48 +++++++++++++
 src/hb-fallback-shape.cc         |   43 ++++++++++++
 src/hb-ot-shape.cc               |    9 ++
 src/hb-ot-shape.h                |    5 -
 src/hb-shape.cc                  |  135 +++++++++++++++++++++++----------------
 src/hb-shape.h                   |   13 ++-
 src/hb-uniscribe-shape.cc        |   52 ++++++---------
 src/hb-uniscribe.h               |    5 -
 src/hb-view.cc                   |    2 
 src/test.cc                      |   37 +++++++++-
 test/test-shape.c                |    2 
 17 files changed, 306 insertions(+), 109 deletions(-)

New commits:
commit 02aeca985b570763342c35e99af90025bfa088d5
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Thu Aug 4 22:31:05 2011 -0400

    [API] Changes to main shape API
    
    hb_shape() now accepts a shaper_options and a shaper_list argument.
    Both can be set to NULL to emulate previous API.  And in most situations
    they are expected to be set to NULL.
    
    hb_shape() also returns a boolean for now.  If shaper_list is NULL, the
    return value can be ignored.
    
    shaper_options is ignored for now, but otherwise it should be a
    NULL-terminated list of strings.
    
    shaper_list is a NULL-terminated list of strings.  Currently recognized
    strings are "ot" for native OpenType Layout implementation, "uniscribe"
    for the Uniscribe backend, and "fallback" for the non-complex backend
    (that will be implemented shortly).  The fallback backend never fails.
    
    The env var HB_SHAPER_LIST is also parsed and honored.  It's a
    colon-separated list of shaper names.  The fallback shaper is invoked if
    none of the env-listed shapers succeed.
    
    New API hb_buffer_guess_properties() added.

diff --git a/TODO b/TODO
index ef8f413..577843f 100644
--- a/TODO
+++ b/TODO
@@ -23,8 +23,6 @@ API issues to fix before 1.0:
 
 - Add sanitize API (and a cached version, that saves result on blob user-data)
 
-- hb_shape() currently does a bit more than hb_ot_shape().  Shouldn't.
-
 - Add glib GBoxedType stuff and introspection
 
 
diff --git a/configure.ac b/configure.ac
index 3a6e528..3f13c43 100644
--- a/configure.ac
+++ b/configure.ac
@@ -138,12 +138,21 @@ AM_CONDITIONAL(HAVE_FREETYPE, $have_freetype)
 
 dnl ===========================================================================
 
+have_ot=true;
+if $have_ot; then
+	AC_DEFINE(HAVE_OT, 1, [Have native OpenType Layout backend])
+fi
+AM_CONDITIONAL(HAVE_OT, $have_ot)
+
+dnl ===========================================================================
+
 AC_CHECK_HEADERS(usp10.h windows.h, have_uniscribe=true, have_uniscribe=false)
 if $have_uniscribe; then
 	UNISCRIBE_CFLAGS=
 	UNISCRIBE_LIBS="-lusp10 -lgdi32"
 	AC_SUBST(UNISCRIBE_CFLAGS)
 	AC_SUBST(UNISCRIBE_LIBS)
+	AC_DEFINE(HAVE_UNISCRIBE, 1, [Have Uniscribe backend])
 fi
 AM_CONDITIONAL(HAVE_UNISCRIBE, $have_uniscribe)
 
diff --git a/src/Makefile.am b/src/Makefile.am
index c4f35e9..ff5a6d2 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -18,6 +18,8 @@ HBSOURCES =  \
 	hb-buffer-private.hh \
 	hb-buffer.cc \
 	hb-common.cc \
+	hb-fallback-shape-private.hh \
+	hb-fallback-shape.cc \
 	hb-font-private.hh \
 	hb-font.cc \
 	hb-mutex-private.hh \
@@ -30,6 +32,7 @@ HBSOURCES =  \
 	hb-shape.cc \
 	hb-unicode-private.hh \
 	hb-unicode.cc \
+	hb-ot-tag.cc \
 	$(NULL)
 HBHEADERS = \
 	hb.h \
@@ -42,6 +45,11 @@ HBHEADERS = \
 	hb-version.h \
 	$(NULL)
 
+MAINTAINERCLEANFILES += \
+	$(srcdir)/hb-version.h \
+	$(NULL)
+
+if HAVE_OT
 HBSOURCES += \
 	hb-ot-layout.cc \
 	hb-ot-layout-common-private.hh \
@@ -62,7 +70,6 @@ HBSOURCES += \
 	hb-ot-shape-complex-private.hh \
 	hb-ot-shape-normalize.cc \
 	hb-ot-shape-private.hh \
-	hb-ot-tag.cc \
 	$(NULL)
 HBHEADERS += \
 	hb-ot.h \
@@ -70,10 +77,7 @@ HBHEADERS += \
 	hb-ot-shape.h \
 	hb-ot-tag.h \
 	$(NULL)
-
-MAINTAINERCLEANFILES += \
-	$(srcdir)/hb-version.h \
-	$(NULL)
+endif
 
 if HAVE_GLIB
 HBCFLAGS += $(GLIB_CFLAGS)
diff --git a/src/hb-buffer-private.hh b/src/hb-buffer-private.hh
index 1a4a423..f3f3ab0 100644
--- a/src/hb-buffer-private.hh
+++ b/src/hb-buffer-private.hh
@@ -94,6 +94,7 @@ struct _hb_buffer_t {
   HB_INTERNAL void reverse_range (unsigned int start, unsigned int end);
   HB_INTERNAL void reverse (void);
   HB_INTERNAL void reverse_clusters (void);
+  HB_INTERNAL void guess_properties (void);
 
   HB_INTERNAL void swap_buffers (void);
   HB_INTERNAL void clear_output (void);
diff --git a/src/hb-buffer.cc b/src/hb-buffer.cc
index 749330b..e19e7dd 100644
--- a/src/hb-buffer.cc
+++ b/src/hb-buffer.cc
@@ -402,6 +402,35 @@ hb_buffer_t::reverse_clusters (void)
   reverse_range (start, i);
 }
 
+void
+hb_buffer_t::guess_properties (void)
+{
+  /* If script is set to INVALID, guess from buffer contents */
+  if (props.script == HB_SCRIPT_INVALID) {
+    for (unsigned int i = 0; i < len; i++) {
+      hb_script_t script = hb_unicode_script (unicode, info[i].codepoint);
+      if (likely (script != HB_SCRIPT_COMMON &&
+		  script != HB_SCRIPT_INHERITED &&
+		  script != HB_SCRIPT_UNKNOWN)) {
+        props.script = script;
+        break;
+      }
+    }
+  }
+
+  /* If direction is set to INVALID, guess from script */
+  if (props.direction == HB_DIRECTION_INVALID) {
+    props.direction = hb_script_get_horizontal_direction (props.script);
+  }
+
+  /* If language is not set, use default language from locale */
+  if (props.language == HB_LANGUAGE_INVALID) {
+    /* TODO get_default_for_script? using $LANGUAGE */
+    props.language = hb_language_get_default ();
+  }
+}
+
+
 static inline void
 dump_var_allocation (const hb_buffer_t *buffer)
 {
@@ -675,6 +704,12 @@ hb_buffer_reverse_clusters (hb_buffer_t *buffer)
   buffer->reverse_clusters ();
 }
 
+void
+hb_buffer_guess_properties (hb_buffer_t *buffer)
+{
+  buffer->guess_properties ();
+}
+
 #define ADD_UTF(T) \
 	HB_STMT_START { \
 	  const T *next = (const T *) text + item_offset; \
diff --git a/src/hb-buffer.h b/src/hb-buffer.h
index 020a120..1c4a9a7 100644
--- a/src/hb-buffer.h
+++ b/src/hb-buffer.h
@@ -132,6 +132,9 @@ hb_buffer_reverse (hb_buffer_t *buffer);
 void
 hb_buffer_reverse_clusters (hb_buffer_t *buffer);
 
+void
+hb_buffer_guess_properties (hb_buffer_t *buffer);
+
 
 /* Filling the buffer in */
 
diff --git a/src/hb-fallback-shape-private.hh b/src/hb-fallback-shape-private.hh
new file mode 100644
index 0000000..40e9541
--- /dev/null
+++ b/src/hb-fallback-shape-private.hh
@@ -0,0 +1,48 @@
+/*
+ * Copyright © 2011  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
+ */
+
+#ifndef HB_FALLBACK_SHAPE_PRIVATE_HH
+#define HB_FALLBACK_SHAPE_PRIVATE_HH
+
+#include "hb-private.hh"
+
+#include "hb-shape.h"
+
+
+HB_BEGIN_DECLS
+
+
+HB_INTERNAL hb_bool_t
+hb_fallback_shape (hb_font_t          *font,
+		   hb_buffer_t        *buffer,
+		   const hb_feature_t *features,
+		   unsigned int        num_features,
+		   const char         *shaper_options);
+
+
+HB_END_DECLS
+
+#endif /* HB_FALLBACK_SHAPE_PRIVATE_HH */
diff --git a/src/hb-fallback-shape.cc b/src/hb-fallback-shape.cc
new file mode 100644
index 0000000..6c3200d
--- /dev/null
+++ b/src/hb-fallback-shape.cc
@@ -0,0 +1,43 @@
+/*
+ * Copyright © 2011  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-fallback-shape-private.hh"
+
+#include "hb-buffer-private.hh"
+
+hb_bool_t
+hb_fallback_shape (hb_font_t          *font,
+		   hb_buffer_t        *buffer,
+		   const hb_feature_t *features,
+		   unsigned int        num_features,
+		   const char         *shaper_options)
+{
+  buffer->guess_properties ();
+
+  return TRUE;
+}
+
+
diff --git a/src/hb-ot-shape.cc b/src/hb-ot-shape.cc
index 5f8b372..fc2fa41 100644
--- a/src/hb-ot-shape.cc
+++ b/src/hb-ot-shape.cc
@@ -428,16 +428,21 @@ hb_ot_shape_execute (hb_ot_shape_plan_t *plan,
   hb_ot_shape_execute_internal (&c);
 }
 
-void
+hb_bool_t
 hb_ot_shape (hb_font_t          *font,
 	     hb_buffer_t        *buffer,
 	     const hb_feature_t *features,
-	     unsigned int        num_features)
+	     unsigned int        num_features,
+	     const char         *shaper_options)
 {
   hb_ot_shape_plan_t plan;
 
+  buffer->guess_properties ();
+
   hb_ot_shape_plan_internal (&plan, font->face, &buffer->props, features, num_features);
   hb_ot_shape_execute (&plan, font, buffer, features, num_features);
+
+  return TRUE;
 }
 
 
diff --git a/src/hb-ot-shape.h b/src/hb-ot-shape.h
index f9560e5..0fa3f36 100644
--- a/src/hb-ot-shape.h
+++ b/src/hb-ot-shape.h
@@ -34,11 +34,12 @@
 HB_BEGIN_DECLS
 
 
-void
+hb_bool_t
 hb_ot_shape (hb_font_t          *font,
 	     hb_buffer_t        *buffer,
 	     const hb_feature_t *features,
-	     unsigned int        num_features);
+	     unsigned int        num_features,
+	     const char         *shaper_options);
 
 
 HB_END_DECLS
diff --git a/src/hb-shape.cc b/src/hb-shape.cc
index 1b802d6..9ebbd81 100644
--- a/src/hb-shape.cc
+++ b/src/hb-shape.cc
@@ -30,62 +30,89 @@
 
 #include "hb-buffer-private.hh"
 
-#include "hb-ot-shape.h"
-
-#ifdef HAVE_GRAPHITE
-#include "hb-graphite.h"
+#ifdef HAVE_UNISCRIBE
+# include "hb-uniscribe.h"
 #endif
-
-
-
-static void
-hb_shape_internal (hb_font_t          *font,
-		   hb_buffer_t        *buffer,
-		   const hb_feature_t *features,
-		   unsigned int        num_features)
-{
-  hb_ot_shape (font, buffer, features, num_features);
-}
-
-void
-hb_shape (hb_font_t          *font,
-	  hb_buffer_t        *buffer,
-	  const hb_feature_t *features,
-	  unsigned int        num_features)
+#ifdef HAVE_OT
+# include "hb-ot-shape.h"
+#endif
+#include "hb-fallback-shape-private.hh"
+
+typedef hb_bool_t (*hb_shape_func_t) (hb_font_t          *font,
+				      hb_buffer_t        *buffer,
+				      const hb_feature_t *features,
+				      unsigned int        num_features,
+				      const char         *shaper_options);
+
+#define HB_SHAPER_IMPLEMENT(name) {#name, hb_##name##_shape}
+static const struct hb_shaper_pair_t {
+  const char name[16];
+  hb_shape_func_t func;
+} shapers[] = {
+  /* v--- Add new shapers in the right place here */
+#ifdef HAVE_UNISCRIBE
+  HB_SHAPER_IMPLEMENT (uniscribe),
+#endif
+#ifdef HAVE_OT
+  HB_SHAPER_IMPLEMENT (ot),
+#endif
+  HB_SHAPER_IMPLEMENT (fallback) /* should be last */
+};
+#undef HB_SHAPER_IMPLEMENT
+
+static class static_shaper_list_t {
+  public:
+  static_shaper_list_t (void) {
+    char *env = getenv ("HB_SHAPER_LIST");
+    shaper_list = NULL;
+    if (!env || !*env)
+      return;
+    unsigned int count = 3; /* initial, fallback, null */
+    for (const char *p = env; (p == strchr (p, ':')) && p++; )
+      count++;
+    if (count <= ARRAY_LENGTH (static_shaper_list))
+      shaper_list = static_shaper_list;
+    else
+      shaper_list = (const char **) malloc (count * sizeof (shaper_list[0]));
+
+    count = 0;
+    shaper_list[count++] = env;
+    for (char *p = env; (p == strchr (p, ':')) && (*p = '\0', TRUE) && p++; )
+      shaper_list[count++] = p;
+    shaper_list[count++] = "fallback";
+    shaper_list[count] = NULL;
+  }
+  const char **shaper_list;
+  const char *static_shaper_list[10];
+} env_shaper_list;
+
+hb_bool_t
+hb_shape (hb_font_t           *font,
+	  hb_buffer_t         *buffer,
+	  const hb_feature_t  *features,
+	  unsigned int         num_features,
+	  const char          *shaper_options,
+	  const char         **shaper_list)
 {
-  hb_segment_properties_t orig_props;
-
-  orig_props = buffer->props;
-
-  /* If script is set to INVALID, guess from buffer contents */
-  if (buffer->props.script == HB_SCRIPT_INVALID) {
-    hb_unicode_funcs_t *unicode = buffer->unicode;
-    unsigned int count = buffer->len;
-    for (unsigned int i = 0; i < count; i++) {
-      hb_script_t script = hb_unicode_script (unicode, buffer->info[i].codepoint);
-      if (likely (script != HB_SCRIPT_COMMON &&
-		  script != HB_SCRIPT_INHERITED &&
-		  script != HB_SCRIPT_UNKNOWN)) {
-        buffer->props.script = script;
-        break;
-      }
+  if (likely (!shaper_list))
+    shaper_list = env_shaper_list.shaper_list;
+
+  if (likely (!shaper_list)) {
+    for (unsigned int i = 0; i < ARRAY_LENGTH (shapers); i++)
+      if (likely (shapers[i].func (font, buffer,
+				   features, num_features,
+				   shaper_options)))
+        return TRUE;
+  } else {
+    while (*shaper_list) {
+      for (unsigned int i = 0; i < ARRAY_LENGTH (shapers); i++)
+	if (0 == strcmp (*shaper_list, shapers[i].name) &&
+	    likely (shapers[i].func (font, buffer,
+				     features, num_features,
+				     shaper_options)))
+	  return TRUE;
+      shaper_list++;
     }
   }
-
-  /* If direction is set to INVALID, guess from script */
-  if (buffer->props.direction == HB_DIRECTION_INVALID) {
-    buffer->props.direction = hb_script_get_horizontal_direction (buffer->props.script);
-  }
-
-  /* If language is not set, use default language from locale */
-  if (buffer->props.language == HB_LANGUAGE_INVALID) {
-    /* TODO get_default_for_script? using $LANGUAGE */
-    buffer->props.language = hb_language_get_default ();
-  }
-
-  hb_shape_internal (font, buffer, features, num_features);
-
-  buffer->props = orig_props;
+  return FALSE;
 }
-
-
diff --git a/src/hb-shape.h b/src/hb-shape.h
index 39383af..b2193f7 100644
--- a/src/hb-shape.h
+++ b/src/hb-shape.h
@@ -41,11 +41,14 @@ typedef struct _hb_feature_t {
   unsigned int  end;
 } hb_feature_t;
 
-void
-hb_shape (hb_font_t          *font,
-	  hb_buffer_t        *buffer,
-	  const hb_feature_t *features,
-	  unsigned int        num_features);
+
+hb_bool_t
+hb_shape (hb_font_t           *font,
+	  hb_buffer_t         *buffer,
+	  const hb_feature_t  *features,
+	  unsigned int         num_features,
+	  const char          *shaper_options,
+	  const char         **shaper_list);
 
 
 HB_END_DECLS
diff --git a/src/hb-uniscribe-shape.cc b/src/hb-uniscribe-shape.cc
index 3d5b1d5..6c93f3b 100644
--- a/src/hb-uniscribe-shape.cc
+++ b/src/hb-uniscribe-shape.cc
@@ -57,13 +57,6 @@ DWORD GetFontData(
 */
 
 static void
-fallback_shape (hb_font_t   *font,
-		hb_buffer_t *buffer)
-{
-  DEBUG_MSG (UNISCRIBE, NULL, "Fallback shaper invoked");
-}
-
-static void
 populate_log_font (LOGFONTW  *lf,
 		   HDC        hdc,
 		   hb_font_t *font,
@@ -78,18 +71,19 @@ populate_log_font (LOGFONTW  *lf,
     lf->lfFaceName[i] = family_name[i];
 }
 
-void
+hb_bool_t
 hb_uniscribe_shape (hb_font_t          *font,
 		    hb_buffer_t        *buffer,
 		    const hb_feature_t *features,
-		    unsigned int        num_features)
+		    unsigned int        num_features,
+		    const char         *shaper_options)
 {
+  buffer->guess_properties ();
+
   HRESULT hr;
 
-  if (unlikely (!buffer->len)) {
-  fallback:
-    fallback_shape (font, buffer);
-  }
+  if (unlikely (!buffer->len))
+    return TRUE;
 
 retry:
 
@@ -138,10 +132,10 @@ retry:
   ALLOCATE_ARRAY (uint32_t, vis_clusters, glyphs_size);
 
 
-#define FALLBACK(...) \
+#define FAIL(...) \
   HB_STMT_START { \
     DEBUG_MSG (UNISCRIBE, NULL, __VA_ARGS__); \
-    goto fallback; \
+    return FALSE; \
   } HB_STMT_END;
 
 
@@ -164,7 +158,7 @@ retry:
 			      script_tags,
 			      &item_count);
   if (unlikely (FAILED (hr)))
-    FALLBACK ("ScriptItemizeOpenType() failed: %d", hr);
+    FAIL ("ScriptItemizeOpenType() failed: %d", hr);
 
 #undef MAX_ITEMS
 
@@ -178,17 +172,13 @@ retry:
   hb_blob_t *blob = hb_face_get_blob (font->face);
   unsigned int blob_length;
   const char *blob_data = hb_blob_get_data (blob, &blob_length);
-  if (unlikely (!blob_length)) {
-    hb_blob_destroy (blob);
-    FALLBACK ("Empty font blob");
-  }
+  if (unlikely (!blob_length))
+    FAIL ("Empty font blob");
 
   DWORD num_fonts_installed;
   HANDLE fh = AddFontMemResourceEx ((void *) blob_data, blob_length, 0, &num_fonts_installed);
-  if (unlikely (!fh)) {
-    hb_blob_destroy (blob);
-    FALLBACK ("AddFontMemResourceEx() failed");
-  }
+  if (unlikely (!fh))
+    FAIL ("AddFontMemResourceEx() failed");
 
   /* FREE stuff, specially when taking fallback... */
 
@@ -230,16 +220,16 @@ retry:
 				(int *) &glyphs_len);
 
       if (unlikely (items[i].a.fNoGlyphIndex))
-	FALLBACK ("ScriptShapeOpenType() set fNoGlyphIndex");
+	FAIL ("ScriptShapeOpenType() set fNoGlyphIndex");
       if (unlikely (hr == E_OUTOFMEMORY))
       {
         buffer->ensure (buffer->allocated * 2);
 	if (buffer->in_error)
-	  FALLBACK ("Buffer resize failed");
+	  FAIL ("Buffer resize failed");
 	goto retry;
       }
       if (unlikely (FAILED (hr)))
-	FALLBACK ("ScriptShapeOpenType() failed: %d", hr);
+	FAIL ("ScriptShapeOpenType() failed: %d", hr);
 
       hr = ScriptPlaceOpenType (hdc,
 				&script_cache,
@@ -261,7 +251,7 @@ retry:
 				offsets + glyphs_offset,
 				NULL);
       if (unlikely (FAILED (hr)))
-	FALLBACK ("ScriptPlaceOpenType() failed: %d", hr);
+	FAIL ("ScriptPlaceOpenType() failed: %d", hr);
 
       glyphs_offset += glyphs_len;
   }
@@ -285,9 +275,9 @@ retry:
 
   buffer->ensure (glyphs_len);
   if (buffer->in_error)
-    FALLBACK ("Buffer in error");
+    FAIL ("Buffer in error");
 
-#undef FALLBACK
+#undef FAIL
 
   /* Set glyph infos */
   for (unsigned int i = 0; i < glyphs_len; i++)
@@ -317,7 +307,7 @@ retry:
   }
 
   /* Wow, done! */
-  return;
+  return TRUE;
 }
 
 
diff --git a/src/hb-uniscribe.h b/src/hb-uniscribe.h
index d498f97..aa893bd 100644
--- a/src/hb-uniscribe.h
+++ b/src/hb-uniscribe.h
@@ -34,11 +34,12 @@
 HB_BEGIN_DECLS
 
 
-void
+hb_bool_t
 hb_uniscribe_shape (hb_font_t          *font,
 		    hb_buffer_t        *buffer,
 		    const hb_feature_t *features,
-		    unsigned int        num_features);
+		    unsigned int        num_features,
+		    const char         *shaper_options);
 
 
 HB_END_DECLS
diff --git a/src/hb-view.cc b/src/hb-view.cc
index dc3fc47..67070ef 100644
--- a/src/hb-view.cc
+++ b/src/hb-view.cc
@@ -370,7 +370,7 @@ _hb_cr_text_glyphs (cairo_t *cr,
     len = strlen (utf8);
   hb_buffer_add_utf8 (hb_buffer, utf8, len, 0, len);
 
-  hb_shape (hb_font, hb_buffer, features, num_features);
+  hb_shape (hb_font, hb_buffer, features, num_features, NULL, NULL);
 
   num_glyphs = hb_buffer_get_length (hb_buffer);
   hb_glyph = hb_buffer_get_glyph_infos (hb_buffer, NULL);
diff --git a/src/test.cc b/src/test.cc
index 54141bc..8679b33 100644
--- a/src/test.cc
+++ b/src/test.cc
@@ -30,7 +30,6 @@
 #endif
 
 #include "hb.h"
-#include "hb-uniscribe.h"
 
 #ifdef HAVE_GLIB
 #include <glib.h>
@@ -97,7 +96,7 @@ main (int argc, char **argv)
 
   hb_buffer_add_utf8 (buffer, "test", 4, 0, 4);
 
-  hb_uniscribe_shape (font, buffer, NULL, 0);
+  hb_shape (font, buffer, NULL, 0, NULL, NULL);
 
   unsigned int count = hb_buffer_get_length (buffer);
   hb_glyph_info_t *infos = hb_buffer_get_glyph_infos (buffer, NULL);
diff --git a/test/test-shape.c b/test/test-shape.c
index 5a41f0c..a8b7f1d 100644
--- a/test/test-shape.c
+++ b/test/test-shape.c
@@ -110,7 +110,7 @@ test_shape (void)
   hb_buffer_set_direction (buffer, HB_DIRECTION_LTR);
   hb_buffer_add_utf8 (buffer, TesT, 4, 0, 4);
 
-  hb_shape (font, buffer, NULL, 0);
+  hb_shape (font, buffer, NULL, 0, NULL, NULL);
 
   len = hb_buffer_get_length (buffer);
   glyphs = hb_buffer_get_glyph_infos (buffer, NULL);
commit 57692adf1294a6db4627d0de7c671e4aa01d2a8f
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Thu Aug 4 20:49:16 2011 -0400

    Make test.cc do something more useful
    
    Hardcoded to the uniscribe backend for now.  Will fix soon.

diff --git a/src/test.cc b/src/test.cc
index b3e6929..54141bc 100644
--- a/src/test.cc
+++ b/src/test.cc
@@ -30,6 +30,7 @@
 #endif
 
 #include "hb.h"
+#include "hb-uniscribe.h"
 
 #ifdef HAVE_GLIB
 #include <glib.h>
@@ -43,7 +44,6 @@ int
 main (int argc, char **argv)
 {
   hb_blob_t *blob = NULL;
-  hb_face_t *face = NULL;
 
   if (argc != 2) {
     fprintf (stderr, "usage: %s font-file.ttf\n", argv[0]);
@@ -85,12 +85,42 @@ main (int argc, char **argv)
   printf ("Opened font file %s: %u bytes long\n", argv[1], hb_blob_get_length (blob));
 
   /* Create the face */
-  face = hb_face_create (blob, 0 /* first face */);
+  hb_face_t *face = hb_face_create (blob, 0 /* first face */);
+  hb_blob_destroy (blob);
+  blob = NULL;
+  unsigned int upem = hb_face_get_upem (face);
+
+  hb_font_t *font = hb_font_create (face);
+  hb_font_set_scale (font, upem, upem);
+
+  hb_buffer_t *buffer = hb_buffer_create (0);
 
-  /* So, what now? */
+  hb_buffer_add_utf8 (buffer, "test", 4, 0, 4);
 
+  hb_uniscribe_shape (font, buffer, NULL, 0);
+
+  unsigned int count = hb_buffer_get_length (buffer);
+  hb_glyph_info_t *infos = hb_buffer_get_glyph_infos (buffer, NULL);
+  hb_glyph_position_t *positions = hb_buffer_get_glyph_positions (buffer, NULL);
+
+  for (unsigned int i = 0; i < count; i++)
+  {
+    hb_glyph_info_t *info = &infos[i];
+    hb_glyph_position_t *pos = &positions[i];
+
+    printf ("cluster %d	glyph %d at	(%d,%d)+(%d,%d)\n",
+	    info->cluster,
+	    info->codepoint,
+	    pos->x_offset,
+	    pos->x_offset,
+	    pos->x_advance,
+	    pos->y_advance);
+
+  }
+
+  hb_buffer_destroy (buffer);
+  hb_font_destroy (font);
   hb_face_destroy (face);
-  hb_blob_destroy (blob);
 
   return 0;
 }



More information about the HarfBuzz mailing list