src/hb-private.hh | 12 +++++++++++- src/hb-uniscribe.cc | 18 +++++++++++------- 2 files changed, 22 insertions(+), 8 deletions(-)
New commits: commit b069c3c31bfbbf160eb897c7474be9ea90ed4fc1 Author: Behdad Esfahbod <[email protected]> Date: Fri Jun 8 10:10:29 2012 -0400 Really fix override-direction in Uniscribe diff --git a/src/hb-uniscribe.cc b/src/hb-uniscribe.cc index 5013e9f..ce34f77 100644 --- a/src/hb-uniscribe.cc +++ b/src/hb-uniscribe.cc @@ -339,14 +339,18 @@ retry: unsigned int glyphs_offset = 0; unsigned int glyphs_len; - for (unsigned int i = 0; i < item_count; i++) + bool backward = HB_DIRECTION_IS_BACKWARD (buffer->props.direction); + for (unsigned int j = 0; j < item_count; j++) { + unsigned int i = backward ? item_count - 1 - j : j; unsigned int chars_offset = items[i].iCharPos; unsigned int item_chars_len = items[i + 1].iCharPos - chars_offset; OPENTYPE_TAG script_tag; /* We ignore what script tag Uniscribe chose, except to differentiate - * between old/new tags. Not sure if this picks DFLT up correctly... */ + * between old/new tags. Not sure if this picks DFLT up correctly... + * This also screws things up as the item.analysis also has an opaque + * script member. */ if (script_tags[i] == hb_uint32_swap (buffer_script_tags[1])) script_tag = hb_uint32_swap (buffer_script_tags[1]); else @@ -423,7 +427,7 @@ retry: uint32_t *p = &vis_clusters[log_clusters[buffer->info[i].utf16_index()]]; *p = MIN (*p, buffer->info[i].cluster); } - if (HB_DIRECTION_IS_FORWARD (buffer->props.direction)) { + if (!backward) { for (unsigned int i = 1; i < glyphs_len; i++) if (!glyph_props[i].sva.fClusterStart) vis_clusters[i] = vis_clusters[i - 1]; commit fcd6f5326166e993b8f5222efbaffe916da98f0a Author: Behdad Esfahbod <[email protected]> Date: Fri Jun 8 09:59:43 2012 -0400 Unbreak Uniscribe Oops. hb_tag_t and OPENTYPE_TAG have different endianness. Perhaps something to add API for in hb-uniscribe.h diff --git a/src/hb-private.hh b/src/hb-private.hh index 0cb049e..ea8caf5 100644 --- a/src/hb-private.hh +++ b/src/hb-private.hh @@ -464,7 +464,17 @@ struct hb_lockable_set_t static inline uint16_t hb_be_uint16 (const uint16_t v) { const uint8_t *V = (const uint8_t *) &v; - return (uint16_t) (V[0] << 8) + V[1]; + return (V[0] << 8) | V[1]; +} + +static inline uint16_t hb_uint16_swap (const uint16_t v) +{ + return (v >> 8) | (v << 8); +} + +static inline uint32_t hb_uint32_swap (const uint32_t v) +{ + return (hb_uint16_swap (v) << 16) | hb_uint16_swap (v >> 16); } /* Note, of the following macros, uint16_get is the one called many many times. diff --git a/src/hb-uniscribe.cc b/src/hb-uniscribe.cc index 2edc178..5013e9f 100644 --- a/src/hb-uniscribe.cc +++ b/src/hb-uniscribe.cc @@ -331,7 +331,7 @@ retry: /* TODO setup ranges */ } - OPENTYPE_TAG language_tag = hb_ot_tag_from_language (buffer->props.language); + OPENTYPE_TAG language_tag = hb_uint32_swap (hb_ot_tag_from_language (buffer->props.language)); hb_tag_t buffer_script_tags[2]; hb_ot_tags_from_script (buffer->props.script, &buffer_script_tags[0], @@ -347,10 +347,10 @@ retry: OPENTYPE_TAG script_tag; /* We ignore what script tag Uniscribe chose, except to differentiate * between old/new tags. Not sure if this picks DFLT up correctly... */ - if (script_tags[i] == buffer_script_tags[1]) - script_tag = buffer_script_tags[1]; + if (script_tags[i] == hb_uint32_swap (buffer_script_tags[1])) + script_tag = hb_uint32_swap (buffer_script_tags[1]); else - script_tag = buffer_script_tags[0]; + script_tag = hb_uint32_swap (buffer_script_tags[0]); hr = ScriptShapeOpenType (font_data->hdc, &font_data->script_cache, _______________________________________________ HarfBuzz mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/harfbuzz
