harfbuzz/test/shaping
Tor Arne Vestbø f401f85a5a Remove assumption about Core Text working in 96 DPI
Core Text doesn't actually have a concept of DPI internally, as it
doesn't rasterize anything by itself, it just generates vector paths
that get passed along to Core Graphics.

In practice this means Core Text operates in the classical macOS
logical DPI of 72, with one typographic point corresponding to one
point in the Core Graphics coordinate system, which for a normal
bitmap context then corresponds to one pixel -- or two pixels for
a "retina" context with a 2x scale transform.

Scaling the font point sizes given to HarfBuzz to an assumed DPI
of 96 is problematic with this in mind, as fonts with optical
features such as 'trak' tables for tracking, or color glyphs,
will then base the metrics off of the wrong point size compared
to what the client asked for.

This in turn causes mismatches between the metrics of the shaped
text and the actual rasterization, which doesn't include the 72
to 96 DPI scaling.

If a 96 DPI is needed, such as on the Web, the scaling should be
done outside of HarfBuzz, allowing the client to keep the DPI of
the shaping in sync with the rasterization.

The recommended way to do that is by scaling the font point size,
not by applying a transform to the target Core Graphics context,
to let Core Text choose the right optical features of the target
point size, as described in WWDC 2015 session 804:

  https://developer.apple.com/videos/play/wwdc2015/804/
2019-01-15 13:26:35 +01:00
..
data Remove assumption about Core Text working in 96 DPI 2019-01-15 13:26:35 +01:00
texts/in-house Typo 2018-10-03 15:31:33 +02:00
CMakeLists.txt Add Adobe AOTS tests (#1395) 2018-11-24 20:07:24 +03:30
hb_test_tools.py Correct REPLACEMENT CHARACTER's code point to FFFD (#1471) 2018-12-11 13:19:17 -05:00
hb-diff [test] Use /usr/bin/env python instead of /usr/bin/python 2015-04-06 14:51:31 -07:00
hb-diff-colorize [test] Use /usr/bin/env python instead of /usr/bin/python 2015-04-06 14:51:31 -07:00
hb-diff-filter-failures [test] Use /usr/bin/env python instead of /usr/bin/python 2015-04-06 14:51:31 -07:00
hb-diff-stat [test] Use /usr/bin/env python instead of /usr/bin/python 2015-04-06 14:51:31 -07:00
hb-unicode-decode [test] Use /usr/bin/env python instead of /usr/bin/python 2015-04-06 14:51:31 -07:00
hb-unicode-encode [test] Use /usr/bin/env python instead of /usr/bin/python 2015-04-06 14:51:31 -07:00
hb-unicode-prettyname [test] Use /usr/bin/env python instead of /usr/bin/python 2015-04-06 14:51:31 -07:00
Makefile.am Minor 2018-12-11 17:28:04 -05:00
README.md [use] Prohibit visually ambiguous vowel sequences 2018-10-23 02:25:08 -07:00
record-test.sh Minor 2018-10-11 19:23:36 -04:00
run-tests.py [tests] Minor 2018-11-24 22:01:06 -05:00

Adding tests

You can test shaping of a unicode sequence against a font like this:

$ ./hb-unicode-encode 41 42 43 627 | ../../util/hb-shape font.ttf

assuming an in-tree build. The 41 42 43 627 here is a sequence of Unicode codepoints: U+0041,0042,0043,0627. When you are happy with the shape results, you can use the record-test.sh script to add this to the test suite. record-test.sh requires pyftsubset to be installed. You can get pyftsubset by installing FontTools from https://github.com/behdad/fonttools.

To use record-test.sh, just put it right before the hb-shape invocation:

$ ./hb-unicode-encode 41 42 43 627 | ./record-test.sh ../../util/hb-shape font.ttf

what this does is:

  • Subset the font for the sequence of Unicode characters requested,
  • Compare the hb-shape output of the original font versus the subset font for the input sequence,
  • If the outputs differ, perhaps it is because the font does not have glyph names; it then compares the output of hb-view for both fonts.
  • If the outputs differ, recording fails. Otherwise, it will move the subset font file into data/in-house/fonts and name it after its hash, and print out the test case input, which you can then redirect to an existing or new test file in data/in-house/tests using -o, e.g.:
$ ./hb-unicode-encode 41 42 43 627 | ./record-test.sh -o data/in-house/tests/test-name.test ../../util/hb-shape font.ttf

If you created a new test file, add it to data/in-house/Makefile.sources so it is run. Check that make check does indeed run it, and that the test passes. When everything looks good, git add the new font as well as the new test file if you created any. You can see what new files are there by running git status data/in-house. And commit!

Note! Please only add tests using Open Source fonts, preferably under OFL or similar license.