Merge remote branch 'martin/master'
authorBehdad Esfahbod <behdad@behdad.org>
Mon, 24 May 2010 17:14:24 +0000 (18:14 +0100)
committerBehdad Esfahbod <behdad@behdad.org>
Mon, 24 May 2010 17:14:24 +0000 (18:14 +0100)
src/hb-font-private.hh
src/hb-font.cc
src/hb-ft.cc
src/hb-glib.c
src/hb-icu.c
src/hb-object-private.h
src/hb-ot-shape.cc
src/hb-unicode-private.h
src/hb-unicode.c

index a58701e..406e195 100644 (file)
@@ -44,10 +44,12 @@ struct _hb_font_funcs_t {
 
   hb_bool_t immutable;
 
-  hb_font_get_glyph_func_t             get_glyph;
-  hb_font_get_contour_point_func_t     get_contour_point;
-  hb_font_get_glyph_metrics_func_t     get_glyph_metrics;
-  hb_font_get_kerning_func_t           get_kerning;
+  struct {
+    hb_font_get_glyph_func_t           get_glyph;
+    hb_font_get_contour_point_func_t   get_contour_point;
+    hb_font_get_glyph_metrics_func_t   get_glyph_metrics;
+    hb_font_get_kerning_func_t         get_kerning;
+  } v;
 };
 
 extern HB_INTERNAL hb_font_funcs_t _hb_font_funcs_nil;
index a55deb3..34c2345 100644 (file)
@@ -75,13 +75,13 @@ hb_font_get_kerning_nil (hb_font_t *font HB_UNUSED,
 
 hb_font_funcs_t _hb_font_funcs_nil = {
   HB_REFERENCE_COUNT_INVALID, /* ref_count */
-
   TRUE,  /* immutable */
-
-  hb_font_get_glyph_nil,
-  hb_font_get_contour_point_nil,
-  hb_font_get_glyph_metrics_nil,
-  hb_font_get_kerning_nil
+  {
+    hb_font_get_glyph_nil,
+    hb_font_get_contour_point_nil,
+    hb_font_get_glyph_metrics_nil,
+    hb_font_get_kerning_nil
+  }
 };
 
 hb_font_funcs_t *
@@ -92,6 +92,8 @@ hb_font_funcs_create (void)
   if (!HB_OBJECT_DO_CREATE (hb_font_funcs_t, ffuncs))
     return &_hb_font_funcs_nil;
 
+  ffuncs->v = _hb_font_funcs_nil.v;
+
   return ffuncs;
 }
 
@@ -123,11 +125,7 @@ hb_font_funcs_copy (hb_font_funcs_t *other_ffuncs)
   if (!HB_OBJECT_DO_CREATE (hb_font_funcs_t, ffuncs))
     return &_hb_font_funcs_nil;
 
-  *ffuncs = *other_ffuncs;
-
-  /* re-init refcount */
-  HB_OBJECT_DO_INIT (ffuncs);
-  ffuncs->immutable = FALSE;
+  ffuncs->v = other_ffuncs->v;
 
   return ffuncs;
 }
@@ -149,7 +147,7 @@ hb_font_funcs_set_glyph_func (hb_font_funcs_t *ffuncs,
   if (ffuncs->immutable)
     return;
 
-  ffuncs->get_glyph = glyph_func ? glyph_func : hb_font_get_glyph_nil;
+  ffuncs->v.get_glyph = glyph_func ? glyph_func : hb_font_get_glyph_nil;
 }
 
 void
@@ -159,7 +157,7 @@ hb_font_funcs_set_contour_point_func (hb_font_funcs_t *ffuncs,
   if (ffuncs->immutable)
     return;
 
-  ffuncs->get_contour_point = contour_point_func ? contour_point_func : hb_font_get_contour_point_nil;
+  ffuncs->v.get_contour_point = contour_point_func ? contour_point_func : hb_font_get_contour_point_nil;
 }
 
 void
@@ -169,7 +167,7 @@ hb_font_funcs_set_glyph_metrics_func (hb_font_funcs_t *ffuncs,
   if (ffuncs->immutable)
     return;
 
-  ffuncs->get_glyph_metrics = glyph_metrics_func ? glyph_metrics_func : hb_font_get_glyph_metrics_nil;
+  ffuncs->v.get_glyph_metrics = glyph_metrics_func ? glyph_metrics_func : hb_font_get_glyph_metrics_nil;
 }
 
 void
