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

Behdad Esfahbod behdad at kemper.freedesktop.org
Fri May 21 09:58:36 PDT 2010


 src/hb-ot-shape.cc |   86 ++++++++++++++++++++++++++++++++++++++++++-----------
 1 file changed, 69 insertions(+), 17 deletions(-)

New commits:
commit 1094a294f6a44c47fc75867983f2b135a6442bab
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Fri May 21 17:58:20 2010 +0100

    Add rtlm

diff --git a/src/hb-ot-shape.cc b/src/hb-ot-shape.cc
index 0452f8e..8b1863c 100644
--- a/src/hb-ot-shape.cc
+++ b/src/hb-ot-shape.cc
@@ -42,6 +42,12 @@ hb_tag_t default_features[] = {
   HB_TAG('m','k','m','k'),
 };
 
+enum {
+  MASK_ALWAYS_ON = 1 << 0,
+  MASK_RTLM      = 1 << 1
+};
+#define MASK_BITS_USED 2
+
 struct lookup_map {
   unsigned int index;
   hb_mask_t mask;
@@ -148,10 +154,7 @@ setup_lookups (hb_face_t    *face,
       break;
   }
 
-  /* Clear buffer masks. */
-  buffer->clear_masks ();
-
-  unsigned int next_bit = 1;
+  unsigned int next_bit = MASK_BITS_USED;
   hb_mask_t global_mask = 0;
   for (i = 0; i < num_features; i++)
   {
@@ -310,7 +313,11 @@ hb_mirror_chars (hb_buffer_t *buffer)
 
   unsigned int count = buffer->len;
   for (unsigned int i = 0; i < count; i++) {
-      buffer->info[i].codepoint = get_mirroring (buffer->info[i].codepoint);
+    hb_codepoint_t codepoint = get_mirroring (buffer->info[i].codepoint);
+    if (likely (codepoint == buffer->info[i].codepoint))
+      buffer->info[i].mask |= MASK_RTLM;
+    else
+      buffer->info[i].codepoint = codepoint;
   }
 }
 
@@ -431,6 +438,10 @@ hb_ot_shape (hb_font_t    *font,
 
   hb_form_clusters (buffer);
 
+  /* SUBSTITUTE */
+
+  buffer->clear_masks ();
+
   hb_substitute_default (font, face, buffer, features, num_features);
 
   /* We do this after substitute_default because mirroring needs to
@@ -442,6 +453,11 @@ hb_ot_shape (hb_font_t    *font,
   if (substitute_fallback)
     hb_substitute_complex_fallback (font, face, buffer, features, num_features);
 
+
+  /* POSITION */
+
+  buffer->clear_masks ();
+
   hb_position_default (font, face, buffer, features, num_features);
 
   position_fallback = !hb_ot_position_complex (font, face, buffer, features, num_features, original_direction);
commit 074ea787493a37ae8f68d17be7820f13fff57520
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Fri May 21 17:53:10 2010 +0100

    Add ltra, ltrm, and rtla features

diff --git a/src/hb-ot-shape.cc b/src/hb-ot-shape.cc
index 411087b..0452f8e 100644
--- a/src/hb-ot-shape.cc
+++ b/src/hb-ot-shape.cc
@@ -74,6 +74,28 @@ add_feature (hb_face_t    *face,
   }
 }
 
+static hb_bool_t
+maybe_add_feature (hb_face_t    *face,
+		   hb_tag_t      table_tag,
+		   unsigned int  script_index,
+		   unsigned int  language_index,
+		   hb_tag_t      feature_tag,
+		   hb_mask_t     mask,
+		   lookup_map   *lookups,
+		   unsigned int *num_lookups,
+		   unsigned int  room_lookups)
+{
+  unsigned int feature_index;
+  if (hb_ot_layout_language_find_feature (face, table_tag, script_index, language_index,
+					  feature_tag,
+					  &feature_index))
+  {
+    add_feature (face, table_tag, feature_index, mask, lookups, num_lookups, room_lookups);
+    return TRUE;
+  }
+  return FALSE;
+}
+
 static int
 cmp_lookups (const void *p1, const void *p2)
 {
@@ -90,7 +112,8 @@ setup_lookups (hb_face_t    *face,
 	       unsigned int  num_features,
 	       hb_tag_t      table_tag,
 	       lookup_map   *lookups,
-	       unsigned int *num_lookups)
+	       unsigned int *num_lookups,
+	       hb_direction_t original_direction)
 {
   unsigned int i, j, script_index, language_index, feature_index, room_lookups;
 
@@ -109,11 +132,20 @@ setup_lookups (hb_face_t    *face,
     add_feature (face, table_tag, feature_index, 1, lookups, num_lookups, room_lookups);
 
   for (i = 0; i < ARRAY_LENGTH (default_features); i++)
-  {
-    if (hb_ot_layout_language_find_feature (face, table_tag, script_index, language_index,
-					    default_features[i],
-					    &feature_index))
-      add_feature (face, table_tag, feature_index, 1, lookups, num_lookups, room_lookups);
+    maybe_add_feature (face, table_tag, script_index, language_index, default_features[i], 1, lookups, num_lookups, room_lookups);
+
+  switch (original_direction) {
+    case HB_DIRECTION_LTR:
+      maybe_add_feature (face, table_tag, script_index, language_index, HB_TAG ('l','t','r','a'), 1, lookups, num_lookups, room_lookups);
+      maybe_add_feature (face, table_tag, script_index, language_index, HB_TAG ('l','t','r','m'), 1, lookups, num_lookups, room_lookups);
+      break;
+    case HB_DIRECTION_RTL:
+      maybe_add_feature (face, table_tag, script_index, language_index, HB_TAG ('r','t','l','a'), 1, lookups, num_lookups, room_lookups);
+      break;
+    case HB_DIRECTION_TTB:
+    case HB_DIRECTION_BTT:
+    default:
+      break;
   }
 
   /* Clear buffer masks. */
@@ -178,7 +210,8 @@ hb_ot_substitute_complex (hb_font_t    *font HB_UNUSED,
 			  hb_face_t    *face,
 			  hb_buffer_t  *buffer,
 			  hb_feature_t *features,
-			  unsigned int  num_features)
+			  unsigned int  num_features,
+			  hb_direction_t original_direction)
 {
   lookup_map lookups[1000];
   unsigned int num_lookups = ARRAY_LENGTH (lookups);
@@ -189,7 +222,8 @@ hb_ot_substitute_complex (hb_font_t    *font HB_UNUSED,
 
   setup_lookups (face, buffer, features, num_features,
 		 HB_OT_TAG_GSUB,
-		 lookups, &num_lookups);
+		 lookups, &num_lookups,
+		 original_direction);
 
   for (i = 0; i < num_lookups; i++)
     hb_ot_layout_substitute_lookup (face, buffer, lookups[i].index, lookups[i].mask);
@@ -202,7 +236,8 @@ hb_ot_position_complex (hb_font_t    *font,
 			hb_face_t    *face,
 			hb_buffer_t  *buffer,
 			hb_feature_t *features,
-			unsigned int  num_features)
+			unsigned int  num_features,
+			hb_direction_t original_direction)
 {
   lookup_map lookups[1000];
   unsigned int num_lookups = ARRAY_LENGTH (lookups);
@@ -213,7 +248,8 @@ hb_ot_position_complex (hb_font_t    *font,
 
   setup_lookups (face, buffer, features, num_features,
 		 HB_OT_TAG_GPOS,
-		 lookups, &num_lookups);
+		 lookups, &num_lookups,
+		 original_direction);
 
   for (i = 0; i < num_lookups; i++)
     hb_ot_layout_position_lookup (font, face, buffer, lookups[i].index, lookups[i].mask);
@@ -401,14 +437,14 @@ hb_ot_shape (hb_font_t    *font,
    * see the original direction. */
   original_direction = hb_ensure_native_direction (buffer);
 
-  substitute_fallback = !hb_ot_substitute_complex (font, face, buffer, features, num_features);
+  substitute_fallback = !hb_ot_substitute_complex (font, face, buffer, features, num_features, original_direction);
 
   if (substitute_fallback)
     hb_substitute_complex_fallback (font, face, buffer, features, num_features);
 
   hb_position_default (font, face, buffer, features, num_features);
 
-  position_fallback = !hb_ot_position_complex (font, face, buffer, features, num_features);
+  position_fallback = !hb_ot_position_complex (font, face, buffer, features, num_features, original_direction);
 
   if (position_fallback)
     hb_position_complex_fallback (font, face, buffer, features, num_features);



More information about the HarfBuzz mailing list