Add hb_ot_complex_shaper_t stuff and start hooking Arabic shaper up
authorBehdad Esfahbod <behdad@behdad.org>
Tue, 12 Oct 2010 20:50:36 +0000 (16:50 -0400)
committerBehdad Esfahbod <behdad@behdad.org>
Tue, 12 Oct 2010 20:50:36 +0000 (16:50 -0400)
src/Makefile.am
src/hb-ot-map-private.hh
src/hb-ot-map.cc
src/hb-ot-shape-complex-arabic.cc [moved from src/hb-ot-shape-arabic.cc with 98% similarity]
src/hb-ot-shape-complex-private.hh [new file with mode: 0644]
src/hb-ot-shape-private.hh
src/hb-ot-shape.cc

index 4908876..a542ee7 100644 (file)
@@ -50,8 +50,9 @@ HBSOURCES += \
        hb-ot-map.cc \
        hb-ot-map-private.hh \
        hb-ot-shape.cc \
+       hb-ot-shape-complex-arabic.cc \
+       hb-ot-shape-complex-private.hh \
        hb-ot-shape-private.hh \
-       hb-ot-shape-arabic.cc \
        hb-ot-tag.c \
        $(NULL)
 HBHEADERS += \
index 0c05742..8e65f49 100644 (file)
@@ -96,7 +96,7 @@ struct hb_ot_map_t {
   { add_feature (tag, 1, global); }
 
   HB_INTERNAL void compile (hb_face_t *face,
-                           hb_segment_properties_t *props);
+                           const hb_segment_properties_t *props);
 
   hb_mask_t get_global_mask (void) const { return global_mask; }
 
index 2205624..ea11faf 100644 (file)
@@ -61,7 +61,7 @@ hb_ot_map_t::add_lookups (hb_face_t    *face,
 
 void
 hb_ot_map_t::compile (hb_face_t *face,
-                     hb_segment_properties_t *props)
+                     const hb_segment_properties_t *props)
 {
  global_mask = 0;
  lookup_count[0] = lookup_count[1] = 0;
similarity index 98%
rename from src/hb-ot-shape-arabic.cc
rename to src/hb-ot-shape-complex-arabic.cc
index fb5182b..5e6ce05 100644 (file)
@@ -669,6 +669,15 @@ static const struct arabic_state_table_entry {
 };
 
 
+
+void
+_hb_ot_shape_complex_collect_features_arabic   (hb_ot_shape_plan_t *plan, const hb_segment_properties_t  *props)
+{
+  unsigned int num_features = props->script == HB_SCRIPT_SYRIAC ? SYRIAC_NUM_FEATURES : COMMON_NUM_FEATURES;
+  for (unsigned int i = 0; i < num_features; i++)
+    plan->map.add_bool_feature (arabic_syriac_features[i], false);
+}
+
 void
 _hb_ot_analyze_complex_arabic (hb_ot_shape_context_t *c)
 {
diff --git a/src/hb-ot-shape-complex-private.hh b/src/hb-ot-shape-complex-private.hh
new file mode 100644 (file)
index 0000000..1c605bb
--- /dev/null
@@ -0,0 +1,88 @@
+/*
+ * Copyright (C) 2010  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_OT_SHAPE_COMPLEX_PRIVATE_HH
+#define HB_OT_SHAPE_COMPLEX_PRIVATE_HH
+
+#include "hb-private.h"
+
+#include "hb-ot-map-private.hh"
+
+HB_BEGIN_DECLS
+
+
+enum hb_ot_complex_shaper_t {
+  hb_ot_complex_shaper_none,
+  hb_ot_complex_shaper_arabic
+};
+
+
+struct hb_ot_shape_plan_t
+{
+  hb_ot_map_t map;
+  hb_ot_complex_shaper_t shaper;
+};
+
+
+static inline hb_ot_complex_shaper_t
+hb_ot_shape_complex_categorize (const hb_segment_properties_t *props)
+{
+  switch ((int) props->script) {
+    case HB_SCRIPT_ARABIC:
+    case HB_SCRIPT_NKO:
+    case HB_SCRIPT_SYRIAC:
+      return hb_ot_complex_shaper_arabic;
+
+    default:
+      return hb_ot_complex_shaper_none;
+  }
+}
+
+
+
+/*
+ * collect_features()
+ *
+ * Called during planning.  Shapers should call plan->map.add_feature().
+ */
+
+HB_INTERNAL void _hb_ot_shape_complex_collect_features_arabic  (hb_ot_shape_plan_t *plan, const hb_segment_properties_t  *props);
+
+static inline void
+hb_ot_shape_complex_collect_features (hb_ot_shape_plan_t *plan,
+                                     const hb_segment_properties_t  *props)
+{
+  switch (plan->shaper) {
+    case hb_ot_complex_shaper_arabic:  _hb_ot_shape_complex_collect_features_arabic (plan, props);     return;
+    case hb_ot_complex_shaper_none:    default:                                                        return;
+  }
+}
+
+
+
+HB_END_DECLS
+
+#endif /* HB_OT_SHAPE_COMPLEX_PRIVATE_HH */
index de1cb3b..aea52af 100644 (file)
 
 #include "hb-ot-shape.h"
 
+#include "hb-ot-shape-complex-private.hh"
 #include "hb-ot-map-private.hh"
 
 HB_BEGIN_DECLS
 
-enum hb_ot_complex_shaper_t {
-  hb_ot_complex_shaper_none,
-  hb_ot_complex_shaper_arabic
-};
-
-struct hb_ot_shape_plan_t
-{
-  hb_ot_map_t map;
-  hb_ot_complex_shaper_t shaper;
-};
-
 struct hb_ot_shape_context_t
 {
   /* Input to hb_ot_shape() */
index 061c203..b6acb22 100644 (file)
@@ -48,7 +48,7 @@ hb_tag_t default_features[] = {
 
 static void
 hb_ot_shape_collect_features (hb_ot_shape_plan_t       *plan,
-                             hb_segment_properties_t  *props,
+                             const hb_segment_properties_t  *props,
                              const hb_feature_t       *user_features,
                              unsigned int              num_user_features)
 {
@@ -70,7 +70,7 @@ hb_ot_shape_collect_features (hb_ot_shape_plan_t       *plan,
   for (unsigned int i = 0; i < ARRAY_LENGTH (default_features); i++)
     plan->map.add_bool_feature (default_features[i]);
 
-  /* complex */
+  hb_ot_shape_complex_collect_features (plan, props);
 
   for (unsigned int i = 0; i < num_user_features; i++) {
     const hb_feature_t *feature = &user_features[i];
@@ -321,10 +321,12 @@ hb_ot_shape_internal (hb_ot_shape_context_t *c)
 void
 hb_ot_shape_plan_internal (hb_ot_shape_plan_t       *plan,
                           hb_face_t                *face,
-                          hb_segment_properties_t  *props,
+                          const hb_segment_properties_t  *props,
                           const hb_feature_t       *user_features,
                           unsigned int              num_user_features)
 {
+  plan->shaper = hb_ot_shape_complex_categorize (props);
+
   hb_ot_shape_collect_features (plan, props, user_features, num_user_features);
 
   plan->map.compile (face, props);