@@ -179,7 +177,7 @@ hb_font_funcs_set_kerning_func (hb_font_funcs_t *ffuncs,
   if (ffuncs->immutable)
     return;
 
-  ffuncs->get_kerning = kerning_func ? kerning_func : hb_font_get_kerning_nil;
+  ffuncs->v.get_kerning = kerning_func ? kerning_func : hb_font_get_kerning_nil;
 }
 
 
@@ -187,8 +185,8 @@ hb_codepoint_t
 hb_font_get_glyph (hb_font_t *font, hb_face_t *face,
                   hb_codepoint_t unicode, hb_codepoint_t variation_selector)
 {
-  return font->klass->get_glyph (font, face, font->user_data,
-                                unicode, variation_selector);
+  return font->klass->v.get_glyph (font, face, font->user_data,
+                                  unicode, variation_selector);
 }
 
 hb_bool_t
@@ -197,9 +195,9 @@ hb_font_get_contour_point (hb_font_t *font, hb_face_t *face,
                           hb_codepoint_t glyph, hb_position_t *x, hb_position_t *y)
 {
   *x = 0; *y = 0;
-  return font->klass->get_contour_point (font, face, font->user_data,
-                                        point_index,
-                                        glyph, x, y);
+  return font->klass->v.get_contour_point (font, face, font->user_data,
+                                          point_index,
+                                          glyph, x, y);
 }
 
 void
@@ -207,16 +205,16 @@ hb_font_get_glyph_metrics (hb_font_t *font, hb_face_t *face,
                           hb_codepoint_t glyph, hb_glyph_metrics_t *metrics)
 {
   memset (metrics, 0, sizeof (*metrics));
-  return font->klass->get_glyph_metrics (font, face, font->user_data,
-                                        glyph, metrics);
+  return font->klass->v.get_glyph_metrics (font, face, font->user_data,
+                                          glyph, metrics);
 }
 
 hb_position_t
 hb_font_get_kerning (hb_font_t *font, hb_face_t *face,
                     hb_codepoint_t first_glyph, hb_codepoint_t second_glyph)
 {
-  return font->klass->get_kerning (font, face, font->user_data,
-                                  first_glyph, second_glyph);
+  return font->klass->v.get_kerning (font, face, font->user_data,
+                                    first_glyph, second_glyph);
 }
 
 
