[uniscribe] Various improvements
authorBehdad Esfahbod <behdad@behdad.org>
Mon, 19 Sep 2011 18:53:26 +0000 (14:53 -0400)
committerBehdad Esfahbod <behdad@behdad.org>
Mon, 19 Sep 2011 18:53:26 +0000 (14:53 -0400)
src/hb-uniscribe.cc

index 9026bb0..ce86074 100644 (file)
@@ -300,17 +300,22 @@ retry:
 #define MAX_ITEMS 10
 
   SCRIPT_ITEM items[MAX_ITEMS + 1];
+  SCRIPT_CONTROL bidi_control = {0};
   SCRIPT_STATE bidi_state = {0};
   WIN_ULONG script_tags[MAX_ITEMS];
   int item_count;
 
+  /* MinGW32 doesn't define fMergeNeutralItems, so we bruteforce */
+  //bidi_control.fMergeNeutralItems = TRUE;
+  *(uint32_t*)&bidi_control |= 1<<24;
+
   bidi_state.uBidiLevel = HB_DIRECTION_IS_FORWARD (buffer->props.direction) ? 0 : 1;
-  bidi_state.fOverrideDirection = 1;
+//  bidi_state.fOverrideDirection = 1;
 
   hr = ScriptItemizeOpenType (wchars,
                              chars_len,
                              MAX_ITEMS,
-                             NULL,
+                             &bidi_control,
                              &bidi_state,
                              items,
                              script_tags,
@@ -324,7 +329,7 @@ retry:
   TEXTRANGE_PROPERTIES **range_properties = NULL;
   int range_count = 0;
   if (num_features) {
-    /* XXX setup ranges */
+    /* TODO setup ranges */
   }
 
   OPENTYPE_TAG language_tag = hb_ot_tag_from_language (buffer->props.language);
@@ -399,15 +404,21 @@ retry:
    * very, *very*, carefully! */
 
   /* Calculate visual-clusters.  That's what we ship. */
-  for (unsigned int i = 0; i < buffer->len; i++)
-    vis_clusters[i] = 0;
+  for (unsigned int i = 0; i < glyphs_len; i++)
+    vis_clusters[i] = -1;
   for (unsigned int i = 0; i < buffer->len; i++) {
     uint32_t *p = &vis_clusters[log_clusters[buffer->info[i].utf16_index()]];
     *p = MIN (*p, buffer->info[i].cluster);
   }
-  for (unsigned int i = 1; i < glyphs_len; i++)
-    if (!glyph_props[i].sva.fClusterStart)
-    vis_clusters[i] = vis_clusters[i - 1];
+  if (HB_DIRECTION_IS_FORWARD (buffer->props.direction)) {
+    for (unsigned int i = 1; i < glyphs_len; i++)
+      if (!glyph_props[i].sva.fClusterStart)
+       vis_clusters[i] = vis_clusters[i - 1];
+  } else {
+    for (int i = glyphs_len - 2; i >= 0; i--)
+      if (!glyph_props[i].sva.fClusterStart)
+       vis_clusters[i] = vis_clusters[i + 1];
+  }
 
 #undef utf16_index
 
@@ -421,9 +432,6 @@ retry:
   buffer->len = 0;
   for (unsigned int i = 0; i < glyphs_len; i++)
   {
-    if (glyph_props[i].sva.fZeroWidth)
-      continue;
-
     hb_glyph_info_t *info = &buffer->info[buffer->len++];
 
     info->codepoint = glyphs[i];