From 5c299343118d1eaff32ffb2a5dac077cfff67dee Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Mon, 19 Sep 2011 14:53:26 -0400 Subject: [PATCH] [uniscribe] Various improvements --- src/hb-uniscribe.cc | 30 +++++++++++++++++++----------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/src/hb-uniscribe.cc b/src/hb-uniscribe.cc index 9026bb0..ce86074 100644 --- a/src/hb-uniscribe.cc +++ b/src/hb-uniscribe.cc @@ -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]; -- 2.7.4