index 1360733..aee64f6 100644 (file)
@@ -128,13 +128,13 @@ hb_ft_get_kerning (hb_font_t *font HB_UNUSED,
 
 static hb_font_funcs_t ft_ffuncs = {
   HB_REFERENCE_COUNT_INVALID, /* ref_count */
-
   TRUE, /* immutable */
-
-  hb_ft_get_glyph,
-  hb_ft_get_contour_point,
-  hb_ft_get_glyph_metrics,
-  hb_ft_get_kerning
+  {
+    hb_ft_get_glyph,
+    hb_ft_get_contour_point,
+    hb_ft_get_glyph_metrics,
+    hb_ft_get_kerning
+  }
 };
 
 hb_font_funcs_t *
index f1497d9..d336c46 100644 (file)
@@ -41,14 +41,14 @@ static unsigned int hb_glib_get_eastasian_width (hb_codepoint_t unicode) { retur
 
 static hb_unicode_funcs_t glib_ufuncs = {
   HB_REFERENCE_COUNT_INVALID, /* ref_count */
-
   TRUE, /* immutable */
-
-  hb_glib_get_general_category,
-  hb_glib_get_combining_class,
-  hb_glib_get_mirroring,
-  hb_glib_get_script,
-  hb_glib_get_eastasian_width
+  {
+    hb_glib_get_general_category,
+    hb_glib_get_combining_class,
+    hb_glib_get_mirroring,
+    hb_glib_get_script,
+    hb_glib_get_eastasian_width
+  }
 };
 
 hb_unicode_funcs_t *
index 2d1ef85..dc97a54 100644 (file)
@@ -231,14 +231,14 @@ hb_icu_get_script (hb_codepoint_t unicode)
 
 static hb_unicode_funcs_t icu_ufuncs = {
   HB_REFERENCE_COUNT_INVALID, /* ref_count */
-
   TRUE, /* immutable */
-
-  hb_icu_get_general_category,
-  hb_icu_get_combining_class,
-  hb_icu_get_mirroring,
-  hb_icu_get_script,
-  hb_icu_get_eastasian_width
+  {
+    hb_icu_get_general_category,
+    hb_icu_get_combining_class,
+    hb_icu_get_mirroring,
+    hb_icu_get_script,
+    hb_icu_get_eastasian_width
+  }
 };
 
 hb_unicode_funcs_t *
index e99bfbe..4d6321a 100644 (file)
@@ -62,20 +62,19 @@ typedef struct {
 #define HB_DEBUG_OBJECT HB_DEBUG+0
 #endif
 
-static inline hb_bool_t /* always returns TRUE */
-_hb_object_debug_out (const void *obj,
-                     hb_reference_count_t *ref_count,
-                     const char *function)
+static inline void
+_hb_trace_object (const void *obj,
+                 hb_reference_count_t *ref_count,
+                 const char *function)
 {
   if (HB_DEBUG_OBJECT)
-    fprintf (stderr, "%p refcount=%d %s\n",
+    fprintf (stderr, "OBJECT(%p) refcount=%d %s\n",
             obj,
             HB_REFERENCE_COUNT_GET_VALUE (*ref_count),
             function);
-  return TRUE;
 }
 
-#define HB_OBJECT_DEBUG_OUT(obj) _hb_object_debug_out ((void *) obj, &obj->ref_count, __FUNCTION__)
+#define TRACE_OBJECT(obj) _hb_trace_object (obj, &obj->ref_count, __FUNCTION__)
 
 
 
@@ -96,8 +95,11 @@ _hb_object_debug_out (const void *obj,
   likely (( \
               (void) ( \
                 ((obj) = (Type *) calloc (1, sizeof (Type))) && \
-                HB_OBJECT_DO_INIT_EXPR (obj) && \
-                HB_OBJECT_DEBUG_OUT (obj) \
+                ( \
+                 HB_OBJECT_DO_INIT_EXPR (obj), \
+                 TRACE_OBJECT (obj), \
+                 TRUE \
+                ) \
               ), \
               (obj) \
             ))
@@ -107,7 +109,7 @@ _hb_object_debug_out (const void *obj,
     int old_count; \
     if (unlikely (!(obj) || HB_OBJECT_IS_INERT (obj))) \
       return obj; \
-    HB_OBJECT_DEBUG_OUT (obj); \
+    TRACE_OBJECT (obj); \
     old_count = hb_reference_count_inc (obj->ref_count); \
     assert (old_count > 0); \
     return obj; \
@@ -125,7 +127,7 @@ _hb_object_debug_out (const void *obj,
     int old_count; \
     if (unlikely (!(obj) || HB_OBJECT_IS_INERT (obj))) \
       return; \
-    HB_OBJECT_DEBUG_OUT (obj); \
+    TRACE_OBJECT (obj); \
     old_count = hb_reference_count_dec (obj->ref_count); \
     assert (old_count > 0); \
     if (old_count != 1) \
index ac453f4..727772a 100644 (file)
 
 #include "hb-ot-layout.h"
 
+/* XXX vertical */
 hb_tag_t default_features[] = {
-  /* GSUB */
+  HB_TAG('c','a','l','t'),
   HB_TAG('c','c','m','p'),
-  HB_TAG('l','o','c','l'),
-  HB_TAG('l','i','g','a'),
   HB_TAG('c','l','i','g'),
-  /* GPOS */
+  HB_TAG('c','s','w','h'),
+  HB_TAG('c','u','r','s'),
   HB_TAG('k','e','r','n'),
+  HB_TAG('l','i','g','a'),
+  HB_TAG('l','o','c','l'),
   HB_TAG('m','a','r','k'),
   HB_TAG('m','k','m','k'),
+  HB_TAG('r','l','i','g')
 };
 
 enum {
@@ -280,7 +283,7 @@ hb_form_clusters (hb_buffer_t *buffer)
 {
   unsigned int count = buffer->len;
   for (unsigned int i = 1; i < count; i++)
-    if (buffer->unicode->get_general_category (buffer->info[i].codepoint) == HB_CATEGORY_NON_SPACING_MARK)
+    if (buffer->unicode->v.get_general_category (buffer->info[i].codepoint) == HB_CATEGORY_NON_SPACING_MARK)
       buffer->info[i].cluster = buffer->info[i - 1].cluster;
 }
 
@@ -306,7 +309,7 @@ hb_ensure_native_direction (hb_buffer_t *buffer)
 static void
 hb_mirror_chars (hb_buffer_t *buffer)
 {
-  hb_unicode_get_mirroring_func_t get_mirroring = buffer->unicode->get_mirroring;
+  hb_unicode_get_mirroring_func_t get_mirroring = buffer->unicode->v.get_mirroring;
 
   if (HB_DIRECTION_IS_FORWARD (buffer->direction))
     return;
@@ -348,7 +351,6 @@ hb_substitute_default (hb_font_t    *font,
                       hb_feature_t *features HB_UNUSED,
                       unsigned int  num_features HB_UNUSED)
 {
-  hb_mirror_chars (buffer);
   hb_map_glyphs (font, face, buffer);
 }
 
@@ -442,12 +444,13 @@ hb_ot_shape (hb_font_t    *font,
 
   buffer->clear_masks ();
 
-  hb_substitute_default (font, face, buffer, features, num_features);
+  /* Mirroring needs to see the original direction */
+  hb_mirror_chars (buffer);
 
-  /* We do this after substitute_default because mirroring needs to
-   * see the original direction. */
   original_direction = hb_ensure_native_direction (buffer);
 
+  hb_substitute_default (font, face, buffer, features, num_features);
+
   substitute_fallback = !hb_ot_substitute_complex (font, face, buffer, features, num_features, original_direction);
 
   if (substitute_fallback)
index 01272da..9bb566e 100644 (file)
@@ -42,11 +42,13 @@ struct _hb_unicode_funcs_t {
 
   hb_bool_t immutable;
 
-  hb_unicode_get_general_category_func_t       get_general_category;
-  hb_unicode_get_combining_class_func_t                get_combining_class;
-  hb_unicode_get_mirroring_func_t              get_mirroring;
-  hb_unicode_get_script_func_t                 get_script;
-  hb_unicode_get_eastasian_width_func_t                get_eastasian_width;
+  struct {
+    hb_unicode_get_general_category_func_t     get_general_category;
+    hb_unicode_get_combining_class_func_t      get_combining_class;
+    hb_unicode_get_mirroring_func_t            get_mirroring;
+    hb_unicode_get_script_func_t               get_script;
+    hb_unicode_get_eastasian_width_func_t      get_eastasian_width;
+  } v;
 };
 
 extern HB_INTERNAL hb_unicode_funcs_t _hb_unicode_funcs_nil;
index 1813940..77efb67 100644 (file)
@@ -40,14 +40,14 @@ static unsigned int hb_unicode_get_eastasian_width_nil (hb_codepoint_t unicode H
 
 hb_unicode_funcs_t _hb_unicode_funcs_nil = {
   HB_REFERENCE_COUNT_INVALID, /* ref_count */
-
   TRUE, /* immutable */
-
-  hb_unicode_get_general_category_nil,
-  hb_unicode_get_combining_class_nil,
-  hb_unicode_get_mirroring_nil,
-  hb_unicode_get_script_nil,
-  hb_unicode_get_eastasian_width_nil
+  {
+    hb_unicode_get_general_category_nil,
+    hb_unicode_get_combining_class_nil,
+    hb_unicode_get_mirroring_nil,
+    hb_unicode_get_script_nil,
+    hb_unicode_get_eastasian_width_nil
+  }
 };
 
 hb_unicode_funcs_t *
@@ -58,8 +58,7 @@ hb_unicode_funcs_create (void)
   if (!HB_OBJECT_DO_CREATE (hb_unicode_funcs_t, ufuncs))
     return &_hb_unicode_funcs_nil;
 
-  *ufuncs = _hb_unicode_funcs_nil;
-  HB_OBJECT_DO_INIT (ufuncs);
+  ufuncs->v = _hb_unicode_funcs_nil.v;
 
   return ufuncs;
 }
@@ -92,9 +91,7 @@ hb_unicode_funcs_copy (hb_unicode_funcs_t *other_ufuncs)
   if (!HB_OBJECT_DO_CREATE (hb_unicode_funcs_t, ufuncs))
     return &_hb_unicode_funcs_nil;
 
-  *ufuncs = *other_ufuncs;
-  HB_OBJECT_DO_INIT (ufuncs);
-  ufuncs->immutable = FALSE;
+  ufuncs->v = other_ufuncs->v;
 
   return ufuncs;
 }
@@ -116,7 +113,7 @@ hb_unicode_funcs_set_mirroring_func (hb_unicode_funcs_t *ufuncs,
   if (ufuncs->immutable)
     return;
 
-  ufuncs->get_mirroring = mirroring_func ? mirroring_func : hb_unicode_get_mirroring_nil;
+  ufuncs->v.get_mirroring = mirroring_func ? mirroring_func : hb_unicode_get_mirroring_nil;
 }
 
 void
@@ -126,7 +123,7 @@ hb_unicode_funcs_set_general_category_func (hb_unicode_funcs_t *ufuncs,
   if (ufuncs->immutable)
     return;
 
-  ufuncs->get_general_category = general_category_func ? general_category_func : hb_unicode_get_general_category_nil;
+  ufuncs->v.get_general_category = general_category_func ? general_category_func : hb_unicode_get_general_category_nil;
 }
 
 void
@@ -136,7 +133,7 @@ hb_unicode_funcs_set_script_func (hb_unicode_funcs_t *ufuncs,
   if (ufuncs->immutable)
     return;
 
-  ufuncs->get_script = script_func ? script_func : hb_unicode_get_script_nil;
+  ufuncs->v.get_script = script_func ? script_func : hb_unicode_get_script_nil;
 }
 
 void
@@ -146,7 +143,7 @@ hb_unicode_funcs_set_combining_class_func (hb_unicode_funcs_t *ufuncs,
   if (ufuncs->immutable)
     return;
 
-  ufuncs->get_combining_class = combining_class_func ? combining_class_func : hb_unicode_get_combining_class_nil;
+  ufuncs->v.get_combining_class = combining_class_func ? combining_class_func : hb_unicode_get_combining_class_nil;
 }
 
 void
@@ -156,7 +153,7 @@ hb_unicode_funcs_set_eastasian_width_func (hb_unicode_funcs_t *ufuncs,
   if (ufuncs->immutable)
     return;
 
-  ufuncs->get_eastasian_width = eastasian_width_func ? eastasian_width_func : hb_unicode_get_eastasian_width_nil;
+  ufuncs->v.get_eastasian_width = eastasian_width_func ? eastasian_width_func : hb_unicode_get_eastasian_width_nil;
 }
 
 
@@ -164,35 +161,35 @@ hb_codepoint_t
 hb_unicode_get_mirroring (hb_unicode_funcs_t *ufuncs,
                          hb_codepoint_t unicode)
 {
-  return ufuncs->get_mirroring (unicode);
+  return ufuncs->v.get_mirroring (unicode);
 }
 
 hb_category_t
 hb_unicode_get_general_category (hb_unicode_funcs_t *ufuncs,
                                 hb_codepoint_t unicode)
 {
-  return ufuncs->get_general_category (unicode);
+  return ufuncs->v.get_general_category (unicode);
 }
 
 hb_script_t
 hb_unicode_get_script (hb_unicode_funcs_t *ufuncs,
                       hb_codepoint_t unicode)
 {
-  return ufuncs->get_script (unicode);
+  return ufuncs->v.get_script (unicode);
 }
 
 unsigned int
 hb_unicode_get_combining_class (hb_unicode_funcs_t *ufuncs,
                                hb_codepoint_t unicode)
 {
-  return ufuncs->get_combining_class (unicode);
+  return ufuncs->v.get_combining_class (unicode);
 }
 
 unsigned int
 hb_unicode_get_eastasian_width (hb_unicode_funcs_t *ufuncs,
                                hb_codepoint_t unicode)
 {
-  return ufuncs->get_eastasian_width (unicode);
+  return ufuncs->v.get_eastasian_width (unicode);
 }