src/hb-ot-shape.cc | 24 +++- src/hb-unicode-private.hh | 6 - test/shaping/Makefile.am | 1 test/shaping/fonts/sha1sum/37033cc5cf37bb223d7355153016b6ccece93b28.ttf |binary test/shaping/fonts/sha1sum/MANIFEST | 1 test/shaping/record-test.sh | 49 ++++++++++ test/shaping/tests/MANIFEST | 1 test/shaping/tests/mongolian-variation-selector.tests | 1 8 files changed, 75 insertions(+), 8 deletions(-)
New commits: commit 844f1a487d9c39724ebff20e89f6184c9a59be0b Author: Behdad Esfahbod <beh...@behdad.org> Date: Wed Jul 16 13:32:51 2014 -0400 [tests] Add record-test.sh diff --git a/test/shaping/Makefile.am b/test/shaping/Makefile.am index cefd480..33f75ab 100644 --- a/test/shaping/Makefile.am +++ b/test/shaping/Makefile.am @@ -20,6 +20,7 @@ EXTRA_DIST += \ hb-unicode-decode \ hb-unicode-encode \ hb-unicode-prettyname \ + record-test.sh \ run-tests.sh \ texts/in-tree \ fonts/sha1sum \ diff --git a/test/shaping/record-test.sh b/test/shaping/record-test.sh new file mode 100755 index 0000000..384d87f --- /dev/null +++ b/test/shaping/record-test.sh @@ -0,0 +1,49 @@ +#!/bin/bash + +dir=`mktemp --directory` + +hb_shape=$1 +fontfile=$2 +unicodes=`./hb-unicode-decode` +text=`./hb-unicode-encode "$unicodes"` +glyphs=`echo "$text" | $hb_shape "$fontfile"` + +cp "$fontfile" "$dir/font.ttf" +pyftsubset \ + --glyph-names \ + "$dir/font.ttf" \ + --text="$text" +if ! test -s "$dir/font.ttf.subset"; then + echo "Subsetter didn't produce nonempty subset font in $dir/font.ttf.subset" >&2 + exit 2 +fi + +# Verify that subset font produces same glyphs! +glyphs_subset=`echo "$text" | $hb_shape "$dir/font.ttf.subset"` + +if ! test "x$glyphs" = "x$glyphs_subset"; then + echo "Subset font produced different glyphs!" >&2 + echo "Perhaps font doesn't have glyph names; checking visually..." >&2 + hb_view=${hb_shape//shape/view} + echo "$text" | $hb_view "$dir/font.ttf" --output-format=png --output-file="$dir/orig.png" + echo "$text" | $hb_view "$dir/font.ttf.subset" --output-format=png --output-file="$dir/subset.png" + if ! cmp "$dir/orig.png" "$dir/subset.png"; then + echo "Images differ. Please inspect $dir/*.png." >&2 + echo "$glyphs" + echo "$glyphs_subset" + exit 2 + fi + echo "Yep; all good." >&2 + rm -f "$dir/orig.png" + rm -f "$dir/subset.png" + glyphs=$glyphs_subset +fi + +sha1sum=`sha1sum "$dir/font.ttf.subset" | cut -d' ' -f1` +subset="fonts/sha1sum/$sha1sum.ttf" +mv "$dir/font.ttf.subset" "$subset" + +echo "$subset:$unicodes:$glyphs" + +rm -f "$dir/font.ttf" +rmdir "$dir" commit 3b861421a772f52eb232ff93bd74b5a8214801ec Author: Behdad Esfahbod <beh...@behdad.org> Date: Wed Jul 16 13:22:05 2014 -0400 Fix Mongolian Variation Selectors for fonts without GDEF Originally we fixed those in 79d1007a501fd63c0ba4d51038c513e6b8b94740. However, fonts like MongolianWhite don't have GDEF, but have IgnoreMarks in their LigatureSubstitute init/etc features. We were synthesizing a GDEF class of mark for Mongolian Variation Selectors and as such the ligature lookups where not matching. Uniscribe doesn't do that. I tried with more sophisticated fixes, like, if there is no GDEF and a lookup-flag mismatch happens, instead of rejecting a match, try skipping that glyph. That surely produces some interesting behavior, but since we don't want to support fonts missing GDEF more than we have to, I went for this simpler fix which is to always mark default-ignorables as base when synthesizing GDEF. Micro-test added. Fixes rest of https://bugs.freedesktop.org/show_bug.cgi?id=65258 diff --git a/src/hb-ot-shape.cc b/src/hb-ot-shape.cc index 5a1960c..736eefd 100644 --- a/src/hb-ot-shape.cc +++ b/src/hb-ot-shape.cc @@ -395,8 +395,17 @@ hb_synthesize_glyph_classes (hb_ot_shape_context_t *c) { hb_ot_layout_glyph_class_mask_t klass; - klass = _hb_glyph_info_get_general_category (&info[i]) != - HB_UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK ? + /* Never mark default-ignorables as marks. + * They won't get in the way of lookups anyway, + * but having them as mark will cause them to be skipped + * over if the lookup-flag says so, but at least for the + * Mongolian variation selectors, looks like Uniscribe + * marks them as non-mark. Some Mongolian fonts without + * GDEF rely on this. Another notable character that + * this applies to is COMBINING GRAPHEME JOINER. */ + klass = (_hb_glyph_info_get_general_category (&info[i]) != + HB_UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK || + _hb_glyph_info_is_default_ignorable (&info[i])) ? HB_OT_LAYOUT_GLYPH_PROPS_BASE_GLYPH : HB_OT_LAYOUT_GLYPH_PROPS_MARK; _hb_glyph_info_set_glyph_props (&info[i], klass); diff --git a/test/shaping/fonts/sha1sum/37033cc5cf37bb223d7355153016b6ccece93b28.ttf b/test/shaping/fonts/sha1sum/37033cc5cf37bb223d7355153016b6ccece93b28.ttf new file mode 100644 index 0000000..14defeb Binary files /dev/null and b/test/shaping/fonts/sha1sum/37033cc5cf37bb223d7355153016b6ccece93b28.ttf differ diff --git a/test/shaping/fonts/sha1sum/MANIFEST b/test/shaping/fonts/sha1sum/MANIFEST index c05a9ef..427f433 100644 --- a/test/shaping/fonts/sha1sum/MANIFEST +++ b/test/shaping/fonts/sha1sum/MANIFEST @@ -1,4 +1,5 @@ 226bc2deab3846f1a682085f70c67d0421014144.ttf +37033cc5cf37bb223d7355153016b6ccece93b28.ttf 4cce528e99f600ed9c25a2b69e32eb94a03b4ae8.ttf d629e7fedc0b350222d7987345fe61613fa3929a.ttf e207635780b42f898d58654b65098763e340f5c7.ttf diff --git a/test/shaping/tests/MANIFEST b/test/shaping/tests/MANIFEST index ac10e07..024169d 100644 --- a/test/shaping/tests/MANIFEST +++ b/test/shaping/tests/MANIFEST @@ -1,2 +1,3 @@ context-matching.tests indic-pref-blocking.tests +mongolian-variation-selector.tests diff --git a/test/shaping/tests/mongolian-variation-selector.tests b/test/shaping/tests/mongolian-variation-selector.tests new file mode 100644 index 0000000..043fa18 --- /dev/null +++ b/test/shaping/tests/mongolian-variation-selector.tests @@ -0,0 +1 @@ +fonts/sha1sum/37033cc5cf37bb223d7355153016b6ccece93b28.ttf:U+1826,U+180B,U+1826:[uni1826.E85E_ue.init1=0+599|uni1826.E856_ue.fina=2+750] commit 878a25375b2fdf64cf0cc30c23fca9fcd58548e8 Author: Behdad Esfahbod <beh...@behdad.org> Date: Wed Jul 16 13:21:26 2014 -0400 Minor diff --git a/src/hb-ot-shape.cc b/src/hb-ot-shape.cc index e122ef4..5a1960c 100644 --- a/src/hb-ot-shape.cc +++ b/src/hb-ot-shape.cc @@ -37,6 +37,7 @@ #include "hb-ot-shape-normalize-private.hh" #include "hb-ot-layout-private.hh" +#include "hb-unicode-private.hh" #include "hb-set-private.hh" diff --git a/src/hb-unicode-private.hh b/src/hb-unicode-private.hh index 31a7abb..6652015 100644 --- a/src/hb-unicode-private.hh +++ b/src/hb-unicode-private.hh @@ -102,7 +102,7 @@ HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS_SIMPLE } - unsigned int + inline unsigned int modified_combining_class (hb_codepoint_t unicode) { /* XXX This hack belongs to the Myanmar shaper. */ @@ -119,7 +119,7 @@ HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS_SIMPLE return _hb_modified_combining_class[combining_class (unicode)]; } - inline hb_bool_t + static inline hb_bool_t is_variation_selector (hb_codepoint_t unicode) { return unlikely (hb_in_ranges (unicode, @@ -164,7 +164,7 @@ HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS_SIMPLE * E0100..E01EF # Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256 * E01F0..E0FFF # Cn [3600] <reserved-E01F0>..<reserved-E0FFF> */ - inline hb_bool_t + static inline hb_bool_t is_default_ignorable (hb_codepoint_t ch) { hb_codepoint_t plane = ch >> 16; commit ec181e50140fc65b32d6080e2f7f73bbe0269ba9 Author: Behdad Esfahbod <beh...@behdad.org> Date: Wed Jul 16 13:10:03 2014 -0400 Minor moving around diff --git a/src/hb-ot-shape.cc b/src/hb-ot-shape.cc index bc9eaa5..e122ef4 100644 --- a/src/hb-ot-shape.cc +++ b/src/hb-ot-shape.cc @@ -391,11 +391,15 @@ hb_synthesize_glyph_classes (hb_ot_shape_context_t *c) unsigned int count = c->buffer->len; hb_glyph_info_t *info = c->buffer->info; for (unsigned int i = 0; i < count; i++) - _hb_glyph_info_set_glyph_props (&info[i], - _hb_glyph_info_get_general_category (&info[i]) - == HB_UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK ? - HB_OT_LAYOUT_GLYPH_PROPS_MARK : - HB_OT_LAYOUT_GLYPH_PROPS_BASE_GLYPH); + { + hb_ot_layout_glyph_class_mask_t klass; + + klass = _hb_glyph_info_get_general_category (&info[i]) != + HB_UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK ? + HB_OT_LAYOUT_GLYPH_PROPS_BASE_GLYPH : + HB_OT_LAYOUT_GLYPH_PROPS_MARK; + _hb_glyph_info_set_glyph_props (&info[i], klass); + } } static inline void _______________________________________________ HarfBuzz mailing list HarfBuzz@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/harfbuzz