summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
Diffstat (limited to 'test')
-rw-r--r--test/Makefile.in5
-rw-r--r--test/api/CMakeLists.txt2
-rw-r--r--test/api/Makefile.am46
-rw-r--r--test/api/Makefile.in366
-rw-r--r--test/api/fonts/AdobeVFPrototype.abc.otfbin0 -> 7456 bytes
-rw-r--r--test/api/fonts/AdobeVFPrototype.ac.nohints.otfbin0 -> 6780 bytes
-rw-r--r--test/api/fonts/AdobeVFPrototype.ac.nosubrs.nohints.otfbin0 -> 6844 bytes
-rw-r--r--test/api/fonts/AdobeVFPrototype.ac.nosubrs.otfbin0 -> 7060 bytes
-rw-r--r--test/api/fonts/AdobeVFPrototype.ac.otfbin0 -> 6996 bytes
-rw-r--r--test/api/fonts/AdobeVFPrototype_vsindex.otfbin0 -> 7036 bytes
-rw-r--r--test/api/fonts/MathTestFontFull.ttx6578
-rw-r--r--test/api/fonts/README2
-rw-r--r--test/api/fonts/Roboto-Regular.multihdmx.a.ttfbin0 -> 2052 bytes
-rw-r--r--test/api/fonts/Roboto-Regular.multihdmx.abc.ttfbin0 -> 2468 bytes
-rw-r--r--test/api/fonts/SourceHanSans-Regular.41,3041,4C2E.otfbin0 -> 3892 bytes
-rw-r--r--test/api/fonts/SourceHanSans-Regular.41,4C2E.nohints.otfbin0 -> 2376 bytes
-rw-r--r--test/api/fonts/SourceHanSans-Regular.41,4C2E.nosubrs.nohints.otfbin0 -> 2360 bytes
-rw-r--r--test/api/fonts/SourceHanSans-Regular.41,4C2E.nosubrs.otfbin0 -> 2548 bytes
-rw-r--r--test/api/fonts/SourceHanSans-Regular.41,4C2E.otfbin0 -> 2572 bytes
-rw-r--r--test/api/fonts/SourceSansPro-Regular.abc.otfbin0 -> 1808 bytes
-rw-r--r--test/api/fonts/SourceSansPro-Regular.ac.nohints.otfbin0 -> 1592 bytes
-rw-r--r--test/api/fonts/SourceSansPro-Regular.ac.nosubrs.nohints.otfbin0 -> 1540 bytes
-rw-r--r--test/api/fonts/SourceSansPro-Regular.ac.nosubrs.otfbin0 -> 1632 bytes
-rw-r--r--test/api/fonts/SourceSansPro-Regular.ac.otfbin0 -> 1704 bytes
-rw-r--r--test/api/fonts/aat-feat.ttfbin0 -> 1132 bytes
-rw-r--r--test/api/fonts/aat-morx.ttfbin0 -> 1620 bytes
-rw-r--r--test/api/fonts/aat-trak.ttfbin0 -> 2456 bytes
-rw-r--r--test/api/fonts/base.ttfbin0 -> 5596 bytes
-rw-r--r--test/api/fonts/cff1_dotsect.nohints.otfbin0 -> 3132 bytes
-rw-r--r--test/api/fonts/cff1_dotsect.otfbin0 -> 3220 bytes
-rw-r--r--test/api/fonts/cff1_expert.2D,F6E9,FB00.otfbin0 -> 3096 bytes
-rw-r--r--test/api/fonts/cff1_expert.otfbin0 -> 3656 bytes
-rw-r--r--test/api/fonts/cff1_flex.otfbin0 -> 3152 bytes
-rw-r--r--test/api/fonts/cff1_seac.C0.otfbin0 -> 1600 bytes
-rw-r--r--test/api/fonts/cff1_seac.otfbin0 -> 2260 bytes
-rw-r--r--test/api/fonts/chromacheck-cbdt.ttfbin0 -> 792 bytes
-rw-r--r--test/api/fonts/chromacheck-colr.ttfbin0 -> 652 bytes
-rw-r--r--test/api/fonts/chromacheck-sbix.ttfbin0 -> 864 bytes
-rw-r--r--test/api/fonts/chromacheck-svg.ttfbin0 -> 792 bytes
-rw-r--r--test/api/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5658272078495744bin0 -> 2252 bytes
-rw-r--r--test/api/fonts/cpal-v0.ttf (renamed from test/shaping/data/in-house/fonts/e90374e5e439e00725b4fe7a8d73db57c5a97f82.ttf)bin1948 -> 1948 bytes
-rw-r--r--test/api/fonts/cpal-v1.ttf (renamed from test/shaping/data/in-house/fonts/319f5d7ebffbefc5c5e6569f8cea73444d7a7268.ttf)bin2128 -> 2128 bytes
-rw-r--r--test/api/fonts/cv01.otfbin0 -> 1956 bytes
-rw-r--r--test/api/fonts/lcar.ttfbin0 -> 808 bytes
-rw-r--r--test/api/hb-subset-test.h18
-rw-r--r--test/api/hb-test.h23
-rw-r--r--test/api/test-aat-layout.c133
-rw-r--r--test/api/test-baseline.c58
-rw-r--r--test/api/test-blob.c2
-rw-r--r--test/api/test-buffer.c13
-rw-r--r--test/api/test-c.c8
-rw-r--r--test/api/test-collect-unicodes.c (renamed from test/api/test-subset-codepoints.c)33
-rw-r--r--test/api/test-common.c1
-rw-r--r--test/api/test-font.c88
-rw-r--r--test/api/test-map.c117
-rw-r--r--test/api/test-multithread.c162
-rw-r--r--test/api/test-object.c2
-rw-r--r--test/api/test-ot-color.c326
-rw-r--r--test/api/test-ot-extents-cff.c199
-rw-r--r--test/api/test-ot-face.c122
-rw-r--r--test/api/test-ot-ligature-carets.c67
-rw-r--r--test/api/test-ot-math.c8
-rw-r--r--test/api/test-ot-name.c106
-rw-r--r--test/api/test-ot-tag.c299
-rw-r--r--test/api/test-set.c8
-rw-r--r--test/api/test-shape.c16
-rw-r--r--test/api/test-subset-cff1.c312
-rw-r--r--test/api/test-subset-cff2.c153
-rw-r--r--test/api/test-subset-cmap.c8
-rw-r--r--test/api/test-subset-glyf.c57
-rw-r--r--test/api/test-subset-hdmx.c42
-rw-r--r--test/api/test-subset-hmtx.c25
-rw-r--r--test/api/test-subset-os2.c4
-rw-r--r--test/api/test-subset-post.c7
-rw-r--r--test/api/test-subset-vmtx.c12
-rw-r--r--test/api/test-subset.c24
-rw-r--r--test/api/test-unicode.c125
-rw-r--r--test/fuzzing/CMakeLists.txt7
-rw-r--r--test/fuzzing/Makefile.am54
-rw-r--r--test/fuzzing/Makefile.in118
-rw-r--r--test/fuzzing/fonts/0509e80afb379d16560e9e47bdd7d888bebdebc6 (renamed from test/shaping/data/in-house/fonts/0509e80afb379d16560e9e47bdd7d888bebdebc6.ttf)bin61 -> 61 bytes
-rw-r--r--test/fuzzing/fonts/1a6f1687b7a221f9f2c834b0b360d3c8463b6daf (renamed from test/shaping/data/in-house/fonts/1a6f1687b7a221f9f2c834b0b360d3c8463b6daf.ttf)bin64 -> 64 bytes
-rw-r--r--test/fuzzing/fonts/205edd09bd3d141cc9580f650109556cc28b22cb (renamed from test/shaping/data/in-house/fonts/205edd09bd3d141cc9580f650109556cc28b22cb.ttf)bin1966 -> 1966 bytes
-rw-r--r--test/fuzzing/fonts/217a934cfe15c548b572c203dceb2befdf026462 (renamed from test/shaping/data/in-house/fonts/217a934cfe15c548b572c203dceb2befdf026462.ttf)bin1384 -> 1384 bytes
-rw-r--r--test/fuzzing/fonts/3511ff5c1647150595846ac414c595cccac34f18 (renamed from test/shaping/data/in-house/fonts/3511ff5c1647150595846ac414c595cccac34f18.ttf)bin1483 -> 1483 bytes
-rw-r--r--test/fuzzing/fonts/375d6ae32a3cbe52fbf81a4e5777e3377675d5a3 (renamed from test/shaping/data/in-house/fonts/375d6ae32a3cbe52fbf81a4e5777e3377675d5a3.ttf)bin1024 -> 1024 bytes
-rw-r--r--test/fuzzing/fonts/43979b90b2dd929723cf4fe1715990bcb9c9a56b (renamed from test/shaping/data/in-house/fonts/43979b90b2dd929723cf4fe1715990bcb9c9a56b.ttf)bin1804 -> 1804 bytes
-rw-r--r--test/fuzzing/fonts/558661aa659912f4d30ecd27bd09835171a8e2b0 (renamed from test/shaping/data/in-house/fonts/558661aa659912f4d30ecd27bd09835171a8e2b0.ttf)bin1358 -> 1358 bytes
-rw-r--r--test/fuzzing/fonts/5a5daf5eb5a4db77a2baa3ad9c7a6ed6e0655fa8 (renamed from test/shaping/data/in-house/fonts/5a5daf5eb5a4db77a2baa3ad9c7a6ed6e0655fa8.ttf)bin61 -> 61 bytes
-rw-r--r--test/fuzzing/fonts/641bd9db850193064d17575053ae2bf8ec149ddc (renamed from test/shaping/data/in-house/fonts/641bd9db850193064d17575053ae2bf8ec149ddc.ttf)bin305 -> 305 bytes
-rw-r--r--test/fuzzing/fonts/8240789f6d12d4cfc4b5e8e6f246c3701bcf861f (renamed from test/shaping/data/in-house/fonts/8240789f6d12d4cfc4b5e8e6f246c3701bcf861f.ttf)bin633 -> 633 bytes
-rw-r--r--test/fuzzing/fonts/a34a9191d9376bda419836effeef7e75c1386016 (renamed from test/shaping/data/in-house/fonts/a34a9191d9376bda419836effeef7e75c1386016.ttf)bin1010 -> 1010 bytes
-rw-r--r--test/fuzzing/fonts/a69118c2c2ada48ff803d9149daa54c9ebdae30e (renamed from test/shaping/data/in-house/fonts/a69118c2c2ada48ff803d9149daa54c9ebdae30e.ttf)bin820 -> 820 bytes
-rw-r--r--test/fuzzing/fonts/b9e2aaa0d75fcef6971ec3a96d806ba4a6b31fe2 (renamed from test/shaping/data/in-house/fonts/b9e2aaa0d75fcef6971ec3a96d806ba4a6b31fe2.ttf)bin1804 -> 1804 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-5517117891805184bin0 -> 178 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-6107935408390144bin0 -> 16800 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-hb-fuzzer-4666056377368576 (renamed from test/shaping/data/in-house/fonts/ef2511f215aa3ca847cbfffbf861793b42170875.ttf)bin1152 -> 1152 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-hb-fuzzer-5662671558934528bin0 -> 242272 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-hb-fuzzer-6243458541944832bin0 -> 370187 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-hb-fuzzer-6303297511096320 (renamed from test/shaping/data/in-house/fonts/9d8a94a67932a3ab75a596fc8b5c6d0392ca9e49.ttf)bin4545 -> 4545 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-hb-fuzzer-6696647723581440bin0 -> 3266 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-hb-shape-fuzzer-5097734906839040bin0 -> 164 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-hb-shape-fuzzer-5634395566768128bin0 -> 106 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-hb-shape-fuzzer-5688420752424960bin0 -> 163 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-hb-shape-fuzzer-5728971283496960bin0 -> 101 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-hb-shape-fuzzer-5746142327865344bin0 -> 219 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-hb-shape-fuzzer-5750379279548416bin0 -> 317 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-hb-subset-fuzzer-5643036478930944bin0 -> 369 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-hb-subset-fuzzer-5686186874503168bin0 -> 962 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-hb-subset-fuzzer-5762137968869376bin0 -> 2037 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-4884742786777088bin0 -> 393 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-5255344882188288bin0 -> 65 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-5720051798769664 (renamed from test/shaping/data/in-house/fonts/233c1e252e737ca79e03a9fd56b71aaa4a230f2b.ttf)bin1048576 -> 1048576 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-5924299061854208bin0 -> 2786 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-6460279560863744bin0 -> 589 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-5126525414014976bin0 -> 1141 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-5166320261529600bin0 -> 393 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-5659690013556736bin0 -> 2732 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-5662548265009152bin0 -> 28 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-5973566991106048bin0 -> 4047 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-4523479581851648bin0 -> 322 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-4535496598355968 (renamed from test/shaping/data/in-house/fonts/dd9f0c7c7c36f75a18be0cab1cddf8f3ab0f366b.ttf)bin2786 -> 2786 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-4548492505645056bin0 -> 122 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-4595692015190016 (renamed from test/shaping/data/in-house/fonts/243798dd281c1c77c065958e1ff467420faa9bde.ttf)bin225 -> 225 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-4687441845813248bin0 -> 162 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-4706238090706944bin0 -> 350 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-4769173588672512bin0 -> 37 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-4827735151083520bin0 -> 1384 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-4841745322868736bin0 -> 660 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-4884742786777088bin0 -> 393 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-5216838347653120bin0 -> 157600 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-5255344882188288bin0 -> 65 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-5294584596791296bin0 -> 1602 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-5303930168803328bin0 -> 7321 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-5331901587914752 (renamed from test/shaping/data/in-house/fonts/b6acef662e0beb8d5fcf5b61c6b0ca69537b7402.ttf)bin3301 -> 3301 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-5388906574905344bin0 -> 9937 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-5517117891805184bin0 -> 178 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-5617496443846656bin0 -> 195 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-5672141338968064bin0 -> 176 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-5700697074958336bin0 -> 878 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-5713868010553344bin0 -> 370 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-5720051798769664bin0 -> 1048576 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-5924299061854208bin0 -> 2786 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-6023178755244032bin0 -> 2261 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-6111685556305920bin0 -> 586 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-6160439919509504 (renamed from test/shaping/data/in-house/fonts/bbf4a308c402f0678c3e82844892a4da2ebe598f.ttf)bin204 -> 204 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-6210176798425088bin0 -> 1420 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-6260579246276608bin0 -> 700 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-6264625609834496bin0 -> 1731 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-6278851874258944bin0 -> 598 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-6424351550210048bin0 -> 73 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-6460279560863744bin0 -> 589 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-6576177596596224bin0 -> 385 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-6595199411159040bin0 -> 1862 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-6624904746106880bin0 -> 42 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-6723367514144768bin0 -> 1074 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5175735354916864bin0 -> 354461 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5629524117553152bin0 -> 93 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5630246225707008bin0 -> 109 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5631444412530688bin0 -> 336 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5633985665826816bin0 -> 73 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5634443633491968bin0 -> 41814 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5634620935110656bin0 -> 41 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5635082459545600bin0 -> 52 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5647267827023872bin0 -> 655 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5649959857160192bin0 -> 3608 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5650286710882304bin0 -> 76 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5652019562414080bin0 -> 49 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5656511058018304bin0 -> 28 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5659641787187200bin0 -> 3498 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5664873493561344bin0 -> 400 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5667182741028864bin0 -> 407 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5668791174823936bin0 -> 3608 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5672261407735808bin0 -> 192 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5674361600606208bin0 -> 518 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5677421274071040bin0 -> 3608 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5679244475105280bin0 -> 256 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5685596677210112bin0 -> 58 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5686369209286656bin0 -> 2880 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5688420752424960bin0 -> 69 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5691469793329152bin0 -> 69 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5695615258853376bin0 -> 194 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5696686572175360bin0 -> 256 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5700264032468992bin0 -> 648 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5706010589659136bin0 -> 52 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5716208469409792bin0 -> 243 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5718464350650368bin0 -> 41 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5718889451749376bin0 -> 1680 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5719982789361664bin0 -> 3608 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5722888989048832bin0 -> 3608 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5725129603022848bin0 -> 3608 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5725855502827520bin0 -> 655 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5726089628876800bin0 -> 76 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5729361857085440bin0 -> 2250 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5733166795456512bin0 -> 78 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5734736291430400bin0 -> 66 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5735679418433536bin0 -> 36 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5736657639178240bin0 -> 459 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5738888765636608bin0 -> 267731 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5740171484463104bin0 -> 186 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5750379279548416bin0 -> 219 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5754863779053568bin0 -> 100 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5762490181353472bin0 -> 101 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5762953198960640bin0 -> 62 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5764636557705216bin0 -> 2184 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5768046065483776bin0 -> 342 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5768601332613120bin0 -> 108 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5067936541179904bin0 -> 172 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5359635656605696bin0 -> 393270 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5521982557782016 (renamed from test/api/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5521982557782016)bin1228 -> 1228 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5542653037903872bin0 -> 160249 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5609911946838016 (renamed from test/api/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5609911946838016)bin313 -> 313 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5629878397829120bin0 -> 3746 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5651059347816448bin0 -> 2648 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5660711141769216bin0 -> 383 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5669437462544384bin0 -> 284427 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5670861909524480bin0 -> 1298 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5672006905757696bin0 -> 73 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5672913680728064bin0 -> 861 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5690658895953920bin0 -> 2735 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5695279609675776bin0 -> 135 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5696607199166464bin0 -> 28 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5710107829075968bin0 -> 3660 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5711951464759296bin0 -> 284521 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5718215406125056bin0 -> 107 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5725847365877760bin0 -> 880 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5743250149736448bin0 -> 103 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5747265633779712bin0 -> 177090 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5750092395970560bin0 -> 72435 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5750420593442816bin0 -> 96091 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5758598970343424bin0 -> 64 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5765071062958080bin0 -> 329 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5768186323009536bin0 -> 337 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-6543700493598720bin0 -> 138425 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-6651660668502016 (renamed from test/api/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-6651660668502016)bin15229 -> 15229 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-get-codepoints-fuzzer-5203067375976448bin0 -> 16310 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-get-codepoints-fuzzer-5630904853069824bin0 -> 580 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-get-codepoints-fuzzer-5687638085337088bin0 -> 1206 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-get-codepoints-fuzzer-5736539338833920bin0 -> 512 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-get-codepoints-fuzzer-5930139383758848bin0 -> 9410 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-get-codepoints-fuzzer-5973295416475648bin0 -> 109 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-get-codepoints-fuzzer-6136125075750912bin0 -> 65816 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-get-codepoints-fuzzer-6394290358976512bin0 -> 1868 bytes
-rw-r--r--test/fuzzing/fonts/crash-4b60576767ee4d9fe1cc10959d89baf73d4e8249 (renamed from test/api/fonts/crash-4b60576767ee4d9fe1cc10959d89baf73d4e8249)bin3140 -> 3140 bytes
-rw-r--r--test/fuzzing/fonts/crash-b577db318b30f2851828a4c9ef97cb30678b1b54 (renamed from test/api/fonts/crash-b577db318b30f2851828a4c9ef97cb30678b1b54)bin22473 -> 22473 bytes
-rw-r--r--test/fuzzing/fonts/crash-ccc61c92d589f895174cdef6ff2e3b20e9999a1a (renamed from test/api/fonts/crash-ccc61c92d589f895174cdef6ff2e3b20e9999a1a)bin63302 -> 63302 bytes
-rw-r--r--test/fuzzing/fonts/crash-e4e0bb1458a91b692eba492c907ae1f94e635480 (renamed from test/api/fonts/crash-e4e0bb1458a91b692eba492c907ae1f94e635480)bin63302 -> 63302 bytes
-rw-r--r--test/fuzzing/fonts/e88c339237f52d21e01c55f01b9c1b4cc14a0467 (renamed from test/shaping/data/in-house/fonts/e88c339237f52d21e01c55f01b9c1b4cc14a0467.ttf)bin515 -> 515 bytes
-rw-r--r--test/fuzzing/fonts/fab39d60d758cb586db5a504f218442cd1395725 (renamed from test/shaping/data/in-house/fonts/fab39d60d758cb586db5a504f218442cd1395725.ttf)bin1894 -> 1894 bytes
-rw-r--r--test/fuzzing/fonts/oom-6ef8c96d3710262511bcc730dce9c00e722cb653 (renamed from test/api/fonts/oom-6ef8c96d3710262511bcc730dce9c00e722cb653)bin24233 -> 24233 bytes
-rw-r--r--test/fuzzing/fonts/oom-ccc61c92d589f895174cdef6ff2e3b20e9999a1a (renamed from test/api/fonts/oom-ccc61c92d589f895174cdef6ff2e3b20e9999a1a)bin63302 -> 63302 bytes
-rw-r--r--test/fuzzing/hb-shape-fuzzer.cc67
-rw-r--r--test/fuzzing/hb-subset-fuzzer.cc48
-rw-r--r--test/fuzzing/hb-subset-get-codepoints-fuzzer.cc23
-rw-r--r--test/fuzzing/main.cc28
-rwxr-xr-xtest/fuzzing/run-shape-fuzzer-tests.py78
-rwxr-xr-xtest/fuzzing/run-subset-fuzzer-tests.py38
-rw-r--r--test/shaping/CMakeLists.txt11
-rw-r--r--test/shaping/Makefile.am4
-rw-r--r--test/shaping/Makefile.in11
-rw-r--r--test/shaping/README.md4
-rw-r--r--test/shaping/data/Makefile.am1
-rw-r--r--test/shaping/data/Makefile.in6
-rw-r--r--test/shaping/data/aots/COPYING13
-rw-r--r--test/shaping/data/aots/Makefile.am37
-rw-r--r--test/shaping/data/aots/Makefile.in1012
-rw-r--r--test/shaping/data/aots/Makefile.sources126
-rw-r--r--test/shaping/data/aots/fonts/classdef1_font1.otfbin0 -> 6004 bytes
-rw-r--r--test/shaping/data/aots/fonts/classdef1_font2.otfbin0 -> 6020 bytes
-rw-r--r--test/shaping/data/aots/fonts/classdef1_font3.otfbin0 -> 6060 bytes
-rw-r--r--test/shaping/data/aots/fonts/classdef1_font4.otfbin0 -> 5984 bytes
-rw-r--r--test/shaping/data/aots/fonts/classdef2_font1.otfbin0 -> 6004 bytes
-rw-r--r--test/shaping/data/aots/fonts/classdef2_font2.otfbin0 -> 6016 bytes
-rw-r--r--test/shaping/data/aots/fonts/classdef2_font3.otfbin0 -> 6052 bytes
-rw-r--r--test/shaping/data/aots/fonts/classdef2_font4.otfbin0 -> 5984 bytes
-rw-r--r--test/shaping/data/aots/fonts/cmap0_font1.otfbin0 -> 5196 bytes
-rw-r--r--test/shaping/data/aots/fonts/cmap10_font1.otfbin0 -> 4968 bytes
-rw-r--r--test/shaping/data/aots/fonts/cmap10_font2.otfbin0 -> 4960 bytes
-rw-r--r--test/shaping/data/aots/fonts/cmap12_font1.otfbin0 -> 4980 bytes
-rw-r--r--test/shaping/data/aots/fonts/cmap14_font1.otfbin0 -> 5028 bytes
-rw-r--r--test/shaping/data/aots/fonts/cmap2_font1.otfbin0 -> 6000 bytes
-rw-r--r--test/shaping/data/aots/fonts/cmap4_font1.otfbin0 -> 4964 bytes
-rw-r--r--test/shaping/data/aots/fonts/cmap4_font2.otfbin0 -> 4956 bytes
-rw-r--r--test/shaping/data/aots/fonts/cmap4_font3.otfbin0 -> 4956 bytes
-rw-r--r--test/shaping/data/aots/fonts/cmap4_font4.otfbin0 -> 4972 bytes
-rw-r--r--test/shaping/data/aots/fonts/cmap6_font1.otfbin0 -> 4948 bytes
-rw-r--r--test/shaping/data/aots/fonts/cmap6_font2.otfbin0 -> 4944 bytes
-rw-r--r--test/shaping/data/aots/fonts/cmap8_font1.otfbin0 -> 13224 bytes
-rw-r--r--test/shaping/data/aots/fonts/cmap_composition_font1.otfbin0 -> 5096 bytes
-rw-r--r--test/shaping/data/aots/fonts/cmap_subtableselection_font1.otfbin0 -> 6412 bytes
-rw-r--r--test/shaping/data/aots/fonts/cmap_subtableselection_font2.otfbin0 -> 6140 bytes
-rw-r--r--test/shaping/data/aots/fonts/cmap_subtableselection_font3.otfbin0 -> 5872 bytes
-rw-r--r--test/shaping/data/aots/fonts/cmap_subtableselection_font4.otfbin0 -> 5600 bytes
-rw-r--r--test/shaping/data/aots/fonts/cmap_subtableselection_font5.otfbin0 -> 5332 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos1_1_lookupflag_f1.otfbin0 -> 5208 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos1_1_simple_f1.otfbin0 -> 5136 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos1_1_simple_f2.otfbin0 -> 5136 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos1_1_simple_f3.otfbin0 -> 5136 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos1_1_simple_f4.otfbin0 -> 5136 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos1_2_font1.otfbin0 -> 5108 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos1_2_font2.otfbin0 -> 5148 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos2_1_font6.otfbin0 -> 5120 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos2_1_font7.otfbin0 -> 5132 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos2_1_lookupflag_f1.otfbin0 -> 5220 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos2_1_lookupflag_f2.otfbin0 -> 5220 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos2_1_next_glyph_f1.otfbin0 -> 5180 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos2_1_next_glyph_f2.otfbin0 -> 5176 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos2_1_simple_f1.otfbin0 -> 5148 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos2_2_font1.otfbin0 -> 5148 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos2_2_font2.otfbin0 -> 5188 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos2_2_font3.otfbin0 -> 5188 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos2_2_font4.otfbin0 -> 5148 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos2_2_font5.otfbin0 -> 5140 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos3_font1.otfbin0 -> 5120 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos3_font2.otfbin0 -> 5160 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos3_font3.otfbin0 -> 5164 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos4_lookupflag_f1.otfbin0 -> 5256 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos4_lookupflag_f2.otfbin0 -> 5240 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos4_multiple_anchors_1.otfbin0 -> 5352 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos4_simple_1.otfbin0 -> 5200 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos5_font1.otfbin0 -> 5284 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos6_font1.otfbin0 -> 5176 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos7_1_font1.otfbin0 -> 5160 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos9_font1.otfbin0 -> 5096 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos9_font2.otfbin0 -> 5124 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos_chaining1_boundary_f1.otfbin0 -> 5496 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos_chaining1_boundary_f2.otfbin0 -> 5500 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos_chaining1_boundary_f3.otfbin0 -> 5496 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos_chaining1_boundary_f4.otfbin0 -> 5496 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos_chaining1_lookupflag_f1.otfbin0 -> 5520 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos_chaining1_multiple_subrules_f1.otfbin0 -> 5592 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos_chaining1_multiple_subrules_f2.otfbin0 -> 5592 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos_chaining1_next_glyph_f1.otfbin0 -> 5540 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos_chaining1_simple_f1.otfbin0 -> 5488 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos_chaining1_simple_f2.otfbin0 -> 5488 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos_chaining1_successive_f1.otfbin0 -> 5524 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos_chaining2_boundary_f1.otfbin0 -> 5704 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos_chaining2_boundary_f2.otfbin0 -> 5708 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos_chaining2_boundary_f3.otfbin0 -> 5704 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos_chaining2_boundary_f4.otfbin0 -> 5704 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos_chaining2_lookupflag_f1.otfbin0 -> 5728 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos_chaining2_multiple_subrules_f1.otfbin0 -> 5800 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos_chaining2_multiple_subrules_f2.otfbin0 -> 5800 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos_chaining2_next_glyph_f1.otfbin0 -> 5744 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos_chaining2_simple_f1.otfbin0 -> 5696 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos_chaining2_simple_f2.otfbin0 -> 5696 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos_chaining2_successive_f1.otfbin0 -> 5732 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos_chaining3_boundary_f1.otfbin0 -> 5504 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos_chaining3_boundary_f2.otfbin0 -> 5508 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos_chaining3_boundary_f3.otfbin0 -> 5500 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos_chaining3_boundary_f4.otfbin0 -> 5500 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos_chaining3_lookupflag_f1.otfbin0 -> 5548 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos_chaining3_next_glyph_f1.otfbin0 -> 5524 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos_chaining3_simple_f1.otfbin0 -> 5496 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos_chaining3_simple_f2.otfbin0 -> 5516 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos_chaining3_successive_f1.otfbin0 -> 5544 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos_context1_boundary_f1.otfbin0 -> 5480 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos_context1_boundary_f2.otfbin0 -> 5480 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos_context1_expansion_f1.otfbin0 -> 5492 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos_context1_lookupflag_f1.otfbin0 -> 5508 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos_context1_lookupflag_f2.otfbin0 -> 5500 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos_context1_multiple_subrules_f1.otfbin0 -> 5568 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos_context1_multiple_subrules_f2.otfbin0 -> 5568 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos_context1_next_glyph_f1.otfbin0 -> 5500 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos_context1_simple_f1.otfbin0 -> 5476 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos_context1_simple_f2.otfbin0 -> 5468 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos_context1_successive_f1.otfbin0 -> 5508 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos_context2_boundary_f1.otfbin0 -> 5492 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos_context2_boundary_f2.otfbin0 -> 5496 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos_context2_classes_f1.otfbin0 -> 5540 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos_context2_classes_f2.otfbin0 -> 5564 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos_context2_expansion_f1.otfbin0 -> 5524 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos_context2_lookupflag_f1.otfbin0 -> 5540 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos_context2_lookupflag_f2.otfbin0 -> 5532 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos_context2_multiple_subrules_f1.otfbin0 -> 5600 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos_context2_multiple_subrules_f2.otfbin0 -> 5600 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos_context2_next_glyph_f1.otfbin0 -> 5512 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos_context2_simple_f1.otfbin0 -> 5508 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos_context2_simple_f2.otfbin0 -> 5484 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos_context2_successive_f1.otfbin0 -> 5544 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos_context3_boundary_f1.otfbin0 -> 5476 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos_context3_boundary_f2.otfbin0 -> 5472 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos_context3_lookupflag_f1.otfbin0 -> 5512 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos_context3_lookupflag_f2.otfbin0 -> 5504 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos_context3_next_glyph_f1.otfbin0 -> 5496 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos_context3_simple_f1.otfbin0 -> 5480 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos_context3_successive_f1.otfbin0 -> 5516 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub1_1_lookupflag_f1.otfbin0 -> 5208 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub1_1_modulo_f1.otfbin0 -> 5216 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub1_1_simple_f1.otfbin0 -> 5136 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub1_2_lookupflag_f1.otfbin0 -> 5212 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub1_2_simple_f1.otfbin0 -> 5140 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub2_1_lookupflag_f1.otfbin0 -> 5224 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub2_1_multiple_sequences_f1.otfbin0 -> 5248 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub2_1_simple_f1.otfbin0 -> 5144 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub3_1_lookupflag_f1.otfbin0 -> 5224 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub3_1_multiple_f1.otfbin0 -> 5168 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub3_1_simple_f1.otfbin0 -> 5144 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub4_1_lookupflag_f1.otfbin0 -> 5220 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub4_1_multiple_ligatures_f1.otfbin0 -> 5252 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub4_1_multiple_ligatures_f2.otfbin0 -> 5252 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub4_1_multiple_ligsets_f1.otfbin0 -> 5240 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub4_1_simple_f1.otfbin0 -> 5148 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub7_font1.otfbin0 -> 5096 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub7_font2.otfbin0 -> 5116 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub_chaining1_boundary_f1.otfbin0 -> 5516 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub_chaining1_boundary_f2.otfbin0 -> 5520 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub_chaining1_boundary_f3.otfbin0 -> 5520 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub_chaining1_boundary_f4.otfbin0 -> 5520 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub_chaining1_lookupflag_f1.otfbin0 -> 5544 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub_chaining1_multiple_subrules_f1.otfbin0 -> 5616 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub_chaining1_multiple_subrules_f2.otfbin0 -> 5616 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub_chaining1_next_glyph_f1.otfbin0 -> 5560 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub_chaining1_simple_f1.otfbin0 -> 5508 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub_chaining1_simple_f2.otfbin0 -> 5512 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub_chaining1_successive_f1.otfbin0 -> 5544 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub_chaining2_boundary_f1.otfbin0 -> 5724 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub_chaining2_boundary_f2.otfbin0 -> 5728 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub_chaining2_boundary_f3.otfbin0 -> 5728 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub_chaining2_boundary_f4.otfbin0 -> 5728 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub_chaining2_lookupflag_f1.otfbin0 -> 5752 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub_chaining2_multiple_subrules_f1.otfbin0 -> 5824 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub_chaining2_multiple_subrules_f2.otfbin0 -> 5824 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub_chaining2_next_glyph_f1.otfbin0 -> 5764 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub_chaining2_simple_f1.otfbin0 -> 5716 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub_chaining2_simple_f2.otfbin0 -> 5720 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub_chaining2_successive_f1.otfbin0 -> 5752 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub_chaining3_boundary_f1.otfbin0 -> 5528 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub_chaining3_boundary_f2.otfbin0 -> 5532 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub_chaining3_boundary_f3.otfbin0 -> 5524 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub_chaining3_boundary_f4.otfbin0 -> 5524 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub_chaining3_lookupflag_f1.otfbin0 -> 5572 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub_chaining3_next_glyph_f1.otfbin0 -> 5548 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub_chaining3_simple_f1.otfbin0 -> 5520 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub_chaining3_simple_f2.otfbin0 -> 5540 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub_chaining3_successive_f1.otfbin0 -> 5568 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub_context1_boundary_f1.otfbin0 -> 5500 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub_context1_boundary_f2.otfbin0 -> 5504 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub_context1_expansion_f1.otfbin0 -> 5516 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub_context1_lookupflag_f1.otfbin0 -> 5532 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub_context1_lookupflag_f2.otfbin0 -> 5524 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub_context1_multiple_subrules_f1.otfbin0 -> 5592 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub_context1_multiple_subrules_f2.otfbin0 -> 5592 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub_context1_next_glyph_f1.otfbin0 -> 5520 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub_context1_simple_f1.otfbin0 -> 5500 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub_context1_simple_f2.otfbin0 -> 5492 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub_context1_successive_f1.otfbin0 -> 5528 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub_context2_boundary_f1.otfbin0 -> 5516 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub_context2_boundary_f2.otfbin0 -> 5516 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub_context2_classes_f1.otfbin0 -> 5564 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub_context2_classes_f2.otfbin0 -> 5584 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub_context2_expansion_f1.otfbin0 -> 5544 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub_context2_lookupflag_f1.otfbin0 -> 5560 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub_context2_lookupflag_f2.otfbin0 -> 5552 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub_context2_multiple_subrules_f1.otfbin0 -> 5620 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub_context2_multiple_subrules_f2.otfbin0 -> 5620 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub_context2_next_glyph_f1.otfbin0 -> 5536 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub_context2_simple_f1.otfbin0 -> 5528 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub_context2_simple_f2.otfbin0 -> 5504 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub_context2_successive_f1.otfbin0 -> 5568 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub_context3_boundary_f1.otfbin0 -> 5500 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub_context3_boundary_f2.otfbin0 -> 5496 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub_context3_lookupflag_f1.otfbin0 -> 5536 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub_context3_lookupflag_f2.otfbin0 -> 5528 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub_context3_next_glyph_f1.otfbin0 -> 5520 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub_context3_simple_f1.otfbin0 -> 5504 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub_context3_successive_f1.otfbin0 -> 5540 bytes
-rw-r--r--test/shaping/data/aots/fonts/lookupflag_ignore_attach_f1.otfbin0 -> 5416 bytes
-rw-r--r--test/shaping/data/aots/fonts/lookupflag_ignore_base_f1.otfbin0 -> 5256 bytes
-rw-r--r--test/shaping/data/aots/fonts/lookupflag_ignore_combination_f1.otfbin0 -> 5408 bytes
-rw-r--r--test/shaping/data/aots/fonts/lookupflag_ignore_ligatures_f1.otfbin0 -> 5320 bytes
-rw-r--r--test/shaping/data/aots/fonts/lookupflag_ignore_marks_f1.otfbin0 -> 5288 bytes
-rw-r--r--test/shaping/data/aots/tests/classdef1.tests1
-rw-r--r--test/shaping/data/aots/tests/classdef1_empty.tests1
-rw-r--r--test/shaping/data/aots/tests/classdef1_multiple.tests1
-rw-r--r--test/shaping/data/aots/tests/classdef1_single.tests1
-rw-r--r--test/shaping/data/aots/tests/classdef2.tests1
-rw-r--r--test/shaping/data/aots/tests/classdef2_empty.tests1
-rw-r--r--test/shaping/data/aots/tests/classdef2_multiple.tests1
-rw-r--r--test/shaping/data/aots/tests/classdef2_single.tests1
-rw-r--r--test/shaping/data/aots/tests/gpos1_1_lookupflag.tests1
-rw-r--r--test/shaping/data/aots/tests/gpos1_1_simple.tests4
-rw-r--r--test/shaping/data/aots/tests/gpos1_2.tests1
-rw-r--r--test/shaping/data/aots/tests/gpos1_2_lookupflag.tests1
-rw-r--r--test/shaping/data/aots/tests/gpos2_1.tests2
-rw-r--r--test/shaping/data/aots/tests/gpos2_1_lookupflag.tests2
-rw-r--r--test/shaping/data/aots/tests/gpos2_1_next_glyph.tests2
-rw-r--r--test/shaping/data/aots/tests/gpos2_1_simple.tests2
-rw-r--r--test/shaping/data/aots/tests/gpos2_2.tests5
-rw-r--r--test/shaping/data/aots/tests/gpos3.tests11
-rw-r--r--test/shaping/data/aots/tests/gpos3_lookupflag.tests2
-rw-r--r--test/shaping/data/aots/tests/gpos4_lookupflag.tests2
-rw-r--r--test/shaping/data/aots/tests/gpos4_multiple_anchors.tests1
-rw-r--r--test/shaping/data/aots/tests/gpos4_simple.tests5
-rw-r--r--test/shaping/data/aots/tests/gpos5.tests2
-rw-r--r--test/shaping/data/aots/tests/gpos6.tests3
-rw-r--r--test/shaping/data/aots/tests/gpos7_1.tests2
-rw-r--r--test/shaping/data/aots/tests/gpos9.tests2
-rw-r--r--test/shaping/data/aots/tests/gpos_chaining1_boundary.tests4
-rw-r--r--test/shaping/data/aots/tests/gpos_chaining1_lookupflag.tests1
-rw-r--r--test/shaping/data/aots/tests/gpos_chaining1_multiple_subrules.tests2
-rw-r--r--test/shaping/data/aots/tests/gpos_chaining1_next_glyph.tests1
-rw-r--r--test/shaping/data/aots/tests/gpos_chaining1_simple.tests11
-rw-r--r--test/shaping/data/aots/tests/gpos_chaining1_successive.tests1
-rw-r--r--test/shaping/data/aots/tests/gpos_chaining2_boundary.tests4
-rw-r--r--test/shaping/data/aots/tests/gpos_chaining2_lookupflag.tests1
-rw-r--r--test/shaping/data/aots/tests/gpos_chaining2_multiple_subrules.tests2
-rw-r--r--test/shaping/data/aots/tests/gpos_chaining2_next_glyph.tests1
-rw-r--r--test/shaping/data/aots/tests/gpos_chaining2_simple.tests11
-rw-r--r--test/shaping/data/aots/tests/gpos_chaining2_successive.tests1
-rw-r--r--test/shaping/data/aots/tests/gpos_chaining3_boundary.tests4
-rw-r--r--test/shaping/data/aots/tests/gpos_chaining3_lookupflag.tests1
-rw-r--r--test/shaping/data/aots/tests/gpos_chaining3_next_glyph.tests1
-rw-r--r--test/shaping/data/aots/tests/gpos_chaining3_simple.tests11
-rw-r--r--test/shaping/data/aots/tests/gpos_chaining3_successive.tests1
-rw-r--r--test/shaping/data/aots/tests/gpos_context1_boundary.tests2
-rw-r--r--test/shaping/data/aots/tests/gpos_context1_expansion.tests1
-rw-r--r--test/shaping/data/aots/tests/gpos_context1_lookupflag.tests2
-rw-r--r--test/shaping/data/aots/tests/gpos_context1_multiple_subrules.tests2
-rw-r--r--test/shaping/data/aots/tests/gpos_context1_next_glyph.tests1
-rw-r--r--test/shaping/data/aots/tests/gpos_context1_simple.tests3
-rw-r--r--test/shaping/data/aots/tests/gpos_context1_successive.tests1
-rw-r--r--test/shaping/data/aots/tests/gpos_context2_boundary.tests2
-rw-r--r--test/shaping/data/aots/tests/gpos_context2_classes.tests2
-rw-r--r--test/shaping/data/aots/tests/gpos_context2_expansion.tests1
-rw-r--r--test/shaping/data/aots/tests/gpos_context2_lookupflag.tests2
-rw-r--r--test/shaping/data/aots/tests/gpos_context2_multiple_subrules.tests2
-rw-r--r--test/shaping/data/aots/tests/gpos_context2_next_glyph.tests1
-rw-r--r--test/shaping/data/aots/tests/gpos_context2_simple.tests3
-rw-r--r--test/shaping/data/aots/tests/gpos_context2_successive.tests1
-rw-r--r--test/shaping/data/aots/tests/gpos_context3_boundary.tests2
-rw-r--r--test/shaping/data/aots/tests/gpos_context3_lookupflag.tests2
-rw-r--r--test/shaping/data/aots/tests/gpos_context3_next_glyph.tests1
-rw-r--r--test/shaping/data/aots/tests/gpos_context3_simple.tests2
-rw-r--r--test/shaping/data/aots/tests/gpos_context3_successive.tests1
-rw-r--r--test/shaping/data/aots/tests/gsub1_1_lookupflag.tests1
-rw-r--r--test/shaping/data/aots/tests/gsub1_1_modulo.tests1
-rw-r--r--test/shaping/data/aots/tests/gsub1_1_simple.tests1
-rw-r--r--test/shaping/data/aots/tests/gsub1_2_lookupflag.tests1
-rw-r--r--test/shaping/data/aots/tests/gsub1_2_simple.tests1
-rw-r--r--test/shaping/data/aots/tests/gsub2_1_lookupflag.tests1
-rw-r--r--test/shaping/data/aots/tests/gsub2_1_multiple_sequences.tests1
-rw-r--r--test/shaping/data/aots/tests/gsub2_1_simple.tests2
-rw-r--r--test/shaping/data/aots/tests/gsub3_1_lookupflag.tests1
-rw-r--r--test/shaping/data/aots/tests/gsub3_1_multiple.tests1
-rw-r--r--test/shaping/data/aots/tests/gsub3_1_simple.tests1
-rw-r--r--test/shaping/data/aots/tests/gsub4_1_lookupflag.tests1
-rw-r--r--test/shaping/data/aots/tests/gsub4_1_multiple_ligatures.tests2
-rw-r--r--test/shaping/data/aots/tests/gsub4_1_multiple_ligsets.tests1
-rw-r--r--test/shaping/data/aots/tests/gsub4_1_simple.tests1
-rw-r--r--test/shaping/data/aots/tests/gsub7.tests2
-rw-r--r--test/shaping/data/aots/tests/gsub_chaining1_boundary.tests4
-rw-r--r--test/shaping/data/aots/tests/gsub_chaining1_lookupflag.tests1
-rw-r--r--test/shaping/data/aots/tests/gsub_chaining1_multiple_subrules.tests2
-rw-r--r--test/shaping/data/aots/tests/gsub_chaining1_next_glyph.tests1
-rw-r--r--test/shaping/data/aots/tests/gsub_chaining1_simple.tests11
-rw-r--r--test/shaping/data/aots/tests/gsub_chaining1_successive.tests1
-rw-r--r--test/shaping/data/aots/tests/gsub_chaining2_boundary.tests4
-rw-r--r--test/shaping/data/aots/tests/gsub_chaining2_lookupflag.tests1
-rw-r--r--test/shaping/data/aots/tests/gsub_chaining2_multiple_subrules.tests2
-rw-r--r--test/shaping/data/aots/tests/gsub_chaining2_next_glyph.tests1
-rw-r--r--test/shaping/data/aots/tests/gsub_chaining2_simple.tests11
-rw-r--r--test/shaping/data/aots/tests/gsub_chaining2_successive.tests1
-rw-r--r--test/shaping/data/aots/tests/gsub_chaining3_boundary.tests4
-rw-r--r--test/shaping/data/aots/tests/gsub_chaining3_lookupflag.tests1
-rw-r--r--test/shaping/data/aots/tests/gsub_chaining3_next_glyph.tests1
-rw-r--r--test/shaping/data/aots/tests/gsub_chaining3_simple.tests11
-rw-r--r--test/shaping/data/aots/tests/gsub_chaining3_successive.tests1
-rw-r--r--test/shaping/data/aots/tests/gsub_context1_boundary.tests2
-rw-r--r--test/shaping/data/aots/tests/gsub_context1_expansion.tests1
-rw-r--r--test/shaping/data/aots/tests/gsub_context1_lookupflag.tests2
-rw-r--r--test/shaping/data/aots/tests/gsub_context1_multiple_subrules.tests2
-rw-r--r--test/shaping/data/aots/tests/gsub_context1_next_glyph.tests1
-rw-r--r--test/shaping/data/aots/tests/gsub_context1_simple.tests3
-rw-r--r--test/shaping/data/aots/tests/gsub_context1_successive.tests1
-rw-r--r--test/shaping/data/aots/tests/gsub_context2_boundary.tests2
-rw-r--r--test/shaping/data/aots/tests/gsub_context2_classes.tests2
-rw-r--r--test/shaping/data/aots/tests/gsub_context2_expansion.tests1
-rw-r--r--test/shaping/data/aots/tests/gsub_context2_lookupflag.tests2
-rw-r--r--test/shaping/data/aots/tests/gsub_context2_multiple_subrules.tests2
-rw-r--r--test/shaping/data/aots/tests/gsub_context2_next_glyph.tests1
-rw-r--r--test/shaping/data/aots/tests/gsub_context2_simple.tests3
-rw-r--r--test/shaping/data/aots/tests/gsub_context2_successive.tests1
-rw-r--r--test/shaping/data/aots/tests/gsub_context3_boundary.tests2
-rw-r--r--test/shaping/data/aots/tests/gsub_context3_lookupflag.tests2
-rw-r--r--test/shaping/data/aots/tests/gsub_context3_next_glyph.tests1
-rw-r--r--test/shaping/data/aots/tests/gsub_context3_simple.tests2
-rw-r--r--test/shaping/data/aots/tests/gsub_context3_successive.tests1
-rw-r--r--test/shaping/data/aots/tests/lookupflag_ignore_attach.tests5
-rw-r--r--test/shaping/data/aots/tests/lookupflag_ignore_base.tests2
-rw-r--r--test/shaping/data/aots/tests/lookupflag_ignore_combination.tests3
-rw-r--r--test/shaping/data/aots/tests/lookupflag_ignore_ligatures.tests3
-rw-r--r--test/shaping/data/aots/tests/lookupflag_ignore_marks.tests1
-rw-r--r--test/shaping/data/in-house/Makefile.in32
-rw-r--r--test/shaping/data/in-house/Makefile.sources15
-rw-r--r--test/shaping/data/in-house/fonts/03e3f463c3a985bc42096620cc415342818454fb.ttfbin0 -> 2904 bytes
-rw-r--r--test/shaping/data/in-house/fonts/1a5face3fcbd929d228235c2f72bbd6f8eb37424.ttfbin0 -> 8188 bytes
-rw-r--r--test/shaping/data/in-house/fonts/28f497629c04ceb15546c9a70e0730125ed6698d.ttfbin0 -> 1496 bytes
-rw-r--r--test/shaping/data/in-house/fonts/2a670df15b73a5dc75a5cc491bde5ac93c5077dc.ttfbin0 -> 1344 bytes
-rw-r--r--test/shaping/data/in-house/fonts/2c25beb56d9c556622d56b0b5d02b4670c034f89.ttfbin0 -> 2460 bytes
-rw-r--r--test/shaping/data/in-house/fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttfbin0 -> 24392 bytes
-rw-r--r--test/shaping/data/in-house/fonts/3c96e7a303c58475a8c750bf4289bbe73784f37d.ttfbin0 -> 3364 bytes
-rw-r--r--test/shaping/data/in-house/fonts/3cf6f8ac6d647473a43a3100e7494b202b2cfafe.ttfbin0 -> 16596 bytes
-rw-r--r--test/shaping/data/in-house/fonts/46669c8860cbfea13562a6ca0d83130ee571137b.ttfbin0 -> 7184 bytes
-rw-r--r--test/shaping/data/in-house/fonts/4afb0e8b9a86bb9bd73a1247de4e33fbe3c1fd93.ttfbin0 -> 1824 bytes
-rw-r--r--test/shaping/data/in-house/fonts/4cbbc461be066fccc611dcc634af6e8cb2705537.ttfbin0 -> 2808 bytes
-rw-r--r--test/shaping/data/in-house/fonts/4d4206e30b2dbf1c1ef492a8eae1c9e7829ebad8.ttfbin0 -> 51924 bytes
-rw-r--r--test/shaping/data/in-house/fonts/5bb74492f5e0ffa1fbb72e4c881be035120b6513.ttfbin0 -> 1352 bytes
-rw-r--r--test/shaping/data/in-house/fonts/604026ae5aaca83c49cd8416909d71ba3e1c1194.ttfbin0 -> 4120 bytes
-rw-r--r--test/shaping/data/in-house/fonts/641ca9d7808b01cafa9a666c13811c9b56eb9c52.ttfbin0 -> 11492 bytes
-rw-r--r--test/shaping/data/in-house/fonts/738d9f3b8c2dfd03875bf35a61d28fd78faf17c8.ttfbin0 -> 2336 bytes
-rw-r--r--test/shaping/data/in-house/fonts/7d18685e1529e4ceaad5b6095dfab2f9789e5bce.ttfbin0 -> 3452 bytes
-rw-r--r--test/shaping/data/in-house/fonts/8116e5d8fedfbec74e45dc350d2416d810bed8c4.ttfbin0 -> 4364 bytes
-rw-r--r--test/shaping/data/in-house/fonts/86cdd983c4e4c4d7f27dd405d6ceb7d4b9ed3d35.ttfbin0 -> 968 bytes
-rw-r--r--test/shaping/data/in-house/fonts/881642af1667ae30a54e58de8be904566d00508f.ttfbin0 -> 2760 bytes
-rw-r--r--test/shaping/data/in-house/fonts/8d9c4b193808b8bde94389ba7831c1fc6f9e794e.ttfbin0 -> 1548 bytes
-rw-r--r--test/shaping/data/in-house/fonts/9fc3e6960b3520e5304033ef5fd540285f72f14d.ttfbin0 -> 2380 bytes
-rw-r--r--test/shaping/data/in-house/fonts/DFONT.dfontbin0 -> 3505 bytes
-rw-r--r--test/shaping/data/in-house/fonts/MORXTwentyeight.ttfbin0 -> 2660 bytes
-rw-r--r--test/shaping/data/in-house/fonts/TRAK.ttfbin0 -> 2456 bytes
-rw-r--r--test/shaping/data/in-house/fonts/TTC.ttcbin0 -> 2608 bytes
-rw-r--r--test/shaping/data/in-house/fonts/ab14b4eb9d7a67e293f51d30d719add06c9d6e06.ttfbin0 -> 1792 bytes
-rw-r--r--test/shaping/data/in-house/fonts/af85624080af5627fb050f570d148a62f04fda74.ttfbin0 -> 2656 bytes
-rw-r--r--test/shaping/data/in-house/fonts/b6031119874ae9ff1dd65383a335e361c0962220.ttfbin0 -> 2564 bytes
-rw-r--r--test/shaping/data/in-house/fonts/b722a7d09e60421f3efbc706ad348ab47b88567b.ttfbin0 -> 4672 bytes
-rw-r--r--test/shaping/data/in-house/fonts/bb29ce50df2bdba2d10726427c6b7609bf460e04.ttfbin74856 -> 0 bytes
-rw-r--r--test/shaping/data/in-house/fonts/d3129450fafe5e5c98cfc25a4e71809b1b4d2855.ttfbin0 -> 956 bytes
-rw-r--r--test/shaping/data/in-house/fonts/dcf774ca21062e7439f98658b18974ea8b956d0c.ttfbin0 -> 2568 bytes
-rw-r--r--test/shaping/data/in-house/fonts/e39391c77a6321c2ac7a2d644de0396470cd4bfe.ttfbin0 -> 34116 bytes
-rw-r--r--test/shaping/data/in-house/tests/aat-morx.tests1
-rw-r--r--test/shaping/data/in-house/tests/aat-trak.tests11
-rw-r--r--test/shaping/data/in-house/tests/arabic-fallback-shaping.tests2
-rw-r--r--test/shaping/data/in-house/tests/arabic-mark-attach.tests1
-rw-r--r--test/shaping/data/in-house/tests/cluster.tests2
-rw-r--r--test/shaping/data/in-house/tests/collections.tests6
-rw-r--r--test/shaping/data/in-house/tests/color-fonts.tests2
-rw-r--r--test/shaping/data/in-house/tests/cursive-positioning.tests1
-rw-r--r--test/shaping/data/in-house/tests/emoji-flag-tags.tests2
-rw-r--r--test/shaping/data/in-house/tests/emoji.tests5
-rw-r--r--test/shaping/data/in-house/tests/fallback-positioning.tests4
-rw-r--r--test/shaping/data/in-house/tests/fuzzed.tests23
-rw-r--r--test/shaping/data/in-house/tests/indic-joiner-candrabindu.tests2
-rw-r--r--test/shaping/data/in-house/tests/indic-joiners.tests6
-rw-r--r--test/shaping/data/in-house/tests/indic-old-spec.tests2
-rw-r--r--test/shaping/data/in-house/tests/indic-vowel-letter-spoofing.tests53
-rw-r--r--test/shaping/data/in-house/tests/kern-format2.tests3
-rw-r--r--test/shaping/data/in-house/tests/khmer-mark-order.tests25
-rw-r--r--test/shaping/data/in-house/tests/khmer-misc.tests89
-rw-r--r--test/shaping/data/in-house/tests/language-tags.tests1
-rw-r--r--test/shaping/data/in-house/tests/macos.tests37
-rw-r--r--test/shaping/data/in-house/tests/mongolian-variation-selector.tests17
-rw-r--r--test/shaping/data/in-house/tests/myanmar-zawgyi.tests1
-rw-r--r--test/shaping/data/in-house/tests/rand.tests3
-rw-r--r--test/shaping/data/in-house/tests/spaces.tests17
-rw-r--r--test/shaping/data/in-house/tests/use-indic3.tests1
-rw-r--r--test/shaping/data/in-house/tests/use-syllable.tests4
-rw-r--r--test/shaping/data/in-house/tests/use.tests9
-rw-r--r--test/shaping/data/in-house/tests/vertical.tests3
-rw-r--r--test/shaping/data/text-rendering-tests/Makefile.in59
-rw-r--r--test/shaping/data/text-rendering-tests/Makefile.sources29
-rwxr-xr-xtest/shaping/data/text-rendering-tests/extract-tests.py18
-rw-r--r--test/shaping/data/text-rendering-tests/fonts/TestGSUBThree.ttfbin0 -> 1504 bytes
-rw-r--r--test/shaping/data/text-rendering-tests/fonts/TestGVAR-Composite-0.ttfbin0 -> 3136 bytes
-rw-r--r--test/shaping/data/text-rendering-tests/fonts/TestGVAR-Composite-Missing.ttfbin0 -> 2984 bytes
-rw-r--r--test/shaping/data/text-rendering-tests/fonts/TestMORXForty.ttfbin0 -> 2408 bytes
-rw-r--r--test/shaping/data/text-rendering-tests/fonts/TestMORXFourtyone.ttfbin0 -> 2248 bytes
-rw-r--r--test/shaping/data/text-rendering-tests/fonts/TestMORXThirtyeight.ttfbin0 -> 2444 bytes
-rw-r--r--test/shaping/data/text-rendering-tests/fonts/TestMORXThirtyfive.ttfbin0 -> 1968 bytes
-rw-r--r--test/shaping/data/text-rendering-tests/fonts/TestMORXThirtyfour.ttfbin0 -> 3608 bytes
-rw-r--r--test/shaping/data/text-rendering-tests/fonts/TestMORXThirtynine.ttfbin0 -> 2436 bytes
-rw-r--r--test/shaping/data/text-rendering-tests/fonts/TestMORXThirtyone.ttfbin0 -> 2964 bytes
-rw-r--r--test/shaping/data/text-rendering-tests/fonts/TestMORXThirtyseven.ttfbin0 -> 2444 bytes
-rw-r--r--test/shaping/data/text-rendering-tests/fonts/TestMORXThirtysix.ttfbin0 -> 1836 bytes
-rw-r--r--test/shaping/data/text-rendering-tests/fonts/TestMORXThirtythree.ttfbin0 -> 1520 bytes
-rw-r--r--test/shaping/data/text-rendering-tests/fonts/TestMORXThirtytwo.ttfbin0 -> 2948 bytes
-rw-r--r--test/shaping/data/text-rendering-tests/fonts/TestMORXTwentyfour.ttfbin0 -> 1828 bytes
-rw-r--r--test/shaping/data/text-rendering-tests/fonts/TestMORXTwentynine.ttfbin0 -> 3012 bytes
-rw-r--r--test/shaping/data/text-rendering-tests/fonts/TestTRAKOne.ttfbin0 -> 1752 bytes
-rw-r--r--test/shaping/data/text-rendering-tests/tests/GSUB-3.tests1
-rw-r--r--test/shaping/data/text-rendering-tests/tests/MORX-1.tests1
-rw-r--r--test/shaping/data/text-rendering-tests/tests/MORX-10.tests1
-rw-r--r--test/shaping/data/text-rendering-tests/tests/MORX-11.tests1
-rw-r--r--test/shaping/data/text-rendering-tests/tests/MORX-12.tests3
-rw-r--r--test/shaping/data/text-rendering-tests/tests/MORX-13.tests1
-rw-r--r--test/shaping/data/text-rendering-tests/tests/MORX-14.tests2
-rw-r--r--test/shaping/data/text-rendering-tests/tests/MORX-16.tests1
-rw-r--r--test/shaping/data/text-rendering-tests/tests/MORX-17.tests1
-rw-r--r--test/shaping/data/text-rendering-tests/tests/MORX-18.tests4
-rw-r--r--test/shaping/data/text-rendering-tests/tests/MORX-19.tests2
-rw-r--r--test/shaping/data/text-rendering-tests/tests/MORX-2.tests16
-rw-r--r--test/shaping/data/text-rendering-tests/tests/MORX-20.tests7
-rw-r--r--test/shaping/data/text-rendering-tests/tests/MORX-21.tests1
-rw-r--r--test/shaping/data/text-rendering-tests/tests/MORX-22.tests1
-rw-r--r--test/shaping/data/text-rendering-tests/tests/MORX-23.tests1
-rw-r--r--test/shaping/data/text-rendering-tests/tests/MORX-24.tests1
-rw-r--r--test/shaping/data/text-rendering-tests/tests/MORX-25.tests9
-rw-r--r--test/shaping/data/text-rendering-tests/tests/MORX-26.tests2
-rw-r--r--test/shaping/data/text-rendering-tests/tests/MORX-27.tests3
-rw-r--r--test/shaping/data/text-rendering-tests/tests/MORX-28.tests5
-rw-r--r--test/shaping/data/text-rendering-tests/tests/MORX-29.tests4
-rw-r--r--test/shaping/data/text-rendering-tests/tests/MORX-3.tests16
-rw-r--r--test/shaping/data/text-rendering-tests/tests/MORX-30.tests4
-rw-r--r--test/shaping/data/text-rendering-tests/tests/MORX-31.tests8
-rw-r--r--test/shaping/data/text-rendering-tests/tests/MORX-32.tests4
-rw-r--r--test/shaping/data/text-rendering-tests/tests/MORX-33.tests3
-rw-r--r--test/shaping/data/text-rendering-tests/tests/MORX-34.tests1
-rw-r--r--test/shaping/data/text-rendering-tests/tests/MORX-35.tests2
-rw-r--r--test/shaping/data/text-rendering-tests/tests/MORX-36.tests1
-rw-r--r--test/shaping/data/text-rendering-tests/tests/MORX-37.tests4
-rw-r--r--test/shaping/data/text-rendering-tests/tests/MORX-38.tests4
-rw-r--r--test/shaping/data/text-rendering-tests/tests/MORX-39.tests4
-rw-r--r--test/shaping/data/text-rendering-tests/tests/MORX-4.tests15
-rw-r--r--test/shaping/data/text-rendering-tests/tests/MORX-40.tests4
-rw-r--r--test/shaping/data/text-rendering-tests/tests/MORX-41.tests4
-rw-r--r--test/shaping/data/text-rendering-tests/tests/MORX-5.tests25
-rw-r--r--test/shaping/data/text-rendering-tests/tests/MORX-6.tests1
-rw-r--r--test/shaping/data/text-rendering-tests/tests/MORX-7.tests1
-rw-r--r--test/shaping/data/text-rendering-tests/tests/MORX-8.tests3
-rw-r--r--test/shaping/data/text-rendering-tests/tests/MORX-9.tests1
-rw-r--r--test/shaping/hb_test_tools.py10
-rwxr-xr-xtest/shaping/record-test.sh5
-rwxr-xr-xtest/shaping/run-tests.py132
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-assamese/utrrs/LICENSE (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-assamese/utrrs/LICENSE)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-assamese/utrrs/README (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-assamese/utrrs/README)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-assamese/utrrs/SOURCES (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-assamese/utrrs/SOURCES)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-assamese/utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalVowels.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-assamese/utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalVowels.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-assamese/utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-assamese/utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-assamese/utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-assamese/utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-assamese/utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-assamese/utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-assamese/utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-assamese/utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-assamese/utrrs/codepoint/IndicFontFeatureCodepoint-Reserved.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-assamese/utrrs/codepoint/IndicFontFeatureCodepoint-Reserved.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-assamese/utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-assamese/utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-assamese/utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-assamese/utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-assamese/utrrs/gpos/IndicFontFeatureGPOS-BelowBase.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-assamese/utrrs/gpos/IndicFontFeatureGPOS-BelowBase.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-assamese/utrrs/gsub/IndicFontFeatureGSUB.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-assamese/utrrs/gsub/IndicFontFeatureGSUB.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-bengali/bengali-vowel-letters.txt3
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-bengali/misc/misc.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-bengali/misc/misc.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-bengali/misc/reph.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-bengali/misc/reph.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-bengali/utrrs/LICENSE (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-bengali/utrrs/LICENSE)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-bengali/utrrs/README (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-bengali/utrrs/README)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-bengali/utrrs/SOURCES (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-bengali/utrrs/SOURCES)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-bengali/utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalVowels.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-bengali/utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalVowels.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-bengali/utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-bengali/utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-bengali/utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-bengali/utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-bengali/utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-bengali/utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-bengali/utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-bengali/utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-bengali/utrrs/codepoint/IndicFontFeatureCodepoint-Reserved.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-bengali/utrrs/codepoint/IndicFontFeatureCodepoint-Reserved.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-bengali/utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-bengali/utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-bengali/utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-bengali/utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-bengali/utrrs/gpos/IndicFontFeatureGPOS-BelowBase.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-bengali/utrrs/gpos/IndicFontFeatureGPOS-BelowBase.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-bengali/utrrs/gsub/IndicFontFeatureGSUB.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-bengali/utrrs/gsub/IndicFontFeatureGSUB.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-devanagari/devanagari-atomic-consonants.txt33
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-devanagari/devanagari-vowel-letters.txt17
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-devanagari/misc/dottedcircle.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-devanagari/misc/dottedcircle.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-devanagari/misc/eyelash.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-devanagari/misc/eyelash.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-devanagari/misc/joiners.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-devanagari/misc/joiners.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-devanagari/misc/misc.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-devanagari/misc/misc.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-devanagari/misc/spec-deviations.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-devanagari/misc/spec-deviations.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-devanagari/misc/tricky-reordering.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-devanagari/misc/tricky-reordering.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-devanagari/utrrs/LICENSE (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-devanagari/utrrs/LICENSE)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-devanagari/utrrs/README (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-devanagari/utrrs/README)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-devanagari/utrrs/SOURCES (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-devanagari/utrrs/SOURCES)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-devanagari/utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalConsonants.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-devanagari/utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalConsonants.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-devanagari/utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalVowels.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-devanagari/utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalVowels.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-devanagari/utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-devanagari/utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-devanagari/utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-devanagari/utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-devanagari/utrrs/codepoint/IndicFontFeatureCodepoint-DevnagariSpecificAddition.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-devanagari/utrrs/codepoint/IndicFontFeatureCodepoint-DevnagariSpecificAddition.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-devanagari/utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-devanagari/utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-devanagari/utrrs/codepoint/IndicFontFeatureCodepoint-GenericPunctuation.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-devanagari/utrrs/codepoint/IndicFontFeatureCodepoint-GenericPunctuation.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-devanagari/utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-devanagari/utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-devanagari/utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-devanagari/utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-devanagari/utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-devanagari/utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-devanagari/utrrs/gpos/IndicFontFeatureGPOS-BelowBase.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-devanagari/utrrs/gpos/IndicFontFeatureGPOS-BelowBase.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-devanagari/utrrs/gsub/IndicFontFeatureGSUB.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-devanagari/utrrs/gsub/IndicFontFeatureGSUB.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-gujarati/gujarati-vowel-letters.txt8
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-gujarati/utrrs/LICENSE (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-gujarati/utrrs/LICENSE)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-gujarati/utrrs/README (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-gujarati/utrrs/README)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-gujarati/utrrs/SOURCES (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-gujarati/utrrs/SOURCES)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-gujarati/utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalVowels.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-gujarati/utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalVowels.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-gujarati/utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-gujarati/utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-gujarati/utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-gujarati/utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-gujarati/utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-gujarati/utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-gujarati/utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-gujarati/utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-gujarati/utrrs/codepoint/IndicFontFeatureCodepoint-Reserved.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-gujarati/utrrs/codepoint/IndicFontFeatureCodepoint-Reserved.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-gujarati/utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-gujarati/utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-gujarati/utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-gujarati/utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-gujarati/utrrs/gpos/IndicFontFeatureGPOS-BelowBase.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-gujarati/utrrs/gpos/IndicFontFeatureGPOS-BelowBase.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-gujarati/utrrs/gsub/IndicFontFeatureGSUB.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-gujarati/utrrs/gsub/IndicFontFeatureGSUB.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-gurmukhi/gurmukhi-vowel-letters.txt9
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-gurmukhi/misc/misc.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-gurmukhi/misc/misc.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-gurmukhi/utrrs/LICENSE (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-gurmukhi/utrrs/LICENSE)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-gurmukhi/utrrs/README (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-gurmukhi/utrrs/README)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-gurmukhi/utrrs/SOURCES (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-gurmukhi/utrrs/SOURCES)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-gurmukhi/utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-gurmukhi/utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-gurmukhi/utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-gurmukhi/utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-gurmukhi/utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-gurmukhi/utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-gurmukhi/utrrs/codepoint/IndicFontFeatureCodepoint-GurmukhiSpecific.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-gurmukhi/utrrs/codepoint/IndicFontFeatureCodepoint-GurmukhiSpecific.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-gurmukhi/utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-gurmukhi/utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-gurmukhi/utrrs/codepoint/IndicFontFeatureCodepoint-Reserved.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-gurmukhi/utrrs/codepoint/IndicFontFeatureCodepoint-Reserved.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-gurmukhi/utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-gurmukhi/utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-gurmukhi/utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-gurmukhi/utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-gurmukhi/utrrs/gpos/IndicFontFeatureGPOS-BelowBase.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-gurmukhi/utrrs/gpos/IndicFontFeatureGPOS-BelowBase.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-gurmukhi/utrrs/gsub/IndicFontFeatureGSUB.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-gurmukhi/utrrs/gsub/IndicFontFeatureGSUB.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-kannada/kannada-vowel-letters.txt3
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-kannada/misc/misc.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-kannada/misc/misc.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-kannada/misc/right-matras.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-kannada/misc/right-matras.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-kannada/utrrs/LICENSE (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-kannada/utrrs/LICENSE)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-kannada/utrrs/README (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-kannada/utrrs/README)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-kannada/utrrs/SOURCES (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-kannada/utrrs/SOURCES)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-kannada/utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalConsonants.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-kannada/utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalConsonants.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-kannada/utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalVowels.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-kannada/utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalVowels.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-kannada/utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-kannada/utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-kannada/utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-kannada/utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-kannada/utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-kannada/utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-kannada/utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-kannada/utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-kannada/utrrs/codepoint/IndicFontFeatureCodepoint-Reserved.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-kannada/utrrs/codepoint/IndicFontFeatureCodepoint-Reserved.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-kannada/utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-kannada/utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-kannada/utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-kannada/utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-kannada/utrrs/gsub/IndicFontFeatureGSUB.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-kannada/utrrs/gsub/IndicFontFeatureGSUB.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-malayalam/malayalam-vowel-letters.txt5
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-malayalam/misc/cibu.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-malayalam/misc/cibu.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-malayalam/misc/dot-reph.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-malayalam/misc/dot-reph.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-malayalam/misc/misc.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-malayalam/misc/misc.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-malayalam/utrrs/LICENSE (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-malayalam/utrrs/LICENSE)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-malayalam/utrrs/README (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-malayalam/utrrs/README)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-malayalam/utrrs/SOURCES (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-malayalam/utrrs/SOURCES)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-malayalam/utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalVowels.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-malayalam/utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalVowels.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-malayalam/utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-malayalam/utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-malayalam/utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-malayalam/utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-malayalam/utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-malayalam/utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-malayalam/utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-malayalam/utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-malayalam/utrrs/codepoint/IndicFontFeatureCodepoint-Reserved.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-malayalam/utrrs/codepoint/IndicFontFeatureCodepoint-Reserved.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-malayalam/utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-malayalam/utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-malayalam/utrrs/gsub/IndicFontFeatureGSUB.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-malayalam/utrrs/gsub/IndicFontFeatureGSUB.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-oriya/misc/bindu.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-oriya/misc/bindu.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-oriya/misc/misc.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-oriya/misc/misc.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-oriya/oriya-vowel-letters.txt3
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-oriya/utrrs/LICENSE (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-oriya/utrrs/LICENSE)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-oriya/utrrs/README (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-oriya/utrrs/README)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-oriya/utrrs/SOURCES (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-oriya/utrrs/SOURCES)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-oriya/utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalConsonants.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-oriya/utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalConsonants.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-oriya/utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalVowels.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-oriya/utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalVowels.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-oriya/utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-oriya/utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-oriya/utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-oriya/utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-oriya/utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-oriya/utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-oriya/utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-oriya/utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-oriya/utrrs/codepoint/IndicFontFeatureCodepoint-OriyaSpecific.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-oriya/utrrs/codepoint/IndicFontFeatureCodepoint-OriyaSpecific.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-oriya/utrrs/codepoint/IndicFontFeatureCodepoint-Reserved.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-oriya/utrrs/codepoint/IndicFontFeatureCodepoint-Reserved.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-oriya/utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-oriya/utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-oriya/utrrs/gsub/IndicFontFeatureGSUB.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-oriya/utrrs/gsub/IndicFontFeatureGSUB.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-sinhala/misc/extensive.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-sinhala/misc/extensive.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-sinhala/misc/misc.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-sinhala/misc/misc.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-sinhala/misc/reph.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-sinhala/misc/reph.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-sinhala/misc/split-matras.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-sinhala/misc/split-matras.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-sinhala/utrrs/LICENSE (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-sinhala/utrrs/LICENSE)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-sinhala/utrrs/README (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-sinhala/utrrs/README)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-sinhala/utrrs/SOURCES (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-sinhala/utrrs/SOURCES)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-sinhala/utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-sinhala/utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-sinhala/utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-sinhala/utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-sinhala/utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-sinhala/utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-sinhala/utrrs/codepoint/IndicFontFeatureCodepoint-Punctuation.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-sinhala/utrrs/codepoint/IndicFontFeatureCodepoint-Punctuation.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-sinhala/utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-sinhala/utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-sinhala/utrrs/gpos/IndicFontFeatureGPOS.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-sinhala/utrrs/gpos/IndicFontFeatureGPOS.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-sinhala/utrrs/gsub/IndicFontFeatureGSUB-Conjunct.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-sinhala/utrrs/gsub/IndicFontFeatureGSUB-Conjunct.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-sinhala/utrrs/gsub/IndicFontFeatureGSUB-Rakaaraansaya.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-sinhala/utrrs/gsub/IndicFontFeatureGSUB-Rakaaraansaya.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-sinhala/utrrs/gsub/IndicFontFeatureGSUB-Repaya.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-sinhala/utrrs/gsub/IndicFontFeatureGSUB-Repaya.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-sinhala/utrrs/gsub/IndicFontFeatureGSUB-Special-Cases.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-sinhala/utrrs/gsub/IndicFontFeatureGSUB-Special-Cases.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-sinhala/utrrs/gsub/IndicFontFeatureGSUB-TouchingLetters.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-sinhala/utrrs/gsub/IndicFontFeatureGSUB-TouchingLetters.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-sinhala/utrrs/gsub/IndicFontFeatureGSUB-Yansaya.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-sinhala/utrrs/gsub/IndicFontFeatureGSUB-Yansaya.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-sinhala/utrrs/gsub/IndicFontFeatureGSUB.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-sinhala/utrrs/gsub/IndicFontFeatureGSUB.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-tamil/misc/misc.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-tamil/misc/misc.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-tamil/utrrs/LICENSE (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-tamil/utrrs/LICENSE)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-tamil/utrrs/README (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-tamil/utrrs/README)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-tamil/utrrs/SOURCES (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-tamil/utrrs/SOURCES)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-tamil/utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-tamil/utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-tamil/utrrs/codepoint/IndicFontFeatureCodepoint-CurrencySymbols.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-tamil/utrrs/codepoint/IndicFontFeatureCodepoint-CurrencySymbols.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-tamil/utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-tamil/utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-tamil/utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-tamil/utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-tamil/utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-tamil/utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-tamil/utrrs/codepoint/IndicFontFeatureCodepoint-Numerics.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-tamil/utrrs/codepoint/IndicFontFeatureCodepoint-Numerics.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-tamil/utrrs/codepoint/IndicFontFeatureCodepoint-Reserved.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-tamil/utrrs/codepoint/IndicFontFeatureCodepoint-Reserved.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-tamil/utrrs/codepoint/IndicFontFeatureCodepoint-Symbols.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-tamil/utrrs/codepoint/IndicFontFeatureCodepoint-Symbols.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-tamil/utrrs/codepoint/IndicFontFeatureCodepoint-TamilSymbol.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-tamil/utrrs/codepoint/IndicFontFeatureCodepoint-TamilSymbol.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-tamil/utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-tamil/utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-tamil/utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-tamil/utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-tamil/utrrs/gpos/IndicFontFeatureGPOS-BelowBase.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-tamil/utrrs/gpos/IndicFontFeatureGPOS-BelowBase.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-tamil/utrrs/gsub/IndicFontFeatureGSUB.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-tamil/utrrs/gsub/IndicFontFeatureGSUB.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-telugu/misc/misc.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-telugu/misc/misc.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-telugu/telugu-vowel-letters.txt5
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-telugu/utrrs/LICENSE (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-telugu/utrrs/LICENSE)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-telugu/utrrs/README (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-telugu/utrrs/README)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-telugu/utrrs/SOURCES (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-telugu/utrrs/SOURCES)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-telugu/utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalVowels.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-telugu/utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalVowels.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-telugu/utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-telugu/utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-telugu/utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-telugu/utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-telugu/utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-telugu/utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-telugu/utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-telugu/utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-telugu/utrrs/codepoint/IndicFontFeatureCodepoint-Reserved.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-telugu/utrrs/codepoint/IndicFontFeatureCodepoint-Reserved.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-telugu/utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-telugu/utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-telugu/utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-telugu/utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/script-telugu/utrrs/gsub/IndicFontFeatureGSUB.txt (renamed from test/shaping/texts/in-house/shaper-indic/indic/script-telugu/utrrs/gsub/IndicFontFeatureGSUB.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-indic/south-east-asian/script-khmer/misc/misc.txt23
-rw-r--r--test/shaping/texts/in-house/shaper-khmer/misc.txt89
-rw-r--r--test/shaping/texts/in-house/shaper-khmer/other-marks-invalid.txt (renamed from test/shaping/texts/in-house/shaper-indic/south-east-asian/script-khmer/misc/other-marks-invalid.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-khmer/other-marks.txt (renamed from test/shaping/texts/in-house/shaper-indic/south-east-asian/script-khmer/misc/other-marks.txt)0
-rw-r--r--test/shaping/texts/in-house/shaper-use/script-javanese/misc.txt (renamed from test/shaping/texts/in-house/shaper-indic/south-east-asian/script-javanese/misc.txt)0
-rw-r--r--test/subset/Makefile.am2
-rw-r--r--test/subset/Makefile.in7
-rw-r--r--test/subset/data/Makefile.am2
-rw-r--r--test/subset/data/Makefile.in16
-rw-r--r--test/subset/data/expected/full-font/SourceSansPro-Regular.default.1FC,21,41,20,62,63.otfbin0 -> 3784 bytes
-rw-r--r--test/subset/data/expected/full-font/SourceSansPro-Regular.default.61,62,63.otfbin0 -> 3496 bytes
-rw-r--r--test/subset/data/expected/full-font/SourceSansPro-Regular.default.D7,D8,D9,DA,DE.otfbin0 -> 3612 bytes
-rw-r--r--test/subset/data/expected/full-font/SourceSansPro-Regular.desubroutinize.1FC,21,41,20,62,63.otfbin0 -> 3640 bytes
-rw-r--r--test/subset/data/expected/full-font/SourceSansPro-Regular.desubroutinize.61,62,63.otfbin0 -> 3400 bytes
-rw-r--r--test/subset/data/expected/full-font/SourceSansPro-Regular.desubroutinize.D7,D8,D9,DA,DE.otfbin0 -> 3596 bytes
-rw-r--r--test/subset/data/expected/full-font/SourceSansPro-Regular.drop-hints.1FC,21,41,20,62,63.otfbin0 -> 3564 bytes
-rw-r--r--test/subset/data/expected/full-font/SourceSansPro-Regular.drop-hints.61,62,63.otfbin0 -> 3340 bytes
-rw-r--r--test/subset/data/expected/full-font/SourceSansPro-Regular.drop-hints.D7,D8,D9,DA,DE.otfbin0 -> 3464 bytes
-rw-r--r--test/subset/data/expected/full-font/SourceSansPro-Regular.drop-hints.desubroutinize.1FC,21,41,20,62,63.otfbin0 -> 3480 bytes
-rw-r--r--test/subset/data/expected/full-font/SourceSansPro-Regular.drop-hints.desubroutinize.61,62,63.otfbin0 -> 3276 bytes
-rw-r--r--test/subset/data/expected/full-font/SourceSansPro-Regular.drop-hints.desubroutinize.D7,D8,D9,DA,DE.otfbin0 -> 3448 bytes
-rw-r--r--test/subset/data/expected/japanese/SourceHanSans-Regular.default.3042,3044,3046,3048,304A,304B.otfbin0 -> 6324 bytes
-rw-r--r--test/subset/data/expected/japanese/SourceHanSans-Regular.default.3042,3044,3046,73E0,5EA6,8F38.otfbin0 -> 6568 bytes
-rw-r--r--test/subset/data/expected/japanese/SourceHanSans-Regular.default.61,63,65,6B.otfbin0 -> 5500 bytes
-rw-r--r--test/subset/data/expected/japanese/SourceHanSans-Regular.default.660E,6975,73E0,5EA6,8F38,6E05.otfbin0 -> 6780 bytes
-rw-r--r--test/subset/data/expected/japanese/SourceHanSans-Regular.default.660E.otfbin0 -> 5248 bytes
-rw-r--r--test/subset/data/expected/japanese/SourceHanSans-Regular.desubroutinize..otfbin0 -> 2340 bytes
-rw-r--r--test/subset/data/expected/japanese/SourceHanSans-Regular.desubroutinize.3042,3044,3046,3048,304A,304B.otfbin0 -> 6248 bytes
-rw-r--r--test/subset/data/expected/japanese/SourceHanSans-Regular.desubroutinize.3042,3044,3046,73E0,5EA6,8F38.otfbin0 -> 6432 bytes
-rw-r--r--test/subset/data/expected/japanese/SourceHanSans-Regular.desubroutinize.61,63,65,6B.otfbin0 -> 5428 bytes
-rw-r--r--test/subset/data/expected/japanese/SourceHanSans-Regular.desubroutinize.660E,6975,73E0,5EA6,8F38,6E05.otfbin0 -> 6552 bytes
-rw-r--r--test/subset/data/expected/japanese/SourceHanSans-Regular.desubroutinize.660E.otfbin0 -> 5196 bytes
-rw-r--r--test/subset/data/expected/japanese/SourceHanSans-Regular.drop-hints.3042,3044,3046,3048,304A,304B.otfbin0 -> 6132 bytes
-rw-r--r--test/subset/data/expected/japanese/SourceHanSans-Regular.drop-hints.3042,3044,3046,73E0,5EA6,8F38.otfbin0 -> 6304 bytes
-rw-r--r--test/subset/data/expected/japanese/SourceHanSans-Regular.drop-hints.61,63,65,6B.otfbin0 -> 5344 bytes
-rw-r--r--test/subset/data/expected/japanese/SourceHanSans-Regular.drop-hints.660E,6975,73E0,5EA6,8F38,6E05.otfbin0 -> 6472 bytes
-rw-r--r--test/subset/data/expected/japanese/SourceHanSans-Regular.drop-hints.660E.otfbin0 -> 5140 bytes
-rw-r--r--test/subset/data/expected/japanese/SourceHanSans-Regular.drop-hints.desubroutinize..otfbin0 -> 2188 bytes
-rw-r--r--test/subset/data/expected/japanese/SourceHanSans-Regular.drop-hints.desubroutinize.3042,3044,3046,3048,304A,304B.otfbin0 -> 6076 bytes
-rw-r--r--test/subset/data/expected/japanese/SourceHanSans-Regular.drop-hints.desubroutinize.3042,3044,3046,73E0,5EA6,8F38.otfbin0 -> 6180 bytes
-rw-r--r--test/subset/data/expected/japanese/SourceHanSans-Regular.drop-hints.desubroutinize.61,63,65,6B.otfbin0 -> 5312 bytes
-rw-r--r--test/subset/data/expected/japanese/SourceHanSans-Regular.drop-hints.desubroutinize.660E,6975,73E0,5EA6,8F38,6E05.otfbin0 -> 6248 bytes
-rw-r--r--test/subset/data/expected/japanese/SourceHanSans-Regular.drop-hints.desubroutinize.660E.otfbin0 -> 5140 bytes
-rwxr-xr-xtest/subset/data/fonts/SourceHanSans-Regular.otfbin0 -> 16427580 bytes
-rw-r--r--test/subset/data/fonts/SourceSansPro-Regular.otfbin0 -> 220852 bytes
-rw-r--r--test/subset/data/profiles/desubroutinize.txt1
-rw-r--r--test/subset/data/profiles/drop-hints-desubroutinize.txt2
-rw-r--r--test/subset/data/tests/full-font.tests1
-rw-r--r--test/subset/data/tests/japanese.tests1
-rwxr-xr-xtest/subset/run-tests.py103
-rw-r--r--test/subset/subset_test_suite.py14
952 files changed, 5142 insertions, 7549 deletions
diff --git a/test/Makefile.in b/test/Makefile.in
index 5a7e405..2416988 100644
--- a/test/Makefile.in
+++ b/test/Makefile.in
@@ -96,8 +96,7 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/ax_check_link_flag.m4 \
$(top_srcdir)/m4/ax_pthread.m4 $(top_srcdir)/m4/gtk-doc.m4 \
$(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
$(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
- $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/pkg.m4 \
- $(top_srcdir)/configure.ac
+ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
$(ACLOCAL_M4)
DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
@@ -304,6 +303,8 @@ PACKAGE_URL = @PACKAGE_URL@
PACKAGE_VERSION = @PACKAGE_VERSION@
PATH_SEPARATOR = @PATH_SEPARATOR@
PKG_CONFIG = @PKG_CONFIG@
+PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
+PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
PTHREAD_CC = @PTHREAD_CC@
PTHREAD_CFLAGS = @PTHREAD_CFLAGS@
PTHREAD_LIBS = @PTHREAD_LIBS@
diff --git a/test/api/CMakeLists.txt b/test/api/CMakeLists.txt
index b540eb5..0c7337c 100644
--- a/test/api/CMakeLists.txt
+++ b/test/api/CMakeLists.txt
@@ -3,6 +3,8 @@ if (HB_HAVE_GLIB)
extract_make_variable (TEST_PROGS ${MAKEFILEAM})
list (APPEND TEST_PROGS
+ test-ot-color
+ test-ot-name
test-ot-tag
test-c
test-cplusplus
diff --git a/test/api/Makefile.am b/test/api/Makefile.am
index 65ceeda..67d66e1 100644
--- a/test/api/Makefile.am
+++ b/test/api/Makefile.am
@@ -9,11 +9,15 @@ MAINTAINERCLEANFILES =
# Convenience targets:
lib:
@$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src lib
+libs:
+ @$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src libs
EXTRA_DIST += CMakeLists.txt
EXTRA_DIST += fonts
+LINK = $(CXXLINK)
+
if HAVE_GLIB
AM_CPPFLAGS = -DSRCDIR="\"$(srcdir)\"" -I$(top_srcdir)/src/ -I$(top_builddir)/src/ $(GLIB_CFLAGS)
LDADD = $(top_builddir)/src/libharfbuzz.la $(GLIB_LIBS)
@@ -24,15 +28,19 @@ check_PROGRAMS = $(TEST_PROGS)
noinst_PROGRAMS = $(TEST_PROGS)
TEST_PROGS = \
+ test-aat-layout \
+ test-baseline \
test-blob \
test-buffer \
+ test-collect-unicodes \
test-common \
test-font \
+ test-map \
test-object \
+ test-ot-face \
test-set \
test-shape \
test-subset \
- test-subset-codepoints \
test-subset-cmap \
test-subset-glyf \
test-subset-hdmx \
@@ -40,12 +48,13 @@ TEST_PROGS = \
test-subset-os2 \
test-subset-post \
test-subset-vmtx \
+ test-subset-cff1 \
+ test-subset-cff2 \
test-unicode \
test-version \
$(NULL)
test_subset_LDADD = $(LDADD) $(top_builddir)/src/libharfbuzz-subset.la
-test_subset_codepoints_LDADD = $(LDADD) $(top_builddir)/src/libharfbuzz-subset.la
test_subset_cmap_LDADD = $(LDADD) $(top_builddir)/src/libharfbuzz-subset.la
test_subset_glyf_LDADD = $(LDADD) $(top_builddir)/src/libharfbuzz-subset.la
test_subset_hdmx_LDADD = $(LDADD) $(top_builddir)/src/libharfbuzz-subset.la
@@ -53,6 +62,8 @@ test_subset_hmtx_LDADD = $(LDADD) $(top_builddir)/src/libharfbuzz-subset.la
test_subset_os2_LDADD = $(LDADD) $(top_builddir)/src/libharfbuzz-subset.la
test_subset_post_LDADD = $(LDADD) $(top_builddir)/src/libharfbuzz-subset.la
test_subset_vmtx_LDADD = $(LDADD) $(top_builddir)/src/libharfbuzz-subset.la
+test_subset_cff1_LDADD = $(LDADD) $(top_builddir)/src/libharfbuzz-subset.la
+test_subset_cff2_LDADD = $(LDADD) $(top_builddir)/src/libharfbuzz-subset.la
test_unicode_CPPFLAGS = \
$(AM_CPPFLAGS) \
@@ -65,13 +76,26 @@ test_unicode_LDADD += $(top_builddir)/src/libharfbuzz-icu.la $(ICU_LIBS)
endif
-if HAVE_OT
-
TEST_PROGS += \
test-ot-color \
+ test-ot-ligature-carets \
+ test-ot-name \
test-ot-tag \
+ test-ot-extents-cff \
$(NULL)
+
+if HAVE_PTHREAD
+if HAVE_FREETYPE
+TEST_PROGS += test-multithread
+test_multithread_CFLAGS = $(CFLAGS) $(PTHREAD_CFLAGS) $(FREETYPE_CFLAGS)
+test_multithread_LDADD = $(LDADD) $(PTHREAD_LIBS) $(FREETYPE_LIBS)
+# The auto-generated link rule somehow includes CFLAGS as well. Without
+# it, pthread link fails, because, who knows why, $PTHREAD_LIBS is empty.
+test_multithread_LINK = $(LINK) $(PTHREAD_CFLAGS)
+endif
+endif
+
if HAVE_FREETYPE
TEST_PROGS += \
test-ot-math \
@@ -80,7 +104,6 @@ test_ot_math_LDADD = $(LDADD) $(FREETYPE_LIBS)
test_ot_math_CPPFLAGS = $(AM_CPPFLAGS) $(FREETYPE_CFLAGS)
endif # HAVE_FREETYPE
-endif # HAVE_OT
# Tests for header compilation
TEST_PROGS += \
@@ -131,9 +154,9 @@ check-gtester:
# Check tests under valgrind. Saves log to log-valgrind.txt
VALGRIND_FLAGS = \
- --tool=memcheck --suppressions=$(srcdir)/.valgrind-suppressions \
+ --tool=memcheck \
--track-origins=yes \
- --leak-check=yes
+ --leak-check=yes \
$(EXTRA_VALGRIND_FLAGS)
# Can't do for now: --show-reachable=yes
CLEANFILES += log-valgrind.txt
@@ -152,13 +175,18 @@ symbols-tested.txt: $(TEST_PROGS)
$(AM_V_GEN)$(top_builddir)/libtool --mode=execute nm $^ \
| grep ' U hb_' | sed 's/.* U hb_/hb_/' \
| sort | uniq > $@.tmp && mv $@.tmp $@
+symbols-tested-or-deprecated.txt: symbols-tested.txt $(top_builddir)/src/harfbuzz-deprecated-symbols.txt
+ $(AM_V_GEN)cat $^ | sort | uniq > $@.tmp; mv $@.tmp $@
symbols-exported.txt: $(top_builddir)/src/.libs/libharfbuzz.so
$(AM_V_GEN)$(top_builddir)/libtool --mode=execute nm $^ \
| grep ' T ' | sed 's/.* T //' | grep -v '^\(_init\|_fini\)$$' \
| sort | uniq > $@.tmp && mv $@.tmp $@
-symbols-untested.txt: symbols-tested.txt symbols-exported.txt
+symbols-untested.txt: symbols-tested-or-deprecated.txt symbols-exported.txt
$(AM_V_GEN)diff $^ > $@.tmp; mv $@.tmp $@
-CLEANFILES += symbols-tested.txt symbols-exported.txt symbols-untested.txt
+CLEANFILES += symbols-tested.txt \
+ symbols-exported.txt \
+ symbols-untested.txt \
+ symbols-tested-or-deprecated.txt
check-symbols: symbols-untested.txt
@! cat $^ | grep .
diff --git a/test/api/Makefile.in b/test/api/Makefile.in
index c08ad51..b317eb5 100644
--- a/test/api/Makefile.in
+++ b/test/api/Makefile.in
@@ -95,14 +95,10 @@ host_triplet = @host@
@HAVE_GLIB_TRUE@noinst_PROGRAMS = $(am__EXEEXT_4)
@HAVE_GLIB_TRUE@@HAVE_ICU_TRUE@am__append_2 = $(ICU_CFLAGS)
@HAVE_GLIB_TRUE@@HAVE_ICU_TRUE@am__append_3 = $(top_builddir)/src/libharfbuzz-icu.la $(ICU_LIBS)
-@HAVE_GLIB_TRUE@@HAVE_OT_TRUE@am__append_4 = \
-@HAVE_GLIB_TRUE@@HAVE_OT_TRUE@ test-ot-color \
-@HAVE_GLIB_TRUE@@HAVE_OT_TRUE@ test-ot-tag \
-@HAVE_GLIB_TRUE@@HAVE_OT_TRUE@ $(NULL)
-
-@HAVE_FREETYPE_TRUE@@HAVE_GLIB_TRUE@@HAVE_OT_TRUE@am__append_5 = \
-@HAVE_FREETYPE_TRUE@@HAVE_GLIB_TRUE@@HAVE_OT_TRUE@ test-ot-math \
-@HAVE_FREETYPE_TRUE@@HAVE_GLIB_TRUE@@HAVE_OT_TRUE@ $(NULL)
+@HAVE_FREETYPE_TRUE@@HAVE_GLIB_TRUE@@HAVE_PTHREAD_TRUE@am__append_4 = test-multithread
+@HAVE_FREETYPE_TRUE@@HAVE_GLIB_TRUE@am__append_5 = \
+@HAVE_FREETYPE_TRUE@@HAVE_GLIB_TRUE@ test-ot-math \
+@HAVE_FREETYPE_TRUE@@HAVE_GLIB_TRUE@ $(NULL)
@HAVE_GLIB_TRUE@@HAVE_ICU_TRUE@am__append_6 = $(ICU_CFLAGS)
@HAVE_GLIB_TRUE@@HAVE_ICU_TRUE@am__append_7 = $(ICU_CFLAGS)
@@ -111,7 +107,8 @@ host_triplet = @host@
@HAVE_GLIB_TRUE@TESTS = $(am__EXEEXT_4)
# Can't do for now: --show-reachable=yes
@HAVE_GLIB_TRUE@am__append_10 = log-valgrind.txt symbols-tested.txt \
-@HAVE_GLIB_TRUE@ symbols-exported.txt symbols-untested.txt
+@HAVE_GLIB_TRUE@ symbols-exported.txt symbols-untested.txt \
+@HAVE_GLIB_TRUE@ symbols-tested-or-deprecated.txt
subdir = test/api
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
am__aclocal_m4_deps = $(top_srcdir)/m4/ax_check_link_flag.m4 \
@@ -119,8 +116,7 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/ax_check_link_flag.m4 \
$(top_srcdir)/m4/ax_pthread.m4 $(top_srcdir)/m4/gtk-doc.m4 \
$(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
$(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
- $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/pkg.m4 \
- $(top_srcdir)/configure.ac
+ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
$(ACLOCAL_M4)
DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
@@ -129,16 +125,18 @@ CONFIG_HEADER = $(top_builddir)/config.h
CONFIG_CLEAN_FILES =
CONFIG_CLEAN_VPATH_FILES =
am__EXEEXT_1 =
-@HAVE_GLIB_TRUE@@HAVE_OT_TRUE@am__EXEEXT_2 = test-ot-color$(EXEEXT) \
-@HAVE_GLIB_TRUE@@HAVE_OT_TRUE@ test-ot-tag$(EXEEXT) \
-@HAVE_GLIB_TRUE@@HAVE_OT_TRUE@ $(am__EXEEXT_1)
-@HAVE_FREETYPE_TRUE@@HAVE_GLIB_TRUE@@HAVE_OT_TRUE@am__EXEEXT_3 = test-ot-math$(EXEEXT) \
-@HAVE_FREETYPE_TRUE@@HAVE_GLIB_TRUE@@HAVE_OT_TRUE@ $(am__EXEEXT_1)
-@HAVE_GLIB_TRUE@am__EXEEXT_4 = test-blob$(EXEEXT) test-buffer$(EXEEXT) \
+@HAVE_FREETYPE_TRUE@@HAVE_GLIB_TRUE@@HAVE_PTHREAD_TRUE@am__EXEEXT_2 = test-multithread$(EXEEXT)
+@HAVE_FREETYPE_TRUE@@HAVE_GLIB_TRUE@am__EXEEXT_3 = \
+@HAVE_FREETYPE_TRUE@@HAVE_GLIB_TRUE@ test-ot-math$(EXEEXT) \
+@HAVE_FREETYPE_TRUE@@HAVE_GLIB_TRUE@ $(am__EXEEXT_1)
+@HAVE_GLIB_TRUE@am__EXEEXT_4 = test-aat-layout$(EXEEXT) \
+@HAVE_GLIB_TRUE@ test-baseline$(EXEEXT) test-blob$(EXEEXT) \
+@HAVE_GLIB_TRUE@ test-buffer$(EXEEXT) \
+@HAVE_GLIB_TRUE@ test-collect-unicodes$(EXEEXT) \
@HAVE_GLIB_TRUE@ test-common$(EXEEXT) test-font$(EXEEXT) \
-@HAVE_GLIB_TRUE@ test-object$(EXEEXT) test-set$(EXEEXT) \
+@HAVE_GLIB_TRUE@ test-map$(EXEEXT) test-object$(EXEEXT) \
+@HAVE_GLIB_TRUE@ test-ot-face$(EXEEXT) test-set$(EXEEXT) \
@HAVE_GLIB_TRUE@ test-shape$(EXEEXT) test-subset$(EXEEXT) \
-@HAVE_GLIB_TRUE@ test-subset-codepoints$(EXEEXT) \
@HAVE_GLIB_TRUE@ test-subset-cmap$(EXEEXT) \
@HAVE_GLIB_TRUE@ test-subset-glyf$(EXEEXT) \
@HAVE_GLIB_TRUE@ test-subset-hdmx$(EXEEXT) \
@@ -146,22 +144,40 @@ am__EXEEXT_1 =
@HAVE_GLIB_TRUE@ test-subset-os2$(EXEEXT) \
@HAVE_GLIB_TRUE@ test-subset-post$(EXEEXT) \
@HAVE_GLIB_TRUE@ test-subset-vmtx$(EXEEXT) \
+@HAVE_GLIB_TRUE@ test-subset-cff1$(EXEEXT) \
+@HAVE_GLIB_TRUE@ test-subset-cff2$(EXEEXT) \
@HAVE_GLIB_TRUE@ test-unicode$(EXEEXT) test-version$(EXEEXT) \
-@HAVE_GLIB_TRUE@ $(am__EXEEXT_1) $(am__EXEEXT_2) \
-@HAVE_GLIB_TRUE@ $(am__EXEEXT_3) test-c$(EXEEXT) \
-@HAVE_GLIB_TRUE@ test-cplusplus$(EXEEXT) $(am__EXEEXT_1)
+@HAVE_GLIB_TRUE@ $(am__EXEEXT_1) test-ot-color$(EXEEXT) \
+@HAVE_GLIB_TRUE@ test-ot-ligature-carets$(EXEEXT) \
+@HAVE_GLIB_TRUE@ test-ot-name$(EXEEXT) test-ot-tag$(EXEEXT) \
+@HAVE_GLIB_TRUE@ test-ot-extents-cff$(EXEEXT) $(am__EXEEXT_1) \
+@HAVE_GLIB_TRUE@ $(am__EXEEXT_2) $(am__EXEEXT_3) \
+@HAVE_GLIB_TRUE@ test-c$(EXEEXT) test-cplusplus$(EXEEXT) \
+@HAVE_GLIB_TRUE@ $(am__EXEEXT_1)
PROGRAMS = $(noinst_PROGRAMS)
-test_blob_SOURCES = test-blob.c
-test_blob_OBJECTS = test-blob.$(OBJEXT)
-test_blob_LDADD = $(LDADD)
+test_aat_layout_SOURCES = test-aat-layout.c
+test_aat_layout_OBJECTS = test-aat-layout.$(OBJEXT)
+test_aat_layout_LDADD = $(LDADD)
am__DEPENDENCIES_1 =
-@HAVE_GLIB_TRUE@test_blob_DEPENDENCIES = \
+@HAVE_GLIB_TRUE@test_aat_layout_DEPENDENCIES = \
@HAVE_GLIB_TRUE@ $(top_builddir)/src/libharfbuzz.la \
@HAVE_GLIB_TRUE@ $(am__DEPENDENCIES_1)
AM_V_lt = $(am__v_lt_@AM_V@)
am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
am__v_lt_0 = --silent
am__v_lt_1 =
+test_baseline_SOURCES = test-baseline.c
+test_baseline_OBJECTS = test-baseline.$(OBJEXT)
+test_baseline_LDADD = $(LDADD)
+@HAVE_GLIB_TRUE@test_baseline_DEPENDENCIES = \
+@HAVE_GLIB_TRUE@ $(top_builddir)/src/libharfbuzz.la \
+@HAVE_GLIB_TRUE@ $(am__DEPENDENCIES_1)
+test_blob_SOURCES = test-blob.c
+test_blob_OBJECTS = test-blob.$(OBJEXT)
+test_blob_LDADD = $(LDADD)
+@HAVE_GLIB_TRUE@test_blob_DEPENDENCIES = \
+@HAVE_GLIB_TRUE@ $(top_builddir)/src/libharfbuzz.la \
+@HAVE_GLIB_TRUE@ $(am__DEPENDENCIES_1)
test_buffer_SOURCES = test-buffer.c
test_buffer_OBJECTS = test-buffer.$(OBJEXT)
test_buffer_LDADD = $(LDADD)
@@ -174,6 +190,12 @@ test_c_LDADD = $(LDADD)
@HAVE_GLIB_TRUE@test_c_DEPENDENCIES = \
@HAVE_GLIB_TRUE@ $(top_builddir)/src/libharfbuzz.la \
@HAVE_GLIB_TRUE@ $(am__DEPENDENCIES_1)
+test_collect_unicodes_SOURCES = test-collect-unicodes.c
+test_collect_unicodes_OBJECTS = test-collect-unicodes.$(OBJEXT)
+test_collect_unicodes_LDADD = $(LDADD)
+@HAVE_GLIB_TRUE@test_collect_unicodes_DEPENDENCIES = \
+@HAVE_GLIB_TRUE@ $(top_builddir)/src/libharfbuzz.la \
+@HAVE_GLIB_TRUE@ $(am__DEPENDENCIES_1)
test_common_SOURCES = test-common.c
test_common_OBJECTS = test-common.$(OBJEXT)
test_common_LDADD = $(LDADD)
@@ -194,6 +216,21 @@ test_font_LDADD = $(LDADD)
@HAVE_GLIB_TRUE@test_font_DEPENDENCIES = \
@HAVE_GLIB_TRUE@ $(top_builddir)/src/libharfbuzz.la \
@HAVE_GLIB_TRUE@ $(am__DEPENDENCIES_1)
+test_map_SOURCES = test-map.c
+test_map_OBJECTS = test-map.$(OBJEXT)
+test_map_LDADD = $(LDADD)
+@HAVE_GLIB_TRUE@test_map_DEPENDENCIES = \
+@HAVE_GLIB_TRUE@ $(top_builddir)/src/libharfbuzz.la \
+@HAVE_GLIB_TRUE@ $(am__DEPENDENCIES_1)
+test_multithread_SOURCES = test-multithread.c
+test_multithread_OBJECTS = \
+ test_multithread-test-multithread.$(OBJEXT)
+@HAVE_GLIB_TRUE@am__DEPENDENCIES_2 = \
+@HAVE_GLIB_TRUE@ $(top_builddir)/src/libharfbuzz.la \
+@HAVE_GLIB_TRUE@ $(am__DEPENDENCIES_1)
+@HAVE_FREETYPE_TRUE@@HAVE_GLIB_TRUE@@HAVE_PTHREAD_TRUE@test_multithread_DEPENDENCIES = $(am__DEPENDENCIES_2) \
+@HAVE_FREETYPE_TRUE@@HAVE_GLIB_TRUE@@HAVE_PTHREAD_TRUE@ $(am__DEPENDENCIES_1) \
+@HAVE_FREETYPE_TRUE@@HAVE_GLIB_TRUE@@HAVE_PTHREAD_TRUE@ $(am__DEPENDENCIES_1)
test_object_SOURCES = test-object.c
test_object_OBJECTS = test-object.$(OBJEXT)
test_object_LDADD = $(LDADD)
@@ -206,13 +243,35 @@ test_ot_color_LDADD = $(LDADD)
@HAVE_GLIB_TRUE@test_ot_color_DEPENDENCIES = \
@HAVE_GLIB_TRUE@ $(top_builddir)/src/libharfbuzz.la \
@HAVE_GLIB_TRUE@ $(am__DEPENDENCIES_1)
+test_ot_extents_cff_SOURCES = test-ot-extents-cff.c
+test_ot_extents_cff_OBJECTS = test-ot-extents-cff.$(OBJEXT)
+test_ot_extents_cff_LDADD = $(LDADD)
+@HAVE_GLIB_TRUE@test_ot_extents_cff_DEPENDENCIES = \
+@HAVE_GLIB_TRUE@ $(top_builddir)/src/libharfbuzz.la \
+@HAVE_GLIB_TRUE@ $(am__DEPENDENCIES_1)
+test_ot_face_SOURCES = test-ot-face.c
+test_ot_face_OBJECTS = test-ot-face.$(OBJEXT)
+test_ot_face_LDADD = $(LDADD)
+@HAVE_GLIB_TRUE@test_ot_face_DEPENDENCIES = \
+@HAVE_GLIB_TRUE@ $(top_builddir)/src/libharfbuzz.la \
+@HAVE_GLIB_TRUE@ $(am__DEPENDENCIES_1)
+test_ot_ligature_carets_SOURCES = test-ot-ligature-carets.c
+test_ot_ligature_carets_OBJECTS = test-ot-ligature-carets.$(OBJEXT)
+test_ot_ligature_carets_LDADD = $(LDADD)
+@HAVE_GLIB_TRUE@test_ot_ligature_carets_DEPENDENCIES = \
+@HAVE_GLIB_TRUE@ $(top_builddir)/src/libharfbuzz.la \
+@HAVE_GLIB_TRUE@ $(am__DEPENDENCIES_1)
test_ot_math_SOURCES = test-ot-math.c
test_ot_math_OBJECTS = test_ot_math-test-ot-math.$(OBJEXT)
-@HAVE_GLIB_TRUE@am__DEPENDENCIES_2 = \
+@HAVE_FREETYPE_TRUE@@HAVE_GLIB_TRUE@test_ot_math_DEPENDENCIES = \
+@HAVE_FREETYPE_TRUE@@HAVE_GLIB_TRUE@ $(am__DEPENDENCIES_2) \
+@HAVE_FREETYPE_TRUE@@HAVE_GLIB_TRUE@ $(am__DEPENDENCIES_1)
+test_ot_name_SOURCES = test-ot-name.c
+test_ot_name_OBJECTS = test-ot-name.$(OBJEXT)
+test_ot_name_LDADD = $(LDADD)
+@HAVE_GLIB_TRUE@test_ot_name_DEPENDENCIES = \
@HAVE_GLIB_TRUE@ $(top_builddir)/src/libharfbuzz.la \
@HAVE_GLIB_TRUE@ $(am__DEPENDENCIES_1)
-@HAVE_FREETYPE_TRUE@@HAVE_GLIB_TRUE@@HAVE_OT_TRUE@test_ot_math_DEPENDENCIES = $(am__DEPENDENCIES_2) \
-@HAVE_FREETYPE_TRUE@@HAVE_GLIB_TRUE@@HAVE_OT_TRUE@ $(am__DEPENDENCIES_1)
test_ot_tag_SOURCES = test-ot-tag.c
test_ot_tag_OBJECTS = test-ot-tag.$(OBJEXT)
test_ot_tag_LDADD = $(LDADD)
@@ -235,15 +294,18 @@ test_subset_SOURCES = test-subset.c
test_subset_OBJECTS = test-subset.$(OBJEXT)
@HAVE_GLIB_TRUE@test_subset_DEPENDENCIES = $(am__DEPENDENCIES_2) \
@HAVE_GLIB_TRUE@ $(top_builddir)/src/libharfbuzz-subset.la
+test_subset_cff1_SOURCES = test-subset-cff1.c
+test_subset_cff1_OBJECTS = test-subset-cff1.$(OBJEXT)
+@HAVE_GLIB_TRUE@test_subset_cff1_DEPENDENCIES = $(am__DEPENDENCIES_2) \
+@HAVE_GLIB_TRUE@ $(top_builddir)/src/libharfbuzz-subset.la
+test_subset_cff2_SOURCES = test-subset-cff2.c
+test_subset_cff2_OBJECTS = test-subset-cff2.$(OBJEXT)
+@HAVE_GLIB_TRUE@test_subset_cff2_DEPENDENCIES = $(am__DEPENDENCIES_2) \
+@HAVE_GLIB_TRUE@ $(top_builddir)/src/libharfbuzz-subset.la
test_subset_cmap_SOURCES = test-subset-cmap.c
test_subset_cmap_OBJECTS = test-subset-cmap.$(OBJEXT)
@HAVE_GLIB_TRUE@test_subset_cmap_DEPENDENCIES = $(am__DEPENDENCIES_2) \
@HAVE_GLIB_TRUE@ $(top_builddir)/src/libharfbuzz-subset.la
-test_subset_codepoints_SOURCES = test-subset-codepoints.c
-test_subset_codepoints_OBJECTS = test-subset-codepoints.$(OBJEXT)
-@HAVE_GLIB_TRUE@test_subset_codepoints_DEPENDENCIES = \
-@HAVE_GLIB_TRUE@ $(am__DEPENDENCIES_2) \
-@HAVE_GLIB_TRUE@ $(top_builddir)/src/libharfbuzz-subset.la
test_subset_glyf_SOURCES = test-subset-glyf.c
test_subset_glyf_OBJECTS = test-subset-glyf.$(OBJEXT)
@HAVE_GLIB_TRUE@test_subset_glyf_DEPENDENCIES = $(am__DEPENDENCIES_2) \
@@ -307,9 +369,6 @@ am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
am__v_CC_0 = @echo " CC " $@;
am__v_CC_1 =
CCLD = $(CC)
-LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
- $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
- $(AM_LDFLAGS) $(LDFLAGS) -o $@
AM_V_CCLD = $(am__v_CCLD_@AM_V@)
am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
am__v_CCLD_0 = @echo " CCLD " $@;
@@ -332,20 +391,28 @@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@)
am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@)
am__v_CXXLD_0 = @echo " CXXLD " $@;
am__v_CXXLD_1 =
-SOURCES = test-blob.c test-buffer.c test-c.c test-common.c \
- $(test_cplusplus_SOURCES) test-font.c test-object.c \
- test-ot-color.c test-ot-math.c test-ot-tag.c test-set.c \
- test-shape.c test-subset.c test-subset-cmap.c \
- test-subset-codepoints.c test-subset-glyf.c test-subset-hdmx.c \
- test-subset-hmtx.c test-subset-os2.c test-subset-post.c \
- test-subset-vmtx.c test-unicode.c test-version.c
-DIST_SOURCES = test-blob.c test-buffer.c test-c.c test-common.c \
- $(am__test_cplusplus_SOURCES_DIST) test-font.c test-object.c \
- test-ot-color.c test-ot-math.c test-ot-tag.c test-set.c \
- test-shape.c test-subset.c test-subset-cmap.c \
- test-subset-codepoints.c test-subset-glyf.c test-subset-hdmx.c \
- test-subset-hmtx.c test-subset-os2.c test-subset-post.c \
- test-subset-vmtx.c test-unicode.c test-version.c
+SOURCES = test-aat-layout.c test-baseline.c test-blob.c test-buffer.c \
+ test-c.c test-collect-unicodes.c test-common.c \
+ $(test_cplusplus_SOURCES) test-font.c test-map.c \
+ test-multithread.c test-object.c test-ot-color.c \
+ test-ot-extents-cff.c test-ot-face.c test-ot-ligature-carets.c \
+ test-ot-math.c test-ot-name.c test-ot-tag.c test-set.c \
+ test-shape.c test-subset.c test-subset-cff1.c \
+ test-subset-cff2.c test-subset-cmap.c test-subset-glyf.c \
+ test-subset-hdmx.c test-subset-hmtx.c test-subset-os2.c \
+ test-subset-post.c test-subset-vmtx.c test-unicode.c \
+ test-version.c
+DIST_SOURCES = test-aat-layout.c test-baseline.c test-blob.c \
+ test-buffer.c test-c.c test-collect-unicodes.c test-common.c \
+ $(am__test_cplusplus_SOURCES_DIST) test-font.c test-map.c \
+ test-multithread.c test-object.c test-ot-color.c \
+ test-ot-extents-cff.c test-ot-face.c test-ot-ligature-carets.c \
+ test-ot-math.c test-ot-name.c test-ot-tag.c test-set.c \
+ test-shape.c test-subset.c test-subset-cff1.c \
+ test-subset-cff2.c test-subset-cmap.c test-subset-glyf.c \
+ test-subset-hdmx.c test-subset-hmtx.c test-subset-os2.c \
+ test-subset-post.c test-subset-vmtx.c test-unicode.c \
+ test-version.c
am__can_run_installinfo = \
case $$AM_UPDATE_INFO_DIR in \
n|no|NO) false;; \
@@ -694,6 +761,8 @@ PACKAGE_URL = @PACKAGE_URL@
PACKAGE_VERSION = @PACKAGE_VERSION@
PATH_SEPARATOR = @PATH_SEPARATOR@
PKG_CONFIG = @PKG_CONFIG@
+PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
+PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
PTHREAD_CC = @PTHREAD_CC@
PTHREAD_CFLAGS = @PTHREAD_CFLAGS@
PTHREAD_LIBS = @PTHREAD_LIBS@
@@ -767,21 +836,25 @@ EXTRA_DIST = CMakeLists.txt fonts $(am__append_1)
CLEANFILES = $(am__append_10)
DISTCLEANFILES =
MAINTAINERCLEANFILES =
+LINK = $(CXXLINK)
@HAVE_GLIB_TRUE@AM_CPPFLAGS = -DSRCDIR="\"$(srcdir)\"" -I$(top_srcdir)/src/ -I$(top_builddir)/src/ $(GLIB_CFLAGS)
@HAVE_GLIB_TRUE@LDADD = $(top_builddir)/src/libharfbuzz.la $(GLIB_LIBS)
# Tests for header compilation
-@HAVE_GLIB_TRUE@TEST_PROGS = test-blob test-buffer test-common \
-@HAVE_GLIB_TRUE@ test-font test-object test-set test-shape \
-@HAVE_GLIB_TRUE@ test-subset test-subset-codepoints \
+@HAVE_GLIB_TRUE@TEST_PROGS = test-aat-layout test-baseline test-blob \
+@HAVE_GLIB_TRUE@ test-buffer test-collect-unicodes test-common \
+@HAVE_GLIB_TRUE@ test-font test-map test-object test-ot-face \
+@HAVE_GLIB_TRUE@ test-set test-shape test-subset \
@HAVE_GLIB_TRUE@ test-subset-cmap test-subset-glyf \
@HAVE_GLIB_TRUE@ test-subset-hdmx test-subset-hmtx \
@HAVE_GLIB_TRUE@ test-subset-os2 test-subset-post \
-@HAVE_GLIB_TRUE@ test-subset-vmtx test-unicode test-version \
+@HAVE_GLIB_TRUE@ test-subset-vmtx test-subset-cff1 \
+@HAVE_GLIB_TRUE@ test-subset-cff2 test-unicode test-version \
+@HAVE_GLIB_TRUE@ $(NULL) test-ot-color test-ot-ligature-carets \
+@HAVE_GLIB_TRUE@ test-ot-name test-ot-tag test-ot-extents-cff \
@HAVE_GLIB_TRUE@ $(NULL) $(am__append_4) $(am__append_5) test-c \
@HAVE_GLIB_TRUE@ test-cplusplus $(NULL)
@HAVE_GLIB_TRUE@test_subset_LDADD = $(LDADD) $(top_builddir)/src/libharfbuzz-subset.la
-@HAVE_GLIB_TRUE@test_subset_codepoints_LDADD = $(LDADD) $(top_builddir)/src/libharfbuzz-subset.la
@HAVE_GLIB_TRUE@test_subset_cmap_LDADD = $(LDADD) $(top_builddir)/src/libharfbuzz-subset.la
@HAVE_GLIB_TRUE@test_subset_glyf_LDADD = $(LDADD) $(top_builddir)/src/libharfbuzz-subset.la
@HAVE_GLIB_TRUE@test_subset_hdmx_LDADD = $(LDADD) $(top_builddir)/src/libharfbuzz-subset.la
@@ -789,11 +862,18 @@ MAINTAINERCLEANFILES =
@HAVE_GLIB_TRUE@test_subset_os2_LDADD = $(LDADD) $(top_builddir)/src/libharfbuzz-subset.la
@HAVE_GLIB_TRUE@test_subset_post_LDADD = $(LDADD) $(top_builddir)/src/libharfbuzz-subset.la
@HAVE_GLIB_TRUE@test_subset_vmtx_LDADD = $(LDADD) $(top_builddir)/src/libharfbuzz-subset.la
+@HAVE_GLIB_TRUE@test_subset_cff1_LDADD = $(LDADD) $(top_builddir)/src/libharfbuzz-subset.la
+@HAVE_GLIB_TRUE@test_subset_cff2_LDADD = $(LDADD) $(top_builddir)/src/libharfbuzz-subset.la
@HAVE_GLIB_TRUE@test_unicode_CPPFLAGS = $(AM_CPPFLAGS) $(GLIB_CFLAGS) \
@HAVE_GLIB_TRUE@ $(NULL) $(am__append_2)
@HAVE_GLIB_TRUE@test_unicode_LDADD = $(LDADD) $(am__append_3)
-@HAVE_FREETYPE_TRUE@@HAVE_GLIB_TRUE@@HAVE_OT_TRUE@test_ot_math_LDADD = $(LDADD) $(FREETYPE_LIBS)
-@HAVE_FREETYPE_TRUE@@HAVE_GLIB_TRUE@@HAVE_OT_TRUE@test_ot_math_CPPFLAGS = $(AM_CPPFLAGS) $(FREETYPE_CFLAGS)
+@HAVE_FREETYPE_TRUE@@HAVE_GLIB_TRUE@@HAVE_PTHREAD_TRUE@test_multithread_CFLAGS = $(CFLAGS) $(PTHREAD_CFLAGS) $(FREETYPE_CFLAGS)
+@HAVE_FREETYPE_TRUE@@HAVE_GLIB_TRUE@@HAVE_PTHREAD_TRUE@test_multithread_LDADD = $(LDADD) $(PTHREAD_LIBS) $(FREETYPE_LIBS)
+# The auto-generated link rule somehow includes CFLAGS as well. Without
+# it, pthread link fails, because, who knows why, $PTHREAD_LIBS is empty.
+@HAVE_FREETYPE_TRUE@@HAVE_GLIB_TRUE@@HAVE_PTHREAD_TRUE@test_multithread_LINK = $(LINK) $(PTHREAD_CFLAGS)
+@HAVE_FREETYPE_TRUE@@HAVE_GLIB_TRUE@test_ot_math_LDADD = $(LDADD) $(FREETYPE_LIBS)
+@HAVE_FREETYPE_TRUE@@HAVE_GLIB_TRUE@test_ot_math_CPPFLAGS = $(AM_CPPFLAGS) $(FREETYPE_CFLAGS)
@HAVE_GLIB_TRUE@test_cplusplus_SOURCES = test-cplusplus.cc
@HAVE_GLIB_TRUE@test_c_CPPFLAGS = $(AM_CPPFLAGS) $(am__append_6) \
@HAVE_GLIB_TRUE@ $(am__append_8)
@@ -815,9 +895,10 @@ MAINTAINERCLEANFILES =
# Check tests under valgrind. Saves log to log-valgrind.txt
@HAVE_GLIB_TRUE@VALGRIND_FLAGS = \
-@HAVE_GLIB_TRUE@ --tool=memcheck --suppressions=$(srcdir)/.valgrind-suppressions \
+@HAVE_GLIB_TRUE@ --tool=memcheck \
@HAVE_GLIB_TRUE@ --track-origins=yes \
-@HAVE_GLIB_TRUE@ --leak-check=yes
+@HAVE_GLIB_TRUE@ --leak-check=yes \
+@HAVE_GLIB_TRUE@ $(EXTRA_VALGRIND_FLAGS)
@HAVE_GLIB_TRUE@valgrind_verbose = $(valgrind_verbose_@AM_V@)
@HAVE_GLIB_TRUE@valgrind_verbose_ = $(valgrind_verbose_@AM_DEFAULT_V@)
@@ -876,6 +957,14 @@ clean-noinstPROGRAMS:
echo " rm -f" $$list; \
rm -f $$list
+test-aat-layout$(EXEEXT): $(test_aat_layout_OBJECTS) $(test_aat_layout_DEPENDENCIES) $(EXTRA_test_aat_layout_DEPENDENCIES)
+ @rm -f test-aat-layout$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(test_aat_layout_OBJECTS) $(test_aat_layout_LDADD) $(LIBS)
+
+test-baseline$(EXEEXT): $(test_baseline_OBJECTS) $(test_baseline_DEPENDENCIES) $(EXTRA_test_baseline_DEPENDENCIES)
+ @rm -f test-baseline$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(test_baseline_OBJECTS) $(test_baseline_LDADD) $(LIBS)
+
test-blob$(EXEEXT): $(test_blob_OBJECTS) $(test_blob_DEPENDENCIES) $(EXTRA_test_blob_DEPENDENCIES)
@rm -f test-blob$(EXEEXT)
$(AM_V_CCLD)$(LINK) $(test_blob_OBJECTS) $(test_blob_LDADD) $(LIBS)
@@ -888,6 +977,10 @@ test-c$(EXEEXT): $(test_c_OBJECTS) $(test_c_DEPENDENCIES) $(EXTRA_test_c_DEPENDE
@rm -f test-c$(EXEEXT)
$(AM_V_CCLD)$(LINK) $(test_c_OBJECTS) $(test_c_LDADD) $(LIBS)
+test-collect-unicodes$(EXEEXT): $(test_collect_unicodes_OBJECTS) $(test_collect_unicodes_DEPENDENCIES) $(EXTRA_test_collect_unicodes_DEPENDENCIES)
+ @rm -f test-collect-unicodes$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(test_collect_unicodes_OBJECTS) $(test_collect_unicodes_LDADD) $(LIBS)
+
test-common$(EXEEXT): $(test_common_OBJECTS) $(test_common_DEPENDENCIES) $(EXTRA_test_common_DEPENDENCIES)
@rm -f test-common$(EXEEXT)
$(AM_V_CCLD)$(LINK) $(test_common_OBJECTS) $(test_common_LDADD) $(LIBS)
@@ -900,6 +993,14 @@ test-font$(EXEEXT): $(test_font_OBJECTS) $(test_font_DEPENDENCIES) $(EXTRA_test_
@rm -f test-font$(EXEEXT)
$(AM_V_CCLD)$(LINK) $(test_font_OBJECTS) $(test_font_LDADD) $(LIBS)
+test-map$(EXEEXT): $(test_map_OBJECTS) $(test_map_DEPENDENCIES) $(EXTRA_test_map_DEPENDENCIES)
+ @rm -f test-map$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(test_map_OBJECTS) $(test_map_LDADD) $(LIBS)
+
+test-multithread$(EXEEXT): $(test_multithread_OBJECTS) $(test_multithread_DEPENDENCIES) $(EXTRA_test_multithread_DEPENDENCIES)
+ @rm -f test-multithread$(EXEEXT)
+ $(AM_V_GEN)$(test_multithread_LINK) $(test_multithread_OBJECTS) $(test_multithread_LDADD) $(LIBS)
+
test-object$(EXEEXT): $(test_object_OBJECTS) $(test_object_DEPENDENCIES) $(EXTRA_test_object_DEPENDENCIES)
@rm -f test-object$(EXEEXT)
$(AM_V_CCLD)$(LINK) $(test_object_OBJECTS) $(test_object_LDADD) $(LIBS)
@@ -908,10 +1009,26 @@ test-ot-color$(EXEEXT): $(test_ot_color_OBJECTS) $(test_ot_color_DEPENDENCIES) $
@rm -f test-ot-color$(EXEEXT)
$(AM_V_CCLD)$(LINK) $(test_ot_color_OBJECTS) $(test_ot_color_LDADD) $(LIBS)
+test-ot-extents-cff$(EXEEXT): $(test_ot_extents_cff_OBJECTS) $(test_ot_extents_cff_DEPENDENCIES) $(EXTRA_test_ot_extents_cff_DEPENDENCIES)
+ @rm -f test-ot-extents-cff$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(test_ot_extents_cff_OBJECTS) $(test_ot_extents_cff_LDADD) $(LIBS)
+
+test-ot-face$(EXEEXT): $(test_ot_face_OBJECTS) $(test_ot_face_DEPENDENCIES) $(EXTRA_test_ot_face_DEPENDENCIES)
+ @rm -f test-ot-face$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(test_ot_face_OBJECTS) $(test_ot_face_LDADD) $(LIBS)
+
+test-ot-ligature-carets$(EXEEXT): $(test_ot_ligature_carets_OBJECTS) $(test_ot_ligature_carets_DEPENDENCIES) $(EXTRA_test_ot_ligature_carets_DEPENDENCIES)
+ @rm -f test-ot-ligature-carets$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(test_ot_ligature_carets_OBJECTS) $(test_ot_ligature_carets_LDADD) $(LIBS)
+
test-ot-math$(EXEEXT): $(test_ot_math_OBJECTS) $(test_ot_math_DEPENDENCIES) $(EXTRA_test_ot_math_DEPENDENCIES)
@rm -f test-ot-math$(EXEEXT)
$(AM_V_CCLD)$(LINK) $(test_ot_math_OBJECTS) $(test_ot_math_LDADD) $(LIBS)
+test-ot-name$(EXEEXT): $(test_ot_name_OBJECTS) $(test_ot_name_DEPENDENCIES) $(EXTRA_test_ot_name_DEPENDENCIES)
+ @rm -f test-ot-name$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(test_ot_name_OBJECTS) $(test_ot_name_LDADD) $(LIBS)
+
test-ot-tag$(EXEEXT): $(test_ot_tag_OBJECTS) $(test_ot_tag_DEPENDENCIES) $(EXTRA_test_ot_tag_DEPENDENCIES)
@rm -f test-ot-tag$(EXEEXT)
$(AM_V_CCLD)$(LINK) $(test_ot_tag_OBJECTS) $(test_ot_tag_LDADD) $(LIBS)
@@ -928,14 +1045,18 @@ test-subset$(EXEEXT): $(test_subset_OBJECTS) $(test_subset_DEPENDENCIES) $(EXTRA
@rm -f test-subset$(EXEEXT)
$(AM_V_CCLD)$(LINK) $(test_subset_OBJECTS) $(test_subset_LDADD) $(LIBS)
+test-subset-cff1$(EXEEXT): $(test_subset_cff1_OBJECTS) $(test_subset_cff1_DEPENDENCIES) $(EXTRA_test_subset_cff1_DEPENDENCIES)
+ @rm -f test-subset-cff1$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(test_subset_cff1_OBJECTS) $(test_subset_cff1_LDADD) $(LIBS)
+
+test-subset-cff2$(EXEEXT): $(test_subset_cff2_OBJECTS) $(test_subset_cff2_DEPENDENCIES) $(EXTRA_test_subset_cff2_DEPENDENCIES)
+ @rm -f test-subset-cff2$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(test_subset_cff2_OBJECTS) $(test_subset_cff2_LDADD) $(LIBS)
+
test-subset-cmap$(EXEEXT): $(test_subset_cmap_OBJECTS) $(test_subset_cmap_DEPENDENCIES) $(EXTRA_test_subset_cmap_DEPENDENCIES)
@rm -f test-subset-cmap$(EXEEXT)
$(AM_V_CCLD)$(LINK) $(test_subset_cmap_OBJECTS) $(test_subset_cmap_LDADD) $(LIBS)
-test-subset-codepoints$(EXEEXT): $(test_subset_codepoints_OBJECTS) $(test_subset_codepoints_DEPENDENCIES) $(EXTRA_test_subset_codepoints_DEPENDENCIES)
- @rm -f test-subset-codepoints$(EXEEXT)
- $(AM_V_CCLD)$(LINK) $(test_subset_codepoints_OBJECTS) $(test_subset_codepoints_LDADD) $(LIBS)
-
test-subset-glyf$(EXEEXT): $(test_subset_glyf_OBJECTS) $(test_subset_glyf_DEPENDENCIES) $(EXTRA_test_subset_glyf_DEPENDENCIES)
@rm -f test-subset-glyf$(EXEEXT)
$(AM_V_CCLD)$(LINK) $(test_subset_glyf_OBJECTS) $(test_subset_glyf_LDADD) $(LIBS)
@@ -974,17 +1095,26 @@ mostlyclean-compile:
distclean-compile:
-rm -f *.tab.c
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-aat-layout.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-baseline.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-blob.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-buffer.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-collect-unicodes.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-common.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-font.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-map.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-object.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-ot-color.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-ot-extents-cff.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-ot-face.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-ot-ligature-carets.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-ot-name.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-ot-tag.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-set.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-shape.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-subset-cff1.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-subset-cff2.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-subset-cmap.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-subset-codepoints.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-subset-glyf.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-subset-hdmx.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-subset-hmtx.Po@am__quote@
@@ -995,6 +1125,7 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-version.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_c-test-c.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_cplusplus-test-cplusplus.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_multithread-test-multithread.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_ot_math-test-ot-math.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_unicode-test-unicode.Po@am__quote@
@@ -1033,6 +1164,20 @@ test_c-test-c.obj: test-c.c
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_c_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o test_c-test-c.obj `if test -f 'test-c.c'; then $(CYGPATH_W) 'test-c.c'; else $(CYGPATH_W) '$(srcdir)/test-c.c'; fi`
+test_multithread-test-multithread.o: test-multithread.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_multithread_CFLAGS) $(CFLAGS) -MT test_multithread-test-multithread.o -MD -MP -MF $(DEPDIR)/test_multithread-test-multithread.Tpo -c -o test_multithread-test-multithread.o `test -f 'test-multithread.c' || echo '$(srcdir)/'`test-multithread.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/test_multithread-test-multithread.Tpo $(DEPDIR)/test_multithread-test-multithread.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='test-multithread.c' object='test_multithread-test-multithread.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_multithread_CFLAGS) $(CFLAGS) -c -o test_multithread-test-multithread.o `test -f 'test-multithread.c' || echo '$(srcdir)/'`test-multithread.c
+
+test_multithread-test-multithread.obj: test-multithread.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_multithread_CFLAGS) $(CFLAGS) -MT test_multithread-test-multithread.obj -MD -MP -MF $(DEPDIR)/test_multithread-test-multithread.Tpo -c -o test_multithread-test-multithread.obj `if test -f 'test-multithread.c'; then $(CYGPATH_W) 'test-multithread.c'; else $(CYGPATH_W) '$(srcdir)/test-multithread.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/test_multithread-test-multithread.Tpo $(DEPDIR)/test_multithread-test-multithread.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='test-multithread.c' object='test_multithread-test-multithread.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_multithread_CFLAGS) $(CFLAGS) -c -o test_multithread-test-multithread.obj `if test -f 'test-multithread.c'; then $(CYGPATH_W) 'test-multithread.c'; else $(CYGPATH_W) '$(srcdir)/test-multithread.c'; fi`
+
test_ot_math-test-ot-math.o: test-ot-math.c
@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_ot_math_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT test_ot_math-test-ot-math.o -MD -MP -MF $(DEPDIR)/test_ot_math-test-ot-math.Tpo -c -o test_ot_math-test-ot-math.o `test -f 'test-ot-math.c' || echo '$(srcdir)/'`test-ot-math.c
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/test_ot_math-test-ot-math.Tpo $(DEPDIR)/test_ot_math-test-ot-math.Po
@@ -1295,6 +1440,20 @@ recheck: all $(check_PROGRAMS)
am__force_recheck=am--force-recheck \
TEST_LOGS="$$log_list"; \
exit $$?
+test-aat-layout.log: test-aat-layout$(EXEEXT)
+ @p='test-aat-layout$(EXEEXT)'; \
+ b='test-aat-layout'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+test-baseline.log: test-baseline$(EXEEXT)
+ @p='test-baseline$(EXEEXT)'; \
+ b='test-baseline'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
test-blob.log: test-blob$(EXEEXT)
@p='test-blob$(EXEEXT)'; \
b='test-blob'; \
@@ -1309,6 +1468,13 @@ test-buffer.log: test-buffer$(EXEEXT)
--log-file $$b.log --trs-file $$b.trs \
$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
"$$tst" $(AM_TESTS_FD_REDIRECT)
+test-collect-unicodes.log: test-collect-unicodes$(EXEEXT)
+ @p='test-collect-unicodes$(EXEEXT)'; \
+ b='test-collect-unicodes'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
test-common.log: test-common$(EXEEXT)
@p='test-common$(EXEEXT)'; \
b='test-common'; \
@@ -1323,6 +1489,13 @@ test-font.log: test-font$(EXEEXT)
--log-file $$b.log --trs-file $$b.trs \
$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
"$$tst" $(AM_TESTS_FD_REDIRECT)
+test-map.log: test-map$(EXEEXT)
+ @p='test-map$(EXEEXT)'; \
+ b='test-map'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
test-object.log: test-object$(EXEEXT)
@p='test-object$(EXEEXT)'; \
b='test-object'; \
@@ -1330,6 +1503,13 @@ test-object.log: test-object$(EXEEXT)
--log-file $$b.log --trs-file $$b.trs \
$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
"$$tst" $(AM_TESTS_FD_REDIRECT)
+test-ot-face.log: test-ot-face$(EXEEXT)
+ @p='test-ot-face$(EXEEXT)'; \
+ b='test-ot-face'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
test-set.log: test-set$(EXEEXT)
@p='test-set$(EXEEXT)'; \
b='test-set'; \
@@ -1351,13 +1531,6 @@ test-subset.log: test-subset$(EXEEXT)
--log-file $$b.log --trs-file $$b.trs \
$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
"$$tst" $(AM_TESTS_FD_REDIRECT)
-test-subset-codepoints.log: test-subset-codepoints$(EXEEXT)
- @p='test-subset-codepoints$(EXEEXT)'; \
- b='test-subset-codepoints'; \
- $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
- --log-file $$b.log --trs-file $$b.trs \
- $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
- "$$tst" $(AM_TESTS_FD_REDIRECT)
test-subset-cmap.log: test-subset-cmap$(EXEEXT)
@p='test-subset-cmap$(EXEEXT)'; \
b='test-subset-cmap'; \
@@ -1407,6 +1580,20 @@ test-subset-vmtx.log: test-subset-vmtx$(EXEEXT)
--log-file $$b.log --trs-file $$b.trs \
$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
"$$tst" $(AM_TESTS_FD_REDIRECT)
+test-subset-cff1.log: test-subset-cff1$(EXEEXT)
+ @p='test-subset-cff1$(EXEEXT)'; \
+ b='test-subset-cff1'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+test-subset-cff2.log: test-subset-cff2$(EXEEXT)
+ @p='test-subset-cff2$(EXEEXT)'; \
+ b='test-subset-cff2'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
test-unicode.log: test-unicode$(EXEEXT)
@p='test-unicode$(EXEEXT)'; \
b='test-unicode'; \
@@ -1428,6 +1615,20 @@ test-ot-color.log: test-ot-color$(EXEEXT)
--log-file $$b.log --trs-file $$b.trs \
$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
"$$tst" $(AM_TESTS_FD_REDIRECT)
+test-ot-ligature-carets.log: test-ot-ligature-carets$(EXEEXT)
+ @p='test-ot-ligature-carets$(EXEEXT)'; \
+ b='test-ot-ligature-carets'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+test-ot-name.log: test-ot-name$(EXEEXT)
+ @p='test-ot-name$(EXEEXT)'; \
+ b='test-ot-name'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
test-ot-tag.log: test-ot-tag$(EXEEXT)
@p='test-ot-tag$(EXEEXT)'; \
b='test-ot-tag'; \
@@ -1435,6 +1636,20 @@ test-ot-tag.log: test-ot-tag$(EXEEXT)
--log-file $$b.log --trs-file $$b.trs \
$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
"$$tst" $(AM_TESTS_FD_REDIRECT)
+test-ot-extents-cff.log: test-ot-extents-cff$(EXEEXT)
+ @p='test-ot-extents-cff$(EXEEXT)'; \
+ b='test-ot-extents-cff'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+test-multithread.log: test-multithread$(EXEEXT)
+ @p='test-multithread$(EXEEXT)'; \
+ b='test-multithread'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
test-ot-math.log: test-ot-math$(EXEEXT)
@p='test-ot-math$(EXEEXT)'; \
b='test-ot-math'; \
@@ -1637,6 +1852,8 @@ uninstall-am:
# Convenience targets:
lib:
@$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src lib
+libs:
+ @$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src libs
# check-tool: Run tests under $(TOOL)
@HAVE_GLIB_TRUE@check-tool:
@@ -1650,7 +1867,6 @@ lib:
@HAVE_GLIB_TRUE@ env $(TOOL)'
@HAVE_GLIB_TRUE@check-gtester:
@HAVE_GLIB_TRUE@ $(AM_V_at)$(MAKE) $(AM_MAKEFLGS) check-tool-raw TOOL="$(GTESTER) --verbose --keep-going"
-@HAVE_GLIB_TRUE@ $(EXTRA_VALGRIND_FLAGS)
# TODO: The following check does not fail if valgrind finds error. It should.
@HAVE_GLIB_TRUE@check-valgrind:
@HAVE_GLIB_TRUE@ $(AM_V_at)$(MAKE) $(AM_MAKEFLGS) check-tool TOOL="valgrind $(VALGRIND_FLAGS)" \
@@ -1661,11 +1877,13 @@ lib:
@HAVE_GLIB_TRUE@ $(AM_V_GEN)$(top_builddir)/libtool --mode=execute nm $^ \
@HAVE_GLIB_TRUE@ | grep ' U hb_' | sed 's/.* U hb_/hb_/' \
@HAVE_GLIB_TRUE@ | sort | uniq > $@.tmp && mv $@.tmp $@
+@HAVE_GLIB_TRUE@symbols-tested-or-deprecated.txt: symbols-tested.txt $(top_builddir)/src/harfbuzz-deprecated-symbols.txt
+@HAVE_GLIB_TRUE@ $(AM_V_GEN)cat $^ | sort | uniq > $@.tmp; mv $@.tmp $@
@HAVE_GLIB_TRUE@symbols-exported.txt: $(top_builddir)/src/.libs/libharfbuzz.so
@HAVE_GLIB_TRUE@ $(AM_V_GEN)$(top_builddir)/libtool --mode=execute nm $^ \
@HAVE_GLIB_TRUE@ | grep ' T ' | sed 's/.* T //' | grep -v '^\(_init\|_fini\)$$' \
@HAVE_GLIB_TRUE@ | sort | uniq > $@.tmp && mv $@.tmp $@
-@HAVE_GLIB_TRUE@symbols-untested.txt: symbols-tested.txt symbols-exported.txt
+@HAVE_GLIB_TRUE@symbols-untested.txt: symbols-tested-or-deprecated.txt symbols-exported.txt
@HAVE_GLIB_TRUE@ $(AM_V_GEN)diff $^ > $@.tmp; mv $@.tmp $@
@HAVE_GLIB_TRUE@check-symbols: symbols-untested.txt
@HAVE_GLIB_TRUE@ @! cat $^ | grep .
diff --git a/test/api/fonts/AdobeVFPrototype.abc.otf b/test/api/fonts/AdobeVFPrototype.abc.otf
new file mode 100644
index 0000000..cc47708
--- /dev/null
+++ b/test/api/fonts/AdobeVFPrototype.abc.otf
Binary files differ
diff --git a/test/api/fonts/AdobeVFPrototype.ac.nohints.otf b/test/api/fonts/AdobeVFPrototype.ac.nohints.otf
new file mode 100644
index 0000000..935bdbf
--- /dev/null
+++ b/test/api/fonts/AdobeVFPrototype.ac.nohints.otf
Binary files differ
diff --git a/test/api/fonts/AdobeVFPrototype.ac.nosubrs.nohints.otf b/test/api/fonts/AdobeVFPrototype.ac.nosubrs.nohints.otf
new file mode 100644
index 0000000..85f6cf6
--- /dev/null
+++ b/test/api/fonts/AdobeVFPrototype.ac.nosubrs.nohints.otf
Binary files differ
diff --git a/test/api/fonts/AdobeVFPrototype.ac.nosubrs.otf b/test/api/fonts/AdobeVFPrototype.ac.nosubrs.otf
new file mode 100644
index 0000000..ad4d53b
--- /dev/null
+++ b/test/api/fonts/AdobeVFPrototype.ac.nosubrs.otf
Binary files differ
diff --git a/test/api/fonts/AdobeVFPrototype.ac.otf b/test/api/fonts/AdobeVFPrototype.ac.otf
new file mode 100644
index 0000000..beab7d5
--- /dev/null
+++ b/test/api/fonts/AdobeVFPrototype.ac.otf
Binary files differ
diff --git a/test/api/fonts/AdobeVFPrototype_vsindex.otf b/test/api/fonts/AdobeVFPrototype_vsindex.otf
new file mode 100644
index 0000000..3697b46
--- /dev/null
+++ b/test/api/fonts/AdobeVFPrototype_vsindex.otf
Binary files differ
diff --git a/test/api/fonts/MathTestFontFull.ttx b/test/api/fonts/MathTestFontFull.ttx
deleted file mode 100644
index 1d1aa53..0000000
--- a/test/api/fonts/MathTestFontFull.ttx
+++ /dev/null
@@ -1,6578 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ttFont sfntVersion="OTTO" ttLibVersion="3.0">
-
- <GlyphOrder>
- <!-- The 'id' attribute is only for humans; it is ignored when parsed. -->
- <GlyphID id="0" name=".notdef"/>
- <GlyphID id="1" name="space"/>
- <GlyphID id="2" name="A"/>
- <GlyphID id="3" name="B"/>
- <GlyphID id="4" name="C"/>
- <GlyphID id="5" name="D"/>
- <GlyphID id="6" name="E"/>
- <GlyphID id="7" name="F"/>
- <GlyphID id="8" name="G"/>
- <GlyphID id="9" name="H"/>
- <GlyphID id="10" name="I"/>
- <GlyphID id="11" name="J"/>
- <GlyphID id="12" name="K"/>
- <GlyphID id="13" name="L"/>
- <GlyphID id="14" name="M"/>
- <GlyphID id="15" name="N"/>
- <GlyphID id="16" name="O"/>
- <GlyphID id="17" name="P"/>
- <GlyphID id="18" name="Q"/>
- <GlyphID id="19" name="R"/>
- <GlyphID id="20" name="S"/>
- <GlyphID id="21" name="T"/>
- <GlyphID id="22" name="U"/>
- <GlyphID id="23" name="V"/>
- <GlyphID id="24" name="W"/>
- <GlyphID id="25" name="X"/>
- <GlyphID id="26" name="Y"/>
- <GlyphID id="27" name="Z"/>
- <GlyphID id="28" name="underscore"/>
- <GlyphID id="29" name="braceleft"/>
- <GlyphID id="30" name="arrowleft"/>
- <GlyphID id="31" name="arrowup"/>
- <GlyphID id="32" name="arrowright"/>
- <GlyphID id="33" name="arrowdown"/>
- <GlyphID id="34" name="arrowboth"/>
- <GlyphID id="35" name="arrowupdn"/>
- <GlyphID id="36" name="uni21A4"/>
- <GlyphID id="37" name="uni21A5"/>
- <GlyphID id="38" name="uni21A6"/>
- <GlyphID id="39" name="uni21A7"/>
- <GlyphID id="40" name="uni21C7"/>
- <GlyphID id="41" name="uni21C8"/>
- <GlyphID id="42" name="uni21C9"/>
- <GlyphID id="43" name="uni21CA"/>
- <GlyphID id="44" name="arrowdblleft"/>
- <GlyphID id="45" name="arrowdblup"/>
- <GlyphID id="46" name="arrowdblright"/>
- <GlyphID id="47" name="arrowdbldown"/>
- <GlyphID id="48" name="arrowdblboth"/>
- <GlyphID id="49" name="uni21D5"/>
- <GlyphID id="50" name="uni21E6"/>
- <GlyphID id="51" name="uni21E7"/>
- <GlyphID id="52" name="uni21E8"/>
- <GlyphID id="53" name="uni21E9"/>
- <GlyphID id="54" name="uni23A7"/>
- <GlyphID id="55" name="uni23A8"/>
- <GlyphID id="56" name="uni23A9"/>
- <GlyphID id="57" name="uni23AA"/>
- <GlyphID id="58" name="center"/>
- <GlyphID id="59" name="left"/>
- <GlyphID id="60" name="right"/>
- <GlyphID id="61" name="top"/>
- <GlyphID id="62" name="bottom"/>
- <GlyphID id="63" name="horizontal"/>
- <GlyphID id="64" name="vertical"/>
- <GlyphID id="65" name="uni2190_size2"/>
- <GlyphID id="66" name="uni2190_size3"/>
- <GlyphID id="67" name="uni2190_size4"/>
- <GlyphID id="68" name="uni2191_size2"/>
- <GlyphID id="69" name="uni2191_size3"/>
- <GlyphID id="70" name="uni2191_size4"/>
- <GlyphID id="71" name="uni2191_size5"/>
- <GlyphID id="72" name="uni2192_size2"/>
- <GlyphID id="73" name="uni2192_size3"/>
- <GlyphID id="74" name="uni2192_size4"/>
- <GlyphID id="75" name="uni2192_size5"/>
- <GlyphID id="76" name="uni2192_size6"/>
- <GlyphID id="77" name="uni2193_size2"/>
- <GlyphID id="78" name="uni2193_size3"/>
- <GlyphID id="79" name="uni2193_size4"/>
- <GlyphID id="80" name="uni2193_size5"/>
- <GlyphID id="81" name="uni2193_size6"/>
- <GlyphID id="82" name="uni2193_size7"/>
- <GlyphID id="83" name="uni2195_size2"/>
- <GlyphID id="84" name="uni21A4_size2"/>
- <GlyphID id="85" name="uni21A4_size3"/>
- <GlyphID id="86" name="uni21A5_size2"/>
- <GlyphID id="87" name="uni21A5_size3"/>
- <GlyphID id="88" name="uni21A5_size4"/>
- <GlyphID id="89" name="uni21A6_size2"/>
- <GlyphID id="90" name="uni21A6_size3"/>
- <GlyphID id="91" name="uni21A6_size4"/>
- <GlyphID id="92" name="uni21A6_size5"/>
- <GlyphID id="93" name="uni21A7_size2"/>
- <GlyphID id="94" name="uni21A7_size3"/>
- <GlyphID id="95" name="uni21A7_size4"/>
- <GlyphID id="96" name="uni21A7_size5"/>
- <GlyphID id="97" name="uni21A7_size6"/>
- <GlyphID id="98" name="uni21C7_size2"/>
- <GlyphID id="99" name="uni21C7_size3"/>
- <GlyphID id="100" name="uni21C8_size2"/>
- <GlyphID id="101" name="uni21C8_size3"/>
- <GlyphID id="102" name="uni21C8_size4"/>
- <GlyphID id="103" name="uni21C9_size2"/>
- <GlyphID id="104" name="uni21C9_size3"/>
- <GlyphID id="105" name="uni21C9_size4"/>
- <GlyphID id="106" name="uni21C9_size5"/>
- <GlyphID id="107" name="uni21CA_size2"/>
- <GlyphID id="108" name="uni21CA_size3"/>
- <GlyphID id="109" name="uni21CA_size4"/>
- <GlyphID id="110" name="uni21CA_size5"/>
- <GlyphID id="111" name="uni21CA_size6"/>
- <GlyphID id="112" name="uni21D0_size2"/>
- <GlyphID id="113" name="uni21D0_size3"/>
- <GlyphID id="114" name="uni21D0_size4"/>
- <GlyphID id="115" name="uni21D0_size5"/>
- <GlyphID id="116" name="uni21D1_size2"/>
- <GlyphID id="117" name="uni21D1_size3"/>
- <GlyphID id="118" name="uni21D1_size4"/>
- <GlyphID id="119" name="uni21D1_size5"/>
- <GlyphID id="120" name="uni21D1_size6"/>
- <GlyphID id="121" name="uni21D2_size2"/>
- <GlyphID id="122" name="uni21D2_size3"/>
- <GlyphID id="123" name="uni21D2_size4"/>
- <GlyphID id="124" name="uni21D2_size5"/>
- <GlyphID id="125" name="uni21D2_size6"/>
- <GlyphID id="126" name="uni21D2_size7"/>
- <GlyphID id="127" name="uni21D4_size2"/>
- <GlyphID id="128" name="uni21D5_size2"/>
- <GlyphID id="129" name="uni21D5_size3"/>
- <GlyphID id="130" name="uni21E6_size2"/>
- <GlyphID id="131" name="uni21E6_size3"/>
- <GlyphID id="132" name="uni21E6_size4"/>
- <GlyphID id="133" name="uni21E6_size5"/>
- <GlyphID id="134" name="uni21E6_size6"/>
- <GlyphID id="135" name="uni21E7_size2"/>
- <GlyphID id="136" name="uni21E7_size3"/>
- <GlyphID id="137" name="uni21E7_size4"/>
- <GlyphID id="138" name="uni21E7_size5"/>
- <GlyphID id="139" name="uni21E7_size6"/>
- <GlyphID id="140" name="uni21E7_size7"/>
- <GlyphID id="141" name="uni21E9_size2"/>
- </GlyphOrder>
-
- <head>
- <!-- Most of this table will be recalculated by the compiler -->
- <tableVersion value="1.0"/>
- <fontRevision value="1.0"/>
- <checkSumAdjustment value="0x87faf3a0"/>
- <magicNumber value="0x5f0f3cf5"/>
- <flags value="00000000 00001011"/>
- <unitsPerEm value="1000"/>
- <created value="Tue Apr 12 14:44:11 2016"/>
- <modified value="Tue Apr 12 14:44:11 2016"/>
- <xMin value="0"/>
- <yMin value="0"/>
- <xMax value="5300"/>
- <yMax value="5500"/>
- <macStyle value="00000000 00000000"/>
- <lowestRecPPEM value="8"/>
- <fontDirectionHint value="2"/>
- <indexToLocFormat value="0"/>
- <glyphDataFormat value="0"/>
- </head>
-
- <hhea>
- <tableVersion value="1.0"/>
- <ascent value="1000"/>
- <descent value="0"/>
- <lineGap value="108"/>
- <advanceWidthMax value="1000"/>
- <minLeftSideBearing value="0"/>
- <minRightSideBearing value="-4300"/>
- <xMaxExtent value="5300"/>
- <caretSlopeRise value="1"/>
- <caretSlopeRun value="0"/>
- <caretOffset value="0"/>
- <reserved0 value="0"/>
- <reserved1 value="0"/>
- <reserved2 value="0"/>
- <reserved3 value="0"/>
- <metricDataFormat value="0"/>
- <numberOfHMetrics value="2"/>
- </hhea>
-
- <maxp>
- <tableVersion value="0x5000"/>
- <numGlyphs value="142"/>
- </maxp>
-
- <OS_2>
- <!-- The fields 'usFirstCharIndex' and 'usLastCharIndex'
- will be recalculated by the compiler -->
- <version value="4"/>
- <xAvgCharWidth value="1000"/>
- <usWeightClass value="400"/>
- <usWidthClass value="5"/>
- <fsType value="00000000 00000000"/>
- <ySubscriptXSize value="780"/>
- <ySubscriptYSize value="840"/>
- <ySubscriptXOffset value="0"/>
- <ySubscriptYOffset value="168"/>
- <ySuperscriptXSize value="780"/>
- <ySuperscriptYSize value="840"/>
- <ySuperscriptXOffset value="0"/>
- <ySuperscriptYOffset value="576"/>
- <yStrikeoutSize value="59"/>
- <yStrikeoutPosition value="310"/>
- <sFamilyClass value="0"/>
- <panose>
- <bFamilyType value="2"/>
- <bSerifStyle value="0"/>
- <bWeight value="5"/>
- <bProportion value="9"/>
- <bContrast value="0"/>
- <bStrokeVariation value="0"/>
- <bArmStyle value="0"/>
- <bLetterForm value="0"/>
- <bMidline value="0"/>
- <bXHeight value="0"/>
- </panose>
- <ulUnicodeRange1 value="00000000 00000000 00000000 00000001"/>
- <ulUnicodeRange2 value="00000000 00000000 00000000 00100000"/>
- <ulUnicodeRange3 value="00000000 00000000 00000000 00000000"/>
- <ulUnicodeRange4 value="00000000 00000000 00000000 00000000"/>
- <achVendID value="\x00\x00\x00\x00"/>
- <fsSelection value="00000000 10000000"/>
- <usFirstCharIndex value="32"/>
- <usLastCharIndex value="9130"/>
- <sTypoAscender value="1000"/>
- <sTypoDescender value="0"/>
- <sTypoLineGap value="108"/>
- <usWinAscent value="0"/>
- <usWinDescent value="0"/>
- <ulCodePageRange1 value="00000000 00000000 00000000 00000001"/>
- <ulCodePageRange2 value="00000000 00000000 00000000 00000000"/>
- <sxHeight value="0"/>
- <sCapHeight value="1000"/>
- <usDefaultChar value="32"/>
- <usBreakChar value="32"/>
- <usMaxContext value="1"/>
- </OS_2>
-
- <name>
- <namerecord nameID="0" platformID="1" platEncID="0" langID="0x0" unicode="True">
- Copyright (c) 2016, Igalia S.L. (http://igalia.com/)
-
-This Font Software is licensed under the SIL Open Font License, Version 1.1.
-This license is copied below, and is also available with a FAQ at:
-http://scripts.sil.org/OFL
-
-
------------------------------------------------------------
-SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
------------------------------------------------------------
-
-PREAMBLE
-The goals of the Open Font License (OFL) are to stimulate worldwide
-development of collaborative font projects, to support the font creation
-efforts of academic and linguistic communities, and to provide a free and
-open framework in which fonts may be shared and improved in partnership
-with others.
-
-The OFL allows the licensed fonts to be used, studied, modified and
-redistributed freely as long as they are not sold by themselves. The
-fonts, including any derivative works, can be bundled, embedded,
-redistributed and/or sold with any software provided that any reserved
-names are not used by derivative works. The fonts and derivatives,
-however, cannot be released under any other type of license. The
-requirement for fonts to remain under this license does not apply
-to any document created using the fonts or their derivatives.
-
-DEFINITIONS
-"Font Software" refers to the set of files released by the Copyright
-Holder(s) under this license and clearly marked as such. This may
-include source files, build scripts and documentation.
-
-"Reserved Font Name" refers to any names specified as such after the
-copyright statement(s).
-
-"Original Version" refers to the collection of Font Software components as
-distributed by the Copyright Holder(s).
-
-"Modified Version" refers to any derivative made by adding to, deleting,
-or substituting -- in part or in whole -- any of the components of the
-Original Version, by changing formats or by porting the Font Software to a
-new environment.
-
-"Author" refers to any designer, engineer, programmer, technical
-writer or other person who contributed to the Font Software.
-
-PERMISSION &amp; CONDITIONS
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of the Font Software, to use, study, copy, merge, embed, modify,
-redistribute, and sell modified and unmodified copies of the Font
-Software, subject to the following conditions:
-
-1) Neither the Font Software nor any of its individual components,
-in Original or Modified Versions, may be sold by itself.
-
-2) Original or Modified Versions of the Font Software may be bundled,
-redistributed and/or sold with any software, provided that each copy
-contains the above copyright notice and this license. These can be
-included either as stand-alone text files, human-readable headers or
-in the appropriate machine-readable metadata fields within text or
-binary files as long as those fields can be easily viewed by the user.
-
-3) No Modified Version of the Font Software may use the Reserved Font
-Name(s) unless explicit written permission is granted by the corresponding
-Copyright Holder. This restriction only applies to the primary font name as
-presented to the users.
-
-4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
-Software shall not be used to promote, endorse or advertise any
-Modified Version, except to acknowledge the contribution(s) of the
-Copyright Holder(s) and the Author(s) or with their explicit written
-permission.
-
-5) The Font Software, modified or unmodified, in part or in whole,
-must be distributed entirely under this license, and must not be
-distributed under any other license. The requirement for fonts to
-remain under this license does not apply to any document created
-using the Font Software.
-
-TERMINATION
-This license becomes null and void if any of the above conditions are
-not met.
-
-DISCLAIMER
-THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
-OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
-COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
-DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
-OTHER DEALINGS IN THE FONT SOFTWARE.
-
- </namerecord>
- <namerecord nameID="1" platformID="1" platEncID="0" langID="0x0" unicode="True">
- MathTestFontFull
- </namerecord>
- <namerecord nameID="2" platformID="1" platEncID="0" langID="0x0" unicode="True">
- Regular
- </namerecord>
- <namerecord nameID="3" platformID="1" platEncID="0" langID="0x0" unicode="True">
- FontForge 2.0 : MathTestFontFull : 12-4-2016
- </namerecord>
- <namerecord nameID="4" platformID="1" platEncID="0" langID="0x0" unicode="True">
- MathTestFontFull
- </namerecord>
- <namerecord nameID="5" platformID="1" platEncID="0" langID="0x0" unicode="True">
- Version 001.000
- </namerecord>
- <namerecord nameID="6" platformID="1" platEncID="0" langID="0x0" unicode="True">
- MathTestFontFull
- </namerecord>
- <namerecord nameID="14" platformID="1" platEncID="0" langID="0x0" unicode="True">
- http://scripts.sil.org/OFL
- </namerecord>
- <namerecord nameID="0" platformID="3" platEncID="1" langID="0x409">
- Copyright (c) 2016, Igalia S.L. (http://igalia.com/)
-
-This Font Software is licensed under the SIL Open Font License, Version 1.1.
-This license is copied below, and is also available with a FAQ at:
-http://scripts.sil.org/OFL
-
-
------------------------------------------------------------
-SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
------------------------------------------------------------
-
-PREAMBLE
-The goals of the Open Font License (OFL) are to stimulate worldwide
-development of collaborative font projects, to support the font creation
-efforts of academic and linguistic communities, and to provide a free and
-open framework in which fonts may be shared and improved in partnership
-with others.
-
-The OFL allows the licensed fonts to be used, studied, modified and
-redistributed freely as long as they are not sold by themselves. The
-fonts, including any derivative works, can be bundled, embedded,
-redistributed and/or sold with any software provided that any reserved
-names are not used by derivative works. The fonts and derivatives,
-however, cannot be released under any other type of license. The
-requirement for fonts to remain under this license does not apply
-to any document created using the fonts or their derivatives.
-
-DEFINITIONS
-"Font Software" refers to the set of files released by the Copyright
-Holder(s) under this license and clearly marked as such. This may
-include source files, build scripts and documentation.
-
-"Reserved Font Name" refers to any names specified as such after the
-copyright statement(s).
-
-"Original Version" refers to the collection of Font Software components as
-distributed by the Copyright Holder(s).
-
-"Modified Version" refers to any derivative made by adding to, deleting,
-or substituting -- in part or in whole -- any of the components of the
-Original Version, by changing formats or by porting the Font Software to a
-new environment.
-
-"Author" refers to any designer, engineer, programmer, technical
-writer or other person who contributed to the Font Software.
-
-PERMISSION &amp; CONDITIONS
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of the Font Software, to use, study, copy, merge, embed, modify,
-redistribute, and sell modified and unmodified copies of the Font
-Software, subject to the following conditions:
-
-1) Neither the Font Software nor any of its individual components,
-in Original or Modified Versions, may be sold by itself.
-
-2) Original or Modified Versions of the Font Software may be bundled,
-redistributed and/or sold with any software, provided that each copy
-contains the above copyright notice and this license. These can be
-included either as stand-alone text files, human-readable headers or
-in the appropriate machine-readable metadata fields within text or
-binary files as long as those fields can be easily viewed by the user.
-
-3) No Modified Version of the Font Software may use the Reserved Font
-Name(s) unless explicit written permission is granted by the corresponding
-Copyright Holder. This restriction only applies to the primary font name as
-presented to the users.
-
-4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
-Software shall not be used to promote, endorse or advertise any
-Modified Version, except to acknowledge the contribution(s) of the
-Copyright Holder(s) and the Author(s) or with their explicit written
-permission.
-
-5) The Font Software, modified or unmodified, in part or in whole,
-must be distributed entirely under this license, and must not be
-distributed under any other license. The requirement for fonts to
-remain under this license does not apply to any document created
-using the Font Software.
-
-TERMINATION
-This license becomes null and void if any of the above conditions are
-not met.
-
-DISCLAIMER
-THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
-OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
-COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
-DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
-OTHER DEALINGS IN THE FONT SOFTWARE.
-
- </namerecord>
- <namerecord nameID="1" platformID="3" platEncID="1" langID="0x409">
- MathTestFontFull
- </namerecord>
- <namerecord nameID="2" platformID="3" platEncID="1" langID="0x409">
- Regular
- </namerecord>
- <namerecord nameID="3" platformID="3" platEncID="1" langID="0x409">
- FontForge 2.0 : MathTestFontFull : 12-4-2016
- </namerecord>
- <namerecord nameID="4" platformID="3" platEncID="1" langID="0x409">
- MathTestFontFull
- </namerecord>
- <namerecord nameID="5" platformID="3" platEncID="1" langID="0x409">
- Version 001.000
- </namerecord>
- <namerecord nameID="6" platformID="3" platEncID="1" langID="0x409">
- MathTestFontFull
- </namerecord>
- <namerecord nameID="14" platformID="3" platEncID="1" langID="0x409">
- http://scripts.sil.org/OFL
- </namerecord>
- </name>
-
- <cmap>
- <tableVersion version="0"/>
- <cmap_format_4 platformID="0" platEncID="3" language="0">
- <map code="0x20" name="space"/><!-- SPACE -->
- <map code="0x41" name="A"/><!-- LATIN CAPITAL LETTER A -->
- <map code="0x42" name="B"/><!-- LATIN CAPITAL LETTER B -->
- <map code="0x43" name="C"/><!-- LATIN CAPITAL LETTER C -->
- <map code="0x44" name="D"/><!-- LATIN CAPITAL LETTER D -->
- <map code="0x45" name="E"/><!-- LATIN CAPITAL LETTER E -->
- <map code="0x46" name="F"/><!-- LATIN CAPITAL LETTER F -->
- <map code="0x47" name="G"/><!-- LATIN CAPITAL LETTER G -->
- <map code="0x48" name="H"/><!-- LATIN CAPITAL LETTER H -->
- <map code="0x49" name="I"/><!-- LATIN CAPITAL LETTER I -->
- <map code="0x4a" name="J"/><!-- LATIN CAPITAL LETTER J -->
- <map code="0x4b" name="K"/><!-- LATIN CAPITAL LETTER K -->
- <map code="0x4c" name="L"/><!-- LATIN CAPITAL LETTER L -->
- <map code="0x4d" name="M"/><!-- LATIN CAPITAL LETTER M -->
- <map code="0x4e" name="N"/><!-- LATIN CAPITAL LETTER N -->
- <map code="0x4f" name="O"/><!-- LATIN CAPITAL LETTER O -->
- <map code="0x50" name="P"/><!-- LATIN CAPITAL LETTER P -->
- <map code="0x51" name="Q"/><!-- LATIN CAPITAL LETTER Q -->
- <map code="0x52" name="R"/><!-- LATIN CAPITAL LETTER R -->
- <map code="0x53" name="S"/><!-- LATIN CAPITAL LETTER S -->
- <map code="0x54" name="T"/><!-- LATIN CAPITAL LETTER T -->
- <map code="0x55" name="U"/><!-- LATIN CAPITAL LETTER U -->
- <map code="0x56" name="V"/><!-- LATIN CAPITAL LETTER V -->
- <map code="0x57" name="W"/><!-- LATIN CAPITAL LETTER W -->
- <map code="0x58" name="X"/><!-- LATIN CAPITAL LETTER X -->
- <map code="0x59" name="Y"/><!-- LATIN CAPITAL LETTER Y -->
- <map code="0x5a" name="Z"/><!-- LATIN CAPITAL LETTER Z -->
- <map code="0x5f" name="underscore"/><!-- LOW LINE -->
- <map code="0x7b" name="braceleft"/><!-- LEFT CURLY BRACKET -->
- <map code="0x2190" name="arrowleft"/><!-- LEFTWARDS ARROW -->
- <map code="0x2191" name="arrowup"/><!-- UPWARDS ARROW -->
- <map code="0x2192" name="arrowright"/><!-- RIGHTWARDS ARROW -->
- <map code="0x2193" name="arrowdown"/><!-- DOWNWARDS ARROW -->
- <map code="0x2194" name="arrowboth"/><!-- LEFT RIGHT ARROW -->
- <map code="0x2195" name="arrowupdn"/><!-- UP DOWN ARROW -->
- <map code="0x21a4" name="uni21A4"/><!-- LEFTWARDS ARROW FROM BAR -->
- <map code="0x21a5" name="uni21A5"/><!-- UPWARDS ARROW FROM BAR -->
- <map code="0x21a6" name="uni21A6"/><!-- RIGHTWARDS ARROW FROM BAR -->
- <map code="0x21a7" name="uni21A7"/><!-- DOWNWARDS ARROW FROM BAR -->
- <map code="0x21c7" name="uni21C7"/><!-- LEFTWARDS PAIRED ARROWS -->
- <map code="0x21c8" name="uni21C8"/><!-- UPWARDS PAIRED ARROWS -->
- <map code="0x21c9" name="uni21C9"/><!-- RIGHTWARDS PAIRED ARROWS -->
- <map code="0x21ca" name="uni21CA"/><!-- DOWNWARDS PAIRED ARROWS -->
- <map code="0x21d0" name="arrowdblleft"/><!-- LEFTWARDS DOUBLE ARROW -->
- <map code="0x21d1" name="arrowdblup"/><!-- UPWARDS DOUBLE ARROW -->
- <map code="0x21d2" name="arrowdblright"/><!-- RIGHTWARDS DOUBLE ARROW -->
- <map code="0x21d3" name="arrowdbldown"/><!-- DOWNWARDS DOUBLE ARROW -->
- <map code="0x21d4" name="arrowdblboth"/><!-- LEFT RIGHT DOUBLE ARROW -->
- <map code="0x21d5" name="uni21D5"/><!-- UP DOWN DOUBLE ARROW -->
- <map code="0x21e6" name="uni21E6"/><!-- LEFTWARDS WHITE ARROW -->
- <map code="0x21e7" name="uni21E7"/><!-- UPWARDS WHITE ARROW -->
- <map code="0x21e8" name="uni21E8"/><!-- RIGHTWARDS WHITE ARROW -->
- <map code="0x21e9" name="uni21E9"/><!-- DOWNWARDS WHITE ARROW -->
- <map code="0x23a7" name="uni23A7"/><!-- LEFT CURLY BRACKET UPPER HOOK -->
- <map code="0x23a8" name="uni23A8"/><!-- LEFT CURLY BRACKET MIDDLE PIECE -->
- <map code="0x23a9" name="uni23A9"/><!-- LEFT CURLY BRACKET LOWER HOOK -->
- <map code="0x23aa" name="uni23AA"/><!-- CURLY BRACKET EXTENSION -->
- </cmap_format_4>
- <cmap_format_0 platformID="1" platEncID="0" language="0">
- <map code="0x0" name="space"/>
- <map code="0x1" name=".notdef"/>
- <map code="0x2" name=".notdef"/>
- <map code="0x3" name=".notdef"/>
- <map code="0x4" name=".notdef"/>
- <map code="0x5" name=".notdef"/>
- <map code="0x6" name=".notdef"/>
- <map code="0x7" name=".notdef"/>
- <map code="0x8" name=".notdef"/>
- <map code="0x9" name=".notdef"/>
- <map code="0xa" name=".notdef"/>
- <map code="0xb" name=".notdef"/>
- <map code="0xc" name=".notdef"/>
- <map code="0xd" name=".notdef"/>
- <map code="0xe" name=".notdef"/>
- <map code="0xf" name=".notdef"/>
- <map code="0x10" name=".notdef"/>
- <map code="0x11" name=".notdef"/>
- <map code="0x12" name=".notdef"/>
- <map code="0x13" name=".notdef"/>
- <map code="0x14" name=".notdef"/>
- <map code="0x15" name=".notdef"/>
- <map code="0x16" name=".notdef"/>
- <map code="0x17" name=".notdef"/>
- <map code="0x18" name=".notdef"/>
- <map code="0x19" name=".notdef"/>
- <map code="0x1a" name=".notdef"/>
- <map code="0x1b" name=".notdef"/>
- <map code="0x1c" name=".notdef"/>
- <map code="0x1d" name=".notdef"/>
- <map code="0x1e" name=".notdef"/>
- <map code="0x1f" name=".notdef"/>
- <map code="0x20" name="space"/>
- <map code="0x21" name=".notdef"/>
- <map code="0x22" name=".notdef"/>
- <map code="0x23" name=".notdef"/>
- <map code="0x24" name=".notdef"/>
- <map code="0x25" name=".notdef"/>
- <map code="0x26" name=".notdef"/>
- <map code="0x27" name=".notdef"/>
- <map code="0x28" name=".notdef"/>
- <map code="0x29" name=".notdef"/>
- <map code="0x2a" name=".notdef"/>
- <map code="0x2b" name=".notdef"/>
- <map code="0x2c" name=".notdef"/>
- <map code="0x2d" name=".notdef"/>
- <map code="0x2e" name=".notdef"/>
- <map code="0x2f" name=".notdef"/>
- <map code="0x30" name=".notdef"/>
- <map code="0x31" name=".notdef"/>
- <map code="0x32" name=".notdef"/>
- <map code="0x33" name=".notdef"/>
- <map code="0x34" name=".notdef"/>
- <map code="0x35" name=".notdef"/>
- <map code="0x36" name=".notdef"/>
- <map code="0x37" name=".notdef"/>
- <map code="0x38" name=".notdef"/>
- <map code="0x39" name=".notdef"/>
- <map code="0x3a" name=".notdef"/>
- <map code="0x3b" name=".notdef"/>
- <map code="0x3c" name=".notdef"/>
- <map code="0x3d" name=".notdef"/>
- <map code="0x3e" name=".notdef"/>
- <map code="0x3f" name=".notdef"/>
- <map code="0x40" name=".notdef"/>
- <map code="0x41" name="A"/>
- <map code="0x42" name="B"/>
- <map code="0x43" name="C"/>
- <map code="0x44" name="D"/>
- <map code="0x45" name="E"/>
- <map code="0x46" name="F"/>
- <map code="0x47" name="G"/>
- <map code="0x48" name="H"/>
- <map code="0x49" name="I"/>
- <map code="0x4a" name="J"/>
- <map code="0x4b" name="K"/>
- <map code="0x4c" name="L"/>
- <map code="0x4d" name="M"/>
- <map code="0x4e" name="N"/>
- <map code="0x4f" name="O"/>
- <map code="0x50" name="P"/>
- <map code="0x51" name="Q"/>
- <map code="0x52" name="R"/>
- <map code="0x53" name="S"/>
- <map code="0x54" name="T"/>
- <map code="0x55" name="U"/>
- <map code="0x56" name="V"/>
- <map code="0x57" name="W"/>
- <map code="0x58" name="X"/>
- <map code="0x59" name="Y"/>
- <map code="0x5a" name="Z"/>
- <map code="0x5b" name=".notdef"/>
- <map code="0x5c" name=".notdef"/>
- <map code="0x5d" name=".notdef"/>
- <map code="0x5e" name=".notdef"/>
- <map code="0x5f" name="underscore"/>
- <map code="0x60" name=".notdef"/>
- <map code="0x61" name=".notdef"/>
- <map code="0x62" name=".notdef"/>
- <map code="0x63" name=".notdef"/>
- <map code="0x64" name=".notdef"/>
- <map code="0x65" name=".notdef"/>
- <map code="0x66" name=".notdef"/>
- <map code="0x67" name=".notdef"/>
- <map code="0x68" name=".notdef"/>
- <map code="0x69" name=".notdef"/>
- <map code="0x6a" name=".notdef"/>
- <map code="0x6b" name=".notdef"/>
- <map code="0x6c" name=".notdef"/>
- <map code="0x6d" name=".notdef"/>
- <map code="0x6e" name=".notdef"/>
- <map code="0x6f" name=".notdef"/>
- <map code="0x70" name=".notdef"/>
- <map code="0x71" name=".notdef"/>
- <map code="0x72" name=".notdef"/>
- <map code="0x73" name=".notdef"/>
- <map code="0x74" name=".notdef"/>
- <map code="0x75" name=".notdef"/>
- <map code="0x76" name=".notdef"/>
- <map code="0x77" name=".notdef"/>
- <map code="0x78" name=".notdef"/>
- <map code="0x79" name=".notdef"/>
- <map code="0x7a" name=".notdef"/>
- <map code="0x7b" name="braceleft"/>
- <map code="0x7c" name=".notdef"/>
- <map code="0x7d" name=".notdef"/>
- <map code="0x7e" name=".notdef"/>
- <map code="0x7f" name=".notdef"/>
- <map code="0x80" name=".notdef"/>
- <map code="0x81" name=".notdef"/>
- <map code="0x82" name=".notdef"/>
- <map code="0x83" name=".notdef"/>
- <map code="0x84" name=".notdef"/>
- <map code="0x85" name=".notdef"/>
- <map code="0x86" name=".notdef"/>
- <map code="0x87" name=".notdef"/>
- <map code="0x88" name=".notdef"/>
- <map code="0x89" name=".notdef"/>
- <map code="0x8a" name=".notdef"/>
- <map code="0x8b" name=".notdef"/>
- <map code="0x8c" name=".notdef"/>
- <map code="0x8d" name=".notdef"/>
- <map code="0x8e" name=".notdef"/>
- <map code="0x8f" name=".notdef"/>
- <map code="0x90" name=".notdef"/>
- <map code="0x91" name=".notdef"/>
- <map code="0x92" name=".notdef"/>
- <map code="0x93" name=".notdef"/>
- <map code="0x94" name=".notdef"/>
- <map code="0x95" name=".notdef"/>
- <map code="0x96" name=".notdef"/>
- <map code="0x97" name=".notdef"/>
- <map code="0x98" name=".notdef"/>
- <map code="0x99" name=".notdef"/>
- <map code="0x9a" name=".notdef"/>
- <map code="0x9b" name=".notdef"/>
- <map code="0x9c" name=".notdef"/>
- <map code="0x9d" name=".notdef"/>
- <map code="0x9e" name=".notdef"/>
- <map code="0x9f" name=".notdef"/>
- <map code="0xa0" name=".notdef"/>
- <map code="0xa1" name=".notdef"/>
- <map code="0xa2" name=".notdef"/>
- <map code="0xa3" name=".notdef"/>
- <map code="0xa4" name=".notdef"/>
- <map code="0xa5" name=".notdef"/>
- <map code="0xa6" name=".notdef"/>
- <map code="0xa7" name=".notdef"/>
- <map code="0xa8" name=".notdef"/>
- <map code="0xa9" name=".notdef"/>
- <map code="0xaa" name=".notdef"/>
- <map code="0xab" name=".notdef"/>
- <map code="0xac" name=".notdef"/>
- <map code="0xad" name=".notdef"/>
- <map code="0xae" name=".notdef"/>
- <map code="0xaf" name=".notdef"/>
- <map code="0xb0" name=".notdef"/>
- <map code="0xb1" name=".notdef"/>
- <map code="0xb2" name=".notdef"/>
- <map code="0xb3" name=".notdef"/>
- <map code="0xb4" name=".notdef"/>
- <map code="0xb5" name=".notdef"/>
- <map code="0xb6" name=".notdef"/>
- <map code="0xb7" name=".notdef"/>
- <map code="0xb8" name=".notdef"/>
- <map code="0xb9" name=".notdef"/>
- <map code="0xba" name=".notdef"/>
- <map code="0xbb" name=".notdef"/>
- <map code="0xbc" name=".notdef"/>
- <map code="0xbd" name=".notdef"/>
- <map code="0xbe" name=".notdef"/>
- <map code="0xbf" name=".notdef"/>
- <map code="0xc0" name=".notdef"/>
- <map code="0xc1" name=".notdef"/>
- <map code="0xc2" name=".notdef"/>
- <map code="0xc3" name=".notdef"/>
- <map code="0xc4" name=".notdef"/>
- <map code="0xc5" name=".notdef"/>
- <map code="0xc6" name=".notdef"/>
- <map code="0xc7" name=".notdef"/>
- <map code="0xc8" name=".notdef"/>
- <map code="0xc9" name=".notdef"/>
- <map code="0xca" name=".notdef"/>
- <map code="0xcb" name=".notdef"/>
- <map code="0xcc" name=".notdef"/>
- <map code="0xcd" name=".notdef"/>
- <map code="0xce" name=".notdef"/>
- <map code="0xcf" name=".notdef"/>
- <map code="0xd0" name=".notdef"/>
- <map code="0xd1" name=".notdef"/>
- <map code="0xd2" name=".notdef"/>
- <map code="0xd3" name=".notdef"/>
- <map code="0xd4" name=".notdef"/>
- <map code="0xd5" name=".notdef"/>
- <map code="0xd6" name=".notdef"/>
- <map code="0xd7" name=".notdef"/>
- <map code="0xd8" name=".notdef"/>
- <map code="0xd9" name=".notdef"/>
- <map code="0xda" name=".notdef"/>
- <map code="0xdb" name=".notdef"/>
- <map code="0xdc" name=".notdef"/>
- <map code="0xdd" name=".notdef"/>
- <map code="0xde" name=".notdef"/>
- <map code="0xdf" name=".notdef"/>
- <map code="0xe0" name=".notdef"/>
- <map code="0xe1" name=".notdef"/>
- <map code="0xe2" name=".notdef"/>
- <map code="0xe3" name=".notdef"/>
- <map code="0xe4" name=".notdef"/>
- <map code="0xe5" name=".notdef"/>
- <map code="0xe6" name=".notdef"/>
- <map code="0xe7" name=".notdef"/>
- <map code="0xe8" name=".notdef"/>
- <map code="0xe9" name=".notdef"/>
- <map code="0xea" name=".notdef"/>
- <map code="0xeb" name=".notdef"/>
- <map code="0xec" name=".notdef"/>
- <map code="0xed" name=".notdef"/>
- <map code="0xee" name=".notdef"/>
- <map code="0xef" name=".notdef"/>
- <map code="0xf0" name=".notdef"/>
- <map code="0xf1" name=".notdef"/>
- <map code="0xf2" name=".notdef"/>
- <map code="0xf3" name=".notdef"/>
- <map code="0xf4" name=".notdef"/>
- <map code="0xf5" name=".notdef"/>
- <map code="0xf6" name=".notdef"/>
- <map code="0xf7" name=".notdef"/>
- <map code="0xf8" name=".notdef"/>
- <map code="0xf9" name=".notdef"/>
- <map code="0xfa" name=".notdef"/>
- <map code="0xfb" name=".notdef"/>
- <map code="0xfc" name=".notdef"/>
- <map code="0xfd" name=".notdef"/>
- <map code="0xfe" name=".notdef"/>
- <map code="0xff" name=".notdef"/>
- </cmap_format_0>
- <cmap_format_4 platformID="3" platEncID="1" language="0">
- <map code="0x20" name="space"/><!-- SPACE -->
- <map code="0x41" name="A"/><!-- LATIN CAPITAL LETTER A -->
- <map code="0x42" name="B"/><!-- LATIN CAPITAL LETTER B -->
- <map code="0x43" name="C"/><!-- LATIN CAPITAL LETTER C -->
- <map code="0x44" name="D"/><!-- LATIN CAPITAL LETTER D -->
- <map code="0x45" name="E"/><!-- LATIN CAPITAL LETTER E -->
- <map code="0x46" name="F"/><!-- LATIN CAPITAL LETTER F -->
- <map code="0x47" name="G"/><!-- LATIN CAPITAL LETTER G -->
- <map code="0x48" name="H"/><!-- LATIN CAPITAL LETTER H -->
- <map code="0x49" name="I"/><!-- LATIN CAPITAL LETTER I -->
- <map code="0x4a" name="J"/><!-- LATIN CAPITAL LETTER J -->
- <map code="0x4b" name="K"/><!-- LATIN CAPITAL LETTER K -->
- <map code="0x4c" name="L"/><!-- LATIN CAPITAL LETTER L -->
- <map code="0x4d" name="M"/><!-- LATIN CAPITAL LETTER M -->
- <map code="0x4e" name="N"/><!-- LATIN CAPITAL LETTER N -->
- <map code="0x4f" name="O"/><!-- LATIN CAPITAL LETTER O -->
- <map code="0x50" name="P"/><!-- LATIN CAPITAL LETTER P -->
- <map code="0x51" name="Q"/><!-- LATIN CAPITAL LETTER Q -->
- <map code="0x52" name="R"/><!-- LATIN CAPITAL LETTER R -->
- <map code="0x53" name="S"/><!-- LATIN CAPITAL LETTER S -->
- <map code="0x54" name="T"/><!-- LATIN CAPITAL LETTER T -->
- <map code="0x55" name="U"/><!-- LATIN CAPITAL LETTER U -->
- <map code="0x56" name="V"/><!-- LATIN CAPITAL LETTER V -->
- <map code="0x57" name="W"/><!-- LATIN CAPITAL LETTER W -->
- <map code="0x58" name="X"/><!-- LATIN CAPITAL LETTER X -->
- <map code="0x59" name="Y"/><!-- LATIN CAPITAL LETTER Y -->
- <map code="0x5a" name="Z"/><!-- LATIN CAPITAL LETTER Z -->
- <map code="0x5f" name="underscore"/><!-- LOW LINE -->
- <map code="0x7b" name="braceleft"/><!-- LEFT CURLY BRACKET -->
- <map code="0x2190" name="arrowleft"/><!-- LEFTWARDS ARROW -->
- <map code="0x2191" name="arrowup"/><!-- UPWARDS ARROW -->
- <map code="0x2192" name="arrowright"/><!-- RIGHTWARDS ARROW -->
- <map code="0x2193" name="arrowdown"/><!-- DOWNWARDS ARROW -->
- <map code="0x2194" name="arrowboth"/><!-- LEFT RIGHT ARROW -->
- <map code="0x2195" name="arrowupdn"/><!-- UP DOWN ARROW -->
- <map code="0x21a4" name="uni21A4"/><!-- LEFTWARDS ARROW FROM BAR -->
- <map code="0x21a5" name="uni21A5"/><!-- UPWARDS ARROW FROM BAR -->
- <map code="0x21a6" name="uni21A6"/><!-- RIGHTWARDS ARROW FROM BAR -->
- <map code="0x21a7" name="uni21A7"/><!-- DOWNWARDS ARROW FROM BAR -->
- <map code="0x21c7" name="uni21C7"/><!-- LEFTWARDS PAIRED ARROWS -->
- <map code="0x21c8" name="uni21C8"/><!-- UPWARDS PAIRED ARROWS -->
- <map code="0x21c9" name="uni21C9"/><!-- RIGHTWARDS PAIRED ARROWS -->
- <map code="0x21ca" name="uni21CA"/><!-- DOWNWARDS PAIRED ARROWS -->
- <map code="0x21d0" name="arrowdblleft"/><!-- LEFTWARDS DOUBLE ARROW -->
- <map code="0x21d1" name="arrowdblup"/><!-- UPWARDS DOUBLE ARROW -->
- <map code="0x21d2" name="arrowdblright"/><!-- RIGHTWARDS DOUBLE ARROW -->
- <map code="0x21d3" name="arrowdbldown"/><!-- DOWNWARDS DOUBLE ARROW -->
- <map code="0x21d4" name="arrowdblboth"/><!-- LEFT RIGHT DOUBLE ARROW -->
- <map code="0x21d5" name="uni21D5"/><!-- UP DOWN DOUBLE ARROW -->
- <map code="0x21e6" name="uni21E6"/><!-- LEFTWARDS WHITE ARROW -->
- <map code="0x21e7" name="uni21E7"/><!-- UPWARDS WHITE ARROW -->
- <map code="0x21e8" name="uni21E8"/><!-- RIGHTWARDS WHITE ARROW -->
- <map code="0x21e9" name="uni21E9"/><!-- DOWNWARDS WHITE ARROW -->
- <map code="0x23a7" name="uni23A7"/><!-- LEFT CURLY BRACKET UPPER HOOK -->
- <map code="0x23a8" name="uni23A8"/><!-- LEFT CURLY BRACKET MIDDLE PIECE -->
- <map code="0x23a9" name="uni23A9"/><!-- LEFT CURLY BRACKET LOWER HOOK -->
- <map code="0x23aa" name="uni23AA"/><!-- CURLY BRACKET EXTENSION -->
- </cmap_format_4>
- </cmap>
-
- <post>
- <formatType value="3.0"/>
- <italicAngle value="0.0"/>
- <underlinePosition value="-125"/>
- <underlineThickness value="50"/>
- <isFixedPitch value="1"/>
- <minMemType42 value="0"/>
- <maxMemType42 value="0"/>
- <minMemType1 value="0"/>
- <maxMemType1 value="0"/>
- </post>
-
- <CFF>
- <CFFFont name="MathTestFontFull">
- <version value="001.000"/>
- <Notice value="Copyright (c) 2016 Igalia S.L."/>
- <FullName value="MathTestFontFull"/>
- <FamilyName value="MathTestFontFull"/>
- <Weight value="Regular"/>
- <isFixedPitch value="1"/>
- <ItalicAngle value="0"/>
- <UnderlineThickness value="50"/>
- <PaintType value="0"/>
- <CharstringType value="2"/>
- <FontMatrix value="0.001 0 0 0.001 0 0"/>
- <FontBBox value="0 0 5300 5500"/>
- <StrokeWidth value="0"/>
- <!-- charset is dumped separately as the 'GlyphOrder' element -->
- <Encoding name="StandardEncoding"/>
- <Private>
- <BlueValues value="-20 0 1000 1000"/>
- <BlueScale value="0.039625"/>
- <BlueShift value="0"/>
- <BlueFuzz value="1"/>
- <StdHW value="250"/>
- <StdVW value="1000"/>
- <StemSnapH value="166 200 250 333 500"/>
- <StemSnapV value="166 200 250 333 500 1000"/>
- <ForceBold value="0"/>
- <LanguageGroup value="0"/>
- <ExpansionFactor value="0.06"/>
- <initialRandomSeed value="0"/>
- <defaultWidthX value="1000"/>
- <nominalWidthX value="0"/>
- <Subrs>
- <!-- The 'index' attribute is only for humans; it is ignored when parsed. -->
- <CharString index="0">
- 1000 1000 -1000 hlineto
- return
- </CharString>
- </Subrs>
- </Private>
- <CharStrings>
- <CharString name=".notdef">
- 0 50 566 50 hstem
- 50 50 800 50 vstem
- 50 hmoveto
- 900 666 -900 hlineto
- 50 -616 rmoveto
- 566 800 -566 vlineto
- endchar
- </CharString>
- <CharString name="A">
- 21 -21 1000 -20 hstem
- 0 1000 vstem
- 0 vmoveto
- -107 callsubr
- endchar
- </CharString>
- <CharString name="B">
- 21 -21 1000 -20 hstem
- 0 1000 vstem
- 0 vmoveto
- -107 callsubr
- endchar
- </CharString>
- <CharString name="C">
- 21 -21 1000 -20 hstem
- 0 1000 vstem
- 0 vmoveto
- -107 callsubr
- endchar
- </CharString>
- <CharString name="D">
- 21 -21 1000 -20 hstem
- 0 1000 vstem
- 0 vmoveto
- -107 callsubr
- endchar
- </CharString>
- <CharString name="E">
- 21 -21 1000 -20 hstem
- 0 1000 vstem
- 0 vmoveto
- -107 callsubr
- endchar
- </CharString>
- <CharString name="F">
- 21 -21 1000 -20 hstem
- 0 1000 vstem
- 0 vmoveto
- -107 callsubr
- endchar
- </CharString>
- <CharString name="G">
- 21 -21 1000 -20 hstem
- 0 1000 vstem
- 0 vmoveto
- -107 callsubr
- endchar
- </CharString>
- <CharString name="H">
- 21 -21 1000 -20 hstem
- 0 1000 vstem
- 0 vmoveto
- -107 callsubr
- endchar
- </CharString>
- <CharString name="I">
- 21 -21 1000 -20 hstem
- 0 1000 vstem
- 0 vmoveto
- -107 callsubr
- endchar
- </CharString>
- <CharString name="J">
- 21 -21 1000 -20 hstem
- 0 1000 vstem
- 0 vmoveto
- -107 callsubr
- endchar
- </CharString>
- <CharString name="K">
- 21 -21 1000 -20 hstem
- 0 1000 vstem
- 0 vmoveto
- -107 callsubr
- endchar
- </CharString>
- <CharString name="L">
- 21 -21 1000 -20 hstem
- 0 1000 vstem
- 0 vmoveto
- -107 callsubr
- endchar
- </CharString>
- <CharString name="M">
- 21 -21 1000 -20 hstem
- 0 1000 vstem
- 0 vmoveto
- -107 callsubr
- endchar
- </CharString>
- <CharString name="N">
- 21 -21 1000 -20 hstem
- 0 1000 vstem
- 0 vmoveto
- -107 callsubr
- endchar
- </CharString>
- <CharString name="O">
- 21 -21 1000 -20 hstem
- 0 1000 vstem
- 0 vmoveto
- -107 callsubr
- endchar
- </CharString>
- <CharString name="P">
- 21 -21 1000 -20 hstem
- 0 1000 vstem
- 0 vmoveto
- -107 callsubr
- endchar
- </CharString>
- <CharString name="Q">
- 21 -21 1000 -20 hstem
- 0 1000 vstem
- 0 vmoveto
- -107 callsubr
- endchar
- </CharString>
- <CharString name="R">
- 21 -21 1000 -20 hstem
- 0 1000 vstem
- 0 vmoveto
- -107 callsubr
- endchar
- </CharString>
- <CharString name="S">
- 21 -21 1000 -20 hstem
- 0 1000 vstem
- 0 vmoveto
- -107 callsubr
- endchar
- </CharString>
- <CharString name="T">
- 21 -21 1000 -20 hstem
- 0 1000 vstem
- 0 vmoveto
- -107 callsubr
- endchar
- </CharString>
- <CharString name="U">
- 21 -21 1000 -20 hstem
- 0 1000 vstem
- 0 vmoveto
- -107 callsubr
- endchar
- </CharString>
- <CharString name="V">
- 21 -21 1000 -20 hstem
- 0 1000 vstem
- 0 vmoveto
- -107 callsubr
- endchar
- </CharString>
- <CharString name="W">
- 21 -21 1000 -20 hstem
- 0 1000 vstem
- 0 vmoveto
- -107 callsubr
- endchar
- </CharString>
- <CharString name="X">
- 21 -21 1000 -20 hstem
- 0 1000 vstem
- 0 vmoveto
- -107 callsubr
- endchar
- </CharString>
- <CharString name="Y">
- 21 -21 1000 -20 hstem
- 0 1000 vstem
- 0 vmoveto
- -107 callsubr
- endchar
- </CharString>
- <CharString name="Z">
- 21 -21 1000 -20 hstem
- 0 1000 vstem
- 0 vmoveto
- -107 callsubr
- endchar
- </CharString>
- <CharString name="arrowboth">
- 21 -21 1000 -20 hstem
- 0 1000 vstem
- 0 vmoveto
- -107 callsubr
- endchar
- </CharString>
- <CharString name="arrowdblboth">
- 21 -21 1000 -20 hstem
- 0 1000 vstem
- 0 vmoveto
- -107 callsubr
- endchar
- </CharString>
- <CharString name="arrowdbldown">
- 21 -21 1000 -20 hstem
- 0 1000 vstem
- 0 vmoveto
- -107 callsubr
- endchar
- </CharString>
- <CharString name="arrowdblleft">
- 21 -21 1000 -20 hstem
- 0 1000 vstem
- 0 vmoveto
- -107 callsubr
- endchar
- </CharString>
- <CharString name="arrowdblright">
- 21 -21 1000 -20 hstem
- 0 1000 vstem
- 0 vmoveto
- -107 callsubr
- endchar
- </CharString>
- <CharString name="arrowdblup">
- 21 -21 1000 -20 hstem
- 0 1000 vstem
- 0 vmoveto
- -107 callsubr
- endchar
- </CharString>
- <CharString name="arrowdown">
- 21 -21 1000 -20 hstem
- 0 1000 vstem
- 0 vmoveto
- -107 callsubr
- endchar
- </CharString>
- <CharString name="arrowleft">
- 21 -21 1000 -20 hstem
- 0 1000 vstem
- 0 vmoveto
- -107 callsubr
- endchar
- </CharString>
- <CharString name="arrowright">
- 21 -21 1000 -20 hstem
- 0 1000 vstem
- 0 vmoveto
- -107 callsubr
- endchar
- </CharString>
- <CharString name="arrowup">
- 21 -21 1000 -20 hstem
- 0 1000 vstem
- 0 vmoveto
- -107 callsubr
- endchar
- </CharString>
- <CharString name="arrowupdn">
- 21 -21 1000 -20 hstem
- 0 1000 vstem
- 0 vmoveto
- -107 callsubr
- endchar
- </CharString>
- <CharString name="bottom">
- 0 200 800 -20 hstem
- 400 200 vstem
- 0 vmoveto
- 1000 200 -400 800 -200 -800 -400 hlineto
- endchar
- </CharString>
- <CharString name="braceleft">
- 21 -21 1000 -20 hstem
- 0 1000 vstem
- 0 vmoveto
- -107 callsubr
- endchar
- </CharString>
- <CharString name="center">
- 21 -21 400 200 400 -20 hstem
- 400 200 vstem
- 400 hmoveto
- 200 400 400 200 -400 400 -200 -400 -400 -200 400 hlineto
- endchar
- </CharString>
- <CharString name="horizontal">
- 400 200 hstem
- 400 vmoveto
- 1000 200 -1000 hlineto
- endchar
- </CharString>
- <CharString name="left">
- 21 -21 400 200 400 -20 hstem
- 0 200 vstem
- 0 vmoveto
- 200 400 800 200 -800 400 -200 hlineto
- endchar
- </CharString>
- <CharString name="right">
- 21 -21 400 200 400 -20 hstem
- 800 200 vstem
- 800 hmoveto
- 200 1000 -200 -400 -800 -200 800 hlineto
- endchar
- </CharString>
- <CharString name="space">
- endchar
- </CharString>
- <CharString name="top">
- 21 -21 800 200 hstem
- 400 200 vstem
- 400 hmoveto
- 200 800 400 200 -1000 -200 400 hlineto
- endchar
- </CharString>
- <CharString name="underscore">
- 21 -21 1000 -20 hstem
- 0 1000 vstem
- 0 vmoveto
- -107 callsubr
- endchar
- </CharString>
- <CharString name="uni2190_size2">
- 0 250 hstem
- 0 vmoveto
- 2150 250 -2150 hlineto
- endchar
- </CharString>
- <CharString name="uni2190_size3">
- 0 200 hstem
- 0 vmoveto
- 2400 200 -2400 hlineto
- endchar
- </CharString>
- <CharString name="uni2190_size4">
- 0 166 hstem
- 0 vmoveto
- 2900 166 -2900 hlineto
- endchar
- </CharString>
- <CharString name="uni2191_size2">
- 21 -21 hstem
- 0 250 vstem
- 0 vmoveto
- 250 2250 -250 hlineto
- endchar
- </CharString>
- <CharString name="uni2191_size3">
- 21 -21 hstem
- 0 200 vstem
- 0 vmoveto
- 200 2500 -200 hlineto
- endchar
- </CharString>
- <CharString name="uni2191_size4">
- 21 -21 hstem
- 0 166 vstem
- 0 vmoveto
- 166 3000 -166 hlineto
- endchar
- </CharString>
- <CharString name="uni2191_size5">
- 21 -21 hstem
- 0 500 vstem
- 0 vmoveto
- 500 3750 -500 hlineto
- endchar
- </CharString>
- <CharString name="uni2192_size2">
- 0 250 hstem
- 0 vmoveto
- 2350 250 -2350 hlineto
- endchar
- </CharString>
- <CharString name="uni2192_size3">
- 0 200 hstem
- 0 vmoveto
- 2600 200 -2600 hlineto
- endchar
- </CharString>
- <CharString name="uni2192_size4">
- 0 166 hstem
- 0 vmoveto
- 3100 166 -3100 hlineto
- endchar
- </CharString>
- <CharString name="uni2192_size5">
- 0 500 hstem
- 0 vmoveto
- 3850 500 -3850 hlineto
- endchar
- </CharString>
- <CharString name="uni2192_size6">
- 0 333 hstem
- 0 vmoveto
- 4100 333 -4100 hlineto
- endchar
- </CharString>
- <CharString name="uni2193_size2">
- 21 -21 hstem
- 0 250 vstem
- 0 vmoveto
- 250 2450 -250 hlineto
- endchar
- </CharString>
- <CharString name="uni2193_size3">
- 21 -21 hstem
- 0 200 vstem
- 0 vmoveto
- 200 2700 -200 hlineto
- endchar
- </CharString>
- <CharString name="uni2193_size4">
- 21 -21 hstem
- 0 166 vstem
- 0 vmoveto
- 166 3200 -166 hlineto
- endchar
- </CharString>
- <CharString name="uni2193_size5">
- 21 -21 hstem
- 0 500 vstem
- 0 vmoveto
- 500 3950 -500 hlineto
- endchar
- </CharString>
- <CharString name="uni2193_size6">
- 21 -21 hstem
- 0 333 vstem
- 0 vmoveto
- 333 4200 -333 hlineto
- endchar
- </CharString>
- <CharString name="uni2193_size7">
- 21 -21 hstem
- 0 250 vstem
- 0 vmoveto
- 250 4700 -250 hlineto
- endchar
- </CharString>
- <CharString name="uni2195_size2">
- 21 -21 hstem
- 0 250 vstem
- 0 vmoveto
- 250 2650 -250 hlineto
- endchar
- </CharString>
- <CharString name="uni21A4">
- 21 -21 1000 -20 hstem
- 0 1000 vstem
- 0 vmoveto
- -107 callsubr
- endchar
- </CharString>
- <CharString name="uni21A4_size2">
- 0 250 hstem
- 0 vmoveto
- 2250 250 -2250 hlineto
- endchar
- </CharString>
- <CharString name="uni21A4_size3">
- 0 200 hstem
- 0 vmoveto
- 2500 200 -2500 hlineto
- endchar
- </CharString>
- <CharString name="uni21A5">
- 21 -21 1000 -20 hstem
- 0 1000 vstem
- 0 vmoveto
- -107 callsubr
- endchar
- </CharString>
- <CharString name="uni21A5_size2">
- 21 -21 hstem
- 0 250 vstem
- 0 vmoveto
- 250 2350 -250 hlineto
- endchar
- </CharString>
- <CharString name="uni21A5_size3">
- 21 -21 hstem
- 0 200 vstem
- 0 vmoveto
- 200 2600 -200 hlineto
- endchar
- </CharString>
- <CharString name="uni21A5_size4">
- 21 -21 hstem
- 0 166 vstem
- 0 vmoveto
- 166 3100 -166 hlineto
- endchar
- </CharString>
- <CharString name="uni21A6">
- 21 -21 1000 -20 hstem
- 0 1000 vstem
- 0 vmoveto
- -107 callsubr
- endchar
- </CharString>
- <CharString name="uni21A6_size2">
- 0 250 hstem
- 0 vmoveto
- 2450 250 -2450 hlineto
- endchar
- </CharString>
- <CharString name="uni21A6_size3">
- 0 200 hstem
- 0 vmoveto
- 2700 200 -2700 hlineto
- endchar
- </CharString>
- <CharString name="uni21A6_size4">
- 0 166 hstem
- 0 vmoveto
- 3200 166 -3200 hlineto
- endchar
- </CharString>
- <CharString name="uni21A6_size5">
- 0 500 hstem
- 0 vmoveto
- 3950 500 -3950 hlineto
- endchar
- </CharString>
- <CharString name="uni21A7">
- 21 -21 1000 -20 hstem
- 0 1000 vstem
- 0 vmoveto
- -107 callsubr
- endchar
- </CharString>
- <CharString name="uni21A7_size2">
- 21 -21 hstem
- 0 250 vstem
- 0 vmoveto
- 250 2550 -250 hlineto
- endchar
- </CharString>
- <CharString name="uni21A7_size3">
- 21 -21 hstem
- 0 200 vstem
- 0 vmoveto
- 200 2800 -200 hlineto
- endchar
- </CharString>
- <CharString name="uni21A7_size4">
- 21 -21 hstem
- 0 166 vstem
- 0 vmoveto
- 166 3300 -166 hlineto
- endchar
- </CharString>
- <CharString name="uni21A7_size5">
- 21 -21 hstem
- 0 500 vstem
- 0 vmoveto
- 500 4050 -500 hlineto
- endchar
- </CharString>
- <CharString name="uni21A7_size6">
- 21 -21 hstem
- 0 333 vstem
- 0 vmoveto
- 333 4300 -333 hlineto
- endchar
- </CharString>
- <CharString name="uni21C7">
- 21 -21 1000 -20 hstem
- 0 1000 vstem
- 0 vmoveto
- -107 callsubr
- endchar
- </CharString>
- <CharString name="uni21C7_size2">
- 0 250 hstem
- 0 vmoveto
- 1950 250 -1950 hlineto
- endchar
- </CharString>
- <CharString name="uni21C7_size3">
- 0 200 hstem
- 0 vmoveto
- 2200 200 -2200 hlineto
- endchar
- </CharString>
- <CharString name="uni21C8">
- 21 -21 1000 -20 hstem
- 0 1000 vstem
- 0 vmoveto
- -107 callsubr
- endchar
- </CharString>
- <CharString name="uni21C8_size2">
- 21 -21 hstem
- 0 250 vstem
- 0 vmoveto
- 250 2050 -250 hlineto
- endchar
- </CharString>
- <CharString name="uni21C8_size3">
- 21 -21 hstem
- 0 200 vstem
- 0 vmoveto
- 200 2300 -200 hlineto
- endchar
- </CharString>
- <CharString name="uni21C8_size4">
- 21 -21 hstem
- 0 166 vstem
- 0 vmoveto
- 166 2800 -166 hlineto
- endchar
- </CharString>
- <CharString name="uni21C9">
- 21 -21 1000 -20 hstem
- 0 1000 vstem
- 0 vmoveto
- -107 callsubr
- endchar
- </CharString>
- <CharString name="uni21C9_size2">
- 0 250 hstem
- 0 vmoveto
- 2150 250 -2150 hlineto
- endchar
- </CharString>
- <CharString name="uni21C9_size3">
- 0 200 hstem
- 0 vmoveto
- 2400 200 -2400 hlineto
- endchar
- </CharString>
- <CharString name="uni21C9_size4">
- 0 166 hstem
- 0 vmoveto
- 2900 166 -2900 hlineto
- endchar
- </CharString>
- <CharString name="uni21C9_size5">
- 0 500 hstem
- 0 vmoveto
- 3650 500 -3650 hlineto
- endchar
- </CharString>
- <CharString name="uni21CA">
- 21 -21 1000 -20 hstem
- 0 1000 vstem
- 0 vmoveto
- -107 callsubr
- endchar
- </CharString>
- <CharString name="uni21CA_size2">
- 21 -21 hstem
- 0 250 vstem
- 0 vmoveto
- 250 2250 -250 hlineto
- endchar
- </CharString>
- <CharString name="uni21CA_size3">
- 21 -21 hstem
- 0 200 vstem
- 0 vmoveto
- 200 2500 -200 hlineto
- endchar
- </CharString>
- <CharString name="uni21CA_size4">
- 21 -21 hstem
- 0 166 vstem
- 0 vmoveto
- 166 3000 -166 hlineto
- endchar
- </CharString>
- <CharString name="uni21CA_size5">
- 21 -21 hstem
- 0 500 vstem
- 0 vmoveto
- 500 3750 -500 hlineto
- endchar
- </CharString>
- <CharString name="uni21CA_size6">
- 21 -21 hstem
- 0 333 vstem
- 0 vmoveto
- 333 4000 -333 hlineto
- endchar
- </CharString>
- <CharString name="uni21D0_size2">
- 0 250 hstem
- 0 vmoveto
- 2850 250 -2850 hlineto
- endchar
- </CharString>
- <CharString name="uni21D0_size3">
- 0 200 hstem
- 0 vmoveto
- 3100 200 -3100 hlineto
- endchar
- </CharString>
- <CharString name="uni21D0_size4">
- 0 166 hstem
- 0 vmoveto
- 3600 166 -3600 hlineto
- endchar
- </CharString>
- <CharString name="uni21D0_size5">
- 0 500 hstem
- 0 vmoveto
- 4350 500 -4350 hlineto
- endchar
- </CharString>
- <CharString name="uni21D1_size2">
- 21 -21 hstem
- 0 250 vstem
- 0 vmoveto
- 250 2950 -250 hlineto
- endchar
- </CharString>
- <CharString name="uni21D1_size3">
- 21 -21 hstem
- 0 200 vstem
- 0 vmoveto
- 200 3200 -200 hlineto
- endchar
- </CharString>
- <CharString name="uni21D1_size4">
- 21 -21 hstem
- 0 166 vstem
- 0 vmoveto
- 166 3700 -166 hlineto
- endchar
- </CharString>
- <CharString name="uni21D1_size5">
- 21 -21 hstem
- 0 500 vstem
- 0 vmoveto
- 500 4450 -500 hlineto
- endchar
- </CharString>
- <CharString name="uni21D1_size6">
- 21 -21 hstem
- 0 333 vstem
- 0 vmoveto
- 333 4700 -333 hlineto
- endchar
- </CharString>
- <CharString name="uni21D2_size2">
- 0 250 hstem
- 0 vmoveto
- 3050 250 -3050 hlineto
- endchar
- </CharString>
- <CharString name="uni21D2_size3">
- 0 200 hstem
- 0 vmoveto
- 3300 200 -3300 hlineto
- endchar
- </CharString>
- <CharString name="uni21D2_size4">
- 0 166 hstem
- 0 vmoveto
- 3800 166 -3800 hlineto
- endchar
- </CharString>
- <CharString name="uni21D2_size5">
- 0 500 hstem
- 0 vmoveto
- 4550 500 -4550 hlineto
- endchar
- </CharString>
- <CharString name="uni21D2_size6">
- 0 333 hstem
- 0 vmoveto
- 4800 333 -4800 hlineto
- endchar
- </CharString>
- <CharString name="uni21D2_size7">
- 0 250 hstem
- 0 vmoveto
- 5300 250 -5300 hlineto
- endchar
- </CharString>
- <CharString name="uni21D4_size2">
- 0 250 hstem
- 0 vmoveto
- 3250 250 -3250 hlineto
- endchar
- </CharString>
- <CharString name="uni21D5">
- 21 -21 1000 -20 hstem
- 0 1000 vstem
- 0 vmoveto
- -107 callsubr
- endchar
- </CharString>
- <CharString name="uni21D5_size2">
- 21 -21 hstem
- 0 250 vstem
- 0 vmoveto
- 250 3350 -250 hlineto
- endchar
- </CharString>
- <CharString name="uni21D5_size3">
- 21 -21 hstem
- 0 200 vstem
- 0 vmoveto
- 200 3600 -200 hlineto
- endchar
- </CharString>
- <CharString name="uni21E6">
- 21 -21 1000 -20 hstem
- 0 1000 vstem
- 0 vmoveto
- -107 callsubr
- endchar
- </CharString>
- <CharString name="uni21E6_size2">
- 0 250 hstem
- 0 vmoveto
- 3150 250 -3150 hlineto
- endchar
- </CharString>
- <CharString name="uni21E6_size3">
- 0 200 hstem
- 0 vmoveto
- 3400 200 -3400 hlineto
- endchar
- </CharString>
- <CharString name="uni21E6_size4">
- 0 166 hstem
- 0 vmoveto
- 3900 166 -3900 hlineto
- endchar
- </CharString>
- <CharString name="uni21E6_size5">
- 0 500 hstem
- 0 vmoveto
- 4650 500 -4650 hlineto
- endchar
- </CharString>
- <CharString name="uni21E6_size6">
- 0 333 hstem
- 0 vmoveto
- 4900 333 -4900 hlineto
- endchar
- </CharString>
- <CharString name="uni21E7">
- 21 -21 1000 -20 hstem
- 0 1000 vstem
- 0 vmoveto
- -107 callsubr
- endchar
- </CharString>
- <CharString name="uni21E7_size2">
- 21 -21 hstem
- 0 250 vstem
- 0 vmoveto
- 250 3250 -250 hlineto
- endchar
- </CharString>
- <CharString name="uni21E7_size3">
- 21 -21 hstem
- 0 200 vstem
- 0 vmoveto
- 200 3500 -200 hlineto
- endchar
- </CharString>
- <CharString name="uni21E7_size4">
- 21 -21 hstem
- 0 166 vstem
- 0 vmoveto
- 166 4000 -166 hlineto
- endchar
- </CharString>
- <CharString name="uni21E7_size5">
- 21 -21 hstem
- 0 500 vstem
- 0 vmoveto
- 500 4750 -500 hlineto
- endchar
- </CharString>
- <CharString name="uni21E7_size6">
- 21 -21 hstem
- 0 333 vstem
- 0 vmoveto
- 333 5000 -333 hlineto
- endchar
- </CharString>
- <CharString name="uni21E7_size7">
- 21 -21 hstem
- 0 250 vstem
- 0 vmoveto
- 250 5500 -250 hlineto
- endchar
- </CharString>
- <CharString name="uni21E8">
- 21 -21 1000 -20 hstem
- 0 1000 vstem
- 0 vmoveto
- -107 callsubr
- endchar
- </CharString>
- <CharString name="uni21E9">
- 21 -21 1000 -20 hstem
- 0 1000 vstem
- 0 vmoveto
- -107 callsubr
- endchar
- </CharString>
- <CharString name="uni21E9_size2">
- 21 -21 hstem
- 0 250 vstem
- 0 vmoveto
- 250 3450 -250 hlineto
- endchar
- </CharString>
- <CharString name="uni23A7">
- 21 -21 1000 -20 hstem
- 0 1000 vstem
- 0 vmoveto
- -107 callsubr
- endchar
- </CharString>
- <CharString name="uni23A8">
- 21 -21 1000 -20 hstem
- 0 1000 vstem
- 0 vmoveto
- -107 callsubr
- endchar
- </CharString>
- <CharString name="uni23A9">
- 21 -21 1000 -20 hstem
- 0 1000 vstem
- 0 vmoveto
- -107 callsubr
- endchar
- </CharString>
- <CharString name="uni23AA">
- 21 -21 1000 -20 hstem
- 0 1000 vstem
- 0 vmoveto
- -107 callsubr
- endchar
- </CharString>
- <CharString name="vertical">
- 21 -21 1000 -20 hstem
- 400 200 vstem
- 400 hmoveto
- 200 1000 -200 hlineto
- endchar
- </CharString>
- </CharStrings>
- </CFFFont>
-
- <GlobalSubrs>
- <!-- The 'index' attribute is only for humans; it is ignored when parsed. -->
- </GlobalSubrs>
- </CFF>
-
- <FFTM>
- <!-- FontForge's timestamp, font source creation and modification dates -->
- <version value="1"/>
- <FFTimeStamp value="Sun Mar 20 10:09:51 2016"/>
- <sourceCreated value="Tue Apr 12 14:44:11 2016"/>
- <sourceModified value="Tue Apr 12 14:44:11 2016"/>
- </FFTM>
-
- <MATH>
- <Version value="1.0"/>
- <MathConstants>
- <ScriptPercentScaleDown value="87"/>
- <ScriptScriptPercentScaleDown value="76"/>
- <DelimitedSubFormulaMinHeight value="100"/>
- <DisplayOperatorMinHeight value="200"/>
- <MathLeading>
- <Value value="300"/>
- </MathLeading>
- <AxisHeight>
- <Value value="400"/>
- </AxisHeight>
- <AccentBaseHeight>
- <Value value="500"/>
- </AccentBaseHeight>
- <FlattenedAccentBaseHeight>
- <Value value="600"/>
- </FlattenedAccentBaseHeight>
- <SubscriptShiftDown>
- <Value value="700"/>
- </SubscriptShiftDown>
- <SubscriptTopMax>
- <Value value="800"/>
- </SubscriptTopMax>
- <SubscriptBaselineDropMin>
- <Value value="900"/>
- </SubscriptBaselineDropMin>
- <SuperscriptShiftUp>
- <Value value="1100"/>
- </SuperscriptShiftUp>
- <SuperscriptShiftUpCramped>
- <Value value="1200"/>
- </SuperscriptShiftUpCramped>
- <SuperscriptBottomMin>
- <Value value="1300"/>
- </SuperscriptBottomMin>
- <SuperscriptBaselineDropMax>
- <Value value="1400"/>
- </SuperscriptBaselineDropMax>
- <SubSuperscriptGapMin>
- <Value value="1500"/>
- </SubSuperscriptGapMin>
- <SuperscriptBottomMaxWithSubscript>
- <Value value="1600"/>
- </SuperscriptBottomMaxWithSubscript>
- <SpaceAfterScript>
- <Value value="1700"/>
- </SpaceAfterScript>
- <UpperLimitGapMin>
- <Value value="1800"/>
- </UpperLimitGapMin>
- <UpperLimitBaselineRiseMin>
- <Value value="1900"/>
- </UpperLimitBaselineRiseMin>
- <LowerLimitGapMin>
- <Value value="2200"/>
- </LowerLimitGapMin>
- <LowerLimitBaselineDropMin>
- <Value value="2300"/>
- </LowerLimitBaselineDropMin>
- <StackTopShiftUp>
- <Value value="2400"/>
- </StackTopShiftUp>
- <StackTopDisplayStyleShiftUp>
- <Value value="2500"/>
- </StackTopDisplayStyleShiftUp>
- <StackBottomShiftDown>
- <Value value="2600"/>
- </StackBottomShiftDown>
- <StackBottomDisplayStyleShiftDown>
- <Value value="2700"/>
- </StackBottomDisplayStyleShiftDown>
- <StackGapMin>
- <Value value="2800"/>
- </StackGapMin>
- <StackDisplayStyleGapMin>
- <Value value="2900"/>
- </StackDisplayStyleGapMin>
- <StretchStackTopShiftUp>
- <Value value="3000"/>
- </StretchStackTopShiftUp>
- <StretchStackBottomShiftDown>
- <Value value="3100"/>
- </StretchStackBottomShiftDown>
- <StretchStackGapAboveMin>
- <Value value="3200"/>
- </StretchStackGapAboveMin>
- <StretchStackGapBelowMin>
- <Value value="3300"/>
- </StretchStackGapBelowMin>
- <FractionNumeratorShiftUp>
- <Value value="3400"/>
- </FractionNumeratorShiftUp>
- <FractionNumeratorDisplayStyleShiftUp>
- <Value value="3500"/>
- </FractionNumeratorDisplayStyleShiftUp>
- <FractionDenominatorShiftDown>
- <Value value="3600"/>
- </FractionDenominatorShiftDown>
- <FractionDenominatorDisplayStyleShiftDown>
- <Value value="3700"/>
- </FractionDenominatorDisplayStyleShiftDown>
- <FractionNumeratorGapMin>
- <Value value="3800"/>
- </FractionNumeratorGapMin>
- <FractionNumDisplayStyleGapMin>
- <Value value="3900"/>
- </FractionNumDisplayStyleGapMin>
- <FractionRuleThickness>
- <Value value="4000"/>
- </FractionRuleThickness>
- <FractionDenominatorGapMin>
- <Value value="4100"/>
- </FractionDenominatorGapMin>
- <FractionDenomDisplayStyleGapMin>
- <Value value="4200"/>
- </FractionDenomDisplayStyleGapMin>
- <SkewedFractionHorizontalGap>
- <Value value="4300"/>
- </SkewedFractionHorizontalGap>
- <SkewedFractionVerticalGap>
- <Value value="4400"/>
- </SkewedFractionVerticalGap>
- <OverbarVerticalGap>
- <Value value="4500"/>
- </OverbarVerticalGap>
- <OverbarRuleThickness>
- <Value value="4600"/>
- </OverbarRuleThickness>
- <OverbarExtraAscender>
- <Value value="4700"/>
- </OverbarExtraAscender>
- <UnderbarVerticalGap>
- <Value value="4800"/>
- </UnderbarVerticalGap>
- <UnderbarRuleThickness>
- <Value value="4900"/>
- </UnderbarRuleThickness>
- <UnderbarExtraDescender>
- <Value value="5000"/>
- </UnderbarExtraDescender>
- <RadicalVerticalGap>
- <Value value="5100"/>
- </RadicalVerticalGap>
- <RadicalDisplayStyleVerticalGap>
- <Value value="5200"/>
- </RadicalDisplayStyleVerticalGap>
- <RadicalRuleThickness>
- <Value value="5300"/>
- </RadicalRuleThickness>
- <RadicalExtraAscender>
- <Value value="5400"/>
- </RadicalExtraAscender>
- <RadicalKernBeforeDegree>
- <Value value="5500"/>
- </RadicalKernBeforeDegree>
- <RadicalKernAfterDegree>
- <Value value="5600"/>
- </RadicalKernAfterDegree>
- <RadicalDegreeBottomRaisePercent value="65"/>
- </MathConstants>
- <MathGlyphInfo>
- <MathItalicsCorrectionInfo>
- <Coverage Format="2">
- <Glyph value="A"/>
- <Glyph value="B"/>
- <Glyph value="C"/>
- <Glyph value="D"/>
- <Glyph value="E"/>
- <Glyph value="F"/>
- <Glyph value="G"/>
- <Glyph value="H"/>
- <Glyph value="I"/>
- <Glyph value="J"/>
- <Glyph value="K"/>
- <Glyph value="L"/>
- <Glyph value="M"/>
- <Glyph value="N"/>
- <Glyph value="O"/>
- <Glyph value="P"/>
- <Glyph value="Q"/>
- <Glyph value="R"/>
- <Glyph value="S"/>
- <Glyph value="T"/>
- <Glyph value="U"/>
- <Glyph value="V"/>
- <Glyph value="W"/>
- <Glyph value="X"/>
- <Glyph value="Y"/>
- <Glyph value="Z"/>
- <Glyph value="arrowleft"/>
- <Glyph value="arrowup"/>
- <Glyph value="arrowright"/>
- <Glyph value="arrowdown"/>
- <Glyph value="arrowboth"/>
- <Glyph value="arrowupdn"/>
- <Glyph value="uni21A4"/>
- <Glyph value="uni21A5"/>
- <Glyph value="uni21A6"/>
- <Glyph value="uni21A7"/>
- <Glyph value="uni21C7"/>
- <Glyph value="uni21C8"/>
- <Glyph value="uni21C9"/>
- <Glyph value="uni21CA"/>
- <Glyph value="arrowdblleft"/>
- <Glyph value="arrowdblup"/>
- <Glyph value="arrowdblright"/>
- <Glyph value="arrowdbldown"/>
- <Glyph value="arrowdblboth"/>
- <Glyph value="uni21D5"/>
- <Glyph value="uni21E6"/>
- <Glyph value="uni21E7"/>
- <Glyph value="uni21E8"/>
- <Glyph value="uni21E9"/>
- <Glyph value="uni2190_size2"/>
- <Glyph value="uni2190_size3"/>
- <Glyph value="uni2190_size4"/>
- <Glyph value="uni2191_size2"/>
- <Glyph value="uni2191_size3"/>
- <Glyph value="uni2191_size4"/>
- <Glyph value="uni2191_size5"/>
- <Glyph value="uni2192_size2"/>
- <Glyph value="uni2192_size3"/>
- <Glyph value="uni2192_size4"/>
- <Glyph value="uni2192_size5"/>
- <Glyph value="uni2192_size6"/>
- <Glyph value="uni2193_size2"/>
- <Glyph value="uni2193_size3"/>
- <Glyph value="uni2193_size4"/>
- <Glyph value="uni2193_size5"/>
- <Glyph value="uni2193_size6"/>
- <Glyph value="uni2193_size7"/>
- <Glyph value="uni2195_size2"/>
- <Glyph value="uni21A4_size2"/>
- <Glyph value="uni21A4_size3"/>
- <Glyph value="uni21A5_size2"/>
- <Glyph value="uni21A5_size3"/>
- <Glyph value="uni21A5_size4"/>
- <Glyph value="uni21A6_size2"/>
- <Glyph value="uni21A6_size3"/>
- <Glyph value="uni21A6_size4"/>
- <Glyph value="uni21A6_size5"/>
- <Glyph value="uni21A7_size2"/>
- <Glyph value="uni21A7_size3"/>
- <Glyph value="uni21A7_size4"/>
- <Glyph value="uni21A7_size5"/>
- <Glyph value="uni21A7_size6"/>
- <Glyph value="uni21C7_size2"/>
- <Glyph value="uni21C7_size3"/>
- <Glyph value="uni21C8_size2"/>
- <Glyph value="uni21C8_size3"/>
- <Glyph value="uni21C8_size4"/>
- <Glyph value="uni21C9_size2"/>
- <Glyph value="uni21C9_size3"/>
- <Glyph value="uni21C9_size4"/>
- <Glyph value="uni21C9_size5"/>
- <Glyph value="uni21CA_size2"/>
- <Glyph value="uni21CA_size3"/>
- <Glyph value="uni21CA_size4"/>
- <Glyph value="uni21CA_size5"/>
- <Glyph value="uni21CA_size6"/>
- <Glyph value="uni21D0_size2"/>
- <Glyph value="uni21D0_size3"/>
- <Glyph value="uni21D0_size4"/>
- <Glyph value="uni21D0_size5"/>
- <Glyph value="uni21D1_size2"/>
- <Glyph value="uni21D1_size3"/>
- <Glyph value="uni21D1_size4"/>
- <Glyph value="uni21D1_size5"/>
- <Glyph value="uni21D1_size6"/>
- <Glyph value="uni21D2_size2"/>
- <Glyph value="uni21D2_size3"/>
- <Glyph value="uni21D2_size4"/>
- <Glyph value="uni21D2_size5"/>
- <Glyph value="uni21D2_size6"/>
- <Glyph value="uni21D2_size7"/>
- <Glyph value="uni21D4_size2"/>
- <Glyph value="uni21D5_size2"/>
- <Glyph value="uni21D5_size3"/>
- <Glyph value="uni21E6_size2"/>
- <Glyph value="uni21E6_size3"/>
- <Glyph value="uni21E6_size4"/>
- <Glyph value="uni21E6_size5"/>
- <Glyph value="uni21E6_size6"/>
- <Glyph value="uni21E7_size2"/>
- <Glyph value="uni21E7_size3"/>
- <Glyph value="uni21E7_size4"/>
- <Glyph value="uni21E7_size5"/>
- <Glyph value="uni21E7_size6"/>
- <Glyph value="uni21E7_size7"/>
- <Glyph value="uni21E9_size2"/>
- </Coverage>
- <!-- ItalicsCorrectionCount=127 -->
- <ItalicsCorrection index="0">
- <Value value="197"/>
- </ItalicsCorrection>
- <ItalicsCorrection index="1">
- <Value value="150"/>
- </ItalicsCorrection>
- <ItalicsCorrection index="2">
- <Value value="452"/>
- </ItalicsCorrection>
- <ItalicsCorrection index="3">
- <Value value="405"/>
- </ItalicsCorrection>
- <ItalicsCorrection index="4">
- <Value value="358"/>
- </ItalicsCorrection>
- <ItalicsCorrection index="5">
- <Value value="311"/>
- </ItalicsCorrection>
- <ItalicsCorrection index="6">
- <Value value="264"/>
- </ItalicsCorrection>
- <ItalicsCorrection index="7">
- <Value value="217"/>
- </ItalicsCorrection>
- <ItalicsCorrection index="8">
- <Value value="170"/>
- </ItalicsCorrection>
- <ItalicsCorrection index="9">
- <Value value="123"/>
- </ItalicsCorrection>
- <ItalicsCorrection index="10">
- <Value value="425"/>
- </ItalicsCorrection>
- <ItalicsCorrection index="11">
- <Value value="378"/>
- </ItalicsCorrection>
- <ItalicsCorrection index="12">
- <Value value="331"/>
- </ItalicsCorrection>
- <ItalicsCorrection index="13">
- <Value value="284"/>
- </ItalicsCorrection>
- <ItalicsCorrection index="14">
- <Value value="237"/>
- </ItalicsCorrection>
- <ItalicsCorrection index="15">
- <Value value="190"/>
- </ItalicsCorrection>
- <ItalicsCorrection index="16">
- <Value value="143"/>
- </ItalicsCorrection>
- <ItalicsCorrection index="17">
- <Value value="445"/>
- </ItalicsCorrection>
- <ItalicsCorrection index="18">
- <Value value="398"/>
- </ItalicsCorrection>
- <ItalicsCorrection index="19">
- <Value value="351"/>
- </ItalicsCorrection>
- <ItalicsCorrection index="20">
- <Value value="304"/>
- </ItalicsCorrection>
- <ItalicsCorrection index="21">
- <Value value="257"/>
- </ItalicsCorrection>
- <ItalicsCorrection index="22">
- <Value value="210"/>
- </ItalicsCorrection>
- <ItalicsCorrection index="23">
- <Value value="163"/>
- </ItalicsCorrection>
- <ItalicsCorrection index="24">
- <Value value="116"/>
- </ItalicsCorrection>
- <ItalicsCorrection index="25">
- <Value value="418"/>
- </ItalicsCorrection>
- <ItalicsCorrection index="26">
- <Value value="429"/>
- </ItalicsCorrection>
- <ItalicsCorrection index="27">
- <Value value="382"/>
- </ItalicsCorrection>
- <ItalicsCorrection index="28">
- <Value value="335"/>
- </ItalicsCorrection>
- <ItalicsCorrection index="29">
- <Value value="288"/>
- </ItalicsCorrection>
- <ItalicsCorrection index="30">
- <Value value="241"/>
- </ItalicsCorrection>
- <ItalicsCorrection index="31">
- <Value value="194"/>
- </ItalicsCorrection>
- <ItalicsCorrection index="32">
- <Value value="187"/>
- </ItalicsCorrection>
- <ItalicsCorrection index="33">
- <Value value="140"/>
- </ItalicsCorrection>
- <ItalicsCorrection index="34">
- <Value value="442"/>
- </ItalicsCorrection>
- <ItalicsCorrection index="35">
- <Value value="395"/>
- </ItalicsCorrection>
- <ItalicsCorrection index="36">
- <Value value="287"/>
- </ItalicsCorrection>
- <ItalicsCorrection index="37">
- <Value value="240"/>
- </ItalicsCorrection>
- <ItalicsCorrection index="38">
- <Value value="193"/>
- </ItalicsCorrection>
- <ItalicsCorrection index="39">
- <Value value="146"/>
- </ItalicsCorrection>
- <ItalicsCorrection index="40">
- <Value value="213"/>
- </ItalicsCorrection>
- <ItalicsCorrection index="41">
- <Value value="166"/>
- </ItalicsCorrection>
- <ItalicsCorrection index="42">
- <Value value="119"/>
- </ItalicsCorrection>
- <ItalicsCorrection index="43">
- <Value value="421"/>
- </ItalicsCorrection>
- <ItalicsCorrection index="44">
- <Value value="374"/>
- </ItalicsCorrection>
- <ItalicsCorrection index="45">
- <Value value="327"/>
- </ItalicsCorrection>
- <ItalicsCorrection index="46">
- <Value value="226"/>
- </ItalicsCorrection>
- <ItalicsCorrection index="47">
- <Value value="179"/>
- </ItalicsCorrection>
- <ItalicsCorrection index="48">
- <Value value="132"/>
- </ItalicsCorrection>
- <ItalicsCorrection index="49">
- <Value value="434"/>
- </ItalicsCorrection>
- <ItalicsCorrection index="50">
- <Value value="335"/>
- </ItalicsCorrection>
- <ItalicsCorrection index="51">
- <Value value="288"/>
- </ItalicsCorrection>
- <ItalicsCorrection index="52">
- <Value value="241"/>
- </ItalicsCorrection>
- <ItalicsCorrection index="53">
- <Value value="288"/>
- </ItalicsCorrection>
- <ItalicsCorrection index="54">
- <Value value="241"/>
- </ItalicsCorrection>
- <ItalicsCorrection index="55">
- <Value value="194"/>
- </ItalicsCorrection>
- <ItalicsCorrection index="56">
- <Value value="147"/>
- </ItalicsCorrection>
- <ItalicsCorrection index="57">
- <Value value="241"/>
- </ItalicsCorrection>
- <ItalicsCorrection index="58">
- <Value value="194"/>
- </ItalicsCorrection>
- <ItalicsCorrection index="59">
- <Value value="147"/>
- </ItalicsCorrection>
- <ItalicsCorrection index="60">
- <Value value="449"/>
- </ItalicsCorrection>
- <ItalicsCorrection index="61">
- <Value value="402"/>
- </ItalicsCorrection>
- <ItalicsCorrection index="62">
- <Value value="194"/>
- </ItalicsCorrection>
- <ItalicsCorrection index="63">
- <Value value="147"/>
- </ItalicsCorrection>
- <ItalicsCorrection index="64">
- <Value value="449"/>
- </ItalicsCorrection>
- <ItalicsCorrection index="65">
- <Value value="402"/>
- </ItalicsCorrection>
- <ItalicsCorrection index="66">
- <Value value="355"/>
- </ItalicsCorrection>
- <ItalicsCorrection index="67">
- <Value value="308"/>
- </ItalicsCorrection>
- <ItalicsCorrection index="68">
- <Value value="449"/>
- </ItalicsCorrection>
- <ItalicsCorrection index="69">
- <Value value="442"/>
- </ItalicsCorrection>
- <ItalicsCorrection index="70">
- <Value value="395"/>
- </ItalicsCorrection>
- <ItalicsCorrection index="71">
- <Value value="395"/>
- </ItalicsCorrection>
- <ItalicsCorrection index="72">
- <Value value="348"/>
- </ItalicsCorrection>
- <ItalicsCorrection index="73">
- <Value value="301"/>
- </ItalicsCorrection>
- <ItalicsCorrection index="74">
- <Value value="348"/>
- </ItalicsCorrection>
- <ItalicsCorrection index="75">
- <Value value="301"/>
- </ItalicsCorrection>
- <ItalicsCorrection index="76">
- <Value value="254"/>
- </ItalicsCorrection>
- <ItalicsCorrection index="77">
- <Value value="207"/>
- </ItalicsCorrection>
- <ItalicsCorrection index="78">
- <Value value="301"/>
- </ItalicsCorrection>
- <ItalicsCorrection index="79">
- <Value value="254"/>
- </ItalicsCorrection>
- <ItalicsCorrection index="80">
- <Value value="207"/>
- </ItalicsCorrection>
- <ItalicsCorrection index="81">
- <Value value="160"/>
- </ItalicsCorrection>
- <ItalicsCorrection index="82">
- <Value value="113"/>
- </ItalicsCorrection>
- <ItalicsCorrection index="83">
- <Value value="193"/>
- </ItalicsCorrection>
- <ItalicsCorrection index="84">
- <Value value="146"/>
- </ItalicsCorrection>
- <ItalicsCorrection index="85">
- <Value value="146"/>
- </ItalicsCorrection>
- <ItalicsCorrection index="86">
- <Value value="448"/>
- </ItalicsCorrection>
- <ItalicsCorrection index="87">
- <Value value="401"/>
- </ItalicsCorrection>
- <ItalicsCorrection index="88">
- <Value value="448"/>
- </ItalicsCorrection>
- <ItalicsCorrection index="89">
- <Value value="401"/>
- </ItalicsCorrection>
- <ItalicsCorrection index="90">
- <Value value="354"/>
- </ItalicsCorrection>
- <ItalicsCorrection index="91">
- <Value value="307"/>
- </ItalicsCorrection>
- <ItalicsCorrection index="92">
- <Value value="401"/>
- </ItalicsCorrection>
- <ItalicsCorrection index="93">
- <Value value="354"/>
- </ItalicsCorrection>
- <ItalicsCorrection index="94">
- <Value value="307"/>
- </ItalicsCorrection>
- <ItalicsCorrection index="95">
- <Value value="260"/>
- </ItalicsCorrection>
- <ItalicsCorrection index="96">
- <Value value="213"/>
- </ItalicsCorrection>
- <ItalicsCorrection index="97">
- <Value value="119"/>
- </ItalicsCorrection>
- <ItalicsCorrection index="98">
- <Value value="421"/>
- </ItalicsCorrection>
- <ItalicsCorrection index="99">
- <Value value="374"/>
- </ItalicsCorrection>
- <ItalicsCorrection index="100">
- <Value value="327"/>
- </ItalicsCorrection>
- <ItalicsCorrection index="101">
- <Value value="421"/>
- </ItalicsCorrection>
- <ItalicsCorrection index="102">
- <Value value="374"/>
- </ItalicsCorrection>
- <ItalicsCorrection index="103">
- <Value value="327"/>
- </ItalicsCorrection>
- <ItalicsCorrection index="104">
- <Value value="280"/>
- </ItalicsCorrection>
- <ItalicsCorrection index="105">
- <Value value="233"/>
- </ItalicsCorrection>
- <ItalicsCorrection index="106">
- <Value value="374"/>
- </ItalicsCorrection>
- <ItalicsCorrection index="107">
- <Value value="327"/>
- </ItalicsCorrection>
- <ItalicsCorrection index="108">
- <Value value="280"/>
- </ItalicsCorrection>
- <ItalicsCorrection index="109">
- <Value value="233"/>
- </ItalicsCorrection>
- <ItalicsCorrection index="110">
- <Value value="186"/>
- </ItalicsCorrection>
- <ItalicsCorrection index="111">
- <Value value="139"/>
- </ItalicsCorrection>
- <ItalicsCorrection index="112">
- <Value value="280"/>
- </ItalicsCorrection>
- <ItalicsCorrection index="113">
- <Value value="233"/>
- </ItalicsCorrection>
- <ItalicsCorrection index="114">
- <Value value="186"/>
- </ItalicsCorrection>
- <ItalicsCorrection index="115">
- <Value value="132"/>
- </ItalicsCorrection>
- <ItalicsCorrection index="116">
- <Value value="434"/>
- </ItalicsCorrection>
- <ItalicsCorrection index="117">
- <Value value="387"/>
- </ItalicsCorrection>
- <ItalicsCorrection index="118">
- <Value value="340"/>
- </ItalicsCorrection>
- <ItalicsCorrection index="119">
- <Value value="293"/>
- </ItalicsCorrection>
- <ItalicsCorrection index="120">
- <Value value="434"/>
- </ItalicsCorrection>
- <ItalicsCorrection index="121">
- <Value value="387"/>
- </ItalicsCorrection>
- <ItalicsCorrection index="122">
- <Value value="340"/>
- </ItalicsCorrection>
- <ItalicsCorrection index="123">
- <Value value="293"/>
- </ItalicsCorrection>
- <ItalicsCorrection index="124">
- <Value value="246"/>
- </ItalicsCorrection>
- <ItalicsCorrection index="125">
- <Value value="199"/>
- </ItalicsCorrection>
- <ItalicsCorrection index="126">
- <Value value="340"/>
- </ItalicsCorrection>
- </MathItalicsCorrectionInfo>
- <MathTopAccentAttachment>
- <TopAccentCoverage Format="2">
- <Glyph value="A"/>
- <Glyph value="B"/>
- <Glyph value="C"/>
- <Glyph value="D"/>
- <Glyph value="E"/>
- <Glyph value="F"/>
- <Glyph value="G"/>
- <Glyph value="H"/>
- <Glyph value="I"/>
- <Glyph value="J"/>
- <Glyph value="K"/>
- <Glyph value="L"/>
- <Glyph value="M"/>
- <Glyph value="N"/>
- <Glyph value="O"/>
- <Glyph value="P"/>
- <Glyph value="Q"/>
- <Glyph value="R"/>
- <Glyph value="S"/>
- <Glyph value="T"/>
- <Glyph value="U"/>
- <Glyph value="V"/>
- <Glyph value="W"/>
- <Glyph value="X"/>
- <Glyph value="Y"/>
- <Glyph value="Z"/>
- </TopAccentCoverage>
- <!-- TopAccentAttachmentCount=26 -->
- <TopAccentAttachment index="0">
- <Value value="458"/>
- </TopAccentAttachment>
- <TopAccentAttachment index="1">
- <Value value="430"/>
- </TopAccentAttachment>
- <TopAccentAttachment index="2">
- <Value value="402"/>
- </TopAccentAttachment>
- <TopAccentAttachment index="3">
- <Value value="374"/>
- </TopAccentAttachment>
- <TopAccentAttachment index="4">
- <Value value="346"/>
- </TopAccentAttachment>
- <TopAccentAttachment index="5">
- <Value value="318"/>
- </TopAccentAttachment>
- <TopAccentAttachment index="6">
- <Value value="290"/>
- </TopAccentAttachment>
- <TopAccentAttachment index="7">
- <Value value="262"/>
- </TopAccentAttachment>
- <TopAccentAttachment index="8">
- <Value value="234"/>
- </TopAccentAttachment>
- <TopAccentAttachment index="9">
- <Value value="463"/>
- </TopAccentAttachment>
- <TopAccentAttachment index="10">
- <Value value="435"/>
- </TopAccentAttachment>
- <TopAccentAttachment index="11">
- <Value value="407"/>
- </TopAccentAttachment>
- <TopAccentAttachment index="12">
- <Value value="379"/>
- </TopAccentAttachment>
- <TopAccentAttachment index="13">
- <Value value="351"/>
- </TopAccentAttachment>
- <TopAccentAttachment index="14">
- <Value value="323"/>
- </TopAccentAttachment>
- <TopAccentAttachment index="15">
- <Value value="295"/>
- </TopAccentAttachment>
- <TopAccentAttachment index="16">
- <Value value="267"/>
- </TopAccentAttachment>
- <TopAccentAttachment index="17">
- <Value value="239"/>
- </TopAccentAttachment>
- <TopAccentAttachment index="18">
- <Value value="468"/>
- </TopAccentAttachment>
- <TopAccentAttachment index="19">
- <Value value="440"/>
- </TopAccentAttachment>
- <TopAccentAttachment index="20">
- <Value value="412"/>
- </TopAccentAttachment>
- <TopAccentAttachment index="21">
- <Value value="384"/>
- </TopAccentAttachment>
- <TopAccentAttachment index="22">
- <Value value="356"/>
- </TopAccentAttachment>
- <TopAccentAttachment index="23">
- <Value value="328"/>
- </TopAccentAttachment>
- <TopAccentAttachment index="24">
- <Value value="300"/>
- </TopAccentAttachment>
- <TopAccentAttachment index="25">
- <Value value="272"/>
- </TopAccentAttachment>
- </MathTopAccentAttachment>
- <ExtendedShapeCoverage Format="1">
- <Glyph value="B"/>
- <Glyph value="E"/>
- <Glyph value="H"/>
- <Glyph value="K"/>
- <Glyph value="N"/>
- <Glyph value="Q"/>
- <Glyph value="T"/>
- <Glyph value="W"/>
- <Glyph value="Z"/>
- </ExtendedShapeCoverage>
- <MathKernInfo>
- <MathKernCoverage Format="2">
- <Glyph value="A"/>
- <Glyph value="B"/>
- <Glyph value="C"/>
- <Glyph value="D"/>
- <Glyph value="E"/>
- <Glyph value="F"/>
- <Glyph value="G"/>
- <Glyph value="H"/>
- <Glyph value="I"/>
- <Glyph value="J"/>
- <Glyph value="K"/>
- <Glyph value="L"/>
- <Glyph value="M"/>
- <Glyph value="N"/>
- <Glyph value="O"/>
- <Glyph value="P"/>
- <Glyph value="Q"/>
- <Glyph value="R"/>
- <Glyph value="S"/>
- <Glyph value="T"/>
- <Glyph value="U"/>
- <Glyph value="V"/>
- <Glyph value="W"/>
- <Glyph value="X"/>
- <Glyph value="Y"/>
- <Glyph value="Z"/>
- </MathKernCoverage>
- <!-- MathKernCount=26 -->
- <MathKernInfoRecords index="0">
- <TopLeftMathKern>
- <!-- HeightCount=5 -->
- <CorrectionHeight index="0">
- <Value value="12"/>
- </CorrectionHeight>
- <CorrectionHeight index="1">
- <Value value="19"/>
- </CorrectionHeight>
- <CorrectionHeight index="2">
- <Value value="26"/>
- </CorrectionHeight>
- <CorrectionHeight index="3">
- <Value value="33"/>
- </CorrectionHeight>
- <CorrectionHeight index="4">
- <Value value="40"/>
- </CorrectionHeight>
- <KernValue index="0">
- <Value value="17"/>
- </KernValue>
- <KernValue index="1">
- <Value value="24"/>
- </KernValue>
- <KernValue index="2">
- <Value value="31"/>
- </KernValue>
- <KernValue index="3">
- <Value value="38"/>
- </KernValue>
- <KernValue index="4">
- <Value value="45"/>
- </KernValue>
- <KernValue index="5">
- <Value value="52"/>
- </KernValue>
- </TopLeftMathKern>
- <BottomRightMathKern>
- <!-- HeightCount=0 -->
- <KernValue index="0">
- <Value value="25"/>
- </KernValue>
- </BottomRightMathKern>
- <BottomLeftMathKern>
- <!-- HeightCount=9 -->
- <CorrectionHeight index="0">
- <Value value="31"/>
- </CorrectionHeight>
- <CorrectionHeight index="1">
- <Value value="57"/>
- </CorrectionHeight>
- <CorrectionHeight index="2">
- <Value value="83"/>
- </CorrectionHeight>
- <CorrectionHeight index="3">
- <Value value="109"/>
- </CorrectionHeight>
- <CorrectionHeight index="4">
- <Value value="135"/>
- </CorrectionHeight>
- <CorrectionHeight index="5">
- <Value value="161"/>
- </CorrectionHeight>
- <CorrectionHeight index="6">
- <Value value="187"/>
- </CorrectionHeight>
- <CorrectionHeight index="7">
- <Value value="213"/>
- </CorrectionHeight>
- <CorrectionHeight index="8">
- <Value value="239"/>
- </CorrectionHeight>
- <KernValue index="0">
- <Value value="29"/>
- </KernValue>
- <KernValue index="1">
- <Value value="48"/>
- </KernValue>
- <KernValue index="2">
- <Value value="67"/>
- </KernValue>
- <KernValue index="3">
- <Value value="86"/>
- </KernValue>
- <KernValue index="4">
- <Value value="105"/>
- </KernValue>
- <KernValue index="5">
- <Value value="124"/>
- </KernValue>
- <KernValue index="6">
- <Value value="143"/>
- </KernValue>
- <KernValue index="7">
- <Value value="162"/>
- </KernValue>
- <KernValue index="8">
- <Value value="181"/>
- </KernValue>
- <KernValue index="9">
- <Value value="200"/>
- </KernValue>
- </BottomLeftMathKern>
- </MathKernInfoRecords>
- <MathKernInfoRecords index="1">
- <TopRightMathKern>
- <!-- HeightCount=2 -->
- <CorrectionHeight index="0">
- <Value value="30"/>
- </CorrectionHeight>
- <CorrectionHeight index="1">
- <Value value="55"/>
- </CorrectionHeight>
- <KernValue index="0">
- <Value value="24"/>
- </KernValue>
- <KernValue index="1">
- <Value value="38"/>
- </KernValue>
- <KernValue index="2">
- <Value value="52"/>
- </KernValue>
- </TopRightMathKern>
- <TopLeftMathKern>
- <!-- HeightCount=6 -->
- <CorrectionHeight index="0">
- <Value value="13"/>
- </CorrectionHeight>
- <CorrectionHeight index="1">
- <Value value="21"/>
- </CorrectionHeight>
- <CorrectionHeight index="2">
- <Value value="29"/>
- </CorrectionHeight>
- <CorrectionHeight index="3">
- <Value value="37"/>
- </CorrectionHeight>
- <CorrectionHeight index="4">
- <Value value="45"/>
- </CorrectionHeight>
- <CorrectionHeight index="5">
- <Value value="53"/>
- </CorrectionHeight>
- <KernValue index="0">
- <Value value="18"/>
- </KernValue>
- <KernValue index="1">
- <Value value="26"/>
- </KernValue>
- <KernValue index="2">
- <Value value="34"/>
- </KernValue>
- <KernValue index="3">
- <Value value="42"/>
- </KernValue>
- <KernValue index="4">
- <Value value="50"/>
- </KernValue>
- <KernValue index="5">
- <Value value="58"/>
- </KernValue>
- <KernValue index="6">
- <Value value="66"/>
- </KernValue>
- </TopLeftMathKern>
- </MathKernInfoRecords>
- <MathKernInfoRecords index="2">
- <TopRightMathKern>
- <!-- HeightCount=3 -->
- <CorrectionHeight index="0">
- <Value value="31"/>
- </CorrectionHeight>
- <CorrectionHeight index="1">
- <Value value="57"/>
- </CorrectionHeight>
- <CorrectionHeight index="2">
- <Value value="83"/>
- </CorrectionHeight>
- <KernValue index="0">
- <Value value="25"/>
- </KernValue>
- <KernValue index="1">
- <Value value="40"/>
- </KernValue>
- <KernValue index="2">
- <Value value="55"/>
- </KernValue>
- <KernValue index="3">
- <Value value="70"/>
- </KernValue>
- </TopRightMathKern>
- <TopLeftMathKern>
- <!-- HeightCount=7 -->
- <CorrectionHeight index="0">
- <Value value="14"/>
- </CorrectionHeight>
- <CorrectionHeight index="1">
- <Value value="23"/>
- </CorrectionHeight>
- <CorrectionHeight index="2">
- <Value value="32"/>
- </CorrectionHeight>
- <CorrectionHeight index="3">
- <Value value="41"/>
- </CorrectionHeight>
- <CorrectionHeight index="4">
- <Value value="50"/>
- </CorrectionHeight>
- <CorrectionHeight index="5">
- <Value value="59"/>
- </CorrectionHeight>
- <CorrectionHeight index="6">
- <Value value="68"/>
- </CorrectionHeight>
- <KernValue index="0">
- <Value value="19"/>
- </KernValue>
- <KernValue index="1">
- <Value value="28"/>
- </KernValue>
- <KernValue index="2">
- <Value value="37"/>
- </KernValue>
- <KernValue index="3">
- <Value value="46"/>
- </KernValue>
- <KernValue index="4">
- <Value value="55"/>
- </KernValue>
- <KernValue index="5">
- <Value value="64"/>
- </KernValue>
- <KernValue index="6">
- <Value value="73"/>
- </KernValue>
- <KernValue index="7">
- <Value value="82"/>
- </KernValue>
- </TopLeftMathKern>
- <BottomRightMathKern>
- <!-- HeightCount=2 -->
- <CorrectionHeight index="0">
- <Value value="23"/>
- </CorrectionHeight>
- <CorrectionHeight index="1">
- <Value value="41"/>
- </CorrectionHeight>
- <KernValue index="0">
- <Value value="27"/>
- </KernValue>
- <KernValue index="1">
- <Value value="44"/>
- </KernValue>
- <KernValue index="2">
- <Value value="61"/>
- </KernValue>
- </BottomRightMathKern>
- <BottomLeftMathKern>
- <!-- HeightCount=0 -->
- <KernValue index="0">
- <Value value="31"/>
- </KernValue>
- </BottomLeftMathKern>
- </MathKernInfoRecords>
- <MathKernInfoRecords index="3">
- <TopRightMathKern>
- <!-- HeightCount=4 -->
- <CorrectionHeight index="0">
- <Value value="32"/>
- </CorrectionHeight>
- <CorrectionHeight index="1">
- <Value value="59"/>
- </CorrectionHeight>
- <CorrectionHeight index="2">
- <Value value="86"/>
- </CorrectionHeight>
- <CorrectionHeight index="3">
- <Value value="113"/>
- </CorrectionHeight>
- <KernValue index="0">
- <Value value="26"/>
- </KernValue>
- <KernValue index="1">
- <Value value="42"/>
- </KernValue>
- <KernValue index="2">
- <Value value="58"/>
- </KernValue>
- <KernValue index="3">
- <Value value="74"/>
- </KernValue>
- <KernValue index="4">
- <Value value="90"/>
- </KernValue>
- </TopRightMathKern>
- <BottomRightMathKern>
- <!-- HeightCount=3 -->
- <CorrectionHeight index="0">
- <Value value="24"/>
- </CorrectionHeight>
- <CorrectionHeight index="1">
- <Value value="43"/>
- </CorrectionHeight>
- <CorrectionHeight index="2">
- <Value value="62"/>
- </CorrectionHeight>
- <KernValue index="0">
- <Value value="28"/>
- </KernValue>
- <KernValue index="1">
- <Value value="46"/>
- </KernValue>
- <KernValue index="2">
- <Value value="64"/>
- </KernValue>
- <KernValue index="3">
- <Value value="82"/>
- </KernValue>
- </BottomRightMathKern>
- </MathKernInfoRecords>
- <MathKernInfoRecords index="4">
- <TopRightMathKern>
- <!-- HeightCount=5 -->
- <CorrectionHeight index="0">
- <Value value="33"/>
- </CorrectionHeight>
- <CorrectionHeight index="1">
- <Value value="61"/>
- </CorrectionHeight>
- <CorrectionHeight index="2">
- <Value value="89"/>
- </CorrectionHeight>
- <CorrectionHeight index="3">
- <Value value="117"/>
- </CorrectionHeight>
- <CorrectionHeight index="4">
- <Value value="145"/>
- </CorrectionHeight>
- <KernValue index="0">
- <Value value="27"/>
- </KernValue>
- <KernValue index="1">
- <Value value="44"/>
- </KernValue>
- <KernValue index="2">
- <Value value="61"/>
- </KernValue>
- <KernValue index="3">
- <Value value="78"/>
- </KernValue>
- <KernValue index="4">
- <Value value="95"/>
- </KernValue>
- <KernValue index="5">
- <Value value="112"/>
- </KernValue>
- </TopRightMathKern>
- <TopLeftMathKern>
- <!-- HeightCount=9 -->
- <CorrectionHeight index="0">
- <Value value="16"/>
- </CorrectionHeight>
- <CorrectionHeight index="1">
- <Value value="27"/>
- </CorrectionHeight>
- <CorrectionHeight index="2">
- <Value value="38"/>
- </CorrectionHeight>
- <CorrectionHeight index="3">
- <Value value="49"/>
- </CorrectionHeight>
- <CorrectionHeight index="4">
- <Value value="60"/>
- </CorrectionHeight>
- <CorrectionHeight index="5">
- <Value value="71"/>
- </CorrectionHeight>
- <CorrectionHeight index="6">
- <Value value="82"/>
- </CorrectionHeight>
- <CorrectionHeight index="7">
- <Value value="93"/>
- </CorrectionHeight>
- <CorrectionHeight index="8">
- <Value value="104"/>
- </CorrectionHeight>
- <KernValue index="0">
- <Value value="21"/>
- </KernValue>
- <KernValue index="1">
- <Value value="32"/>
- </KernValue>
- <KernValue index="2">
- <Value value="43"/>
- </KernValue>
- <KernValue index="3">
- <Value value="54"/>
- </KernValue>
- <KernValue index="4">
- <Value value="65"/>
- </KernValue>
- <KernValue index="5">
- <Value value="76"/>
- </KernValue>
- <KernValue index="6">
- <Value value="87"/>
- </KernValue>
- <KernValue index="7">
- <Value value="98"/>
- </KernValue>
- <KernValue index="8">
- <Value value="109"/>
- </KernValue>
- <KernValue index="9">
- <Value value="120"/>
- </KernValue>
- </TopLeftMathKern>
- <BottomLeftMathKern>
- <!-- HeightCount=2 -->
- <CorrectionHeight index="0">
- <Value value="12"/>
- </CorrectionHeight>
- <CorrectionHeight index="1">
- <Value value="19"/>
- </CorrectionHeight>
- <KernValue index="0">
- <Value value="16"/>
- </KernValue>
- <KernValue index="1">
- <Value value="22"/>
- </KernValue>
- <KernValue index="2">
- <Value value="28"/>
- </KernValue>
- </BottomLeftMathKern>
- </MathKernInfoRecords>
- <MathKernInfoRecords index="5">
- <BottomRightMathKern>
- <!-- HeightCount=5 -->
- <CorrectionHeight index="0">
- <Value value="26"/>
- </CorrectionHeight>
- <CorrectionHeight index="1">
- <Value value="47"/>
- </CorrectionHeight>
- <CorrectionHeight index="2">
- <Value value="68"/>
- </CorrectionHeight>
- <CorrectionHeight index="3">
- <Value value="89"/>
- </CorrectionHeight>
- <CorrectionHeight index="4">
- <Value value="110"/>
- </CorrectionHeight>
- <KernValue index="0">
- <Value value="30"/>
- </KernValue>
- <KernValue index="1">
- <Value value="50"/>
- </KernValue>
- <KernValue index="2">
- <Value value="70"/>
- </KernValue>
- <KernValue index="3">
- <Value value="90"/>
- </KernValue>
- <KernValue index="4">
- <Value value="110"/>
- </KernValue>
- <KernValue index="5">
- <Value value="130"/>
- </KernValue>
- </BottomRightMathKern>
- </MathKernInfoRecords>
- <MathKernInfoRecords index="6">
- <TopRightMathKern>
- <!-- HeightCount=7 -->
- <CorrectionHeight index="0">
- <Value value="12"/>
- </CorrectionHeight>
- <CorrectionHeight index="1">
- <Value value="19"/>
- </CorrectionHeight>
- <CorrectionHeight index="2">
- <Value value="26"/>
- </CorrectionHeight>
- <CorrectionHeight index="3">
- <Value value="33"/>
- </CorrectionHeight>
- <CorrectionHeight index="4">
- <Value value="40"/>
- </CorrectionHeight>
- <CorrectionHeight index="5">
- <Value value="47"/>
- </CorrectionHeight>
- <CorrectionHeight index="6">
- <Value value="54"/>
- </CorrectionHeight>
- <KernValue index="0">
- <Value value="29"/>
- </KernValue>
- <KernValue index="1">
- <Value value="48"/>
- </KernValue>
- <KernValue index="2">
- <Value value="67"/>
- </KernValue>
- <KernValue index="3">
- <Value value="86"/>
- </KernValue>
- <KernValue index="4">
- <Value value="105"/>
- </KernValue>
- <KernValue index="5">
- <Value value="124"/>
- </KernValue>
- <KernValue index="6">
- <Value value="143"/>
- </KernValue>
- <KernValue index="7">
- <Value value="162"/>
- </KernValue>
- </TopRightMathKern>
- <TopLeftMathKern>
- <!-- HeightCount=0 -->
- <KernValue index="0">
- <Value value="23"/>
- </KernValue>
- </TopLeftMathKern>
- <BottomRightMathKern>
- <!-- HeightCount=6 -->
- <CorrectionHeight index="0">
- <Value value="27"/>
- </CorrectionHeight>
- <CorrectionHeight index="1">
- <Value value="49"/>
- </CorrectionHeight>
- <CorrectionHeight index="2">
- <Value value="71"/>
- </CorrectionHeight>
- <CorrectionHeight index="3">
- <Value value="93"/>
- </CorrectionHeight>
- <CorrectionHeight index="4">
- <Value value="115"/>
- </CorrectionHeight>
- <CorrectionHeight index="5">
- <Value value="137"/>
- </CorrectionHeight>
- <KernValue index="0">
- <Value value="31"/>
- </KernValue>
- <KernValue index="1">
- <Value value="52"/>
- </KernValue>
- <KernValue index="2">
- <Value value="73"/>
- </KernValue>
- <KernValue index="3">
- <Value value="94"/>
- </KernValue>
- <KernValue index="4">
- <Value value="115"/>
- </KernValue>
- <KernValue index="5">
- <Value value="136"/>
- </KernValue>
- <KernValue index="6">
- <Value value="157"/>
- </KernValue>
- </BottomRightMathKern>
- <BottomLeftMathKern>
- <!-- HeightCount=4 -->
- <CorrectionHeight index="0">
- <Value value="14"/>
- </CorrectionHeight>
- <CorrectionHeight index="1">
- <Value value="23"/>
- </CorrectionHeight>
- <CorrectionHeight index="2">
- <Value value="32"/>
- </CorrectionHeight>
- <CorrectionHeight index="3">
- <Value value="41"/>
- </CorrectionHeight>
- <KernValue index="0">
- <Value value="18"/>
- </KernValue>
- <KernValue index="1">
- <Value value="26"/>
- </KernValue>
- <KernValue index="2">
- <Value value="34"/>
- </KernValue>
- <KernValue index="3">
- <Value value="42"/>
- </KernValue>
- <KernValue index="4">
- <Value value="50"/>
- </KernValue>
- </BottomLeftMathKern>
- </MathKernInfoRecords>
- <MathKernInfoRecords index="7">
- <TopRightMathKern>
- <!-- HeightCount=8 -->
- <CorrectionHeight index="0">
- <Value value="13"/>
- </CorrectionHeight>
- <CorrectionHeight index="1">
- <Value value="21"/>
- </CorrectionHeight>
- <CorrectionHeight index="2">
- <Value value="29"/>
- </CorrectionHeight>
- <CorrectionHeight index="3">
- <Value value="37"/>
- </CorrectionHeight>
- <CorrectionHeight index="4">
- <Value value="45"/>
- </CorrectionHeight>
- <CorrectionHeight index="5">
- <Value value="53"/>
- </CorrectionHeight>
- <CorrectionHeight index="6">
- <Value value="61"/>
- </CorrectionHeight>
- <CorrectionHeight index="7">
- <Value value="69"/>
- </CorrectionHeight>
- <KernValue index="0">
- <Value value="30"/>
- </KernValue>
- <KernValue index="1">
- <Value value="50"/>
- </KernValue>
- <KernValue index="2">
- <Value value="70"/>
- </KernValue>
- <KernValue index="3">
- <Value value="90"/>
- </KernValue>
- <KernValue index="4">
- <Value value="110"/>
- </KernValue>
- <KernValue index="5">
- <Value value="130"/>
- </KernValue>
- <KernValue index="6">
- <Value value="150"/>
- </KernValue>
- <KernValue index="7">
- <Value value="170"/>
- </KernValue>
- <KernValue index="8">
- <Value value="190"/>
- </KernValue>
- </TopRightMathKern>
- </MathKernInfoRecords>
- <MathKernInfoRecords index="8">
- <TopRightMathKern>
- <!-- HeightCount=9 -->
- <CorrectionHeight index="0">
- <Value value="14"/>
- </CorrectionHeight>
- <CorrectionHeight index="1">
- <Value value="23"/>
- </CorrectionHeight>
- <CorrectionHeight index="2">
- <Value value="32"/>
- </CorrectionHeight>
- <CorrectionHeight index="3">
- <Value value="41"/>
- </CorrectionHeight>
- <CorrectionHeight index="4">
- <Value value="50"/>
- </CorrectionHeight>
- <CorrectionHeight index="5">
- <Value value="59"/>
- </CorrectionHeight>
- <CorrectionHeight index="6">
- <Value value="68"/>
- </CorrectionHeight>
- <CorrectionHeight index="7">
- <Value value="77"/>
- </CorrectionHeight>
- <CorrectionHeight index="8">
- <Value value="86"/>
- </CorrectionHeight>
- <KernValue index="0">
- <Value value="31"/>
- </KernValue>
- <KernValue index="1">
- <Value value="52"/>
- </KernValue>
- <KernValue index="2">
- <Value value="73"/>
- </KernValue>
- <KernValue index="3">
- <Value value="94"/>
- </KernValue>
- <KernValue index="4">
- <Value value="115"/>
- </KernValue>
- <KernValue index="5">
- <Value value="136"/>
- </KernValue>
- <KernValue index="6">
- <Value value="157"/>
- </KernValue>
- <KernValue index="7">
- <Value value="178"/>
- </KernValue>
- <KernValue index="8">
- <Value value="199"/>
- </KernValue>
- <KernValue index="9">
- <Value value="220"/>
- </KernValue>
- </TopRightMathKern>
- <TopLeftMathKern>
- <!-- HeightCount=2 -->
- <CorrectionHeight index="0">
- <Value value="20"/>
- </CorrectionHeight>
- <CorrectionHeight index="1">
- <Value value="35"/>
- </CorrectionHeight>
- <KernValue index="0">
- <Value value="25"/>
- </KernValue>
- <KernValue index="1">
- <Value value="40"/>
- </KernValue>
- <KernValue index="2">
- <Value value="55"/>
- </KernValue>
- </TopLeftMathKern>
- <BottomRightMathKern>
- <!-- HeightCount=8 -->
- <CorrectionHeight index="0">
- <Value value="29"/>
- </CorrectionHeight>
- <CorrectionHeight index="1">
- <Value value="53"/>
- </CorrectionHeight>
- <CorrectionHeight index="2">
- <Value value="77"/>
- </CorrectionHeight>
- <CorrectionHeight index="3">
- <Value value="101"/>
- </CorrectionHeight>
- <CorrectionHeight index="4">
- <Value value="125"/>
- </CorrectionHeight>
- <CorrectionHeight index="5">
- <Value value="149"/>
- </CorrectionHeight>
- <CorrectionHeight index="6">
- <Value value="173"/>
- </CorrectionHeight>
- <CorrectionHeight index="7">
- <Value value="197"/>
- </CorrectionHeight>
- <KernValue index="0">
- <Value value="16"/>
- </KernValue>
- <KernValue index="1">
- <Value value="22"/>
- </KernValue>
- <KernValue index="2">
- <Value value="28"/>
- </KernValue>
- <KernValue index="3">
- <Value value="34"/>
- </KernValue>
- <KernValue index="4">
- <Value value="40"/>
- </KernValue>
- <KernValue index="5">
- <Value value="46"/>
- </KernValue>
- <KernValue index="6">
- <Value value="52"/>
- </KernValue>
- <KernValue index="7">
- <Value value="58"/>
- </KernValue>
- <KernValue index="8">
- <Value value="64"/>
- </KernValue>
- </BottomRightMathKern>
- <BottomLeftMathKern>
- <!-- HeightCount=6 -->
- <CorrectionHeight index="0">
- <Value value="16"/>
- </CorrectionHeight>
- <CorrectionHeight index="1">
- <Value value="27"/>
- </CorrectionHeight>
- <CorrectionHeight index="2">
- <Value value="38"/>
- </CorrectionHeight>
- <CorrectionHeight index="3">
- <Value value="49"/>
- </CorrectionHeight>
- <CorrectionHeight index="4">
- <Value value="60"/>
- </CorrectionHeight>
- <CorrectionHeight index="5">
- <Value value="71"/>
- </CorrectionHeight>
- <KernValue index="0">
- <Value value="20"/>
- </KernValue>
- <KernValue index="1">
- <Value value="30"/>
- </KernValue>
- <KernValue index="2">
- <Value value="40"/>
- </KernValue>
- <KernValue index="3">
- <Value value="50"/>
- </KernValue>
- <KernValue index="4">
- <Value value="60"/>
- </KernValue>
- <KernValue index="5">
- <Value value="70"/>
- </KernValue>
- <KernValue index="6">
- <Value value="80"/>
- </KernValue>
- </BottomLeftMathKern>
- </MathKernInfoRecords>
- <MathKernInfoRecords index="9">
- <TopLeftMathKern>
- <!-- HeightCount=3 -->
- <CorrectionHeight index="0">
- <Value value="21"/>
- </CorrectionHeight>
- <CorrectionHeight index="1">
- <Value value="37"/>
- </CorrectionHeight>
- <CorrectionHeight index="2">
- <Value value="53"/>
- </CorrectionHeight>
- <KernValue index="0">
- <Value value="26"/>
- </KernValue>
- <KernValue index="1">
- <Value value="42"/>
- </KernValue>
- <KernValue index="2">
- <Value value="58"/>
- </KernValue>
- <KernValue index="3">
- <Value value="74"/>
- </KernValue>
- </TopLeftMathKern>
- <BottomRightMathKern>
- <!-- HeightCount=9 -->
- <CorrectionHeight index="0">
- <Value value="30"/>
- </CorrectionHeight>
- <CorrectionHeight index="1">
- <Value value="55"/>
- </CorrectionHeight>
- <CorrectionHeight index="2">
- <Value value="80"/>
- </CorrectionHeight>
- <CorrectionHeight index="3">
- <Value value="105"/>
- </CorrectionHeight>
- <CorrectionHeight index="4">
- <Value value="130"/>
- </CorrectionHeight>
- <CorrectionHeight index="5">
- <Value value="155"/>
- </CorrectionHeight>
- <CorrectionHeight index="6">
- <Value value="180"/>
- </CorrectionHeight>
- <CorrectionHeight index="7">
- <Value value="205"/>
- </CorrectionHeight>
- <CorrectionHeight index="8">
- <Value value="230"/>
- </CorrectionHeight>
- <KernValue index="0">
- <Value value="17"/>
- </KernValue>
- <KernValue index="1">
- <Value value="24"/>
- </KernValue>
- <KernValue index="2">
- <Value value="31"/>
- </KernValue>
- <KernValue index="3">
- <Value value="38"/>
- </KernValue>
- <KernValue index="4">
- <Value value="45"/>
- </KernValue>
- <KernValue index="5">
- <Value value="52"/>
- </KernValue>
- <KernValue index="6">
- <Value value="59"/>
- </KernValue>
- <KernValue index="7">
- <Value value="66"/>
- </KernValue>
- <KernValue index="8">
- <Value value="73"/>
- </KernValue>
- <KernValue index="9">
- <Value value="80"/>
- </KernValue>
- </BottomRightMathKern>
- </MathKernInfoRecords>
- <MathKernInfoRecords index="10">
- <TopLeftMathKern>
- <!-- HeightCount=4 -->
- <CorrectionHeight index="0">
- <Value value="22"/>
- </CorrectionHeight>
- <CorrectionHeight index="1">
- <Value value="39"/>
- </CorrectionHeight>
- <CorrectionHeight index="2">
- <Value value="56"/>
- </CorrectionHeight>
- <CorrectionHeight index="3">
- <Value value="73"/>
- </CorrectionHeight>
- <KernValue index="0">
- <Value value="27"/>
- </KernValue>
- <KernValue index="1">
- <Value value="44"/>
- </KernValue>
- <KernValue index="2">
- <Value value="61"/>
- </KernValue>
- <KernValue index="3">
- <Value value="78"/>
- </KernValue>
- <KernValue index="4">
- <Value value="95"/>
- </KernValue>
- </TopLeftMathKern>
- <BottomLeftMathKern>
- <!-- HeightCount=8 -->
- <CorrectionHeight index="0">
- <Value value="18"/>
- </CorrectionHeight>
- <CorrectionHeight index="1">
- <Value value="31"/>
- </CorrectionHeight>
- <CorrectionHeight index="2">
- <Value value="44"/>
- </CorrectionHeight>
- <CorrectionHeight index="3">
- <Value value="57"/>
- </CorrectionHeight>
- <CorrectionHeight index="4">
- <Value value="70"/>
- </CorrectionHeight>
- <CorrectionHeight index="5">
- <Value value="83"/>
- </CorrectionHeight>
- <CorrectionHeight index="6">
- <Value value="96"/>
- </CorrectionHeight>
- <CorrectionHeight index="7">
- <Value value="109"/>
- </CorrectionHeight>
- <KernValue index="0">
- <Value value="22"/>
- </KernValue>
- <KernValue index="1">
- <Value value="34"/>
- </KernValue>
- <KernValue index="2">
- <Value value="46"/>
- </KernValue>
- <KernValue index="3">
- <Value value="58"/>
- </KernValue>
- <KernValue index="4">
- <Value value="70"/>
- </KernValue>
- <KernValue index="5">
- <Value value="82"/>
- </KernValue>
- <KernValue index="6">
- <Value value="94"/>
- </KernValue>
- <KernValue index="7">
- <Value value="106"/>
- </KernValue>
- <KernValue index="8">
- <Value value="118"/>
- </KernValue>
- </BottomLeftMathKern>
- </MathKernInfoRecords>
- <MathKernInfoRecords index="11">
- <TopRightMathKern>
- <!-- HeightCount=1 -->
- <CorrectionHeight index="0">
- <Value value="17"/>
- </CorrectionHeight>
- <KernValue index="0">
- <Value value="17"/>
- </KernValue>
- <KernValue index="1">
- <Value value="24"/>
- </KernValue>
- </TopRightMathKern>
- <BottomRightMathKern>
- <!-- HeightCount=0 -->
- <KernValue index="0">
- <Value value="19"/>
- </KernValue>
- </BottomRightMathKern>
- </MathKernInfoRecords>
- <MathKernInfoRecords index="12">
- <TopRightMathKern>
- <!-- HeightCount=2 -->
- <CorrectionHeight index="0">
- <Value value="18"/>
- </CorrectionHeight>
- <CorrectionHeight index="1">
- <Value value="31"/>
- </CorrectionHeight>
- <KernValue index="0">
- <Value value="18"/>
- </KernValue>
- <KernValue index="1">
- <Value value="26"/>
- </KernValue>
- <KernValue index="2">
- <Value value="34"/>
- </KernValue>
- </TopRightMathKern>
- <TopLeftMathKern>
- <!-- HeightCount=6 -->
- <CorrectionHeight index="0">
- <Value value="24"/>
- </CorrectionHeight>
- <CorrectionHeight index="1">
- <Value value="43"/>
- </CorrectionHeight>
- <CorrectionHeight index="2">
- <Value value="62"/>
- </CorrectionHeight>
- <CorrectionHeight index="3">
- <Value value="81"/>
- </CorrectionHeight>
- <CorrectionHeight index="4">
- <Value value="100"/>
- </CorrectionHeight>
- <CorrectionHeight index="5">
- <Value value="119"/>
- </CorrectionHeight>
- <KernValue index="0">
- <Value value="29"/>
- </KernValue>
- <KernValue index="1">
- <Value value="48"/>
- </KernValue>
- <KernValue index="2">
- <Value value="67"/>
- </KernValue>
- <KernValue index="3">
- <Value value="86"/>
- </KernValue>
- <KernValue index="4">
- <Value value="105"/>
- </KernValue>
- <KernValue index="5">
- <Value value="124"/>
- </KernValue>
- <KernValue index="6">
- <Value value="143"/>
- </KernValue>
- </TopLeftMathKern>
- <BottomRightMathKern>
- <!-- HeightCount=1 -->
- <CorrectionHeight index="0">
- <Value value="33"/>
- </CorrectionHeight>
- <KernValue index="0">
- <Value value="20"/>
- </KernValue>
- <KernValue index="1">
- <Value value="30"/>
- </KernValue>
- </BottomRightMathKern>
- </MathKernInfoRecords>
- <MathKernInfoRecords index="13">
- <TopRightMathKern>
- <!-- HeightCount=3 -->
- <CorrectionHeight index="0">
- <Value value="19"/>
- </CorrectionHeight>
- <CorrectionHeight index="1">
- <Value value="33"/>
- </CorrectionHeight>
- <CorrectionHeight index="2">
- <Value value="47"/>
- </CorrectionHeight>
- <KernValue index="0">
- <Value value="19"/>
- </KernValue>
- <KernValue index="1">
- <Value value="28"/>
- </KernValue>
- <KernValue index="2">
- <Value value="37"/>
- </KernValue>
- <KernValue index="3">
- <Value value="46"/>
- </KernValue>
- </TopRightMathKern>
- <TopLeftMathKern>
- <!-- HeightCount=7 -->
- <CorrectionHeight index="0">
- <Value value="25"/>
- </CorrectionHeight>
- <CorrectionHeight index="1">
- <Value value="45"/>
- </CorrectionHeight>
- <CorrectionHeight index="2">
- <Value value="65"/>
- </CorrectionHeight>
- <CorrectionHeight index="3">
- <Value value="85"/>
- </CorrectionHeight>
- <CorrectionHeight index="4">
- <Value value="105"/>
- </CorrectionHeight>
- <CorrectionHeight index="5">
- <Value value="125"/>
- </CorrectionHeight>
- <CorrectionHeight index="6">
- <Value value="145"/>
- </CorrectionHeight>
- <KernValue index="0">
- <Value value="30"/>
- </KernValue>
- <KernValue index="1">
- <Value value="50"/>
- </KernValue>
- <KernValue index="2">
- <Value value="70"/>
- </KernValue>
- <KernValue index="3">
- <Value value="90"/>
- </KernValue>
- <KernValue index="4">
- <Value value="110"/>
- </KernValue>
- <KernValue index="5">
- <Value value="130"/>
- </KernValue>
- <KernValue index="6">
- <Value value="150"/>
- </KernValue>
- <KernValue index="7">
- <Value value="170"/>
- </KernValue>
- </TopLeftMathKern>
- </MathKernInfoRecords>
- <MathKernInfoRecords index="14">
- <TopRightMathKern>
- <!-- HeightCount=4 -->
- <CorrectionHeight index="0">
- <Value value="20"/>
- </CorrectionHeight>
- <CorrectionHeight index="1">
- <Value value="35"/>
- </CorrectionHeight>
- <CorrectionHeight index="2">
- <Value value="50"/>
- </CorrectionHeight>
- <CorrectionHeight index="3">
- <Value value="65"/>
- </CorrectionHeight>
- <KernValue index="0">
- <Value value="20"/>
- </KernValue>
- <KernValue index="1">
- <Value value="30"/>
- </KernValue>
- <KernValue index="2">
- <Value value="40"/>
- </KernValue>
- <KernValue index="3">
- <Value value="50"/>
- </KernValue>
- <KernValue index="4">
- <Value value="60"/>
- </KernValue>
- </TopRightMathKern>
- <TopLeftMathKern>
- <!-- HeightCount=8 -->
- <CorrectionHeight index="0">
- <Value value="26"/>
- </CorrectionHeight>
- <CorrectionHeight index="1">
- <Value value="47"/>
- </CorrectionHeight>
- <CorrectionHeight index="2">
- <Value value="68"/>
- </CorrectionHeight>
- <CorrectionHeight index="3">
- <Value value="89"/>
- </CorrectionHeight>
- <CorrectionHeight index="4">
- <Value value="110"/>
- </CorrectionHeight>
- <CorrectionHeight index="5">
- <Value value="131"/>
- </CorrectionHeight>
- <CorrectionHeight index="6">
- <Value value="152"/>
- </CorrectionHeight>
- <CorrectionHeight index="7">
- <Value value="173"/>
- </CorrectionHeight>
- <KernValue index="0">
- <Value value="31"/>
- </KernValue>
- <KernValue index="1">
- <Value value="52"/>
- </KernValue>
- <KernValue index="2">
- <Value value="73"/>
- </KernValue>
- <KernValue index="3">
- <Value value="94"/>
- </KernValue>
- <KernValue index="4">
- <Value value="115"/>
- </KernValue>
- <KernValue index="5">
- <Value value="136"/>
- </KernValue>
- <KernValue index="6">
- <Value value="157"/>
- </KernValue>
- <KernValue index="7">
- <Value value="178"/>
- </KernValue>
- <KernValue index="8">
- <Value value="199"/>
- </KernValue>
- </TopLeftMathKern>
- <BottomRightMathKern>
- <!-- HeightCount=3 -->
- <CorrectionHeight index="0">
- <Value value="12"/>
- </CorrectionHeight>
- <CorrectionHeight index="1">
- <Value value="19"/>
- </CorrectionHeight>
- <CorrectionHeight index="2">
- <Value value="26"/>
- </CorrectionHeight>
- <KernValue index="0">
- <Value value="22"/>
- </KernValue>
- <KernValue index="1">
- <Value value="34"/>
- </KernValue>
- <KernValue index="2">
- <Value value="46"/>
- </KernValue>
- <KernValue index="3">
- <Value value="58"/>
- </KernValue>
- </BottomRightMathKern>
- <BottomLeftMathKern>
- <!-- HeightCount=1 -->
- <CorrectionHeight index="0">
- <Value value="22"/>
- </CorrectionHeight>
- <KernValue index="0">
- <Value value="26"/>
- </KernValue>
- <KernValue index="1">
- <Value value="42"/>
- </KernValue>
- </BottomLeftMathKern>
- </MathKernInfoRecords>
- <MathKernInfoRecords index="15">
- <BottomRightMathKern>
- <!-- HeightCount=4 -->
- <CorrectionHeight index="0">
- <Value value="13"/>
- </CorrectionHeight>
- <CorrectionHeight index="1">
- <Value value="21"/>
- </CorrectionHeight>
- <CorrectionHeight index="2">
- <Value value="29"/>
- </CorrectionHeight>
- <CorrectionHeight index="3">
- <Value value="37"/>
- </CorrectionHeight>
- <KernValue index="0">
- <Value value="23"/>
- </KernValue>
- <KernValue index="1">
- <Value value="36"/>
- </KernValue>
- <KernValue index="2">
- <Value value="49"/>
- </KernValue>
- <KernValue index="3">
- <Value value="62"/>
- </KernValue>
- <KernValue index="4">
- <Value value="75"/>
- </KernValue>
- </BottomRightMathKern>
- </MathKernInfoRecords>
- <MathKernInfoRecords index="16">
- <TopRightMathKern>
- <!-- HeightCount=6 -->
- <CorrectionHeight index="0">
- <Value value="22"/>
- </CorrectionHeight>
- <CorrectionHeight index="1">
- <Value value="39"/>
- </CorrectionHeight>
- <CorrectionHeight index="2">
- <Value value="56"/>
- </CorrectionHeight>
- <CorrectionHeight index="3">
- <Value value="73"/>
- </CorrectionHeight>
- <CorrectionHeight index="4">
- <Value value="90"/>
- </CorrectionHeight>
- <CorrectionHeight index="5">
- <Value value="107"/>
- </CorrectionHeight>
- <KernValue index="0">
- <Value value="22"/>
- </KernValue>
- <KernValue index="1">
- <Value value="34"/>
- </KernValue>
- <KernValue index="2">
- <Value value="46"/>
- </KernValue>
- <KernValue index="3">
- <Value value="58"/>
- </KernValue>
- <KernValue index="4">
- <Value value="70"/>
- </KernValue>
- <KernValue index="5">
- <Value value="82"/>
- </KernValue>
- <KernValue index="6">
- <Value value="94"/>
- </KernValue>
- </TopRightMathKern>
- <BottomLeftMathKern>
- <!-- HeightCount=3 -->
- <CorrectionHeight index="0">
- <Value value="24"/>
- </CorrectionHeight>
- <CorrectionHeight index="1">
- <Value value="43"/>
- </CorrectionHeight>
- <CorrectionHeight index="2">
- <Value value="62"/>
- </CorrectionHeight>
- <KernValue index="0">
- <Value value="28"/>
- </KernValue>
- <KernValue index="1">
- <Value value="46"/>
- </KernValue>
- <KernValue index="2">
- <Value value="64"/>
- </KernValue>
- <KernValue index="3">
- <Value value="82"/>
- </KernValue>
- </BottomLeftMathKern>
- </MathKernInfoRecords>
- <MathKernInfoRecords index="17">
- <TopRightMathKern>
- <!-- HeightCount=7 -->
- <CorrectionHeight index="0">
- <Value value="23"/>
- </CorrectionHeight>
- <CorrectionHeight index="1">
- <Value value="41"/>
- </CorrectionHeight>
- <CorrectionHeight index="2">
- <Value value="59"/>
- </CorrectionHeight>
- <CorrectionHeight index="3">
- <Value value="77"/>
- </CorrectionHeight>
- <CorrectionHeight index="4">
- <Value value="95"/>
- </CorrectionHeight>
- <CorrectionHeight index="5">
- <Value value="113"/>
- </CorrectionHeight>
- <CorrectionHeight index="6">
- <Value value="131"/>
- </CorrectionHeight>
- <KernValue index="0">
- <Value value="23"/>
- </KernValue>
- <KernValue index="1">
- <Value value="36"/>
- </KernValue>
- <KernValue index="2">
- <Value value="49"/>
- </KernValue>
- <KernValue index="3">
- <Value value="62"/>
- </KernValue>
- <KernValue index="4">
- <Value value="75"/>
- </KernValue>
- <KernValue index="5">
- <Value value="88"/>
- </KernValue>
- <KernValue index="6">
- <Value value="101"/>
- </KernValue>
- <KernValue index="7">
- <Value value="114"/>
- </KernValue>
- </TopRightMathKern>
- <TopLeftMathKern>
- <!-- HeightCount=0 -->
- <KernValue index="0">
- <Value value="17"/>
- </KernValue>
- </TopLeftMathKern>
- <BottomRightMathKern>
- <!-- HeightCount=6 -->
- <CorrectionHeight index="0">
- <Value value="15"/>
- </CorrectionHeight>
- <CorrectionHeight index="1">
- <Value value="25"/>
- </CorrectionHeight>
- <CorrectionHeight index="2">
- <Value value="35"/>
- </CorrectionHeight>
- <CorrectionHeight index="3">
- <Value value="45"/>
- </CorrectionHeight>
- <CorrectionHeight index="4">
- <Value value="55"/>
- </CorrectionHeight>
- <CorrectionHeight index="5">
- <Value value="65"/>
- </CorrectionHeight>
- <KernValue index="0">
- <Value value="25"/>
- </KernValue>
- <KernValue index="1">
- <Value value="40"/>
- </KernValue>
- <KernValue index="2">
- <Value value="55"/>
- </KernValue>
- <KernValue index="3">
- <Value value="70"/>
- </KernValue>
- <KernValue index="4">
- <Value value="85"/>
- </KernValue>
- <KernValue index="5">
- <Value value="100"/>
- </KernValue>
- <KernValue index="6">
- <Value value="115"/>
- </KernValue>
- </BottomRightMathKern>
- </MathKernInfoRecords>
- <MathKernInfoRecords index="18">
- <TopRightMathKern>
- <!-- HeightCount=8 -->
- <CorrectionHeight index="0">
- <Value value="24"/>
- </CorrectionHeight>
- <CorrectionHeight index="1">
- <Value value="43"/>
- </CorrectionHeight>
- <CorrectionHeight index="2">
- <Value value="62"/>
- </CorrectionHeight>
- <CorrectionHeight index="3">
- <Value value="81"/>
- </CorrectionHeight>
- <CorrectionHeight index="4">
- <Value value="100"/>
- </CorrectionHeight>
- <CorrectionHeight index="5">
- <Value value="119"/>
- </CorrectionHeight>
- <CorrectionHeight index="6">
- <Value value="138"/>
- </CorrectionHeight>
- <CorrectionHeight index="7">
- <Value value="157"/>
- </CorrectionHeight>
- <KernValue index="0">
- <Value value="24"/>
- </KernValue>
- <KernValue index="1">
- <Value value="38"/>
- </KernValue>
- <KernValue index="2">
- <Value value="52"/>
- </KernValue>
- <KernValue index="3">
- <Value value="66"/>
- </KernValue>
- <KernValue index="4">
- <Value value="80"/>
- </KernValue>
- <KernValue index="5">
- <Value value="94"/>
- </KernValue>
- <KernValue index="6">
- <Value value="108"/>
- </KernValue>
- <KernValue index="7">
- <Value value="122"/>
- </KernValue>
- <KernValue index="8">
- <Value value="136"/>
- </KernValue>
- </TopRightMathKern>
- <TopLeftMathKern>
- <!-- HeightCount=1 -->
- <CorrectionHeight index="0">
- <Value value="30"/>
- </CorrectionHeight>
- <KernValue index="0">
- <Value value="18"/>
- </KernValue>
- <KernValue index="1">
- <Value value="26"/>
- </KernValue>
- </TopLeftMathKern>
- <BottomRightMathKern>
- <!-- HeightCount=7 -->
- <CorrectionHeight index="0">
- <Value value="16"/>
- </CorrectionHeight>
- <CorrectionHeight index="1">
- <Value value="27"/>
- </CorrectionHeight>
- <CorrectionHeight index="2">
- <Value value="38"/>
- </CorrectionHeight>
- <CorrectionHeight index="3">
- <Value value="49"/>
- </CorrectionHeight>
- <CorrectionHeight index="4">
- <Value value="60"/>
- </CorrectionHeight>
- <CorrectionHeight index="5">
- <Value value="71"/>
- </CorrectionHeight>
- <CorrectionHeight index="6">
- <Value value="82"/>
- </CorrectionHeight>
- <KernValue index="0">
- <Value value="26"/>
- </KernValue>
- <KernValue index="1">
- <Value value="42"/>
- </KernValue>
- <KernValue index="2">
- <Value value="58"/>
- </KernValue>
- <KernValue index="3">
- <Value value="74"/>
- </KernValue>
- <KernValue index="4">
- <Value value="90"/>
- </KernValue>
- <KernValue index="5">
- <Value value="106"/>
- </KernValue>
- <KernValue index="6">
- <Value value="122"/>
- </KernValue>
- <KernValue index="7">
- <Value value="138"/>
- </KernValue>
- </BottomRightMathKern>
- <BottomLeftMathKern>
- <!-- HeightCount=5 -->
- <CorrectionHeight index="0">
- <Value value="26"/>
- </CorrectionHeight>
- <CorrectionHeight index="1">
- <Value value="47"/>
- </CorrectionHeight>
- <CorrectionHeight index="2">
- <Value value="68"/>
- </CorrectionHeight>
- <CorrectionHeight index="3">
- <Value value="89"/>
- </CorrectionHeight>
- <CorrectionHeight index="4">
- <Value value="110"/>
- </CorrectionHeight>
- <KernValue index="0">
- <Value value="30"/>
- </KernValue>
- <KernValue index="1">
- <Value value="50"/>
- </KernValue>
- <KernValue index="2">
- <Value value="70"/>
- </KernValue>
- <KernValue index="3">
- <Value value="90"/>
- </KernValue>
- <KernValue index="4">
- <Value value="110"/>
- </KernValue>
- <KernValue index="5">
- <Value value="130"/>
- </KernValue>
- </BottomLeftMathKern>
- </MathKernInfoRecords>
- <MathKernInfoRecords index="19">
- <TopRightMathKern>
- <!-- HeightCount=9 -->
- <CorrectionHeight index="0">
- <Value value="25"/>
- </CorrectionHeight>
- <CorrectionHeight index="1">
- <Value value="45"/>
- </CorrectionHeight>
- <CorrectionHeight index="2">
- <Value value="65"/>
- </CorrectionHeight>
- <CorrectionHeight index="3">
- <Value value="85"/>
- </CorrectionHeight>
- <CorrectionHeight index="4">
- <Value value="105"/>
- </CorrectionHeight>
- <CorrectionHeight index="5">
- <Value value="125"/>
- </CorrectionHeight>
- <CorrectionHeight index="6">
- <Value value="145"/>
- </CorrectionHeight>
- <CorrectionHeight index="7">
- <Value value="165"/>
- </CorrectionHeight>
- <CorrectionHeight index="8">
- <Value value="185"/>
- </CorrectionHeight>
- <KernValue index="0">
- <Value value="25"/>
- </KernValue>
- <KernValue index="1">
- <Value value="40"/>
- </KernValue>
- <KernValue index="2">
- <Value value="55"/>
- </KernValue>
- <KernValue index="3">
- <Value value="70"/>
- </KernValue>
- <KernValue index="4">
- <Value value="85"/>
- </KernValue>
- <KernValue index="5">
- <Value value="100"/>
- </KernValue>
- <KernValue index="6">
- <Value value="115"/>
- </KernValue>
- <KernValue index="7">
- <Value value="130"/>
- </KernValue>
- <KernValue index="8">
- <Value value="145"/>
- </KernValue>
- <KernValue index="9">
- <Value value="160"/>
- </KernValue>
- </TopRightMathKern>
- </MathKernInfoRecords>
- <MathKernInfoRecords index="20">
- <TopLeftMathKern>
- <!-- HeightCount=3 -->
- <CorrectionHeight index="0">
- <Value value="32"/>
- </CorrectionHeight>
- <CorrectionHeight index="1">
- <Value value="59"/>
- </CorrectionHeight>
- <CorrectionHeight index="2">
- <Value value="86"/>
- </CorrectionHeight>
- <KernValue index="0">
- <Value value="20"/>
- </KernValue>
- <KernValue index="1">
- <Value value="30"/>
- </KernValue>
- <KernValue index="2">
- <Value value="40"/>
- </KernValue>
- <KernValue index="3">
- <Value value="50"/>
- </KernValue>
- </TopLeftMathKern>
- <BottomRightMathKern>
- <!-- HeightCount=9 -->
- <CorrectionHeight index="0">
- <Value value="18"/>
- </CorrectionHeight>
- <CorrectionHeight index="1">
- <Value value="31"/>
- </CorrectionHeight>
- <CorrectionHeight index="2">
- <Value value="44"/>
- </CorrectionHeight>
- <CorrectionHeight index="3">
- <Value value="57"/>
- </CorrectionHeight>
- <CorrectionHeight index="4">
- <Value value="70"/>
- </CorrectionHeight>
- <CorrectionHeight index="5">
- <Value value="83"/>
- </CorrectionHeight>
- <CorrectionHeight index="6">
- <Value value="96"/>
- </CorrectionHeight>
- <CorrectionHeight index="7">
- <Value value="109"/>
- </CorrectionHeight>
- <CorrectionHeight index="8">
- <Value value="122"/>
- </CorrectionHeight>
- <KernValue index="0">
- <Value value="28"/>
- </KernValue>
- <KernValue index="1">
- <Value value="46"/>
- </KernValue>
- <KernValue index="2">
- <Value value="64"/>
- </KernValue>
- <KernValue index="3">
- <Value value="82"/>
- </KernValue>
- <KernValue index="4">
- <Value value="100"/>
- </KernValue>
- <KernValue index="5">
- <Value value="118"/>
- </KernValue>
- <KernValue index="6">
- <Value value="136"/>
- </KernValue>
- <KernValue index="7">
- <Value value="154"/>
- </KernValue>
- <KernValue index="8">
- <Value value="172"/>
- </KernValue>
- <KernValue index="9">
- <Value value="190"/>
- </KernValue>
- </BottomRightMathKern>
- <BottomLeftMathKern>
- <!-- HeightCount=7 -->
- <CorrectionHeight index="0">
- <Value value="28"/>
- </CorrectionHeight>
- <CorrectionHeight index="1">
- <Value value="51"/>
- </CorrectionHeight>
- <CorrectionHeight index="2">
- <Value value="74"/>
- </CorrectionHeight>
- <CorrectionHeight index="3">
- <Value value="97"/>
- </CorrectionHeight>
- <CorrectionHeight index="4">
- <Value value="120"/>
- </CorrectionHeight>
- <CorrectionHeight index="5">
- <Value value="143"/>
- </CorrectionHeight>
- <CorrectionHeight index="6">
- <Value value="166"/>
- </CorrectionHeight>
- <KernValue index="0">
- <Value value="15"/>
- </KernValue>
- <KernValue index="1">
- <Value value="20"/>
- </KernValue>
- <KernValue index="2">
- <Value value="25"/>
- </KernValue>
- <KernValue index="3">
- <Value value="30"/>
- </KernValue>
- <KernValue index="4">
- <Value value="35"/>
- </KernValue>
- <KernValue index="5">
- <Value value="40"/>
- </KernValue>
- <KernValue index="6">
- <Value value="45"/>
- </KernValue>
- <KernValue index="7">
- <Value value="50"/>
- </KernValue>
- </BottomLeftMathKern>
- </MathKernInfoRecords>
- <MathKernInfoRecords index="21">
- <TopRightMathKern>
- <!-- HeightCount=0 -->
- <KernValue index="0">
- <Value value="27"/>
- </KernValue>
- </TopRightMathKern>
- <TopLeftMathKern>
- <!-- HeightCount=4 -->
- <CorrectionHeight index="0">
- <Value value="33"/>
- </CorrectionHeight>
- <CorrectionHeight index="1">
- <Value value="61"/>
- </CorrectionHeight>
- <CorrectionHeight index="2">
- <Value value="89"/>
- </CorrectionHeight>
- <CorrectionHeight index="3">
- <Value value="117"/>
- </CorrectionHeight>
- <KernValue index="0">
- <Value value="21"/>
- </KernValue>
- <KernValue index="1">
- <Value value="32"/>
- </KernValue>
- <KernValue index="2">
- <Value value="43"/>
- </KernValue>
- <KernValue index="3">
- <Value value="54"/>
- </KernValue>
- <KernValue index="4">
- <Value value="65"/>
- </KernValue>
- </TopLeftMathKern>
- </MathKernInfoRecords>
- <MathKernInfoRecords index="22">
- <TopRightMathKern>
- <!-- HeightCount=1 -->
- <CorrectionHeight index="0">
- <Value value="28"/>
- </CorrectionHeight>
- <KernValue index="0">
- <Value value="28"/>
- </KernValue>
- <KernValue index="1">
- <Value value="46"/>
- </KernValue>
- </TopRightMathKern>
- <TopLeftMathKern>
- <!-- HeightCount=5 -->
- <CorrectionHeight index="0">
- <Value value="34"/>
- </CorrectionHeight>
- <CorrectionHeight index="1">
- <Value value="63"/>
- </CorrectionHeight>
- <CorrectionHeight index="2">
- <Value value="92"/>
- </CorrectionHeight>
- <CorrectionHeight index="3">
- <Value value="121"/>
- </CorrectionHeight>
- <CorrectionHeight index="4">
- <Value value="150"/>
- </CorrectionHeight>
- <KernValue index="0">
- <Value value="22"/>
- </KernValue>
- <KernValue index="1">
- <Value value="34"/>
- </KernValue>
- <KernValue index="2">
- <Value value="46"/>
- </KernValue>
- <KernValue index="3">
- <Value value="58"/>
- </KernValue>
- <KernValue index="4">
- <Value value="70"/>
- </KernValue>
- <KernValue index="5">
- <Value value="82"/>
- </KernValue>
- </TopLeftMathKern>
- <BottomLeftMathKern>
- <!-- HeightCount=9 -->
- <CorrectionHeight index="0">
- <Value value="30"/>
- </CorrectionHeight>
- <CorrectionHeight index="1">
- <Value value="55"/>
- </CorrectionHeight>
- <CorrectionHeight index="2">
- <Value value="80"/>
- </CorrectionHeight>
- <CorrectionHeight index="3">
- <Value value="105"/>
- </CorrectionHeight>
- <CorrectionHeight index="4">
- <Value value="130"/>
- </CorrectionHeight>
- <CorrectionHeight index="5">
- <Value value="155"/>
- </CorrectionHeight>
- <CorrectionHeight index="6">
- <Value value="180"/>
- </CorrectionHeight>
- <CorrectionHeight index="7">
- <Value value="205"/>
- </CorrectionHeight>
- <CorrectionHeight index="8">
- <Value value="230"/>
- </CorrectionHeight>
- <KernValue index="0">
- <Value value="17"/>
- </KernValue>
- <KernValue index="1">
- <Value value="24"/>
- </KernValue>
- <KernValue index="2">
- <Value value="31"/>
- </KernValue>
- <KernValue index="3">
- <Value value="38"/>
- </KernValue>
- <KernValue index="4">
- <Value value="45"/>
- </KernValue>
- <KernValue index="5">
- <Value value="52"/>
- </KernValue>
- <KernValue index="6">
- <Value value="59"/>
- </KernValue>
- <KernValue index="7">
- <Value value="66"/>
- </KernValue>
- <KernValue index="8">
- <Value value="73"/>
- </KernValue>
- <KernValue index="9">
- <Value value="80"/>
- </KernValue>
- </BottomLeftMathKern>
- </MathKernInfoRecords>
- <MathKernInfoRecords index="23">
- <TopRightMathKern>
- <!-- HeightCount=2 -->
- <CorrectionHeight index="0">
- <Value value="29"/>
- </CorrectionHeight>
- <CorrectionHeight index="1">
- <Value value="53"/>
- </CorrectionHeight>
- <KernValue index="0">
- <Value value="29"/>
- </KernValue>
- <KernValue index="1">
- <Value value="48"/>
- </KernValue>
- <KernValue index="2">
- <Value value="67"/>
- </KernValue>
- </TopRightMathKern>
- <BottomRightMathKern>
- <!-- HeightCount=1 -->
- <CorrectionHeight index="0">
- <Value value="21"/>
- </CorrectionHeight>
- <KernValue index="0">
- <Value value="31"/>
- </KernValue>
- <KernValue index="1">
- <Value value="52"/>
- </KernValue>
- </BottomRightMathKern>
- </MathKernInfoRecords>
- <MathKernInfoRecords index="24">
- <TopRightMathKern>
- <!-- HeightCount=3 -->
- <CorrectionHeight index="0">
- <Value value="30"/>
- </CorrectionHeight>
- <CorrectionHeight index="1">
- <Value value="55"/>
- </CorrectionHeight>
- <CorrectionHeight index="2">
- <Value value="80"/>
- </CorrectionHeight>
- <KernValue index="0">
- <Value value="30"/>
- </KernValue>
- <KernValue index="1">
- <Value value="50"/>
- </KernValue>
- <KernValue index="2">
- <Value value="70"/>
- </KernValue>
- <KernValue index="3">
- <Value value="90"/>
- </KernValue>
- </TopRightMathKern>
- <TopLeftMathKern>
- <!-- HeightCount=7 -->
- <CorrectionHeight index="0">
- <Value value="13"/>
- </CorrectionHeight>
- <CorrectionHeight index="1">
- <Value value="21"/>
- </CorrectionHeight>
- <CorrectionHeight index="2">
- <Value value="29"/>
- </CorrectionHeight>
- <CorrectionHeight index="3">
- <Value value="37"/>
- </CorrectionHeight>
- <CorrectionHeight index="4">
- <Value value="45"/>
- </CorrectionHeight>
- <CorrectionHeight index="5">
- <Value value="53"/>
- </CorrectionHeight>
- <CorrectionHeight index="6">
- <Value value="61"/>
- </CorrectionHeight>
- <KernValue index="0">
- <Value value="24"/>
- </KernValue>
- <KernValue index="1">
- <Value value="38"/>
- </KernValue>
- <KernValue index="2">
- <Value value="52"/>
- </KernValue>
- <KernValue index="3">
- <Value value="66"/>
- </KernValue>
- <KernValue index="4">
- <Value value="80"/>
- </KernValue>
- <KernValue index="5">
- <Value value="94"/>
- </KernValue>
- <KernValue index="6">
- <Value value="108"/>
- </KernValue>
- <KernValue index="7">
- <Value value="122"/>
- </KernValue>
- </TopLeftMathKern>
- <BottomRightMathKern>
- <!-- HeightCount=2 -->
- <CorrectionHeight index="0">
- <Value value="22"/>
- </CorrectionHeight>
- <CorrectionHeight index="1">
- <Value value="39"/>
- </CorrectionHeight>
- <KernValue index="0">
- <Value value="15"/>
- </KernValue>
- <KernValue index="1">
- <Value value="20"/>
- </KernValue>
- <KernValue index="2">
- <Value value="25"/>
- </KernValue>
- </BottomRightMathKern>
- <BottomLeftMathKern>
- <!-- HeightCount=0 -->
- <KernValue index="0">
- <Value value="19"/>
- </KernValue>
- </BottomLeftMathKern>
- </MathKernInfoRecords>
- <MathKernInfoRecords index="25">
- <TopLeftMathKern>
- <!-- HeightCount=8 -->
- <CorrectionHeight index="0">
- <Value value="14"/>
- </CorrectionHeight>
- <CorrectionHeight index="1">
- <Value value="23"/>
- </CorrectionHeight>
- <CorrectionHeight index="2">
- <Value value="32"/>
- </CorrectionHeight>
- <CorrectionHeight index="3">
- <Value value="41"/>
- </CorrectionHeight>
- <CorrectionHeight index="4">
- <Value value="50"/>
- </CorrectionHeight>
- <CorrectionHeight index="5">
- <Value value="59"/>
- </CorrectionHeight>
- <CorrectionHeight index="6">
- <Value value="68"/>
- </CorrectionHeight>
- <CorrectionHeight index="7">
- <Value value="77"/>
- </CorrectionHeight>
- <KernValue index="0">
- <Value value="25"/>
- </KernValue>
- <KernValue index="1">
- <Value value="40"/>
- </KernValue>
- <KernValue index="2">
- <Value value="55"/>
- </KernValue>
- <KernValue index="3">
- <Value value="70"/>
- </KernValue>
- <KernValue index="4">
- <Value value="85"/>
- </KernValue>
- <KernValue index="5">
- <Value value="100"/>
- </KernValue>
- <KernValue index="6">
- <Value value="115"/>
- </KernValue>
- <KernValue index="7">
- <Value value="130"/>
- </KernValue>
- <KernValue index="8">
- <Value value="145"/>
- </KernValue>
- </TopLeftMathKern>
- </MathKernInfoRecords>
- </MathKernInfo>
- </MathGlyphInfo>
- <MathVariants>
- <MinConnectorOverlap value="54"/>
- <VertGlyphCoverage Format="1">
- <Glyph value="arrowup"/>
- <Glyph value="arrowdown"/>
- <Glyph value="arrowupdn"/>
- <Glyph value="uni21A5"/>
- <Glyph value="uni21A7"/>
- <Glyph value="uni21C8"/>
- <Glyph value="uni21CA"/>
- <Glyph value="arrowdblup"/>
- <Glyph value="arrowdbldown"/>
- <Glyph value="uni21D5"/>
- <Glyph value="uni21E7"/>
- <Glyph value="uni21E9"/>
- </VertGlyphCoverage>
- <HorizGlyphCoverage Format="1">
- <Glyph value="arrowleft"/>
- <Glyph value="arrowright"/>
- <Glyph value="arrowboth"/>
- <Glyph value="uni21A4"/>
- <Glyph value="uni21A6"/>
- <Glyph value="uni21C7"/>
- <Glyph value="uni21C9"/>
- <Glyph value="arrowdblleft"/>
- <Glyph value="arrowdblright"/>
- <Glyph value="arrowdblboth"/>
- <Glyph value="uni21E6"/>
- <Glyph value="uni21E8"/>
- </HorizGlyphCoverage>
- <!-- VertGlyphCount=12 -->
- <!-- HorizGlyphCount=12 -->
- <VertGlyphConstruction index="0">
- <GlyphAssembly>
- <ItalicsCorrection>
- <Value value="331"/>
- </ItalicsCorrection>
- <!-- PartCount=2 -->
- <PartRecords index="0">
- <glyph value="bottom"/>
- <StartConnectorLength value="54"/>
- <EndConnectorLength value="227"/>
- <FullAdvance value="1000"/>
- <PartFlags value="0"/>
- </PartRecords>
- <PartRecords index="1">
- <glyph value="vertical"/>
- <StartConnectorLength value="296"/>
- <EndConnectorLength value="54"/>
- <FullAdvance value="1000"/>
- <PartFlags value="1"/>
- </PartRecords>
- </GlyphAssembly>
- <!-- VariantCount=4 -->
- <MathGlyphVariantRecord index="0">
- <VariantGlyph value="uni2191_size2"/>
- <AdvanceMeasurement value="2251"/>
- </MathGlyphVariantRecord>
- <MathGlyphVariantRecord index="1">
- <VariantGlyph value="uni2191_size3"/>
- <AdvanceMeasurement value="2501"/>
- </MathGlyphVariantRecord>
- <MathGlyphVariantRecord index="2">
- <VariantGlyph value="uni2191_size4"/>
- <AdvanceMeasurement value="3001"/>
- </MathGlyphVariantRecord>
- <MathGlyphVariantRecord index="3">
- <VariantGlyph value="uni2191_size5"/>
- <AdvanceMeasurement value="3751"/>
- </MathGlyphVariantRecord>
- </VertGlyphConstruction>
- <VertGlyphConstruction index="1">
- <GlyphAssembly>
- <ItalicsCorrection>
- <Value value="237"/>
- </ItalicsCorrection>
- <!-- PartCount=5 -->
- <PartRecords index="0">
- <glyph value="bottom"/>
- <StartConnectorLength value="365"/>
- <EndConnectorLength value="158"/>
- <FullAdvance value="1000"/>
- <PartFlags value="0"/>
- </PartRecords>
- <PartRecords index="1">
- <glyph value="vertical"/>
- <StartConnectorLength value="227"/>
- <EndConnectorLength value="365"/>
- <FullAdvance value="1000"/>
- <PartFlags value="1"/>
- </PartRecords>
- <PartRecords index="2">
- <glyph value="center"/>
- <StartConnectorLength value="54"/>
- <EndConnectorLength value="158"/>
- <FullAdvance value="1000"/>
- <PartFlags value="0"/>
- </PartRecords>
- <PartRecords index="3">
- <glyph value="vertical"/>
- <StartConnectorLength value="400"/>
- <EndConnectorLength value="296"/>
- <FullAdvance value="1000"/>
- <PartFlags value="1"/>
- </PartRecords>
- <PartRecords index="4">
- <glyph value="top"/>
- <StartConnectorLength value="123"/>
- <EndConnectorLength value="192"/>
- <FullAdvance value="1000"/>
- <PartFlags value="0"/>
- </PartRecords>
- </GlyphAssembly>
- <!-- VariantCount=6 -->
- <MathGlyphVariantRecord index="0">
- <VariantGlyph value="uni2193_size2"/>
- <AdvanceMeasurement value="2451"/>
- </MathGlyphVariantRecord>
- <MathGlyphVariantRecord index="1">
- <VariantGlyph value="uni2193_size3"/>
- <AdvanceMeasurement value="2701"/>
- </MathGlyphVariantRecord>
- <MathGlyphVariantRecord index="2">
- <VariantGlyph value="uni2193_size4"/>
- <AdvanceMeasurement value="3201"/>
- </MathGlyphVariantRecord>
- <MathGlyphVariantRecord index="3">
- <VariantGlyph value="uni2193_size5"/>
- <AdvanceMeasurement value="3951"/>
- </MathGlyphVariantRecord>
- <MathGlyphVariantRecord index="4">
- <VariantGlyph value="uni2193_size6"/>
- <AdvanceMeasurement value="4201"/>
- </MathGlyphVariantRecord>
- <MathGlyphVariantRecord index="5">
- <VariantGlyph value="uni2193_size7"/>
- <AdvanceMeasurement value="4701"/>
- </MathGlyphVariantRecord>
- </VertGlyphConstruction>
- <VertGlyphConstruction index="2">
- <GlyphAssembly>
- <ItalicsCorrection>
- <Value value="143"/>
- </ItalicsCorrection>
- <!-- PartCount=9 -->
- <PartRecords index="0">
- <glyph value="bottom"/>
- <StartConnectorLength value="296"/>
- <EndConnectorLength value="89"/>
- <FullAdvance value="1000"/>
- <PartFlags value="0"/>
- </PartRecords>
- <PartRecords index="1">
- <glyph value="vertical"/>
- <StartConnectorLength value="158"/>
- <EndConnectorLength value="296"/>
- <FullAdvance value="1000"/>
- <PartFlags value="1"/>
- </PartRecords>
- <PartRecords index="2">
- <glyph value="center"/>
- <StartConnectorLength value="365"/>
- <EndConnectorLength value="89"/>
- <FullAdvance value="1000"/>
- <PartFlags value="0"/>
- </PartRecords>
- <PartRecords index="3">
- <glyph value="vertical"/>
- <StartConnectorLength value="331"/>
- <EndConnectorLength value="227"/>
- <FullAdvance value="1000"/>
- <PartFlags value="1"/>
- </PartRecords>
- <PartRecords index="4">
- <glyph value="center"/>
- <StartConnectorLength value="365"/>
- <EndConnectorLength value="89"/>
- <FullAdvance value="1000"/>
- <PartFlags value="0"/>
- </PartRecords>
- <PartRecords index="5">
- <glyph value="vertical"/>
- <StartConnectorLength value="331"/>
- <EndConnectorLength value="227"/>
- <FullAdvance value="1000"/>
- <PartFlags value="1"/>
- </PartRecords>
- <PartRecords index="6">
- <glyph value="center"/>
- <StartConnectorLength value="365"/>
- <EndConnectorLength value="89"/>
- <FullAdvance value="1000"/>
- <PartFlags value="0"/>
- </PartRecords>
- <PartRecords index="7">
- <glyph value="vertical"/>
- <StartConnectorLength value="331"/>
- <EndConnectorLength value="227"/>
- <FullAdvance value="1000"/>
- <PartFlags value="1"/>
- </PartRecords>
- <PartRecords index="8">
- <glyph value="top"/>
- <StartConnectorLength value="54"/>
- <EndConnectorLength value="123"/>
- <FullAdvance value="1000"/>
- <PartFlags value="0"/>
- </PartRecords>
- </GlyphAssembly>
- <!-- VariantCount=1 -->
- <MathGlyphVariantRecord index="0">
- <VariantGlyph value="uni2195_size2"/>
- <AdvanceMeasurement value="2651"/>
- </MathGlyphVariantRecord>
- </VertGlyphConstruction>
- <VertGlyphConstruction index="3">
- <GlyphAssembly>
- <ItalicsCorrection>
- <Value value="438"/>
- </ItalicsCorrection>
- <!-- PartCount=9 -->
- <PartRecords index="0">
- <glyph value="bottom"/>
- <StartConnectorLength value="123"/>
- <EndConnectorLength value="296"/>
- <FullAdvance value="1000"/>
- <PartFlags value="0"/>
- </PartRecords>
- <PartRecords index="1">
- <glyph value="vertical"/>
- <StartConnectorLength value="365"/>
- <EndConnectorLength value="123"/>
- <FullAdvance value="1000"/>
- <PartFlags value="1"/>
- </PartRecords>
- <PartRecords index="2">
- <glyph value="center"/>
- <StartConnectorLength value="192"/>
- <EndConnectorLength value="296"/>
- <FullAdvance value="1000"/>
- <PartFlags value="0"/>
- </PartRecords>
- <PartRecords index="3">
- <glyph value="vertical"/>
- <StartConnectorLength value="158"/>
- <EndConnectorLength value="54"/>
- <FullAdvance value="1000"/>
- <PartFlags value="1"/>
- </PartRecords>
- <PartRecords index="4">
- <glyph value="center"/>
- <StartConnectorLength value="192"/>
- <EndConnectorLength value="296"/>
- <FullAdvance value="1000"/>
- <PartFlags value="0"/>
- </PartRecords>
- <PartRecords index="5">
- <glyph value="vertical"/>
- <StartConnectorLength value="158"/>
- <EndConnectorLength value="54"/>
- <FullAdvance value="1000"/>
- <PartFlags value="1"/>
- </PartRecords>
- <PartRecords index="6">
- <glyph value="center"/>
- <StartConnectorLength value="192"/>
- <EndConnectorLength value="296"/>
- <FullAdvance value="1000"/>
- <PartFlags value="0"/>
- </PartRecords>
- <PartRecords index="7">
- <glyph value="vertical"/>
- <StartConnectorLength value="158"/>
- <EndConnectorLength value="54"/>
- <FullAdvance value="1000"/>
- <PartFlags value="1"/>
- </PartRecords>
- <PartRecords index="8">
- <glyph value="top"/>
- <StartConnectorLength value="262"/>
- <EndConnectorLength value="331"/>
- <FullAdvance value="1000"/>
- <PartFlags value="0"/>
- </PartRecords>
- </GlyphAssembly>
- <!-- VariantCount=3 -->
- <MathGlyphVariantRecord index="0">
- <VariantGlyph value="uni21A5_size2"/>
- <AdvanceMeasurement value="2351"/>
- </MathGlyphVariantRecord>
- <MathGlyphVariantRecord index="1">
- <VariantGlyph value="uni21A5_size3"/>
- <AdvanceMeasurement value="2601"/>
- </MathGlyphVariantRecord>
- <MathGlyphVariantRecord index="2">
- <VariantGlyph value="uni21A5_size4"/>
- <AdvanceMeasurement value="3101"/>
- </MathGlyphVariantRecord>
- </VertGlyphConstruction>
- <VertGlyphConstruction index="4">
- <GlyphAssembly>
- <ItalicsCorrection>
- <Value value="344"/>
- </ItalicsCorrection>
- <!-- PartCount=13 -->
- <PartRecords index="0">
- <glyph value="bottom"/>
- <StartConnectorLength value="54"/>
- <EndConnectorLength value="227"/>
- <FullAdvance value="1000"/>
- <PartFlags value="0"/>
- </PartRecords>
- <PartRecords index="1">
- <glyph value="vertical"/>
- <StartConnectorLength value="296"/>
- <EndConnectorLength value="54"/>
- <FullAdvance value="1000"/>
- <PartFlags value="1"/>
- </PartRecords>
- <PartRecords index="2">
- <glyph value="center"/>
- <StartConnectorLength value="123"/>
- <EndConnectorLength value="227"/>
- <FullAdvance value="1000"/>
- <PartFlags value="0"/>
- </PartRecords>
- <PartRecords index="3">
- <glyph value="vertical"/>
- <StartConnectorLength value="89"/>
- <EndConnectorLength value="365"/>
- <FullAdvance value="1000"/>
- <PartFlags value="1"/>
- </PartRecords>
- <PartRecords index="4">
- <glyph value="center"/>
- <StartConnectorLength value="123"/>
- <EndConnectorLength value="227"/>
- <FullAdvance value="1000"/>
- <PartFlags value="0"/>
- </PartRecords>
- <PartRecords index="5">
- <glyph value="vertical"/>
- <StartConnectorLength value="89"/>
- <EndConnectorLength value="365"/>
- <FullAdvance value="1000"/>
- <PartFlags value="1"/>
- </PartRecords>
- <PartRecords index="6">
- <glyph value="center"/>
- <StartConnectorLength value="123"/>
- <EndConnectorLength value="227"/>
- <FullAdvance value="1000"/>
- <PartFlags value="0"/>
- </PartRecords>
- <PartRecords index="7">
- <glyph value="vertical"/>
- <StartConnectorLength value="89"/>
- <EndConnectorLength value="365"/>
- <FullAdvance value="1000"/>
- <PartFlags value="1"/>
- </PartRecords>
- <PartRecords index="8">
- <glyph value="center"/>
- <StartConnectorLength value="123"/>
- <EndConnectorLength value="227"/>
- <FullAdvance value="1000"/>
- <PartFlags value="0"/>
- </PartRecords>
- <PartRecords index="9">
- <glyph value="vertical"/>
- <StartConnectorLength value="89"/>
- <EndConnectorLength value="365"/>
- <FullAdvance value="1000"/>
- <PartFlags value="1"/>
- </PartRecords>
- <PartRecords index="10">
- <glyph value="center"/>
- <StartConnectorLength value="123"/>
- <EndConnectorLength value="227"/>
- <FullAdvance value="1000"/>
- <PartFlags value="0"/>
- </PartRecords>
- <PartRecords index="11">
- <glyph value="vertical"/>
- <StartConnectorLength value="89"/>
- <EndConnectorLength value="365"/>
- <FullAdvance value="1000"/>
- <PartFlags value="1"/>
- </PartRecords>
- <PartRecords index="12">
- <glyph value="top"/>
- <StartConnectorLength value="192"/>
- <EndConnectorLength value="262"/>
- <FullAdvance value="1000"/>
- <PartFlags value="0"/>
- </PartRecords>
- </GlyphAssembly>
- <!-- VariantCount=5 -->
- <MathGlyphVariantRecord index="0">
- <VariantGlyph value="uni21A7_size2"/>
- <AdvanceMeasurement value="2551"/>
- </MathGlyphVariantRecord>
- <MathGlyphVariantRecord index="1">
- <VariantGlyph value="uni21A7_size3"/>
- <AdvanceMeasurement value="2801"/>
- </MathGlyphVariantRecord>
- <MathGlyphVariantRecord index="2">
- <VariantGlyph value="uni21A7_size4"/>
- <AdvanceMeasurement value="3301"/>
- </MathGlyphVariantRecord>
- <MathGlyphVariantRecord index="3">
- <VariantGlyph value="uni21A7_size5"/>
- <AdvanceMeasurement value="4051"/>
- </MathGlyphVariantRecord>
- <MathGlyphVariantRecord index="4">
- <VariantGlyph value="uni21A7_size6"/>
- <AdvanceMeasurement value="4301"/>
- </MathGlyphVariantRecord>
- </VertGlyphConstruction>
- <VertGlyphConstruction index="5">
- <GlyphAssembly>
- <ItalicsCorrection>
- <Value value="189"/>
- </ItalicsCorrection>
- <!-- PartCount=1 -->
- <PartRecords index="0">
- <glyph value="vertical"/>
- <StartConnectorLength value="296"/>
- <EndConnectorLength value="54"/>
- <FullAdvance value="1000"/>
- <PartFlags value="1"/>
- </PartRecords>
- </GlyphAssembly>
- <!-- VariantCount=3 -->
- <MathGlyphVariantRecord index="0">
- <VariantGlyph value="uni21C8_size2"/>
- <AdvanceMeasurement value="2051"/>
- </MathGlyphVariantRecord>
- <MathGlyphVariantRecord index="1">
- <VariantGlyph value="uni21C8_size3"/>
- <AdvanceMeasurement value="2301"/>
- </MathGlyphVariantRecord>
- <MathGlyphVariantRecord index="2">
- <VariantGlyph value="uni21C8_size4"/>
- <AdvanceMeasurement value="2801"/>
- </MathGlyphVariantRecord>
- </VertGlyphConstruction>
- <VertGlyphConstruction index="6">
- <GlyphAssembly>
- <ItalicsCorrection>
- <Value value="444"/>
- </ItalicsCorrection>
- <!-- PartCount=3 -->
- <PartRecords index="0">
- <glyph value="bottom"/>
- <StartConnectorLength value="365"/>
- <EndConnectorLength value="158"/>
- <FullAdvance value="1000"/>
- <PartFlags value="0"/>
- </PartRecords>
- <PartRecords index="1">
- <glyph value="vertical"/>
- <StartConnectorLength value="227"/>
- <EndConnectorLength value="365"/>
- <FullAdvance value="1000"/>
- <PartFlags value="1"/>
- </PartRecords>
- <PartRecords index="2">
- <glyph value="top"/>
- <StartConnectorLength value="123"/>
- <EndConnectorLength value="192"/>
- <FullAdvance value="1000"/>
- <PartFlags value="0"/>
- </PartRecords>
- </GlyphAssembly>
- <!-- VariantCount=5 -->
- <MathGlyphVariantRecord index="0">
- <VariantGlyph value="uni21CA_size2"/>
- <AdvanceMeasurement value="2251"/>
- </MathGlyphVariantRecord>
- <MathGlyphVariantRecord index="1">
- <VariantGlyph value="uni21CA_size3"/>
- <AdvanceMeasurement value="2501"/>
- </MathGlyphVariantRecord>
- <MathGlyphVariantRecord index="2">
- <VariantGlyph value="uni21CA_size4"/>
- <AdvanceMeasurement value="3001"/>
- </MathGlyphVariantRecord>
- <MathGlyphVariantRecord index="3">
- <VariantGlyph value="uni21CA_size5"/>
- <AdvanceMeasurement value="3751"/>
- </MathGlyphVariantRecord>
- <MathGlyphVariantRecord index="4">
- <VariantGlyph value="uni21CA_size6"/>
- <AdvanceMeasurement value="4001"/>
- </MathGlyphVariantRecord>
- </VertGlyphConstruction>
- <VertGlyphConstruction index="7">
- <GlyphAssembly>
- <ItalicsCorrection>
- <Value value="115"/>
- </ItalicsCorrection>
- <!-- PartCount=2 -->
- <PartRecords index="0">
- <glyph value="bottom"/>
- <StartConnectorLength value="123"/>
- <EndConnectorLength value="296"/>
- <FullAdvance value="1000"/>
- <PartFlags value="0"/>
- </PartRecords>
- <PartRecords index="1">
- <glyph value="vertical"/>
- <StartConnectorLength value="365"/>
- <EndConnectorLength value="123"/>
- <FullAdvance value="1000"/>
- <PartFlags value="1"/>
- </PartRecords>
- </GlyphAssembly>
- <!-- VariantCount=5 -->
- <MathGlyphVariantRecord index="0">
- <VariantGlyph value="uni21D1_size2"/>
- <AdvanceMeasurement value="2951"/>
- </MathGlyphVariantRecord>
- <MathGlyphVariantRecord index="1">
- <VariantGlyph value="uni21D1_size3"/>
- <AdvanceMeasurement value="3201"/>
- </MathGlyphVariantRecord>
- <MathGlyphVariantRecord index="2">
- <VariantGlyph value="uni21D1_size4"/>
- <AdvanceMeasurement value="3701"/>
- </MathGlyphVariantRecord>
- <MathGlyphVariantRecord index="3">
- <VariantGlyph value="uni21D1_size5"/>
- <AdvanceMeasurement value="4451"/>
- </MathGlyphVariantRecord>
- <MathGlyphVariantRecord index="4">
- <VariantGlyph value="uni21D1_size6"/>
- <AdvanceMeasurement value="4701"/>
- </MathGlyphVariantRecord>
- </VertGlyphConstruction>
- <VertGlyphConstruction index="8">
- <GlyphAssembly>
- <ItalicsCorrection>
- <Value value="370"/>
- </ItalicsCorrection>
- <!-- PartCount=5 -->
- <PartRecords index="0">
- <glyph value="bottom"/>
- <StartConnectorLength value="54"/>
- <EndConnectorLength value="227"/>
- <FullAdvance value="1000"/>
- <PartFlags value="0"/>
- </PartRecords>
- <PartRecords index="1">
- <glyph value="vertical"/>
- <StartConnectorLength value="296"/>
- <EndConnectorLength value="54"/>
- <FullAdvance value="1000"/>
- <PartFlags value="1"/>
- </PartRecords>
- <PartRecords index="2">
- <glyph value="center"/>
- <StartConnectorLength value="123"/>
- <EndConnectorLength value="227"/>
- <FullAdvance value="1000"/>
- <PartFlags value="0"/>
- </PartRecords>
- <PartRecords index="3">
- <glyph value="vertical"/>
- <StartConnectorLength value="89"/>
- <EndConnectorLength value="365"/>
- <FullAdvance value="1000"/>
- <PartFlags value="1"/>
- </PartRecords>
- <PartRecords index="4">
- <glyph value="top"/>
- <StartConnectorLength value="192"/>
- <EndConnectorLength value="262"/>
- <FullAdvance value="1000"/>
- <PartFlags value="0"/>
- </PartRecords>
- </GlyphAssembly>
- <!-- VariantCount=0 -->
- </VertGlyphConstruction>
- <VertGlyphConstruction index="9">
- <GlyphAssembly>
- <ItalicsCorrection>
- <Value value="276"/>
- </ItalicsCorrection>
- <!-- PartCount=9 -->
- <PartRecords index="0">
- <glyph value="bottom"/>
- <StartConnectorLength value="365"/>
- <EndConnectorLength value="158"/>
- <FullAdvance value="1000"/>
- <PartFlags value="0"/>
- </PartRecords>
- <PartRecords index="1">
- <glyph value="vertical"/>
- <StartConnectorLength value="227"/>
- <EndConnectorLength value="365"/>
- <FullAdvance value="1000"/>
- <PartFlags value="1"/>
- </PartRecords>
- <PartRecords index="2">
- <glyph value="center"/>
- <StartConnectorLength value="54"/>
- <EndConnectorLength value="158"/>
- <FullAdvance value="1000"/>
- <PartFlags value="0"/>
- </PartRecords>
- <PartRecords index="3">
- <glyph value="vertical"/>
- <StartConnectorLength value="400"/>
- <EndConnectorLength value="296"/>
- <FullAdvance value="1000"/>
- <PartFlags value="1"/>
- </PartRecords>
- <PartRecords index="4">
- <glyph value="center"/>
- <StartConnectorLength value="54"/>
- <EndConnectorLength value="158"/>
- <FullAdvance value="1000"/>
- <PartFlags value="0"/>
- </PartRecords>
- <PartRecords index="5">
- <glyph value="vertical"/>
- <StartConnectorLength value="400"/>
- <EndConnectorLength value="296"/>
- <FullAdvance value="1000"/>
- <PartFlags value="1"/>
- </PartRecords>
- <PartRecords index="6">
- <glyph value="center"/>
- <StartConnectorLength value="54"/>
- <EndConnectorLength value="158"/>
- <FullAdvance value="1000"/>
- <PartFlags value="0"/>
- </PartRecords>
- <PartRecords index="7">
- <glyph value="vertical"/>
- <StartConnectorLength value="400"/>
- <EndConnectorLength value="296"/>
- <FullAdvance value="1000"/>
- <PartFlags value="1"/>
- </PartRecords>
- <PartRecords index="8">
- <glyph value="top"/>
- <StartConnectorLength value="123"/>
- <EndConnectorLength value="192"/>
- <FullAdvance value="1000"/>
- <PartFlags value="0"/>
- </PartRecords>
- </GlyphAssembly>
- <!-- VariantCount=2 -->
- <MathGlyphVariantRecord index="0">
- <VariantGlyph value="uni21D5_size2"/>
- <AdvanceMeasurement value="3351"/>
- </MathGlyphVariantRecord>
- <MathGlyphVariantRecord index="1">
- <VariantGlyph value="uni21D5_size3"/>
- <AdvanceMeasurement value="3601"/>
- </MathGlyphVariantRecord>
- </VertGlyphConstruction>
- <VertGlyphConstruction index="10">
- <GlyphAssembly>
- <ItalicsCorrection>
- <Value value="128"/>
- </ItalicsCorrection>
- <!-- PartCount=13 -->
- <PartRecords index="0">
- <glyph value="bottom"/>
- <StartConnectorLength value="123"/>
- <EndConnectorLength value="296"/>
- <FullAdvance value="1000"/>
- <PartFlags value="0"/>
- </PartRecords>
- <PartRecords index="1">
- <glyph value="vertical"/>
- <StartConnectorLength value="365"/>
- <EndConnectorLength value="123"/>
- <FullAdvance value="1000"/>
- <PartFlags value="1"/>
- </PartRecords>
- <PartRecords index="2">
- <glyph value="center"/>
- <StartConnectorLength value="192"/>
- <EndConnectorLength value="296"/>
- <FullAdvance value="1000"/>
- <PartFlags value="0"/>
- </PartRecords>
- <PartRecords index="3">
- <glyph value="vertical"/>
- <StartConnectorLength value="158"/>
- <EndConnectorLength value="54"/>
- <FullAdvance value="1000"/>
- <PartFlags value="1"/>
- </PartRecords>
- <PartRecords index="4">
- <glyph value="center"/>
- <StartConnectorLength value="192"/>
- <EndConnectorLength value="296"/>
- <FullAdvance value="1000"/>
- <PartFlags value="0"/>
- </PartRecords>
- <PartRecords index="5">
- <glyph value="vertical"/>
- <StartConnectorLength value="158"/>
- <EndConnectorLength value="54"/>
- <FullAdvance value="1000"/>
- <PartFlags value="1"/>
- </PartRecords>
- <PartRecords index="6">
- <glyph value="center"/>
- <StartConnectorLength value="192"/>
- <EndConnectorLength value="296"/>
- <FullAdvance value="1000"/>
- <PartFlags value="0"/>
- </PartRecords>
- <PartRecords index="7">
- <glyph value="vertical"/>
- <StartConnectorLength value="158"/>
- <EndConnectorLength value="54"/>
- <FullAdvance value="1000"/>
- <PartFlags value="1"/>
- </PartRecords>
- <PartRecords index="8">
- <glyph value="center"/>
- <StartConnectorLength value="192"/>
- <EndConnectorLength value="296"/>
- <FullAdvance value="1000"/>
- <PartFlags value="0"/>
- </PartRecords>
- <PartRecords index="9">
- <glyph value="vertical"/>
- <StartConnectorLength value="158"/>
- <EndConnectorLength value="54"/>
- <FullAdvance value="1000"/>
- <PartFlags value="1"/>
- </PartRecords>
- <PartRecords index="10">
- <glyph value="center"/>
- <StartConnectorLength value="192"/>
- <EndConnectorLength value="296"/>
- <FullAdvance value="1000"/>
- <PartFlags value="0"/>
- </PartRecords>
- <PartRecords index="11">
- <glyph value="vertical"/>
- <StartConnectorLength value="158"/>
- <EndConnectorLength value="54"/>
- <FullAdvance value="1000"/>
- <PartFlags value="1"/>
- </PartRecords>
- <PartRecords index="12">
- <glyph value="top"/>
- <StartConnectorLength value="262"/>
- <EndConnectorLength value="331"/>
- <FullAdvance value="1000"/>
- <PartFlags value="0"/>
- </PartRecords>
- </GlyphAssembly>
- <!-- VariantCount=6 -->
- <MathGlyphVariantRecord index="0">
- <VariantGlyph value="uni21E7_size2"/>
- <AdvanceMeasurement value="3251"/>
- </MathGlyphVariantRecord>
- <MathGlyphVariantRecord index="1">
- <VariantGlyph value="uni21E7_size3"/>
- <AdvanceMeasurement value="3501"/>
- </MathGlyphVariantRecord>
- <MathGlyphVariantRecord index="2">
- <VariantGlyph value="uni21E7_size4"/>
- <AdvanceMeasurement value="4001"/>
- </MathGlyphVariantRecord>
- <MathGlyphVariantRecord index="3">
- <VariantGlyph value="uni21E7_size5"/>
- <AdvanceMeasurement value="4751"/>
- </MathGlyphVariantRecord>
- <MathGlyphVariantRecord index="4">
- <VariantGlyph value="uni21E7_size6"/>
- <AdvanceMeasurement value="5001"/>
- </MathGlyphVariantRecord>
- <MathGlyphVariantRecord index="5">
- <VariantGlyph value="uni21E7_size7"/>
- <AdvanceMeasurement value="5501"/>
- </MathGlyphVariantRecord>
- </VertGlyphConstruction>
- <VertGlyphConstruction index="11">
- <GlyphAssembly>
- <ItalicsCorrection>
- <Value value="383"/>
- </ItalicsCorrection>
- <!-- PartCount=2 -->
- <PartRecords index="0">
- <glyph value="bottom"/>
- <StartConnectorLength value="54"/>
- <EndConnectorLength value="227"/>
- <FullAdvance value="1000"/>
- <PartFlags value="0"/>
- </PartRecords>
- <PartRecords index="1">
- <glyph value="vertical"/>
- <StartConnectorLength value="296"/>
- <EndConnectorLength value="54"/>
- <FullAdvance value="1000"/>
- <PartFlags value="1"/>
- </PartRecords>
- </GlyphAssembly>
- <!-- VariantCount=1 -->
- <MathGlyphVariantRecord index="0">
- <VariantGlyph value="uni21E9_size2"/>
- <AdvanceMeasurement value="3451"/>
- </MathGlyphVariantRecord>
- </VertGlyphConstruction>
- <HorizGlyphConstruction index="0">
- <GlyphAssembly>
- <ItalicsCorrection>
- <Value value="124"/>
- </ItalicsCorrection>
- <!-- PartCount=1 -->
- <PartRecords index="0">
- <glyph value="horizontal"/>
- <StartConnectorLength value="331"/>
- <EndConnectorLength value="89"/>
- <FullAdvance value="1000"/>
- <PartFlags value="1"/>
- </PartRecords>
- </GlyphAssembly>
- <!-- VariantCount=3 -->
- <MathGlyphVariantRecord index="0">
- <VariantGlyph value="uni2190_size2"/>
- <AdvanceMeasurement value="2151"/>
- </MathGlyphVariantRecord>
- <MathGlyphVariantRecord index="1">
- <VariantGlyph value="uni2190_size3"/>
- <AdvanceMeasurement value="2401"/>
- </MathGlyphVariantRecord>
- <MathGlyphVariantRecord index="2">
- <VariantGlyph value="uni2190_size4"/>
- <AdvanceMeasurement value="2901"/>
- </MathGlyphVariantRecord>
- </HorizGlyphConstruction>
- <HorizGlyphConstruction index="1">
- <GlyphAssembly>
- <ItalicsCorrection>
- <Value value="379"/>
- </ItalicsCorrection>
- <!-- PartCount=3 -->
- <PartRecords index="0">
- <glyph value="left"/>
- <StartConnectorLength value="400"/>
- <EndConnectorLength value="192"/>
- <FullAdvance value="1000"/>
- <PartFlags value="0"/>
- </PartRecords>
- <PartRecords index="1">
- <glyph value="horizontal"/>
- <StartConnectorLength value="262"/>
- <EndConnectorLength value="400"/>
- <FullAdvance value="1000"/>
- <PartFlags value="1"/>
- </PartRecords>
- <PartRecords index="2">
- <glyph value="right"/>
- <StartConnectorLength value="158"/>
- <EndConnectorLength value="227"/>
- <FullAdvance value="1000"/>
- <PartFlags value="0"/>
- </PartRecords>
- </GlyphAssembly>
- <!-- VariantCount=5 -->
- <MathGlyphVariantRecord index="0">
- <VariantGlyph value="uni2192_size2"/>
- <AdvanceMeasurement value="2351"/>
- </MathGlyphVariantRecord>
- <MathGlyphVariantRecord index="1">
- <VariantGlyph value="uni2192_size3"/>
- <AdvanceMeasurement value="2601"/>
- </MathGlyphVariantRecord>
- <MathGlyphVariantRecord index="2">
- <VariantGlyph value="uni2192_size4"/>
- <AdvanceMeasurement value="3101"/>
- </MathGlyphVariantRecord>
- <MathGlyphVariantRecord index="3">
- <VariantGlyph value="uni2192_size5"/>
- <AdvanceMeasurement value="3851"/>
- </MathGlyphVariantRecord>
- <MathGlyphVariantRecord index="4">
- <VariantGlyph value="uni2192_size6"/>
- <AdvanceMeasurement value="4101"/>
- </MathGlyphVariantRecord>
- </HorizGlyphConstruction>
- <HorizGlyphConstruction index="2">
- <GlyphAssembly>
- <ItalicsCorrection>
- <Value value="285"/>
- </ItalicsCorrection>
- <!-- PartCount=7 -->
- <PartRecords index="0">
- <glyph value="left"/>
- <StartConnectorLength value="331"/>
- <EndConnectorLength value="123"/>
- <FullAdvance value="1000"/>
- <PartFlags value="0"/>
- </PartRecords>
- <PartRecords index="1">
- <glyph value="horizontal"/>
- <StartConnectorLength value="192"/>
- <EndConnectorLength value="331"/>
- <FullAdvance value="1000"/>
- <PartFlags value="1"/>
- </PartRecords>
- <PartRecords index="2">
- <glyph value="center"/>
- <StartConnectorLength value="400"/>
- <EndConnectorLength value="123"/>
- <FullAdvance value="1000"/>
- <PartFlags value="0"/>
- </PartRecords>
- <PartRecords index="3">
- <glyph value="horizontal"/>
- <StartConnectorLength value="365"/>
- <EndConnectorLength value="262"/>
- <FullAdvance value="1000"/>
- <PartFlags value="1"/>
- </PartRecords>
- <PartRecords index="4">
- <glyph value="center"/>
- <StartConnectorLength value="400"/>
- <EndConnectorLength value="123"/>
- <FullAdvance value="1000"/>
- <PartFlags value="0"/>
- </PartRecords>
- <PartRecords index="5">
- <glyph value="horizontal"/>
- <StartConnectorLength value="365"/>
- <EndConnectorLength value="262"/>
- <FullAdvance value="1000"/>
- <PartFlags value="1"/>
- </PartRecords>
- <PartRecords index="6">
- <glyph value="right"/>
- <StartConnectorLength value="89"/>
- <EndConnectorLength value="158"/>
- <FullAdvance value="1000"/>
- <PartFlags value="0"/>
- </PartRecords>
- </GlyphAssembly>
- <!-- VariantCount=0 -->
- </HorizGlyphConstruction>
- <HorizGlyphConstruction index="3">
- <GlyphAssembly>
- <ItalicsCorrection>
- <Value value="231"/>
- </ItalicsCorrection>
- <!-- PartCount=7 -->
- <PartRecords index="0">
- <glyph value="left"/>
- <StartConnectorLength value="158"/>
- <EndConnectorLength value="331"/>
- <FullAdvance value="1000"/>
- <PartFlags value="0"/>
- </PartRecords>
- <PartRecords index="1">
- <glyph value="horizontal"/>
- <StartConnectorLength value="400"/>
- <EndConnectorLength value="158"/>
- <FullAdvance value="1000"/>
- <PartFlags value="1"/>
- </PartRecords>
- <PartRecords index="2">
- <glyph value="center"/>
- <StartConnectorLength value="227"/>
- <EndConnectorLength value="331"/>
- <FullAdvance value="1000"/>
- <PartFlags value="0"/>
- </PartRecords>
- <PartRecords index="3">
- <glyph value="horizontal"/>
- <StartConnectorLength value="192"/>
- <EndConnectorLength value="89"/>
- <FullAdvance value="1000"/>
- <PartFlags value="1"/>
- </PartRecords>
- <PartRecords index="4">
- <glyph value="center"/>
- <StartConnectorLength value="227"/>
- <EndConnectorLength value="331"/>
- <FullAdvance value="1000"/>
- <PartFlags value="0"/>
- </PartRecords>
- <PartRecords index="5">
- <glyph value="horizontal"/>
- <StartConnectorLength value="192"/>
- <EndConnectorLength value="89"/>
- <FullAdvance value="1000"/>
- <PartFlags value="1"/>
- </PartRecords>
- <PartRecords index="6">
- <glyph value="right"/>
- <StartConnectorLength value="296"/>
- <EndConnectorLength value="365"/>
- <FullAdvance value="1000"/>
- <PartFlags value="0"/>
- </PartRecords>
- </GlyphAssembly>
- <!-- VariantCount=2 -->
- <MathGlyphVariantRecord index="0">
- <VariantGlyph value="uni21A4_size2"/>
- <AdvanceMeasurement value="2251"/>
- </MathGlyphVariantRecord>
- <MathGlyphVariantRecord index="1">
- <VariantGlyph value="uni21A4_size3"/>
- <AdvanceMeasurement value="2501"/>
- </MathGlyphVariantRecord>
- </HorizGlyphConstruction>
- <HorizGlyphConstruction index="4">
- <GlyphAssembly>
- <ItalicsCorrection>
- <Value value="137"/>
- </ItalicsCorrection>
- <!-- PartCount=11 -->
- <PartRecords index="0">
- <glyph value="left"/>
- <StartConnectorLength value="89"/>
- <EndConnectorLength value="262"/>
- <FullAdvance value="1000"/>
- <PartFlags value="0"/>
- </PartRecords>
- <PartRecords index="1">
- <glyph value="horizontal"/>
- <StartConnectorLength value="331"/>
- <EndConnectorLength value="89"/>
- <FullAdvance value="1000"/>
- <PartFlags value="1"/>
- </PartRecords>
- <PartRecords index="2">
- <glyph value="center"/>
- <StartConnectorLength value="158"/>
- <EndConnectorLength value="262"/>
- <FullAdvance value="1000"/>
- <PartFlags value="0"/>
- </PartRecords>
- <PartRecords index="3">
- <glyph value="horizontal"/>
- <StartConnectorLength value="123"/>
- <EndConnectorLength value="400"/>
- <FullAdvance value="1000"/>
- <PartFlags value="1"/>
- </PartRecords>
- <PartRecords index="4">
- <glyph value="center"/>
- <StartConnectorLength value="158"/>
- <EndConnectorLength value="262"/>
- <FullAdvance value="1000"/>
- <PartFlags value="0"/>
- </PartRecords>
- <PartRecords index="5">
- <glyph value="horizontal"/>
- <StartConnectorLength value="123"/>
- <EndConnectorLength value="400"/>
- <FullAdvance value="1000"/>
- <PartFlags value="1"/>
- </PartRecords>
- <PartRecords index="6">
- <glyph value="center"/>
- <StartConnectorLength value="158"/>
- <EndConnectorLength value="262"/>
- <FullAdvance value="1000"/>
- <PartFlags value="0"/>
- </PartRecords>
- <PartRecords index="7">
- <glyph value="horizontal"/>
- <StartConnectorLength value="123"/>
- <EndConnectorLength value="400"/>
- <FullAdvance value="1000"/>
- <PartFlags value="1"/>
- </PartRecords>
- <PartRecords index="8">
- <glyph value="center"/>
- <StartConnectorLength value="158"/>
- <EndConnectorLength value="262"/>
- <FullAdvance value="1000"/>
- <PartFlags value="0"/>
- </PartRecords>
- <PartRecords index="9">
- <glyph value="horizontal"/>
- <StartConnectorLength value="123"/>
- <EndConnectorLength value="400"/>
- <FullAdvance value="1000"/>
- <PartFlags value="1"/>
- </PartRecords>
- <PartRecords index="10">
- <glyph value="right"/>
- <StartConnectorLength value="227"/>
- <EndConnectorLength value="296"/>
- <FullAdvance value="1000"/>
- <PartFlags value="0"/>
- </PartRecords>
- </GlyphAssembly>
- <!-- VariantCount=4 -->
- <MathGlyphVariantRecord index="0">
- <VariantGlyph value="uni21A6_size2"/>
- <AdvanceMeasurement value="2451"/>
- </MathGlyphVariantRecord>
- <MathGlyphVariantRecord index="1">
- <VariantGlyph value="uni21A6_size3"/>
- <AdvanceMeasurement value="2701"/>
- </MathGlyphVariantRecord>
- <MathGlyphVariantRecord index="2">
- <VariantGlyph value="uni21A6_size4"/>
- <AdvanceMeasurement value="3201"/>
- </MathGlyphVariantRecord>
- <MathGlyphVariantRecord index="3">
- <VariantGlyph value="uni21A6_size5"/>
- <AdvanceMeasurement value="3951"/>
- </MathGlyphVariantRecord>
- </HorizGlyphConstruction>
- <HorizGlyphConstruction index="5">
- <GlyphAssembly>
- <ItalicsCorrection>
- <Value value="331"/>
- </ItalicsCorrection>
- <!-- PartCount=13 -->
- <PartRecords index="0">
- <glyph value="left"/>
- <StartConnectorLength value="89"/>
- <EndConnectorLength value="262"/>
- <FullAdvance value="1000"/>
- <PartFlags value="0"/>
- </PartRecords>
- <PartRecords index="1">
- <glyph value="horizontal"/>
- <StartConnectorLength value="331"/>
- <EndConnectorLength value="89"/>
- <FullAdvance value="1000"/>
- <PartFlags value="1"/>
- </PartRecords>
- <PartRecords index="2">
- <glyph value="center"/>
- <StartConnectorLength value="158"/>
- <EndConnectorLength value="262"/>
- <FullAdvance value="1000"/>
- <PartFlags value="0"/>
- </PartRecords>
- <PartRecords index="3">
- <glyph value="horizontal"/>
- <StartConnectorLength value="123"/>
- <EndConnectorLength value="400"/>
- <FullAdvance value="1000"/>
- <PartFlags value="1"/>
- </PartRecords>
- <PartRecords index="4">
- <glyph value="center"/>
- <StartConnectorLength value="158"/>
- <EndConnectorLength value="262"/>
- <FullAdvance value="1000"/>
- <PartFlags value="0"/>
- </PartRecords>
- <PartRecords index="5">
- <glyph value="horizontal"/>
- <StartConnectorLength value="123"/>
- <EndConnectorLength value="400"/>
- <FullAdvance value="1000"/>
- <PartFlags value="1"/>
- </PartRecords>
- <PartRecords index="6">
- <glyph value="center"/>
- <StartConnectorLength value="158"/>
- <EndConnectorLength value="262"/>
- <FullAdvance value="1000"/>
- <PartFlags value="0"/>
- </PartRecords>
- <PartRecords index="7">
- <glyph value="horizontal"/>
- <StartConnectorLength value="123"/>
- <EndConnectorLength value="400"/>
- <FullAdvance value="1000"/>
- <PartFlags value="1"/>
- </PartRecords>
- <PartRecords index="8">
- <glyph value="center"/>
- <StartConnectorLength value="158"/>
- <EndConnectorLength value="262"/>
- <FullAdvance value="1000"/>
- <PartFlags value="0"/>
- </PartRecords>
- <PartRecords index="9">
- <glyph value="horizontal"/>
- <StartConnectorLength value="123"/>
- <EndConnectorLength value="400"/>
- <FullAdvance value="1000"/>
- <PartFlags value="1"/>
- </PartRecords>
- <PartRecords index="10">
- <glyph value="center"/>
- <StartConnectorLength value="158"/>
- <EndConnectorLength value="262"/>
- <FullAdvance value="1000"/>
- <PartFlags value="0"/>
- </PartRecords>
- <PartRecords index="11">
- <glyph value="horizontal"/>
- <StartConnectorLength value="123"/>
- <EndConnectorLength value="400"/>
- <FullAdvance value="1000"/>
- <PartFlags value="1"/>
- </PartRecords>
- <PartRecords index="12">
- <glyph value="right"/>
- <StartConnectorLength value="227"/>
- <EndConnectorLength value="296"/>
- <FullAdvance value="1000"/>
- <PartFlags value="0"/>
- </PartRecords>
- </GlyphAssembly>
- <!-- VariantCount=2 -->
- <MathGlyphVariantRecord index="0">
- <VariantGlyph value="uni21C7_size2"/>
- <AdvanceMeasurement value="1951"/>
- </MathGlyphVariantRecord>
- <MathGlyphVariantRecord index="1">
- <VariantGlyph value="uni21C7_size3"/>
- <AdvanceMeasurement value="2201"/>
- </MathGlyphVariantRecord>
- </HorizGlyphConstruction>
- <HorizGlyphConstruction index="6">
- <GlyphAssembly>
- <ItalicsCorrection>
- <Value value="237"/>
- </ItalicsCorrection>
- <!-- PartCount=2 -->
- <PartRecords index="0">
- <glyph value="left"/>
- <StartConnectorLength value="400"/>
- <EndConnectorLength value="192"/>
- <FullAdvance value="1000"/>
- <PartFlags value="0"/>
- </PartRecords>
- <PartRecords index="1">
- <glyph value="horizontal"/>
- <StartConnectorLength value="262"/>
- <EndConnectorLength value="400"/>
- <FullAdvance value="1000"/>
- <PartFlags value="1"/>
- </PartRecords>
- </GlyphAssembly>
- <!-- VariantCount=4 -->
- <MathGlyphVariantRecord index="0">
- <VariantGlyph value="uni21C9_size2"/>
- <AdvanceMeasurement value="2151"/>
- </MathGlyphVariantRecord>
- <MathGlyphVariantRecord index="1">
- <VariantGlyph value="uni21C9_size3"/>
- <AdvanceMeasurement value="2401"/>
- </MathGlyphVariantRecord>
- <MathGlyphVariantRecord index="2">
- <VariantGlyph value="uni21C9_size4"/>
- <AdvanceMeasurement value="2901"/>
- </MathGlyphVariantRecord>
- <MathGlyphVariantRecord index="3">
- <VariantGlyph value="uni21C9_size5"/>
- <AdvanceMeasurement value="3651"/>
- </MathGlyphVariantRecord>
- </HorizGlyphConstruction>
- <HorizGlyphConstruction index="7">
- <GlyphAssembly>
- <ItalicsCorrection>
- <Value value="257"/>
- </ItalicsCorrection>
- <!-- PartCount=1 -->
- <PartRecords index="0">
- <glyph value="horizontal"/>
- <StartConnectorLength value="400"/>
- <EndConnectorLength value="158"/>
- <FullAdvance value="1000"/>
- <PartFlags value="1"/>
- </PartRecords>
- </GlyphAssembly>
- <!-- VariantCount=4 -->
- <MathGlyphVariantRecord index="0">
- <VariantGlyph value="uni21D0_size2"/>
- <AdvanceMeasurement value="2851"/>
- </MathGlyphVariantRecord>
- <MathGlyphVariantRecord index="1">
- <VariantGlyph value="uni21D0_size3"/>
- <AdvanceMeasurement value="3101"/>
- </MathGlyphVariantRecord>
- <MathGlyphVariantRecord index="2">
- <VariantGlyph value="uni21D0_size4"/>
- <AdvanceMeasurement value="3601"/>
- </MathGlyphVariantRecord>
- <MathGlyphVariantRecord index="3">
- <VariantGlyph value="uni21D0_size5"/>
- <AdvanceMeasurement value="4351"/>
- </MathGlyphVariantRecord>
- </HorizGlyphConstruction>
- <HorizGlyphConstruction index="8">
- <GlyphAssembly>
- <ItalicsCorrection>
- <Value value="163"/>
- </ItalicsCorrection>
- <!-- PartCount=3 -->
- <PartRecords index="0">
- <glyph value="left"/>
- <StartConnectorLength value="89"/>
- <EndConnectorLength value="262"/>
- <FullAdvance value="1000"/>
- <PartFlags value="0"/>
- </PartRecords>
- <PartRecords index="1">
- <glyph value="horizontal"/>
- <StartConnectorLength value="331"/>
- <EndConnectorLength value="89"/>
- <FullAdvance value="1000"/>
- <PartFlags value="1"/>
- </PartRecords>
- <PartRecords index="2">
- <glyph value="right"/>
- <StartConnectorLength value="227"/>
- <EndConnectorLength value="296"/>
- <FullAdvance value="1000"/>
- <PartFlags value="0"/>
- </PartRecords>
- </GlyphAssembly>
- <!-- VariantCount=6 -->
- <MathGlyphVariantRecord index="0">
- <VariantGlyph value="uni21D2_size2"/>
- <AdvanceMeasurement value="3051"/>
- </MathGlyphVariantRecord>
- <MathGlyphVariantRecord index="1">
- <VariantGlyph value="uni21D2_size3"/>
- <AdvanceMeasurement value="3301"/>
- </MathGlyphVariantRecord>
- <MathGlyphVariantRecord index="2">
- <VariantGlyph value="uni21D2_size4"/>
- <AdvanceMeasurement value="3801"/>
- </MathGlyphVariantRecord>
- <MathGlyphVariantRecord index="3">
- <VariantGlyph value="uni21D2_size5"/>
- <AdvanceMeasurement value="4551"/>
- </MathGlyphVariantRecord>
- <MathGlyphVariantRecord index="4">
- <VariantGlyph value="uni21D2_size6"/>
- <AdvanceMeasurement value="4801"/>
- </MathGlyphVariantRecord>
- <MathGlyphVariantRecord index="5">
- <VariantGlyph value="uni21D2_size7"/>
- <AdvanceMeasurement value="5301"/>
- </MathGlyphVariantRecord>
- </HorizGlyphConstruction>
- <HorizGlyphConstruction index="9">
- <GlyphAssembly>
- <ItalicsCorrection>
- <Value value="418"/>
- </ItalicsCorrection>
- <!-- PartCount=7 -->
- <PartRecords index="0">
- <glyph value="left"/>
- <StartConnectorLength value="400"/>
- <EndConnectorLength value="192"/>
- <FullAdvance value="1000"/>
- <PartFlags value="0"/>
- </PartRecords>
- <PartRecords index="1">
- <glyph value="horizontal"/>
- <StartConnectorLength value="262"/>
- <EndConnectorLength value="400"/>
- <FullAdvance value="1000"/>
- <PartFlags value="1"/>
- </PartRecords>
- <PartRecords index="2">
- <glyph value="center"/>
- <StartConnectorLength value="89"/>
- <EndConnectorLength value="192"/>
- <FullAdvance value="1000"/>
- <PartFlags value="0"/>
- </PartRecords>
- <PartRecords index="3">
- <glyph value="horizontal"/>
- <StartConnectorLength value="54"/>
- <EndConnectorLength value="331"/>
- <FullAdvance value="1000"/>
- <PartFlags value="1"/>
- </PartRecords>
- <PartRecords index="4">
- <glyph value="center"/>
- <StartConnectorLength value="89"/>
- <EndConnectorLength value="192"/>
- <FullAdvance value="1000"/>
- <PartFlags value="0"/>
- </PartRecords>
- <PartRecords index="5">
- <glyph value="horizontal"/>
- <StartConnectorLength value="54"/>
- <EndConnectorLength value="331"/>
- <FullAdvance value="1000"/>
- <PartFlags value="1"/>
- </PartRecords>
- <PartRecords index="6">
- <glyph value="right"/>
- <StartConnectorLength value="158"/>
- <EndConnectorLength value="227"/>
- <FullAdvance value="1000"/>
- <PartFlags value="0"/>
- </PartRecords>
- </GlyphAssembly>
- <!-- VariantCount=1 -->
- <MathGlyphVariantRecord index="0">
- <VariantGlyph value="uni21D4_size2"/>
- <AdvanceMeasurement value="3251"/>
- </MathGlyphVariantRecord>
- </HorizGlyphConstruction>
- <HorizGlyphConstruction index="10">
- <GlyphAssembly>
- <ItalicsCorrection>
- <Value value="270"/>
- </ItalicsCorrection>
- <!-- PartCount=11 -->
- <PartRecords index="0">
- <glyph value="left"/>
- <StartConnectorLength value="158"/>
- <EndConnectorLength value="331"/>
- <FullAdvance value="1000"/>
- <PartFlags value="0"/>
- </PartRecords>
- <PartRecords index="1">
- <glyph value="horizontal"/>
- <StartConnectorLength value="400"/>
- <EndConnectorLength value="158"/>
- <FullAdvance value="1000"/>
- <PartFlags value="1"/>
- </PartRecords>
- <PartRecords index="2">
- <glyph value="center"/>
- <StartConnectorLength value="227"/>
- <EndConnectorLength value="331"/>
- <FullAdvance value="1000"/>
- <PartFlags value="0"/>
- </PartRecords>
- <PartRecords index="3">
- <glyph value="horizontal"/>
- <StartConnectorLength value="192"/>
- <EndConnectorLength value="89"/>
- <FullAdvance value="1000"/>
- <PartFlags value="1"/>
- </PartRecords>
- <PartRecords index="4">
- <glyph value="center"/>
- <StartConnectorLength value="227"/>
- <EndConnectorLength value="331"/>
- <FullAdvance value="1000"/>
- <PartFlags value="0"/>
- </PartRecords>
- <PartRecords index="5">
- <glyph value="horizontal"/>
- <StartConnectorLength value="192"/>
- <EndConnectorLength value="89"/>
- <FullAdvance value="1000"/>
- <PartFlags value="1"/>
- </PartRecords>
- <PartRecords index="6">
- <glyph value="center"/>
- <StartConnectorLength value="227"/>
- <EndConnectorLength value="331"/>
- <FullAdvance value="1000"/>
- <PartFlags value="0"/>
- </PartRecords>
- <PartRecords index="7">
- <glyph value="horizontal"/>
- <StartConnectorLength value="192"/>
- <EndConnectorLength value="89"/>
- <FullAdvance value="1000"/>
- <PartFlags value="1"/>
- </PartRecords>
- <PartRecords index="8">
- <glyph value="center"/>
- <StartConnectorLength value="227"/>
- <EndConnectorLength value="331"/>
- <FullAdvance value="1000"/>
- <PartFlags value="0"/>
- </PartRecords>
- <PartRecords index="9">
- <glyph value="horizontal"/>
- <StartConnectorLength value="192"/>
- <EndConnectorLength value="89"/>
- <FullAdvance value="1000"/>
- <PartFlags value="1"/>
- </PartRecords>
- <PartRecords index="10">
- <glyph value="right"/>
- <StartConnectorLength value="296"/>
- <EndConnectorLength value="365"/>
- <FullAdvance value="1000"/>
- <PartFlags value="0"/>
- </PartRecords>
- </GlyphAssembly>
- <!-- VariantCount=5 -->
- <MathGlyphVariantRecord index="0">
- <VariantGlyph value="uni21E6_size2"/>
- <AdvanceMeasurement value="3151"/>
- </MathGlyphVariantRecord>
- <MathGlyphVariantRecord index="1">
- <VariantGlyph value="uni21E6_size3"/>
- <AdvanceMeasurement value="3401"/>
- </MathGlyphVariantRecord>
- <MathGlyphVariantRecord index="2">
- <VariantGlyph value="uni21E6_size4"/>
- <AdvanceMeasurement value="3901"/>
- </MathGlyphVariantRecord>
- <MathGlyphVariantRecord index="3">
- <VariantGlyph value="uni21E6_size5"/>
- <AdvanceMeasurement value="4651"/>
- </MathGlyphVariantRecord>
- <MathGlyphVariantRecord index="4">
- <VariantGlyph value="uni21E6_size6"/>
- <AdvanceMeasurement value="4901"/>
- </MathGlyphVariantRecord>
- </HorizGlyphConstruction>
- <HorizGlyphConstruction index="11">
- <GlyphAssembly>
- <ItalicsCorrection>
- <Value value="176"/>
- </ItalicsCorrection>
- <!-- PartCount=1 -->
- <PartRecords index="0">
- <glyph value="horizontal"/>
- <StartConnectorLength value="331"/>
- <EndConnectorLength value="89"/>
- <FullAdvance value="1000"/>
- <PartFlags value="1"/>
- </PartRecords>
- </GlyphAssembly>
- <!-- VariantCount=0 -->
- </HorizGlyphConstruction>
- </MathVariants>
- </MATH>
-
- <hmtx>
- <mtx name=".notdef" width="1000" lsb="0"/>
- <mtx name="A" width="1000" lsb="0"/>
- <mtx name="B" width="1000" lsb="0"/>
- <mtx name="C" width="1000" lsb="0"/>
- <mtx name="D" width="1000" lsb="0"/>
- <mtx name="E" width="1000" lsb="0"/>
- <mtx name="F" width="1000" lsb="0"/>
- <mtx name="G" width="1000" lsb="0"/>
- <mtx name="H" width="1000" lsb="0"/>
- <mtx name="I" width="1000" lsb="0"/>
- <mtx name="J" width="1000" lsb="0"/>
- <mtx name="K" width="1000" lsb="0"/>
- <mtx name="L" width="1000" lsb="0"/>
- <mtx name="M" width="1000" lsb="0"/>
- <mtx name="N" width="1000" lsb="0"/>
- <mtx name="O" width="1000" lsb="0"/>
- <mtx name="P" width="1000" lsb="0"/>
- <mtx name="Q" width="1000" lsb="0"/>
- <mtx name="R" width="1000" lsb="0"/>
- <mtx name="S" width="1000" lsb="0"/>
- <mtx name="T" width="1000" lsb="0"/>
- <mtx name="U" width="1000" lsb="0"/>
- <mtx name="V" width="1000" lsb="0"/>
- <mtx name="W" width="1000" lsb="0"/>
- <mtx name="X" width="1000" lsb="0"/>
- <mtx name="Y" width="1000" lsb="0"/>
- <mtx name="Z" width="1000" lsb="0"/>
- <mtx name="arrowboth" width="1000" lsb="0"/>
- <mtx name="arrowdblboth" width="1000" lsb="0"/>
- <mtx name="arrowdbldown" width="1000" lsb="0"/>
- <mtx name="arrowdblleft" width="1000" lsb="0"/>
- <mtx name="arrowdblright" width="1000" lsb="0"/>
- <mtx name="arrowdblup" width="1000" lsb="0"/>
- <mtx name="arrowdown" width="1000" lsb="0"/>
- <mtx name="arrowleft" width="1000" lsb="0"/>
- <mtx name="arrowright" width="1000" lsb="0"/>
- <mtx name="arrowup" width="1000" lsb="0"/>
- <mtx name="arrowupdn" width="1000" lsb="0"/>
- <mtx name="bottom" width="1000" lsb="0"/>
- <mtx name="braceleft" width="1000" lsb="0"/>
- <mtx name="center" width="1000" lsb="0"/>
- <mtx name="horizontal" width="1000" lsb="0"/>
- <mtx name="left" width="1000" lsb="0"/>
- <mtx name="right" width="1000" lsb="0"/>
- <mtx name="space" width="1000" lsb="0"/>
- <mtx name="top" width="1000" lsb="0"/>
- <mtx name="underscore" width="1000" lsb="0"/>
- <mtx name="uni2190_size2" width="1000" lsb="0"/>
- <mtx name="uni2190_size3" width="1000" lsb="0"/>
- <mtx name="uni2190_size4" width="1000" lsb="0"/>
- <mtx name="uni2191_size2" width="1000" lsb="0"/>
- <mtx name="uni2191_size3" width="1000" lsb="0"/>
- <mtx name="uni2191_size4" width="1000" lsb="0"/>
- <mtx name="uni2191_size5" width="1000" lsb="0"/>
- <mtx name="uni2192_size2" width="1000" lsb="0"/>
- <mtx name="uni2192_size3" width="1000" lsb="0"/>
- <mtx name="uni2192_size4" width="1000" lsb="0"/>
- <mtx name="uni2192_size5" width="1000" lsb="0"/>
- <mtx name="uni2192_size6" width="1000" lsb="0"/>
- <mtx name="uni2193_size2" width="1000" lsb="0"/>
- <mtx name="uni2193_size3" width="1000" lsb="0"/>
- <mtx name="uni2193_size4" width="1000" lsb="0"/>
- <mtx name="uni2193_size5" width="1000" lsb="0"/>
- <mtx name="uni2193_size6" width="1000" lsb="0"/>
- <mtx name="uni2193_size7" width="1000" lsb="0"/>
- <mtx name="uni2195_size2" width="1000" lsb="0"/>
- <mtx name="uni21A4" width="1000" lsb="0"/>
- <mtx name="uni21A4_size2" width="1000" lsb="0"/>
- <mtx name="uni21A4_size3" width="1000" lsb="0"/>
- <mtx name="uni21A5" width="1000" lsb="0"/>
- <mtx name="uni21A5_size2" width="1000" lsb="0"/>
- <mtx name="uni21A5_size3" width="1000" lsb="0"/>
- <mtx name="uni21A5_size4" width="1000" lsb="0"/>
- <mtx name="uni21A6" width="1000" lsb="0"/>
- <mtx name="uni21A6_size2" width="1000" lsb="0"/>
- <mtx name="uni21A6_size3" width="1000" lsb="0"/>
- <mtx name="uni21A6_size4" width="1000" lsb="0"/>
- <mtx name="uni21A6_size5" width="1000" lsb="0"/>
- <mtx name="uni21A7" width="1000" lsb="0"/>
- <mtx name="uni21A7_size2" width="1000" lsb="0"/>
- <mtx name="uni21A7_size3" width="1000" lsb="0"/>
- <mtx name="uni21A7_size4" width="1000" lsb="0"/>
- <mtx name="uni21A7_size5" width="1000" lsb="0"/>
- <mtx name="uni21A7_size6" width="1000" lsb="0"/>
- <mtx name="uni21C7" width="1000" lsb="0"/>
- <mtx name="uni21C7_size2" width="1000" lsb="0"/>
- <mtx name="uni21C7_size3" width="1000" lsb="0"/>
- <mtx name="uni21C8" width="1000" lsb="0"/>
- <mtx name="uni21C8_size2" width="1000" lsb="0"/>
- <mtx name="uni21C8_size3" width="1000" lsb="0"/>
- <mtx name="uni21C8_size4" width="1000" lsb="0"/>
- <mtx name="uni21C9" width="1000" lsb="0"/>
- <mtx name="uni21C9_size2" width="1000" lsb="0"/>
- <mtx name="uni21C9_size3" width="1000" lsb="0"/>
- <mtx name="uni21C9_size4" width="1000" lsb="0"/>
- <mtx name="uni21C9_size5" width="1000" lsb="0"/>
- <mtx name="uni21CA" width="1000" lsb="0"/>
- <mtx name="uni21CA_size2" width="1000" lsb="0"/>
- <mtx name="uni21CA_size3" width="1000" lsb="0"/>
- <mtx name="uni21CA_size4" width="1000" lsb="0"/>
- <mtx name="uni21CA_size5" width="1000" lsb="0"/>
- <mtx name="uni21CA_size6" width="1000" lsb="0"/>
- <mtx name="uni21D0_size2" width="1000" lsb="0"/>
- <mtx name="uni21D0_size3" width="1000" lsb="0"/>
- <mtx name="uni21D0_size4" width="1000" lsb="0"/>
- <mtx name="uni21D0_size5" width="1000" lsb="0"/>
- <mtx name="uni21D1_size2" width="1000" lsb="0"/>
- <mtx name="uni21D1_size3" width="1000" lsb="0"/>
- <mtx name="uni21D1_size4" width="1000" lsb="0"/>
- <mtx name="uni21D1_size5" width="1000" lsb="0"/>
- <mtx name="uni21D1_size6" width="1000" lsb="0"/>
- <mtx name="uni21D2_size2" width="1000" lsb="0"/>
- <mtx name="uni21D2_size3" width="1000" lsb="0"/>
- <mtx name="uni21D2_size4" width="1000" lsb="0"/>
- <mtx name="uni21D2_size5" width="1000" lsb="0"/>
- <mtx name="uni21D2_size6" width="1000" lsb="0"/>
- <mtx name="uni21D2_size7" width="1000" lsb="0"/>
- <mtx name="uni21D4_size2" width="1000" lsb="0"/>
- <mtx name="uni21D5" width="1000" lsb="0"/>
- <mtx name="uni21D5_size2" width="1000" lsb="0"/>
- <mtx name="uni21D5_size3" width="1000" lsb="0"/>
- <mtx name="uni21E6" width="1000" lsb="0"/>
- <mtx name="uni21E6_size2" width="1000" lsb="0"/>
- <mtx name="uni21E6_size3" width="1000" lsb="0"/>
- <mtx name="uni21E6_size4" width="1000" lsb="0"/>
- <mtx name="uni21E6_size5" width="1000" lsb="0"/>
- <mtx name="uni21E6_size6" width="1000" lsb="0"/>
- <mtx name="uni21E7" width="1000" lsb="0"/>
- <mtx name="uni21E7_size2" width="1000" lsb="0"/>
- <mtx name="uni21E7_size3" width="1000" lsb="0"/>
- <mtx name="uni21E7_size4" width="1000" lsb="0"/>
- <mtx name="uni21E7_size5" width="1000" lsb="0"/>
- <mtx name="uni21E7_size6" width="1000" lsb="0"/>
- <mtx name="uni21E7_size7" width="1000" lsb="0"/>
- <mtx name="uni21E8" width="1000" lsb="0"/>
- <mtx name="uni21E9" width="1000" lsb="0"/>
- <mtx name="uni21E9_size2" width="1000" lsb="0"/>
- <mtx name="uni23A7" width="1000" lsb="0"/>
- <mtx name="uni23A8" width="1000" lsb="0"/>
- <mtx name="uni23A9" width="1000" lsb="0"/>
- <mtx name="uni23AA" width="1000" lsb="0"/>
- <mtx name="vertical" width="1000" lsb="400"/>
- </hmtx>
-
-</ttFont>
diff --git a/test/api/fonts/README b/test/api/fonts/README
index 7e7783c..4830c47 100644
--- a/test/api/fonts/README
+++ b/test/api/fonts/README
@@ -1,3 +1,5 @@
cmap-format12-only files created by ttx & remove all other cmap entries
Inconsolata-Regular.abc.widerc.ttf has the hmtx width of "c" set to 600; everything else is 500. Subsetting out c should reduce numberOfHMetrics to 1.
+
+chromacheck-* fonts are from https://github.com/RoelN/ChromaCheck/tree/master/fonts and licensed under MIT by Roel Nieskens and Google.
diff --git a/test/api/fonts/Roboto-Regular.multihdmx.a.ttf b/test/api/fonts/Roboto-Regular.multihdmx.a.ttf
new file mode 100644
index 0000000..dd82178
--- /dev/null
+++ b/test/api/fonts/Roboto-Regular.multihdmx.a.ttf
Binary files differ
diff --git a/test/api/fonts/Roboto-Regular.multihdmx.abc.ttf b/test/api/fonts/Roboto-Regular.multihdmx.abc.ttf
new file mode 100644
index 0000000..03dd8b6
--- /dev/null
+++ b/test/api/fonts/Roboto-Regular.multihdmx.abc.ttf
Binary files differ
diff --git a/test/api/fonts/SourceHanSans-Regular.41,3041,4C2E.otf b/test/api/fonts/SourceHanSans-Regular.41,3041,4C2E.otf
new file mode 100644
index 0000000..08bc0e0
--- /dev/null
+++ b/test/api/fonts/SourceHanSans-Regular.41,3041,4C2E.otf
Binary files differ
diff --git a/test/api/fonts/SourceHanSans-Regular.41,4C2E.nohints.otf b/test/api/fonts/SourceHanSans-Regular.41,4C2E.nohints.otf
new file mode 100644
index 0000000..ec39590
--- /dev/null
+++ b/test/api/fonts/SourceHanSans-Regular.41,4C2E.nohints.otf
Binary files differ
diff --git a/test/api/fonts/SourceHanSans-Regular.41,4C2E.nosubrs.nohints.otf b/test/api/fonts/SourceHanSans-Regular.41,4C2E.nosubrs.nohints.otf
new file mode 100644
index 0000000..00a112f
--- /dev/null
+++ b/test/api/fonts/SourceHanSans-Regular.41,4C2E.nosubrs.nohints.otf
Binary files differ
diff --git a/test/api/fonts/SourceHanSans-Regular.41,4C2E.nosubrs.otf b/test/api/fonts/SourceHanSans-Regular.41,4C2E.nosubrs.otf
new file mode 100644
index 0000000..6fe9bf3
--- /dev/null
+++ b/test/api/fonts/SourceHanSans-Regular.41,4C2E.nosubrs.otf
Binary files differ
diff --git a/test/api/fonts/SourceHanSans-Regular.41,4C2E.otf b/test/api/fonts/SourceHanSans-Regular.41,4C2E.otf
new file mode 100644
index 0000000..2c6cd9a
--- /dev/null
+++ b/test/api/fonts/SourceHanSans-Regular.41,4C2E.otf
Binary files differ
diff --git a/test/api/fonts/SourceSansPro-Regular.abc.otf b/test/api/fonts/SourceSansPro-Regular.abc.otf
new file mode 100644
index 0000000..7f51bd3
--- /dev/null
+++ b/test/api/fonts/SourceSansPro-Regular.abc.otf
Binary files differ
diff --git a/test/api/fonts/SourceSansPro-Regular.ac.nohints.otf b/test/api/fonts/SourceSansPro-Regular.ac.nohints.otf
new file mode 100644
index 0000000..14a3a5f
--- /dev/null
+++ b/test/api/fonts/SourceSansPro-Regular.ac.nohints.otf
Binary files differ
diff --git a/test/api/fonts/SourceSansPro-Regular.ac.nosubrs.nohints.otf b/test/api/fonts/SourceSansPro-Regular.ac.nosubrs.nohints.otf
new file mode 100644
index 0000000..69e244c
--- /dev/null
+++ b/test/api/fonts/SourceSansPro-Regular.ac.nosubrs.nohints.otf
Binary files differ
diff --git a/test/api/fonts/SourceSansPro-Regular.ac.nosubrs.otf b/test/api/fonts/SourceSansPro-Regular.ac.nosubrs.otf
new file mode 100644
index 0000000..28edf13
--- /dev/null
+++ b/test/api/fonts/SourceSansPro-Regular.ac.nosubrs.otf
Binary files differ
diff --git a/test/api/fonts/SourceSansPro-Regular.ac.otf b/test/api/fonts/SourceSansPro-Regular.ac.otf
new file mode 100644
index 0000000..12d6d0f
--- /dev/null
+++ b/test/api/fonts/SourceSansPro-Regular.ac.otf
Binary files differ
diff --git a/test/api/fonts/aat-feat.ttf b/test/api/fonts/aat-feat.ttf
new file mode 100644
index 0000000..1ff99a2
--- /dev/null
+++ b/test/api/fonts/aat-feat.ttf
Binary files differ
diff --git a/test/api/fonts/aat-morx.ttf b/test/api/fonts/aat-morx.ttf
new file mode 100644
index 0000000..5827ec5
--- /dev/null
+++ b/test/api/fonts/aat-morx.ttf
Binary files differ
diff --git a/test/api/fonts/aat-trak.ttf b/test/api/fonts/aat-trak.ttf
new file mode 100644
index 0000000..07ae3af
--- /dev/null
+++ b/test/api/fonts/aat-trak.ttf
Binary files differ
diff --git a/test/api/fonts/base.ttf b/test/api/fonts/base.ttf
new file mode 100644
index 0000000..d984966
--- /dev/null
+++ b/test/api/fonts/base.ttf
Binary files differ
diff --git a/test/api/fonts/cff1_dotsect.nohints.otf b/test/api/fonts/cff1_dotsect.nohints.otf
new file mode 100644
index 0000000..faa932e
--- /dev/null
+++ b/test/api/fonts/cff1_dotsect.nohints.otf
Binary files differ
diff --git a/test/api/fonts/cff1_dotsect.otf b/test/api/fonts/cff1_dotsect.otf
new file mode 100644
index 0000000..dabd4b3
--- /dev/null
+++ b/test/api/fonts/cff1_dotsect.otf
Binary files differ
diff --git a/test/api/fonts/cff1_expert.2D,F6E9,FB00.otf b/test/api/fonts/cff1_expert.2D,F6E9,FB00.otf
new file mode 100644
index 0000000..8c198b7
--- /dev/null
+++ b/test/api/fonts/cff1_expert.2D,F6E9,FB00.otf
Binary files differ
diff --git a/test/api/fonts/cff1_expert.otf b/test/api/fonts/cff1_expert.otf
new file mode 100644
index 0000000..970ed67
--- /dev/null
+++ b/test/api/fonts/cff1_expert.otf
Binary files differ
diff --git a/test/api/fonts/cff1_flex.otf b/test/api/fonts/cff1_flex.otf
new file mode 100644
index 0000000..1ef59e1
--- /dev/null
+++ b/test/api/fonts/cff1_flex.otf
Binary files differ
diff --git a/test/api/fonts/cff1_seac.C0.otf b/test/api/fonts/cff1_seac.C0.otf
new file mode 100644
index 0000000..aed2fdd
--- /dev/null
+++ b/test/api/fonts/cff1_seac.C0.otf
Binary files differ
diff --git a/test/api/fonts/cff1_seac.otf b/test/api/fonts/cff1_seac.otf
new file mode 100644
index 0000000..bc7991c
--- /dev/null
+++ b/test/api/fonts/cff1_seac.otf
Binary files differ
diff --git a/test/api/fonts/chromacheck-cbdt.ttf b/test/api/fonts/chromacheck-cbdt.ttf
new file mode 100644
index 0000000..100c01a
--- /dev/null
+++ b/test/api/fonts/chromacheck-cbdt.ttf
Binary files differ
diff --git a/test/api/fonts/chromacheck-colr.ttf b/test/api/fonts/chromacheck-colr.ttf
new file mode 100644
index 0000000..626809c
--- /dev/null
+++ b/test/api/fonts/chromacheck-colr.ttf
Binary files differ
diff --git a/test/api/fonts/chromacheck-sbix.ttf b/test/api/fonts/chromacheck-sbix.ttf
new file mode 100644
index 0000000..b6f1fe9
--- /dev/null
+++ b/test/api/fonts/chromacheck-sbix.ttf
Binary files differ
diff --git a/test/api/fonts/chromacheck-svg.ttf b/test/api/fonts/chromacheck-svg.ttf
new file mode 100644
index 0000000..d39cc56
--- /dev/null
+++ b/test/api/fonts/chromacheck-svg.ttf
Binary files differ
diff --git a/test/api/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5658272078495744 b/test/api/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5658272078495744
new file mode 100644
index 0000000..f3fa938
--- /dev/null
+++ b/test/api/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5658272078495744
Binary files differ
diff --git a/test/shaping/data/in-house/fonts/e90374e5e439e00725b4fe7a8d73db57c5a97f82.ttf b/test/api/fonts/cpal-v0.ttf
index 66a9001..66a9001 100644
--- a/test/shaping/data/in-house/fonts/e90374e5e439e00725b4fe7a8d73db57c5a97f82.ttf
+++ b/test/api/fonts/cpal-v0.ttf
Binary files differ
diff --git a/test/shaping/data/in-house/fonts/319f5d7ebffbefc5c5e6569f8cea73444d7a7268.ttf b/test/api/fonts/cpal-v1.ttf
index 53044b7..53044b7 100644
--- a/test/shaping/data/in-house/fonts/319f5d7ebffbefc5c5e6569f8cea73444d7a7268.ttf
+++ b/test/api/fonts/cpal-v1.ttf
Binary files differ
diff --git a/test/api/fonts/cv01.otf b/test/api/fonts/cv01.otf
new file mode 100644
index 0000000..01dbf01
--- /dev/null
+++ b/test/api/fonts/cv01.otf
Binary files differ
diff --git a/test/api/fonts/lcar.ttf b/test/api/fonts/lcar.ttf
new file mode 100644
index 0000000..4d17663
--- /dev/null
+++ b/test/api/fonts/lcar.ttf
Binary files differ
diff --git a/test/api/hb-subset-test.h b/test/api/hb-subset-test.h
index c34f394..cefa4e0 100644
--- a/test/api/hb-subset-test.h
+++ b/test/api/hb-subset-test.h
@@ -47,18 +47,6 @@ typedef short bool;
HB_BEGIN_DECLS
-static inline hb_face_t *
-hb_subset_test_open_font (const char *font_path)
-{
-#if GLIB_CHECK_VERSION(2,37,2)
- char* path = g_test_build_filename(G_TEST_DIST, font_path, NULL);
-#else
- char* path = g_strdup(font_path);
-#endif
-
- return hb_face_create (hb_blob_create_from_file (path), 0);
-}
-
static inline hb_subset_input_t *
hb_subset_test_create_input(const hb_set_t *codepoints)
{
@@ -72,11 +60,9 @@ static inline hb_face_t *
hb_subset_test_create_subset (hb_face_t *source,
hb_subset_input_t *input)
{
- hb_subset_profile_t *profile = hb_subset_profile_create();
- hb_face_t *subset = hb_subset (source, profile, input);
+ hb_face_t *subset = hb_subset (source, input);
g_assert (subset);
- hb_subset_profile_destroy (profile);
hb_subset_input_destroy (input);
return subset;
}
@@ -87,7 +73,7 @@ hb_subset_test_check (hb_face_t *expected,
hb_tag_t table)
{
hb_blob_t *expected_blob, *actual_blob;
- fprintf(stderr, "compare %c%c%c%c\n", HB_UNTAG(table));
+ //fprintf(stderr, "comparing %c%c%c%c ", HB_UNTAG(table));
expected_blob = hb_face_reference_table (expected, table);
actual_blob = hb_face_reference_table (actual, table);
hb_test_assert_blobs_equal (expected_blob, actual_blob);
diff --git a/test/api/hb-test.h b/test/api/hb-test.h
index 307845f..872f45c 100644
--- a/test/api/hb-test.h
+++ b/test/api/hb-test.h
@@ -42,6 +42,7 @@ HB_BEGIN_DECLS
/* Just in case */
#undef G_DISABLE_ASSERT
+#define HB_UNUSED G_GNUC_UNUSED
/* Misc */
@@ -276,6 +277,28 @@ G_STMT_START { \
} G_STMT_END
+static inline hb_face_t *
+hb_test_open_font_file (const char *font_path)
+{
+#if GLIB_CHECK_VERSION(2,37,2)
+ char *path = g_test_build_filename (G_TEST_DIST, font_path, NULL);
+#else
+ char *path = g_strdup (font_path);
+#endif
+
+ hb_blob_t *blob = hb_blob_create_from_file (path);
+ hb_face_t *face;
+ if (hb_blob_get_length (blob) == 0)
+ g_error ("Font %s not found.", path);
+
+ face = hb_face_create (blob, 0);
+ hb_blob_destroy (blob);
+
+ g_free (path);
+
+ return face;
+}
+
HB_END_DECLS
#endif /* HB_TEST_H */
diff --git a/test/api/test-aat-layout.c b/test/api/test-aat-layout.c
new file mode 100644
index 0000000..1384556
--- /dev/null
+++ b/test/api/test-aat-layout.c
@@ -0,0 +1,133 @@
+/*
+ * Copyright © 2018 Google, Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ */
+
+#include "hb-test.h"
+
+#include <hb.h>
+#include <hb-ot.h>
+#include <hb-aat.h>
+
+/* Unit tests for hb-aat.h */
+
+static hb_face_t *face;
+static hb_face_t *sbix;
+
+static void
+test_aat_get_feature_types (void)
+{
+ hb_aat_layout_feature_type_t features[3];
+ unsigned int count = 3;
+ g_assert_cmpuint (11, ==, hb_aat_layout_get_feature_types (face, 0, &count, features));
+
+ g_assert_cmpuint (1, ==, features[0]);
+ g_assert_cmpuint (3, ==, features[1]);
+ g_assert_cmpuint (6, ==, features[2]);
+
+ g_assert_cmpuint (258, ==, hb_aat_layout_feature_type_get_name_id (face, features[0]));
+ g_assert_cmpuint (261, ==, hb_aat_layout_feature_type_get_name_id (face, features[1]));
+ g_assert_cmpuint (265, ==, hb_aat_layout_feature_type_get_name_id (face, features[2]));
+}
+
+static void
+test_aat_get_feature_selectors (void)
+{
+ unsigned int default_index;
+ hb_aat_layout_feature_selector_info_t settings[3];
+ unsigned int count = 3;
+
+ g_assert_cmpuint (4, ==, hb_aat_layout_feature_type_get_selector_infos (face,
+ HB_AAT_LAYOUT_FEATURE_TYPE_DESIGN_COMPLEXITY_TYPE,
+ 0, &count, settings,
+ &default_index));
+ g_assert_cmpuint (3, ==, count);
+ g_assert_cmpuint (0, ==, default_index);
+
+ g_assert_cmpuint (0, ==, settings[0].enable);
+ g_assert_cmpuint (294, ==, settings[0].name_id);
+
+ g_assert_cmpuint (1, ==, settings[1].enable);
+ g_assert_cmpuint (295, ==, settings[1].name_id);
+
+ g_assert_cmpuint (2, ==, settings[2].enable);
+ g_assert_cmpuint (296, ==, settings[2].name_id);
+
+ count = 3;
+ g_assert_cmpuint (4, ==, hb_aat_layout_feature_type_get_selector_infos (face,
+ HB_AAT_LAYOUT_FEATURE_TYPE_DESIGN_COMPLEXITY_TYPE,
+ 3, &count, settings,
+ &default_index));
+ g_assert_cmpuint (1, ==, count);
+ g_assert_cmpuint (0, ==, default_index);
+
+ g_assert_cmpuint (3, ==, settings[0].enable);
+ g_assert_cmpuint (297, ==, settings[0].name_id);
+
+ count = 1;
+ g_assert_cmpuint (1, ==, hb_aat_layout_feature_type_get_selector_infos (face,
+ HB_AAT_LAYOUT_FEATURE_TYPE_TYPOGRAPHIC_EXTRAS,
+ 0, &count, settings,
+ &default_index));
+ g_assert_cmpuint (1, ==, count);
+ g_assert_cmpuint (HB_AAT_LAYOUT_NO_SELECTOR_INDEX, ==, default_index);
+
+ g_assert_cmpuint (8, ==, settings[0].enable);
+ g_assert_cmpuint (308, ==, settings[0].name_id);
+
+ count = 100;
+ g_assert_cmpuint (0, ==, hb_aat_layout_feature_type_get_selector_infos (face, HB_AAT_LAYOUT_FEATURE_TYPE_INVALID,
+ 0, &count, settings,
+ NULL));
+ g_assert_cmpuint (0, ==, count);
+}
+
+static void
+test_aat_has (void)
+{
+ hb_face_t *morx = hb_test_open_font_file ("fonts/aat-morx.ttf");
+ hb_face_t *trak;
+ g_assert (hb_aat_layout_has_substitution (morx));
+ hb_face_destroy (morx);
+
+ trak = hb_test_open_font_file ("fonts/aat-trak.ttf");
+ g_assert (hb_aat_layout_has_tracking (trak));
+ hb_face_destroy (trak);
+}
+
+int
+main (int argc, char **argv)
+{
+ unsigned int status;
+ hb_test_init (&argc, &argv);
+
+ hb_test_add (test_aat_get_feature_types);
+ hb_test_add (test_aat_get_feature_selectors);
+ hb_test_add (test_aat_has);
+
+ face = hb_test_open_font_file ("fonts/aat-feat.ttf");
+ sbix = hb_test_open_font_file ("fonts/chromacheck-sbix.ttf");
+ status = hb_test_run ();
+ hb_face_destroy (sbix);
+ hb_face_destroy (face);
+ return status;
+}
diff --git a/test/api/test-baseline.c b/test/api/test-baseline.c
new file mode 100644
index 0000000..a120e14
--- /dev/null
+++ b/test/api/test-baseline.c
@@ -0,0 +1,58 @@
+/*
+ * Copyright © 2018 Ebrahim Byagowi
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ */
+
+#include "hb-test.h"
+
+#include <hb-ot.h>
+
+/* Unit tests for hb-ot-layout.h baseline */
+
+static void
+test_ot_layout_base (void)
+{
+ hb_face_t *face = hb_test_open_font_file ("fonts/base.ttf");
+ hb_font_t *font = hb_font_create (face);
+
+#if 0
+ hb_position_t position;
+ g_assert (hb_ot_layout_get_baseline (font, HB_OT_LAYOUT_BASELINE_ICFB, HB_DIRECTION_TTB,
+ HB_TAG ('h','a','n','i'),
+ HB_TAG ('E','N','G',' '),
+ &position));
+ g_assert_cmpint (46, ==, position);
+#endif
+
+ hb_font_destroy (font);
+ hb_face_destroy (face);
+}
+
+int
+main (int argc, char **argv)
+{
+ hb_test_init (&argc, &argv);
+
+ hb_test_add (test_ot_layout_base);
+
+ return hb_test_run();
+}
diff --git a/test/api/test-blob.c b/test/api/test-blob.c
index d566f4e..7914a26 100644
--- a/test/api/test-blob.c
+++ b/test/api/test-blob.c
@@ -195,7 +195,7 @@ fixture_init (fixture_t *fixture, gconstpointer user_data)
}
static void
-fixture_finish (fixture_t *fixture, gconstpointer user_data)
+fixture_finish (fixture_t *fixture, gconstpointer user_data HB_UNUSED)
{
hb_blob_destroy (fixture->blob);
g_assert_cmpint (fixture->freed, ==, 1);
diff --git a/test/api/test-buffer.c b/test/api/test-buffer.c
index 5c98a9a..64ab3db 100644
--- a/test/api/test-buffer.c
+++ b/test/api/test-buffer.c
@@ -92,14 +92,14 @@ fixture_init (fixture_t *fixture, gconstpointer user_data)
}
static void
-fixture_finish (fixture_t *fixture, gconstpointer user_data)
+fixture_finish (fixture_t *fixture, gconstpointer user_data HB_UNUSED)
{
hb_buffer_destroy (fixture->buffer);
}
static void
-test_buffer_properties (fixture_t *fixture, gconstpointer user_data)
+test_buffer_properties (fixture_t *fixture, gconstpointer user_data HB_UNUSED)
{
hb_buffer_t *b = fixture->buffer;
hb_unicode_funcs_t *ufuncs;
@@ -294,7 +294,7 @@ test_buffer_contents (fixture_t *fixture, gconstpointer user_data)
}
static void
-test_buffer_positions (fixture_t *fixture, gconstpointer user_data)
+test_buffer_positions (fixture_t *fixture, gconstpointer user_data HB_UNUSED)
{
hb_buffer_t *b = fixture->buffer;
unsigned int i, len, len2;
@@ -319,7 +319,7 @@ test_buffer_positions (fixture_t *fixture, gconstpointer user_data)
}
static void
-test_buffer_allocation (fixture_t *fixture, gconstpointer user_data)
+test_buffer_allocation (fixture_t *fixture, gconstpointer user_data HB_UNUSED)
{
hb_buffer_t *b = fixture->buffer;
@@ -379,14 +379,15 @@ static void
test_buffer_utf8_conversion (void)
{
hb_buffer_t *b;
- hb_glyph_info_t *glyphs;
- unsigned int bytes, chars, i, j, len;
+ unsigned int chars, i, j, len;
b = hb_buffer_create ();
hb_buffer_set_replacement_codepoint (b, (hb_codepoint_t) -1);
for (i = 0; i < G_N_ELEMENTS (utf8_conversion_tests); i++)
{
+ unsigned int bytes;
+ hb_glyph_info_t *glyphs;
const utf8_conversion_test_t *test = &utf8_conversion_tests[i];
char *escaped;
diff --git a/test/api/test-c.c b/test/api/test-c.c
index 4b43b83..b4518ad 100644
--- a/test/api/test-c.c
+++ b/test/api/test-c.c
@@ -32,6 +32,8 @@
#endif
#include <hb.h>
+#include <hb-ot.h>
+#include <hb-aat.h>
#ifdef HAVE_GLIB
#include <hb-glib.h>
@@ -45,10 +47,6 @@
#include <hb-ft.h>
#endif
-#ifdef HAVE_OT
-#include <hb-ot.h>
-#endif
-
#ifdef HAVE_UNISCRIBE
#include <hb-uniscribe.h>
#endif
@@ -58,7 +56,7 @@
#endif
int
-main (int argc, char **argv)
+main (void)
{
return !*hb_shape_list_shapers ();
}
diff --git a/test/api/test-subset-codepoints.c b/test/api/test-collect-unicodes.c
index 3bd1fe0..50965a9 100644
--- a/test/api/test-subset-codepoints.c
+++ b/test/api/test-collect-unicodes.c
@@ -28,14 +28,15 @@
#include "hb-subset-test.h"
static void
-test_get_all_codepoints_format4 (void)
+test_collect_unicodes_format4 (void)
{
- hb_face_t *face = hb_subset_test_open_font("fonts/Roboto-Regular.abc.format4.ttf");
+ hb_face_t *face = hb_test_open_font_file ("fonts/Roboto-Regular.abc.format4.ttf");
hb_set_t *codepoints = hb_set_create();
+ hb_codepoint_t cp;
- hb_subset_get_all_codepoints (face, codepoints);
+ hb_face_collect_unicodes (face, codepoints);
- hb_codepoint_t cp = HB_SET_VALUE_INVALID;
+ cp = HB_SET_VALUE_INVALID;
g_assert (hb_set_next (codepoints, &cp));
g_assert_cmpuint (0x61, ==, cp);
g_assert (hb_set_next (codepoints, &cp));
@@ -49,14 +50,15 @@ test_get_all_codepoints_format4 (void)
}
static void
-test_get_all_codepoints_format12 (void)
+test_collect_unicodes_format12 (void)
{
- hb_face_t *face = hb_subset_test_open_font("fonts/Roboto-Regular.abc.format12.ttf");
+ hb_face_t *face = hb_test_open_font_file ("fonts/Roboto-Regular.abc.format12.ttf");
hb_set_t *codepoints = hb_set_create();
+ hb_codepoint_t cp;
- hb_subset_get_all_codepoints (face, codepoints);
+ hb_face_collect_unicodes (face, codepoints);
- hb_codepoint_t cp = HB_SET_VALUE_INVALID;
+ cp = HB_SET_VALUE_INVALID;
g_assert (hb_set_next (codepoints, &cp));
g_assert_cmpuint (0x61, ==, cp);
g_assert (hb_set_next (codepoints, &cp));
@@ -70,14 +72,15 @@ test_get_all_codepoints_format12 (void)
}
static void
-test_get_all_codepoints (void)
+test_collect_unicodes (void)
{
- hb_face_t *face = hb_subset_test_open_font("fonts/Roboto-Regular.abc.ttf");
+ hb_face_t *face = hb_test_open_font_file ("fonts/Roboto-Regular.abc.ttf");
hb_set_t *codepoints = hb_set_create();
+ hb_codepoint_t cp;
- hb_subset_get_all_codepoints (face, codepoints);
+ hb_face_collect_unicodes (face, codepoints);
- hb_codepoint_t cp = HB_SET_VALUE_INVALID;
+ cp = HB_SET_VALUE_INVALID;
g_assert (hb_set_next (codepoints, &cp));
g_assert_cmpuint (0x61, ==, cp);
g_assert (hb_set_next (codepoints, &cp));
@@ -95,9 +98,9 @@ main (int argc, char **argv)
{
hb_test_init (&argc, &argv);
- hb_test_add (test_get_all_codepoints);
- hb_test_add (test_get_all_codepoints_format4);
- hb_test_add (test_get_all_codepoints_format12);
+ hb_test_add (test_collect_unicodes);
+ hb_test_add (test_collect_unicodes_format4);
+ hb_test_add (test_collect_unicodes_format12);
return hb_test_run();
}
diff --git a/test/api/test-common.c b/test/api/test-common.c
index f6f0d48..e9fae13 100644
--- a/test/api/test-common.c
+++ b/test/api/test-common.c
@@ -32,7 +32,6 @@
static void
test_types_int (void)
{
- /* We already ASSERT_STATIC these in hb-private.h, but anyway */
g_assert_cmpint (sizeof (int8_t), ==, 1);
g_assert_cmpint (sizeof (uint8_t), ==, 1);
g_assert_cmpint (sizeof (int16_t), ==, 2);
diff --git a/test/api/test-font.c b/test/api/test-font.c
index 527dfcd..6690194 100644
--- a/test/api/test-font.c
+++ b/test/api/test-font.c
@@ -83,7 +83,7 @@ free_up (void *user_data)
}
static hb_blob_t *
-get_table (hb_face_t *face, hb_tag_t tag, void *user_data)
+get_table (hb_face_t *face HB_UNUSED, hb_tag_t tag, void *user_data HB_UNUSED)
{
if (tag == HB_TAG ('a','b','c','d'))
return hb_blob_create (test_data, sizeof (test_data), HB_MEMORY_MODE_READONLY, NULL, NULL);
@@ -210,10 +210,10 @@ test_fontfuncs_nil (void)
}
static hb_bool_t
-contour_point_func1 (hb_font_t *font, void *font_data,
- hb_codepoint_t glyph, unsigned int point_index,
+contour_point_func1 (hb_font_t *font HB_UNUSED, void *font_data HB_UNUSED,
+ hb_codepoint_t glyph, unsigned int point_index HB_UNUSED,
hb_position_t *x, hb_position_t *y,
- void *user_data)
+ void *user_data HB_UNUSED)
{
if (glyph == 1) {
*x = 2;
@@ -230,10 +230,10 @@ contour_point_func1 (hb_font_t *font, void *font_data,
}
static hb_bool_t
-contour_point_func2 (hb_font_t *font, void *font_data,
+contour_point_func2 (hb_font_t *font, void *font_data HB_UNUSED,
hb_codepoint_t glyph, unsigned int point_index,
hb_position_t *x, hb_position_t *y,
- void *user_data)
+ void *user_data HB_UNUSED)
{
if (glyph == 1) {
*x = 6;
@@ -246,9 +246,9 @@ contour_point_func2 (hb_font_t *font, void *font_data,
}
static hb_position_t
-glyph_h_advance_func1 (hb_font_t *font, void *font_data,
+glyph_h_advance_func1 (hb_font_t *font HB_UNUSED, void *font_data HB_UNUSED,
hb_codepoint_t glyph,
- void *user_data)
+ void *user_data HB_UNUSED)
{
if (glyph == 1)
return 8;
@@ -361,8 +361,74 @@ test_fontfuncs_subclassing (void)
hb_font_destroy (font3);
+ hb_font_destroy (font2);
+}
+
+static hb_bool_t
+nominal_glyph_func (hb_font_t *font HB_UNUSED,
+ void *font_data HB_UNUSED,
+ hb_codepoint_t unicode HB_UNUSED,
+ hb_codepoint_t *glyph,
+ void *user_data HB_UNUSED)
+{
+ *glyph = 0;
+ return FALSE;
+}
+
+static unsigned int
+nominal_glyphs_func (hb_font_t *font HB_UNUSED,
+ void *font_data HB_UNUSED,
+ unsigned int count HB_UNUSED,
+ const hb_codepoint_t *first_unicode HB_UNUSED,
+ unsigned int unicode_stride HB_UNUSED,
+ hb_codepoint_t *first_glyph HB_UNUSED,
+ unsigned int glyph_stride HB_UNUSED,
+ void *user_data HB_UNUSED)
+{
+ return 0;
}
+static void
+test_fontfuncs_parallels (void)
+{
+ hb_blob_t *blob;
+ hb_face_t *face;
+
+ hb_font_funcs_t *ffuncs1;
+ hb_font_funcs_t *ffuncs2;
+
+ hb_font_t *font0;
+ hb_font_t *font1;
+ hb_font_t *font2;
+ hb_codepoint_t glyph;
+
+ blob = hb_blob_create (test_data, sizeof (test_data), HB_MEMORY_MODE_READONLY, NULL, NULL);
+ face = hb_face_create (blob, 0);
+ hb_blob_destroy (blob);
+ font0 = hb_font_create (face);
+ hb_face_destroy (face);
+
+ /* setup sub-font1 */
+ font1 = hb_font_create_sub_font (font0);
+ hb_font_destroy (font0);
+ ffuncs1 = hb_font_funcs_create ();
+ hb_font_funcs_set_nominal_glyph_func (ffuncs1, nominal_glyph_func, NULL, NULL);
+ hb_font_set_funcs (font1, ffuncs1, NULL, NULL);
+ hb_font_funcs_destroy (ffuncs1);
+
+ /* setup sub-font2 */
+ font2 = hb_font_create_sub_font (font1);
+ hb_font_destroy (font1);
+ ffuncs2 = hb_font_funcs_create ();
+ hb_font_funcs_set_nominal_glyphs_func (ffuncs1, nominal_glyphs_func, NULL, NULL);
+ hb_font_set_funcs (font2, ffuncs2, NULL, NULL);
+ hb_font_funcs_destroy (ffuncs2);
+
+ /* Just test that calling get_nominal_glyph doesn't infinite-loop. */
+ hb_font_get_nominal_glyph (font2, 0x0020u, &glyph);
+
+ hb_font_destroy (font2);
+}
static void
test_font_empty (void)
@@ -470,6 +536,11 @@ test_font_properties (void)
g_assert_cmpint (x_ppem, ==, 17);
g_assert_cmpint (y_ppem, ==, 19);
+ /* Check ptem */
+ g_assert_cmpint (hb_font_get_ptem (font), ==, 0);
+ hb_font_set_ptem (font, 42);
+ g_assert_cmpint (hb_font_get_ptem (font), ==, 42);
+
/* Check immutable */
@@ -542,6 +613,7 @@ main (int argc, char **argv)
hb_test_add (test_fontfuncs_empty);
hb_test_add (test_fontfuncs_nil);
hb_test_add (test_fontfuncs_subclassing);
+ hb_test_add (test_fontfuncs_parallels);
hb_test_add (test_font_empty);
hb_test_add (test_font_properties);
diff --git a/test/api/test-map.c b/test/api/test-map.c
new file mode 100644
index 0000000..0911991
--- /dev/null
+++ b/test/api/test-map.c
@@ -0,0 +1,117 @@
+/*
+ * Copyright © 2018 Ebrahim Byagowi
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ */
+
+#include "hb-test.h"
+
+/* Unit tests for hb-map.h */
+
+
+static void
+test_map_basic (void)
+{
+ hb_map_t *empty = hb_map_get_empty ();
+ hb_map_t *m;
+ g_assert (hb_map_is_empty (empty));
+ g_assert (!hb_map_allocation_successful (empty));
+ hb_map_destroy (empty);
+
+ m = hb_map_create ();
+ g_assert (hb_map_allocation_successful (m));
+ g_assert (hb_map_is_empty (m));
+
+ hb_map_set (m, 213, 223);
+ hb_map_set (m, 643, 675);
+ g_assert_cmpint (hb_map_get_population (m), ==, 2);
+
+ g_assert_cmpint (hb_map_get (m, 213), ==, 223);
+ g_assert (!hb_map_has (m, 123));
+ g_assert (hb_map_has (m, 213));
+
+ hb_map_del (m, 213);
+ g_assert (!hb_map_has (m, 213));
+
+ g_assert_cmpint (hb_map_get (m, 643), ==, 675);
+ hb_map_set (m, 237, 673);
+ g_assert (hb_map_has (m, 237));
+ hb_map_clear (m);
+ g_assert (!hb_map_has (m, 237));
+ g_assert (!hb_map_has (m, 643));
+ g_assert_cmpint (hb_map_get_population (m), ==, 0);
+
+ hb_map_destroy (m);
+}
+
+static void
+test_map_userdata (void)
+{
+ hb_map_t *m = hb_map_create ();
+
+ hb_user_data_key_t key[2];
+ int *data = (int *) malloc (sizeof (int));
+ int *data2;
+ *data = 3123;
+ hb_map_set_user_data (m, &key[0], data, free, TRUE);
+ g_assert_cmpint (*((int *) hb_map_get_user_data (m, &key[0])), ==, 3123);
+
+ data2 = (int *) malloc (sizeof (int));
+ *data2 = 6343;
+ hb_map_set_user_data (m, &key[0], data2, free, FALSE);
+ g_assert_cmpint (*((int *) hb_map_get_user_data (m, &key[0])), ==, 3123);
+ hb_map_set_user_data (m, &key[0], data2, free, TRUE);
+ g_assert_cmpint (*((int *) hb_map_get_user_data (m, &key[0])), ==, 6343);
+
+ hb_map_destroy (m);
+}
+
+static void
+test_map_refcount (void)
+{
+ hb_map_t *m = hb_map_create ();
+ hb_map_t *m2;
+ hb_map_set (m, 213, 223);
+ g_assert_cmpint (hb_map_get (m, 213), ==, 223);
+
+ m2 = hb_map_reference (m);
+ hb_map_destroy (m);
+
+ /* We copied its reference so it is still usable after one destroy */
+ g_assert (hb_map_has (m, 213));
+ g_assert (hb_map_has (m2, 213));
+
+ hb_map_destroy (m2);
+
+ /* Now you can't access them anymore */
+}
+
+int
+main (int argc, char **argv)
+{
+ hb_test_init (&argc, &argv);
+
+ hb_test_add (test_map_basic);
+ hb_test_add (test_map_userdata);
+ hb_test_add (test_map_refcount);
+
+ return hb_test_run();
+}
diff --git a/test/api/test-multithread.c b/test/api/test-multithread.c
new file mode 100644
index 0000000..f946049
--- /dev/null
+++ b/test/api/test-multithread.c
@@ -0,0 +1,162 @@
+/*
+ * Copyright © 2018 Ebrahim Byagowi
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ */
+
+#include <pthread.h>
+
+#include <hb.h>
+#include <hb-ft.h>
+#include <hb-ot.h>
+
+#include "hb-test.h"
+
+static const char *font_path = "fonts/Inconsolata-Regular.abc.ttf";
+static const char *text = "abc";
+
+static int num_threads = 30;
+static int num_iters = 200;
+
+static hb_font_t *font;
+static hb_buffer_t *ref_buffer;
+
+static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
+
+static void
+fill_the_buffer (hb_buffer_t *buffer)
+{
+ hb_buffer_add_utf8 (buffer, text, -1, 0, -1);
+ hb_buffer_guess_segment_properties (buffer);
+ hb_shape (font, buffer, NULL, 0);
+}
+
+static void
+validity_check (hb_buffer_t *buffer) {
+ if (hb_buffer_diff (ref_buffer, buffer, (hb_codepoint_t) -1, 0))
+ {
+ fprintf (stderr, "One of the buffers was different from the reference.\n");
+ char out[255];
+
+ hb_buffer_serialize_glyphs (buffer, 0, hb_buffer_get_length (ref_buffer),
+ out, sizeof (out), NULL,
+ font, HB_BUFFER_SERIALIZE_FORMAT_TEXT,
+ HB_BUFFER_SERIALIZE_FLAG_NO_GLYPH_NAMES);
+ fprintf (stderr, "Actual: %s\n", out);
+
+ hb_buffer_serialize_glyphs (ref_buffer, 0, hb_buffer_get_length (ref_buffer),
+ out, sizeof (out), NULL,
+ font, HB_BUFFER_SERIALIZE_FORMAT_TEXT,
+ HB_BUFFER_SERIALIZE_FLAG_NO_GLYPH_NAMES);
+ fprintf (stderr, "Expected: %s\n", out);
+
+ exit (1);
+ }
+}
+
+static void *
+thread_func (void *data)
+{
+ hb_buffer_t *buffer = (hb_buffer_t *) data;
+
+ pthread_mutex_lock (&mutex);
+ pthread_mutex_unlock (&mutex);
+
+ int i;
+ for (i = 0; i < num_iters; i++)
+ {
+ hb_buffer_clear_contents (buffer);
+ fill_the_buffer (buffer);
+ validity_check (buffer);
+ }
+
+ return 0;
+}
+
+static void
+test_body (void)
+{
+ int i;
+ pthread_t *threads = calloc (num_threads, sizeof (pthread_t));
+ hb_buffer_t **buffers = calloc (num_threads, sizeof (hb_buffer_t *));
+
+ pthread_mutex_lock (&mutex);
+
+ for (i = 0; i < num_threads; i++)
+ {
+ hb_buffer_t *buffer = hb_buffer_create ();
+ buffers[i] = buffer;
+ pthread_create (&threads[i], NULL, thread_func, buffer);
+ }
+
+ /* Let them loose! */
+ pthread_mutex_unlock (&mutex);
+
+ for (i = 0; i < num_threads; i++)
+ {
+ pthread_join (threads[i], NULL);
+ hb_buffer_destroy (buffers[i]);
+ }
+
+ free (buffers);
+ free (threads);
+}
+
+int
+main (int argc, char **argv)
+{
+ hb_test_init (&argc, &argv);
+
+ char *path = argc > 1 && *argv[1] ? argv[1] : (char *) font_path;
+ if (argc > 2)
+ num_threads = atoi (argv[2]);
+ if (argc > 3)
+ num_iters = atoi (argv[3]);
+ if (argc > 4)
+ text = argv[4];
+
+ /* Dummy call to alleviate _guess_segment_properties thread safety-ness
+ * https://github.com/harfbuzz/harfbuzz/issues/1191 */
+ hb_language_get_default ();
+
+ hb_face_t *face = hb_test_open_font_file (path);
+ font = hb_font_create (face);
+
+ /* Fill the reference */
+ ref_buffer = hb_buffer_create ();
+ fill_the_buffer (ref_buffer);
+
+ /* Unnecessary, since version 2 it is ot-font by default */
+ hb_ot_font_set_funcs (font);
+ test_body ();
+
+ /* Test hb-ft in multithread */
+ hb_ft_font_set_funcs (font);
+ test_body ();
+
+ hb_buffer_destroy (ref_buffer);
+
+ hb_font_destroy (font);
+ hb_face_destroy (face);
+
+ return 0;
+}
diff --git a/test/api/test-object.c b/test/api/test-object.c
index 02b9760..093615e 100644
--- a/test/api/test-object.c
+++ b/test/api/test-object.c
@@ -235,7 +235,7 @@ test_object (void)
{
unsigned int j;
- data_t data[2] = {{MAGIC0, FALSE}, {MAGIC1, FALSE}};
+ data_t data[1000] = {{MAGIC0, FALSE}, {MAGIC1, FALSE}};
deadlock_test_t deadlock_test;
g_test_message ("Testing object %s", o->name);
diff --git a/test/api/test-ot-color.c b/test/api/test-ot-color.c
index 22584d2..c0cbd77 100644
--- a/test/api/test-ot-color.c
+++ b/test/api/test-ot-color.c
@@ -1,5 +1,6 @@
/*
* Copyright © 2016 Google, Inc.
+ * Copyright © 2018 Ebrahim Byagowi
*
* This is part of HarfBuzz, a text shaping library.
*
@@ -27,8 +28,6 @@
#include "hb-test.h"
#include <hb-ot.h>
-#include <stdlib.h>
-#include <stdio.h>
/* Unit tests for hb-ot-color.h */
@@ -98,138 +97,142 @@ static hb_face_t *cpal_v0 = NULL;
*/
static hb_face_t *cpal_v1 = NULL;
+static hb_face_t *cpal = NULL;
+static hb_face_t *cbdt = NULL;
+static hb_face_t *sbix = NULL;
+static hb_face_t *svg = NULL;
+static hb_face_t *empty = NULL;
#define assert_color_rgba(colors, i, r, g, b, a) G_STMT_START { \
- const hb_ot_color_t *_colors = (colors); \
+ const hb_color_t *_colors = (colors); \
const size_t _i = (i); \
const uint8_t red = (r), green = (g), blue = (b), alpha = (a); \
- if (_colors[_i].red != red) { \
+ if (hb_color_get_red (_colors[_i]) != red) { \
g_assertion_message_cmpnum (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, \
- "colors[" #i "].red", _colors[_i].red, "==", red, 'x'); \
+ "colors[" #i "]", _colors[_i], "==", red, 'x'); \
} \
- if (_colors[_i].green != green) { \
+ if (hb_color_get_green (_colors[_i]) != green) { \
g_assertion_message_cmpnum (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, \
- "colors[" #i "].green", _colors[_i].green, "==", green, 'x'); \
+ "colors[" #i "]", _colors[_i], "==", green, 'x'); \
} \
- if (_colors[_i].blue != blue) { \
+ if (hb_color_get_blue (_colors[_i]) != blue) { \
g_assertion_message_cmpnum (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, \
- "colors[" #i "].blue", colors[i].blue, "==", blue, 'x'); \
+ "colors[" #i "]", colors[_i], "==", blue, 'x'); \
} \
- if (_colors[_i].alpha != alpha) { \
+ if (hb_color_get_alpha (_colors[_i]) != alpha) { \
g_assertion_message_cmpnum (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, \
- "colors[" #i "].alpha", _colors[_i].alpha, "==", alpha, 'x'); \
+ "colors[" #i "]", _colors[_i], "==", alpha, 'x'); \
} \
} G_STMT_END
-#if 0
static void
-test_hb_ot_color_get_palette_count (void)
+test_hb_ot_color_palette_get_count (void)
{
- g_assert_cmpint (hb_ot_color_get_palette_count (hb_face_get_empty()), ==, 0);
- g_assert_cmpint (hb_ot_color_get_palette_count (cpal_v0), ==, 2);
- g_assert_cmpint (hb_ot_color_get_palette_count (cpal_v1), ==, 3);
+ g_assert_cmpint (hb_ot_color_palette_get_count (hb_face_get_empty()), ==, 0);
+ g_assert_cmpint (hb_ot_color_palette_get_count (cpal_v0), ==, 2);
+ g_assert_cmpint (hb_ot_color_palette_get_count (cpal_v1), ==, 3);
}
static void
-test_hb_ot_color_get_palette_name_id_empty (void)
+test_hb_ot_color_palette_get_name_id_empty (void)
{
/* numPalettes=0, so all calls are for out-of-bounds palette indices */
- g_assert_cmpint (hb_ot_color_get_palette_name_id (hb_face_get_empty(), 0), ==, 0xffff);
- g_assert_cmpint (hb_ot_color_get_palette_name_id (hb_face_get_empty(), 1), ==, 0xffff);
+ g_assert_cmpint (hb_ot_color_palette_get_name_id (hb_face_get_empty(), 0), ==, HB_OT_NAME_ID_INVALID);
+ g_assert_cmpint (hb_ot_color_palette_get_name_id (hb_face_get_empty(), 1), ==, HB_OT_NAME_ID_INVALID);
}
static void
-test_hb_ot_color_get_palette_name_id_v0 (void)
+test_hb_ot_color_palette_get_name_id_v0 (void)
{
- g_assert_cmpint (hb_ot_color_get_palette_name_id (cpal_v0, 0), ==, 0xffff);
- g_assert_cmpint (hb_ot_color_get_palette_name_id (cpal_v0, 1), ==, 0xffff);
+ g_assert_cmpint (hb_ot_color_palette_get_name_id (cpal_v0, 0), ==, HB_OT_NAME_ID_INVALID);
+ g_assert_cmpint (hb_ot_color_palette_get_name_id (cpal_v0, 1), ==, HB_OT_NAME_ID_INVALID);
/* numPalettes=2, so palette #2 is out of bounds */
- g_assert_cmpint (hb_ot_color_get_palette_name_id (cpal_v0, 2), ==, 0xffff);
+ g_assert_cmpint (hb_ot_color_palette_get_name_id (cpal_v0, 2), ==, HB_OT_NAME_ID_INVALID);
}
static void
-test_hb_ot_color_get_palette_name_id_v1 (void)
+test_hb_ot_color_palette_get_name_id_v1 (void)
{
- g_assert_cmpint (hb_ot_color_get_palette_name_id (cpal_v1, 0), ==, 257);
- g_assert_cmpint (hb_ot_color_get_palette_name_id (cpal_v1, 1), ==, 0xffff);
- g_assert_cmpint (hb_ot_color_get_palette_name_id (cpal_v1, 2), ==, 258);
+ g_assert_cmpint (hb_ot_color_palette_get_name_id (cpal_v1, 0), ==, 257);
+ g_assert_cmpint (hb_ot_color_palette_get_name_id (cpal_v1, 1), ==, HB_OT_NAME_ID_INVALID);
+ g_assert_cmpint (hb_ot_color_palette_get_name_id (cpal_v1, 2), ==, 258);
/* numPalettes=3, so palette #3 is out of bounds */
- g_assert_cmpint (hb_ot_color_get_palette_name_id (cpal_v1, 3), ==, 0xffff);
+ g_assert_cmpint (hb_ot_color_palette_get_name_id (cpal_v1, 3), ==, HB_OT_NAME_ID_INVALID);
}
+
static void
-test_hb_ot_color_get_palette_flags_empty (void)
+test_hb_ot_color_palette_get_flags_empty (void)
{
/* numPalettes=0, so all calls are for out-of-bounds palette indices */
- g_assert_cmpint (hb_ot_color_get_palette_flags (hb_face_get_empty(), 0), ==, HB_OT_COLOR_PALETTE_FLAG_DEFAULT);
- g_assert_cmpint (hb_ot_color_get_palette_flags (hb_face_get_empty(), 1), ==, HB_OT_COLOR_PALETTE_FLAG_DEFAULT);
+ g_assert_cmpint (hb_ot_color_palette_get_flags (hb_face_get_empty(), 0), ==, HB_OT_COLOR_PALETTE_FLAG_DEFAULT);
+ g_assert_cmpint (hb_ot_color_palette_get_flags (hb_face_get_empty(), 1), ==, HB_OT_COLOR_PALETTE_FLAG_DEFAULT);
}
static void
-test_hb_ot_color_get_palette_flags_v0 (void)
+test_hb_ot_color_palette_get_flags_v0 (void)
{
- g_assert_cmpint (hb_ot_color_get_palette_flags (cpal_v0, 0), ==, HB_OT_COLOR_PALETTE_FLAG_DEFAULT);
- g_assert_cmpint (hb_ot_color_get_palette_flags (cpal_v0, 1), ==, HB_OT_COLOR_PALETTE_FLAG_DEFAULT);
+ g_assert_cmpint (hb_ot_color_palette_get_flags (cpal_v0, 0), ==, HB_OT_COLOR_PALETTE_FLAG_DEFAULT);
+ g_assert_cmpint (hb_ot_color_palette_get_flags (cpal_v0, 1), ==, HB_OT_COLOR_PALETTE_FLAG_DEFAULT);
/* numPalettes=2, so palette #2 is out of bounds */
- g_assert_cmpint (hb_ot_color_get_palette_flags (cpal_v0, 2), ==, HB_OT_COLOR_PALETTE_FLAG_DEFAULT);
+ g_assert_cmpint (hb_ot_color_palette_get_flags (cpal_v0, 2), ==, HB_OT_COLOR_PALETTE_FLAG_DEFAULT);
}
static void
-test_hb_ot_color_get_palette_flags_v1 (void)
+test_hb_ot_color_palette_get_flags_v1 (void)
{
- g_assert_cmpint (hb_ot_color_get_palette_flags (cpal_v1, 0), ==, HB_OT_COLOR_PALETTE_FLAG_FOR_DARK_BACKGROUND);
- g_assert_cmpint (hb_ot_color_get_palette_flags (cpal_v1, 1), ==, HB_OT_COLOR_PALETTE_FLAG_FOR_LIGHT_BACKGROUND);
- g_assert_cmpint (hb_ot_color_get_palette_flags (cpal_v0, 2), ==, HB_OT_COLOR_PALETTE_FLAG_DEFAULT);
+ g_assert_cmpint (hb_ot_color_palette_get_flags (cpal_v1, 0), ==, HB_OT_COLOR_PALETTE_FLAG_USABLE_WITH_DARK_BACKGROUND);
+ g_assert_cmpint (hb_ot_color_palette_get_flags (cpal_v1, 1), ==, HB_OT_COLOR_PALETTE_FLAG_USABLE_WITH_LIGHT_BACKGROUND);
+ g_assert_cmpint (hb_ot_color_palette_get_flags (cpal_v0, 2), ==, HB_OT_COLOR_PALETTE_FLAG_DEFAULT);
/* numPalettes=3, so palette #3 is out of bounds */
- g_assert_cmpint (hb_ot_color_get_palette_flags (cpal_v0, 3), ==, HB_OT_COLOR_PALETTE_FLAG_DEFAULT);
+ g_assert_cmpint (hb_ot_color_palette_get_flags (cpal_v0, 3), ==, HB_OT_COLOR_PALETTE_FLAG_DEFAULT);
}
static void
-test_hb_ot_color_get_palette_colors_empty (void)
+test_hb_ot_color_palette_get_colors_empty (void)
{
- hb_face_t *empty = hb_face_get_empty ();
- g_assert_cmpint (hb_ot_color_get_palette_colors (empty, 0, 0, NULL, NULL), ==, 0);
+ g_assert_cmpint (hb_ot_color_palette_get_colors (empty, 0, 0, NULL, NULL), ==, 0);
}
static void
-test_hb_ot_color_get_palette_colors_v0 (void)
+test_hb_ot_color_palette_get_colors_v0 (void)
{
- unsigned int num_colors = hb_ot_color_get_palette_colors (cpal_v0, 0, 0, NULL, NULL);
- hb_ot_color_t *colors = (hb_ot_color_t*) alloca (num_colors * sizeof (hb_ot_color_t));
+ unsigned int num_colors = hb_ot_color_palette_get_colors (cpal_v0, 0, 0, NULL, NULL);
+ hb_color_t *colors = (hb_color_t*) alloca (num_colors * sizeof (hb_color_t));
size_t colors_size = num_colors * sizeof(*colors);
g_assert_cmpint (num_colors, ==, 2);
/* Palette #0, start_index=0 */
- g_assert_cmpint (hb_ot_color_get_palette_colors (cpal_v0, 0, 0, &num_colors, colors), ==, 2);
+ g_assert_cmpint (hb_ot_color_palette_get_colors (cpal_v0, 0, 0, &num_colors, colors), ==, 2);
g_assert_cmpint (num_colors, ==, 2);
assert_color_rgba (colors, 0, 0x00, 0x00, 0x00, 0xff);
assert_color_rgba (colors, 1, 0x66, 0xcc, 0xff, 0xff);
/* Palette #1, start_index=0 */
- g_assert_cmpint (hb_ot_color_get_palette_colors (cpal_v0, 1, 0, &num_colors, colors), ==, 2);
+ g_assert_cmpint (hb_ot_color_palette_get_colors (cpal_v0, 1, 0, &num_colors, colors), ==, 2);
g_assert_cmpint (num_colors, ==, 2);
assert_color_rgba (colors, 0, 0x00, 0x00, 0x00, 0xff);
assert_color_rgba (colors, 1, 0x80, 0x00, 0x00, 0xff);
/* Palette #2 (there are only #0 and #1 in the font, so this is out of bounds) */
- g_assert_cmpint (hb_ot_color_get_palette_colors (cpal_v0, 2, 0, &num_colors, colors), ==, 0);
+ g_assert_cmpint (hb_ot_color_palette_get_colors (cpal_v0, 2, 0, &num_colors, colors), ==, 0);
/* Palette #0, start_index=1 */
memset(colors, 0x33, colors_size);
num_colors = 2;
- g_assert_cmpint (hb_ot_color_get_palette_colors (cpal_v0, 0, 1, &num_colors, colors), ==, 2);
+ g_assert_cmpint (hb_ot_color_palette_get_colors (cpal_v0, 0, 1, &num_colors, colors), ==, 2);
g_assert_cmpint (num_colors, ==, 1);
assert_color_rgba (colors, 0, 0x66, 0xcc, 0xff, 0xff);
assert_color_rgba (colors, 1, 0x33, 0x33, 0x33, 0x33); /* untouched */
@@ -237,15 +240,15 @@ test_hb_ot_color_get_palette_colors_v0 (void)
/* Palette #0, start_index=0, pretend that we have only allocated space for 1 color */
memset(colors, 0x44, colors_size);
num_colors = 1;
- g_assert_cmpint (hb_ot_color_get_palette_colors (cpal_v0, 0, 0, &num_colors, colors), ==, 2);
+ g_assert_cmpint (hb_ot_color_palette_get_colors (cpal_v0, 0, 0, &num_colors, colors), ==, 2);
g_assert_cmpint (num_colors, ==, 1);
assert_color_rgba (colors, 0, 0x00, 0x00, 0x00, 0xff);
assert_color_rgba (colors, 1, 0x44, 0x44, 0x44, 0x44); /* untouched */
/* start_index > numPaletteEntries */
- memset(colors, 0x44, colors_size);
+ memset (colors, 0x44, colors_size);
num_colors = 2;
- g_assert_cmpint (hb_ot_color_get_palette_colors (cpal_v0, 0, 9876, &num_colors, colors), ==, 2);
+ g_assert_cmpint (hb_ot_color_palette_get_colors (cpal_v0, 0, 9876, &num_colors, colors), ==, 2);
g_assert_cmpint (num_colors, ==, 0);
assert_color_rgba (colors, 0, 0x44, 0x44, 0x44, 0x44); /* untouched */
assert_color_rgba (colors, 1, 0x44, 0x44, 0x44, 0x44); /* untouched */
@@ -253,46 +256,199 @@ test_hb_ot_color_get_palette_colors_v0 (void)
static void
-test_hb_ot_color_get_palette_colors_v1 (void)
+test_hb_ot_color_palette_get_colors_v1 (void)
{
- hb_ot_color_t colors[3];
- unsigned int num_colors = hb_ot_color_get_palette_colors (cpal_v1, 0, 0, NULL, NULL);
- size_t colors_size = 3 * sizeof(*colors);
+ hb_color_t colors[3];
+ unsigned int num_colors = hb_ot_color_palette_get_colors (cpal_v1, 0, 0, NULL, NULL);
+ size_t colors_size = 3 * sizeof (hb_color_t);
g_assert_cmpint (num_colors, ==, 2);
/* Palette #0, start_index=0 */
- memset(colors, 0x77, colors_size);
- g_assert_cmpint (hb_ot_color_get_palette_colors (cpal_v1, 0, 0, &num_colors, colors), ==, 2);
+ memset (colors, 0x77, colors_size);
+ g_assert_cmpint (hb_ot_color_palette_get_colors (cpal_v1, 0, 0, &num_colors, colors), ==, 2);
g_assert_cmpint (num_colors, ==, 2);
assert_color_rgba (colors, 0, 0x00, 0x00, 0x00, 0xff);
assert_color_rgba (colors, 1, 0x66, 0xcc, 0xff, 0xff);
assert_color_rgba (colors, 2, 0x77, 0x77, 0x77, 0x77); /* untouched */
/* Palette #1, start_index=0 */
- memset(colors, 0x77, colors_size);
- g_assert_cmpint (hb_ot_color_get_palette_colors (cpal_v1, 1, 0, &num_colors, colors), ==, 2);
+ memset (colors, 0x77, colors_size);
+ g_assert_cmpint (hb_ot_color_palette_get_colors (cpal_v1, 1, 0, &num_colors, colors), ==, 2);
g_assert_cmpint (num_colors, ==, 2);
assert_color_rgba (colors, 0, 0x00, 0x00, 0x00, 0xff);
assert_color_rgba (colors, 1, 0xff, 0xcc, 0x66, 0xff);
assert_color_rgba (colors, 2, 0x77, 0x77, 0x77, 0x77); /* untouched */
/* Palette #2, start_index=0 */
- memset(colors, 0x77, colors_size);
- g_assert_cmpint (hb_ot_color_get_palette_colors (cpal_v1, 2, 0, &num_colors, colors), ==, 2);
+ memset (colors, 0x77, colors_size);
+ g_assert_cmpint (hb_ot_color_palette_get_colors (cpal_v1, 2, 0, &num_colors, colors), ==, 2);
g_assert_cmpint (num_colors, ==, 2);
assert_color_rgba (colors, 0, 0x00, 0x00, 0x00, 0xff);
assert_color_rgba (colors, 1, 0x80, 0x00, 0x00, 0xff);
assert_color_rgba (colors, 2, 0x77, 0x77, 0x77, 0x77); /* untouched */
/* Palette #3 (out of bounds), start_index=0 */
- memset(colors, 0x77, colors_size);
- g_assert_cmpint (hb_ot_color_get_palette_colors (cpal_v1, 3, 0, &num_colors, colors), ==, 0);
+ memset (colors, 0x77, colors_size);
+ g_assert_cmpint (hb_ot_color_palette_get_colors (cpal_v1, 3, 0, &num_colors, colors), ==, 0);
g_assert_cmpint (num_colors, ==, 0);
assert_color_rgba (colors, 0, 0x77, 0x77, 0x77, 0x77); /* untouched */
assert_color_rgba (colors, 1, 0x77, 0x77, 0x77, 0x77); /* untouched */
assert_color_rgba (colors, 2, 0x77, 0x77, 0x77, 0x77); /* untouched */
}
-#endif
+
+
+static void
+test_hb_ot_color_palette_color_get_name_id (void)
+{
+ g_assert_cmpuint (hb_ot_color_palette_color_get_name_id (empty, 0), ==, HB_OT_NAME_ID_INVALID);
+ g_assert_cmpuint (hb_ot_color_palette_color_get_name_id (empty, 1), ==, HB_OT_NAME_ID_INVALID);
+ g_assert_cmpuint (hb_ot_color_palette_color_get_name_id (empty, 2), ==, HB_OT_NAME_ID_INVALID);
+ g_assert_cmpuint (hb_ot_color_palette_color_get_name_id (cpal_v0, 0), ==, HB_OT_NAME_ID_INVALID);
+ g_assert_cmpuint (hb_ot_color_palette_color_get_name_id (cpal_v0, 1), ==, HB_OT_NAME_ID_INVALID);
+ g_assert_cmpuint (hb_ot_color_palette_color_get_name_id (cpal_v0, 2), ==, HB_OT_NAME_ID_INVALID);
+ g_assert_cmpuint (hb_ot_color_palette_color_get_name_id (cpal_v1, 0), ==, HB_OT_NAME_ID_INVALID);
+ g_assert_cmpuint (hb_ot_color_palette_color_get_name_id (cpal_v1, 1), ==, 256);
+ g_assert_cmpuint (hb_ot_color_palette_color_get_name_id (cpal_v1, 2), ==, HB_OT_NAME_ID_INVALID);
+}
+
+
+static void
+test_hb_ot_color_glyph_get_layers (void)
+{
+ hb_ot_color_layer_t layers[1];
+ unsigned int count = 1;
+ unsigned int num_layers;
+
+ g_assert_cmpuint (hb_ot_color_glyph_get_layers (cpal_v1, 0, 0,
+ NULL, NULL), ==, 0);
+ g_assert_cmpuint (hb_ot_color_glyph_get_layers (cpal_v1, 1, 0,
+ NULL, NULL), ==, 0);
+ g_assert_cmpuint (hb_ot_color_glyph_get_layers (cpal_v1, 2, 0,
+ NULL, NULL), ==, 2);
+
+ num_layers = hb_ot_color_glyph_get_layers (cpal_v1, 2, 0, &count, layers);
+
+ g_assert_cmpuint (num_layers, ==, 2);
+ g_assert_cmpuint (count, ==, 1);
+ g_assert_cmpuint (layers[0].glyph, ==, 3);
+ g_assert_cmpuint (layers[0].color_index, ==, 1);
+
+ count = 1;
+ hb_ot_color_glyph_get_layers (cpal_v1, 2, 1, &count, layers);
+
+ g_assert_cmpuint (num_layers, ==, 2);
+ g_assert_cmpuint (count, ==, 1);
+ g_assert_cmpuint (layers[0].glyph, ==, 4);
+ g_assert_cmpuint (layers[0].color_index, ==, 0);
+}
+
+static void
+test_hb_ot_color_has_data (void)
+{
+ g_assert (hb_ot_color_has_layers (empty) == FALSE);
+ g_assert (hb_ot_color_has_layers (cpal_v0) == TRUE);
+ g_assert (hb_ot_color_has_layers (cpal_v1) == TRUE);
+ g_assert (hb_ot_color_has_layers (cpal) == TRUE);
+ g_assert (hb_ot_color_has_layers (cbdt) == FALSE);
+ g_assert (hb_ot_color_has_layers (sbix) == FALSE);
+ g_assert (hb_ot_color_has_layers (svg) == FALSE);
+
+ g_assert (hb_ot_color_has_palettes (empty) == FALSE);
+ g_assert (hb_ot_color_has_palettes (cpal_v0) == TRUE);
+ g_assert (hb_ot_color_has_palettes (cpal_v1) == TRUE);
+ g_assert (hb_ot_color_has_palettes (cpal) == TRUE);
+ g_assert (hb_ot_color_has_palettes (cbdt) == FALSE);
+ g_assert (hb_ot_color_has_palettes (sbix) == FALSE);
+ g_assert (hb_ot_color_has_palettes (svg) == FALSE);
+
+ g_assert (hb_ot_color_has_svg (empty) == FALSE);
+ g_assert (hb_ot_color_has_svg (cpal_v0) == FALSE);
+ g_assert (hb_ot_color_has_svg (cpal_v1) == FALSE);
+ g_assert (hb_ot_color_has_svg (cpal) == FALSE);
+ g_assert (hb_ot_color_has_svg (cbdt) == FALSE);
+ g_assert (hb_ot_color_has_svg (sbix) == FALSE);
+ g_assert (hb_ot_color_has_svg (svg) == TRUE);
+
+ g_assert (hb_ot_color_has_png (empty) == FALSE);
+ g_assert (hb_ot_color_has_png (cpal_v0) == FALSE);
+ g_assert (hb_ot_color_has_png (cpal_v1) == FALSE);
+ g_assert (hb_ot_color_has_png (cpal) == FALSE);
+ g_assert (hb_ot_color_has_png (cbdt) == TRUE);
+ g_assert (hb_ot_color_has_png (sbix) == TRUE);
+ g_assert (hb_ot_color_has_png (svg) == FALSE);
+}
+
+static void
+test_hb_ot_color_svg (void)
+{
+ hb_blob_t *blob;
+ unsigned int length;
+ const char *data;
+
+ blob = hb_ot_color_glyph_reference_svg (svg, 0);
+ g_assert (hb_blob_get_length (blob) == 0);
+
+ blob = hb_ot_color_glyph_reference_svg (svg, 1);
+ data = hb_blob_get_data (blob, &length);
+ g_assert_cmpuint (length, ==, 146);
+ g_assert (strncmp (data, "<?xml", 4) == 0);
+ g_assert (strncmp (data + 140, "</svg>", 5) == 0);
+ hb_blob_destroy (blob);
+
+ blob = hb_ot_color_glyph_reference_svg (empty, 0);
+ g_assert (hb_blob_get_length (blob) == 0);
+}
+
+
+static void
+test_hb_ot_color_png (void)
+{
+ hb_blob_t *blob;
+ unsigned int length;
+ const char *data;
+ hb_glyph_extents_t extents;
+ hb_font_t *cbdt_font;
+
+ /* sbix */
+ hb_font_t *sbix_font;
+ sbix_font = hb_font_create (sbix);
+ blob = hb_ot_color_glyph_reference_png (sbix_font, 0);
+ hb_font_get_glyph_extents (sbix_font, 0, &extents);
+ g_assert_cmpint (extents.x_bearing, ==, 0);
+ g_assert_cmpint (extents.y_bearing, ==, 0);
+ g_assert_cmpint (extents.width, ==, 0);
+ g_assert_cmpint (extents.height, ==, 0);
+ g_assert (hb_blob_get_length (blob) == 0);
+
+ blob = hb_ot_color_glyph_reference_png (sbix_font, 1);
+ data = hb_blob_get_data (blob, &length);
+ g_assert_cmpuint (length, ==, 224);
+ g_assert (strncmp (data + 1, "PNG", 3) == 0);
+ hb_font_get_glyph_extents (sbix_font, 1, &extents);
+ g_assert_cmpint (extents.x_bearing, ==, 0);
+ g_assert_cmpint (extents.y_bearing, ==, 0);
+ g_assert_cmpint (extents.width, ==, 800);
+ g_assert_cmpint (extents.height, ==, 800);
+ hb_blob_destroy (blob);
+ hb_font_destroy (sbix_font);
+
+ /* cbdt */
+ cbdt_font = hb_font_create (cbdt);
+ blob = hb_ot_color_glyph_reference_png (cbdt_font, 0);
+ g_assert (hb_blob_get_length (blob) == 0);
+
+ blob = hb_ot_color_glyph_reference_png (cbdt_font, 1);
+ data = hb_blob_get_data (blob, &length);
+ g_assert_cmpuint (length, ==, 88);
+ g_assert (strncmp (data + 1, "PNG", 3) == 0);
+ hb_font_get_glyph_extents (cbdt_font, 1, &extents);
+ g_assert_cmpint (extents.x_bearing, ==, 0);
+ g_assert_cmpint (extents.y_bearing, ==, 1024);
+ g_assert_cmpint (extents.width, ==, 1024);
+ g_assert_cmpint (extents.height, ==, -1024);
+ hb_blob_destroy (blob);
+ hb_font_destroy (cbdt_font);
+}
int
main (int argc, char **argv)
@@ -300,20 +456,34 @@ main (int argc, char **argv)
int status = 0;
hb_test_init (&argc, &argv);
- // cpal_v0 = hb_test_load_face ("../shaping/data/in-house/fonts/e90374e5e439e00725b4fe7a8d73db57c5a97f82.ttf");
- // cpal_v1 = hb_test_load_face ("../shaping/data/in-house/fonts/319f5d7ebffbefc5c5e6569f8cea73444d7a7268.ttf");
- // hb_test_add (test_hb_ot_color_get_palette_count);
- // hb_test_add (test_hb_ot_color_get_palette_name_id_empty);
- // hb_test_add (test_hb_ot_color_get_palette_name_id_v0);
- // hb_test_add (test_hb_ot_color_get_palette_name_id_v1);
- // hb_test_add (test_hb_ot_color_get_palette_flags_empty);
- // hb_test_add (test_hb_ot_color_get_palette_flags_v0);
- // hb_test_add (test_hb_ot_color_get_palette_flags_v1);
- // hb_test_add (test_hb_ot_color_get_palette_colors_empty);
- // hb_test_add (test_hb_ot_color_get_palette_colors_v0);
- // hb_test_add (test_hb_ot_color_get_palette_colors_v1);
+ cpal_v0 = hb_test_open_font_file ("fonts/cpal-v0.ttf");
+ cpal_v1 = hb_test_open_font_file ("fonts/cpal-v1.ttf");
+ cpal = hb_test_open_font_file ("fonts/chromacheck-colr.ttf");
+ cbdt = hb_test_open_font_file ("fonts/chromacheck-cbdt.ttf");
+ sbix = hb_test_open_font_file ("fonts/chromacheck-sbix.ttf");
+ svg = hb_test_open_font_file ("fonts/chromacheck-svg.ttf");
+ empty = hb_face_get_empty ();
+ hb_test_add (test_hb_ot_color_palette_get_count);
+ hb_test_add (test_hb_ot_color_palette_get_name_id_empty);
+ hb_test_add (test_hb_ot_color_palette_get_name_id_v0);
+ hb_test_add (test_hb_ot_color_palette_get_name_id_v1);
+ hb_test_add (test_hb_ot_color_palette_get_flags_empty);
+ hb_test_add (test_hb_ot_color_palette_get_flags_v0);
+ hb_test_add (test_hb_ot_color_palette_get_flags_v1);
+ hb_test_add (test_hb_ot_color_palette_get_colors_empty);
+ hb_test_add (test_hb_ot_color_palette_get_colors_v0);
+ hb_test_add (test_hb_ot_color_palette_get_colors_v1);
+ hb_test_add (test_hb_ot_color_palette_color_get_name_id);
+ hb_test_add (test_hb_ot_color_glyph_get_layers);
+ hb_test_add (test_hb_ot_color_has_data);
+ hb_test_add (test_hb_ot_color_png);
+ hb_test_add (test_hb_ot_color_svg);
status = hb_test_run();
hb_face_destroy (cpal_v0);
hb_face_destroy (cpal_v1);
+ hb_face_destroy (cpal);
+ hb_face_destroy (cbdt);
+ hb_face_destroy (sbix);
+ hb_face_destroy (svg);
return status;
}
diff --git a/test/api/test-ot-extents-cff.c b/test/api/test-ot-extents-cff.c
new file mode 100644
index 0000000..49b8799
--- /dev/null
+++ b/test/api/test-ot-extents-cff.c
@@ -0,0 +1,199 @@
+/*
+ * Copyright © 2018 Adobe Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Adobe Author(s): Michiharu Ariza
+ */
+
+#include "hb-test.h"
+#include <hb-ot.h>
+
+/* Unit tests for CFF/CFF2 glyph extents */
+
+static void
+test_extents_cff1 (void)
+{
+ hb_face_t *face = hb_test_open_font_file ("fonts/SourceSansPro-Regular.abc.otf");
+ g_assert (face);
+ hb_font_t *font = hb_font_create (face);
+ hb_face_destroy (face);
+ g_assert (font);
+ hb_ot_font_set_funcs (font);
+
+ hb_glyph_extents_t extents;
+ hb_bool_t result = hb_font_get_glyph_extents (font, 1, &extents);
+ g_assert (result);
+
+ g_assert_cmpint (extents.x_bearing, ==, 52);
+ g_assert_cmpint (extents.y_bearing, ==, 498);
+ g_assert_cmpint (extents.width, ==, 381);
+ g_assert_cmpint (extents.height, ==, -510);
+
+ hb_font_destroy (font);
+
+ hb_face_t *face_j = hb_test_open_font_file ("fonts/SourceHanSans-Regular.41,3041,4C2E.otf");
+ g_assert (face_j);
+ hb_font_t *font_j = hb_font_create (face_j);
+ hb_face_destroy (face_j);
+ g_assert (font_j);
+ hb_ot_font_set_funcs (font_j);
+
+ hb_bool_t result_j = hb_font_get_glyph_extents (font_j, 3, &extents);
+ g_assert (result_j);
+
+ g_assert_cmpint (extents.x_bearing, ==, 34);
+ g_assert_cmpint (extents.y_bearing, ==, 840);
+ g_assert_cmpint (extents.width, ==, 920);
+ g_assert_cmpint (extents.height, ==, -907);
+
+ hb_font_destroy (font_j);
+}
+
+static void
+test_extents_cff1_flex (void)
+{
+ hb_face_t *face = hb_test_open_font_file ("fonts/cff1_flex.otf");
+ g_assert (face);
+ hb_font_t *font = hb_font_create (face);
+ hb_face_destroy (face);
+ g_assert (font);
+ hb_ot_font_set_funcs (font);
+
+ hb_glyph_extents_t extents;
+ hb_bool_t result = hb_font_get_glyph_extents (font, 1, &extents);
+ g_assert (result);
+
+ g_assert_cmpint (extents.x_bearing, ==, -20);
+ g_assert_cmpint (extents.y_bearing, ==, 520);
+ g_assert_cmpint (extents.width, ==, 540);
+ g_assert_cmpint (extents.height, ==, -540);
+
+ hb_font_destroy (font);
+}
+
+static void
+test_extents_cff1_seac (void)
+{
+ hb_face_t *face = hb_test_open_font_file ("fonts/cff1_seac.otf");
+ g_assert (face);
+ hb_font_t *font = hb_font_create (face);
+ hb_face_destroy (face);
+ g_assert (font);
+ hb_ot_font_set_funcs (font);
+
+ hb_glyph_extents_t extents;
+ hb_bool_t result = hb_font_get_glyph_extents (font, 3, &extents); /* Agrave */
+ g_assert (result);
+
+ g_assert_cmpint (extents.x_bearing, ==, 3);
+ g_assert_cmpint (extents.y_bearing, ==, 861);
+ g_assert_cmpint (extents.width, ==, 538);
+ g_assert_cmpint (extents.height, ==, -861);
+
+ result = hb_font_get_glyph_extents (font, 4, &extents); /* Udieresis */
+ g_assert (result);
+
+ g_assert_cmpint (extents.x_bearing, ==, 87);
+ g_assert_cmpint (extents.y_bearing, ==, 827);
+ g_assert_cmpint (extents.width, ==, 471);
+ g_assert_cmpint (extents.height, ==, -839);
+
+ hb_font_destroy (font);
+}
+
+static void
+test_extents_cff2 (void)
+{
+ hb_face_t *face = hb_test_open_font_file ("fonts/AdobeVFPrototype.abc.otf");
+ g_assert (face);
+ hb_font_t *font = hb_font_create (face);
+ hb_face_destroy (face);
+ g_assert (font);
+ hb_ot_font_set_funcs (font);
+
+ hb_glyph_extents_t extents;
+ hb_bool_t result = hb_font_get_glyph_extents (font, 1, &extents);
+ g_assert (result);
+
+ g_assert_cmpint (extents.x_bearing, ==, 46);
+ g_assert_cmpint (extents.y_bearing, ==, 487);
+ g_assert_cmpint (extents.width, ==, 455);
+ g_assert_cmpint (extents.height, ==, -500);
+
+ float coords[2] = { 600.0f, 50.0f };
+ hb_font_set_var_coords_design (font, coords, 2);
+ result = hb_font_get_glyph_extents (font, 1, &extents);
+ g_assert (result);
+
+ g_assert_cmpint (extents.x_bearing, ==, 38);
+ g_assert_cmpint (extents.y_bearing, ==, 493);
+ g_assert_cmpint (extents.width, ==, 481);
+ g_assert_cmpint (extents.height, ==, -508);
+
+ hb_font_destroy (font);
+}
+
+static void
+test_extents_cff2_vsindex (void)
+{
+ hb_face_t *face = hb_test_open_font_file ("fonts/AdobeVFPrototype_vsindex.otf");
+ g_assert (face);
+ hb_font_t *font = hb_font_create (face);
+ hb_face_destroy (face);
+ g_assert (font);
+ hb_ot_font_set_funcs (font);
+
+ hb_glyph_extents_t extents;
+ float coords[2] = { 800.0f, 50.0f };
+ hb_font_set_var_coords_design (font, coords, 2);
+ hb_bool_t result = hb_font_get_glyph_extents (font, 1, &extents);
+ g_assert (result);
+
+ g_assert_cmpint (extents.x_bearing, ==, 11);
+ g_assert_cmpint (extents.y_bearing, ==, 656);
+ g_assert_cmpint (extents.width, ==, 653);
+ g_assert_cmpint (extents.height, ==, -656);
+
+ result = hb_font_get_glyph_extents (font, 2, &extents);
+ g_assert (result);
+
+ g_assert_cmpint (extents.x_bearing, ==, 7);
+ g_assert_cmpint (extents.y_bearing, ==, 669);
+ g_assert_cmpint (extents.width, ==, 650);
+ g_assert_cmpint (extents.height, ==, -669);
+
+ hb_font_destroy (font);
+}
+
+int
+main (int argc, char **argv)
+{
+ hb_test_init (&argc, &argv);
+
+ hb_test_add (test_extents_cff1);
+ hb_test_add (test_extents_cff1_flex);
+ hb_test_add (test_extents_cff1_seac);
+ hb_test_add (test_extents_cff2);
+ hb_test_add (test_extents_cff2_vsindex);
+
+ return hb_test_run ();
+}
diff --git a/test/api/test-ot-face.c b/test/api/test-ot-face.c
new file mode 100644
index 0000000..f2d2fca
--- /dev/null
+++ b/test/api/test-ot-face.c
@@ -0,0 +1,122 @@
+/*
+ * Copyright © 2011 Google, Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#ifndef TEST_OT_FACE_NO_MAIN
+#include "hb-test.h"
+#endif
+#include <hb-ot.h>
+
+/* Unit tests for hb-ot-*.h */
+
+
+static void
+test_face (hb_face_t *face,
+ hb_codepoint_t cp)
+{
+ hb_font_t *font = hb_font_create (face);
+ hb_set_t *set;
+ hb_codepoint_t g;
+ hb_position_t x, y;
+ char buf[5] = {0};
+ unsigned int len;
+ hb_glyph_extents_t extents;
+ hb_ot_font_set_funcs (font);
+
+ set = hb_set_create ();
+ hb_face_collect_unicodes (face, set);
+ hb_face_collect_variation_selectors (face, set);
+ hb_face_collect_variation_unicodes (face, cp, set);
+
+ hb_font_get_nominal_glyph (font, cp, &g);
+ hb_font_get_variation_glyph (font, cp, cp, &g);
+ hb_font_get_glyph_h_advance (font, cp);
+ hb_font_get_glyph_v_advance (font, cp);
+ hb_font_get_glyph_h_origin (font, cp, &x, &y);
+ hb_font_get_glyph_v_origin (font, cp, &x, &y);
+ hb_font_get_glyph_extents (font, cp, &extents);
+ hb_font_get_glyph_contour_point (font, cp, 0, &x, &y);
+ hb_font_get_glyph_name (font, cp, buf, sizeof (buf));
+ hb_font_get_glyph_from_name (font, buf, strlen (buf), &g);
+
+ hb_ot_color_has_palettes (face);
+ hb_ot_color_palette_get_count (face);
+ hb_ot_color_palette_get_name_id (face, cp);
+ hb_ot_color_palette_color_get_name_id (face, cp);
+ hb_ot_color_palette_get_flags (face, cp);
+ hb_ot_color_palette_get_colors (face, cp, 0, NULL, NULL);
+ hb_ot_color_has_layers (face);
+ hb_ot_color_glyph_get_layers (face, cp, 0, NULL, NULL);
+ hb_ot_color_has_svg (face);
+ hb_blob_destroy (hb_ot_color_glyph_reference_svg (face, cp));
+ hb_ot_color_has_png (face);
+ hb_blob_destroy (hb_ot_color_glyph_reference_png (font, cp));
+
+ hb_ot_layout_has_glyph_classes (face);
+ hb_ot_layout_has_substitution (face);
+ hb_ot_layout_has_positioning (face);
+
+ hb_ot_math_has_data (face);
+ hb_ot_math_get_constant (font, HB_OT_MATH_CONSTANT_MATH_LEADING);
+ hb_ot_math_get_glyph_italics_correction (font, cp);
+ hb_ot_math_get_glyph_top_accent_attachment (font, cp);
+ hb_ot_math_is_glyph_extended_shape (face, cp);
+ hb_ot_math_get_glyph_kerning (font, cp, HB_OT_MATH_KERN_BOTTOM_RIGHT, 0);
+ hb_ot_math_get_glyph_variants (font, cp, HB_DIRECTION_TTB, 0, NULL, NULL);
+ hb_ot_math_get_min_connector_overlap (font, HB_DIRECTION_RTL);
+ hb_ot_math_get_glyph_assembly (font, cp, HB_DIRECTION_BTT, 0, NULL, NULL, NULL);
+
+ len = sizeof (buf);
+ hb_ot_name_list_names (face, NULL);
+ hb_ot_name_get_utf8 (face, cp, NULL, &len, buf);
+ hb_ot_name_get_utf16 (face, cp, NULL, NULL, NULL);
+ hb_ot_name_get_utf32 (face, cp, NULL, NULL, NULL);
+
+ hb_ot_var_get_axis_count (face);
+ hb_ot_var_get_axis_infos (face, 0, NULL, NULL);
+ hb_ot_var_normalize_variations (face, NULL, 0, NULL, 0);
+ hb_ot_var_normalize_coords (face, 0, NULL, NULL);
+
+ hb_set_destroy (set);
+ hb_font_destroy (font);
+}
+
+#ifndef TEST_OT_FACE_NO_MAIN
+static void
+test_ot_face_empty (void)
+{
+ test_face (hb_face_get_empty (), 0);
+}
+
+int
+main (int argc, char **argv)
+{
+ hb_test_init (&argc, &argv);
+
+ hb_test_add (test_ot_face_empty);
+
+ return hb_test_run();
+}
+#endif
diff --git a/test/api/test-ot-ligature-carets.c b/test/api/test-ot-ligature-carets.c
new file mode 100644
index 0000000..d842785
--- /dev/null
+++ b/test/api/test-ot-ligature-carets.c
@@ -0,0 +1,67 @@
+/*
+ * Copyright © 2018 Ebrahim Byagowi
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ */
+
+#include "hb-test.h"
+
+#include <hb-ot.h>
+
+static void
+test_ot_layout_feature_get_name_ids_and_characters (void)
+{
+ hb_face_t *face = hb_test_open_font_file ("fonts/lcar.ttf");
+ hb_font_t *font = hb_font_create (face);
+ hb_font_set_scale (font, hb_face_get_upem (face) * 2, hb_face_get_upem (face) * 4);
+
+ hb_position_t caret_array[2];
+ unsigned int caret_count = 2;
+ g_assert_cmpuint (2, ==, hb_ot_layout_get_ligature_carets (font, HB_DIRECTION_RTL,
+ 98, 0, &caret_count,
+ caret_array));
+
+ g_assert_cmpuint (2, ==, caret_count);
+ g_assert_cmpuint (1130, ==, caret_array[0]);
+ g_assert_cmpuint (2344, ==, caret_array[1]);
+
+ g_assert_cmpuint (2, ==, hb_ot_layout_get_ligature_carets (font, HB_DIRECTION_BTT,
+ 98, 0, &caret_count,
+ caret_array));
+
+ g_assert_cmpuint (2, ==, caret_count);
+ g_assert_cmpuint (2260, ==, caret_array[0]);
+ g_assert_cmpuint (4688, ==, caret_array[1]);
+
+ hb_font_destroy (font);
+ hb_face_destroy (face);
+}
+
+int
+main (int argc, char **argv)
+{
+ g_test_init (&argc, &argv, NULL);
+
+ hb_test_add (test_ot_layout_feature_get_name_ids_and_characters);
+
+ return hb_test_run ();
+}
diff --git a/test/api/test-ot-math.c b/test/api/test-ot-math.c
index 0ca5566..7f50015 100644
--- a/test/api/test-ot-math.c
+++ b/test/api/test-ot-math.c
@@ -100,10 +100,14 @@ test_has_data (void)
hb_face = hb_face_get_empty ();
hb_font = hb_font_create (hb_face);
g_assert(!hb_ot_math_has_data (hb_face)); // MATH table not available
+ hb_font_destroy (hb_font);
+ hb_face_destroy (hb_face);
hb_font = hb_font_get_empty ();
hb_face = hb_font_get_face (hb_font);
g_assert(!hb_ot_math_has_data (hb_face)); // MATH table not available
+ hb_font_destroy (hb_font);
+ hb_face_destroy (hb_face);
cleanupFreeType();
}
@@ -396,8 +400,8 @@ test_get_min_connector_overlap (void)
initFreeType();
openFont("fonts/MathTestFontEmpty.otf");
- g_assert_cmpint(hb_ot_math_get_min_connector_overlap(hb_font, FALSE), ==, 0); // MathVariants not available
- g_assert_cmpint(hb_ot_math_get_min_connector_overlap(hb_font, TRUE), ==, 0); // MathVariants not available
+ g_assert_cmpint(hb_ot_math_get_min_connector_overlap(hb_font, HB_DIRECTION_LTR), ==, 0); // MathVariants not available
+ g_assert_cmpint(hb_ot_math_get_min_connector_overlap(hb_font, HB_DIRECTION_TTB), ==, 0); // MathVariants not available
closeFont();
openFont("fonts/MathTestFontPartial1.otf");
diff --git a/test/api/test-ot-name.c b/test/api/test-ot-name.c
new file mode 100644
index 0000000..c2ae4fd
--- /dev/null
+++ b/test/api/test-ot-name.c
@@ -0,0 +1,106 @@
+/*
+ * Copyright © 2018 Ebrahim Byagowi
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ */
+
+#include "hb-test.h"
+
+#include <hb-ot.h>
+
+static hb_face_t *face;
+
+static void
+test_ot_layout_feature_get_name_ids_and_characters (void)
+{
+ hb_tag_t cv01 = HB_TAG ('c','v','0','1');
+ unsigned int feature_index;
+ unsigned int num_named_parameters;
+ hb_ot_name_id_t label_id;
+ hb_ot_name_id_t tooltip_id;
+ hb_ot_name_id_t sample_id;
+ hb_ot_name_id_t first_param_id;
+ hb_codepoint_t characters[100];
+ unsigned int char_count = 100;
+ unsigned int all_chars;
+ if (!hb_ot_layout_language_find_feature (face,
+ HB_OT_TAG_GSUB,
+ 0,
+ HB_OT_LAYOUT_DEFAULT_LANGUAGE_INDEX,
+ cv01,
+ &feature_index))
+ g_error ("Failed to find feature index");
+
+ if (!hb_ot_layout_feature_get_name_ids (face, HB_OT_TAG_GSUB, feature_index,
+ &label_id, &tooltip_id, &sample_id,
+ &num_named_parameters, &first_param_id))
+ g_error ("Failed to get name ids");
+
+ g_assert_cmpint (label_id, ==, 256);
+ g_assert_cmpint (tooltip_id, ==, 257);
+ g_assert_cmpint (sample_id, ==, 258);
+ g_assert_cmpint (num_named_parameters, ==, 2);
+ g_assert_cmpint (first_param_id, ==, 259);
+
+ all_chars = hb_ot_layout_feature_get_characters (face, HB_OT_TAG_GSUB, feature_index,
+ 0, &char_count, characters);
+
+ g_assert_cmpint (all_chars, ==, 2);
+ g_assert_cmpint (char_count, ==, 2);
+ g_assert_cmpint (characters[0], ==, 10);
+ g_assert_cmpint (characters[1], ==, 24030);
+}
+
+static void
+test_ot_name (void)
+{
+ unsigned int num_entries;
+ const hb_ot_name_entry_t *entries;
+ hb_ot_name_id_t name_id;
+ hb_language_t lang;
+ char text[10];
+ unsigned int text_size = 10;
+ entries = hb_ot_name_list_names (face, &num_entries);
+ g_assert_cmpuint (12, ==, num_entries);
+ name_id = entries[3].name_id;
+ g_assert_cmpuint (3, ==, name_id);
+ lang = entries[3].language;
+ g_assert_cmpstr (hb_language_to_string (lang), ==, "en");
+ g_assert_cmpuint (27, ==, hb_ot_name_get_utf8 (face, name_id, lang, &text_size, text));
+ g_assert_cmpuint (9, ==, text_size);
+ g_assert_cmpstr (text, ==, "FontForge");
+}
+
+int
+main (int argc, char **argv)
+{
+ unsigned int status;
+ g_test_init (&argc, &argv, NULL);
+
+ hb_test_add (test_ot_layout_feature_get_name_ids_and_characters);
+ hb_test_add (test_ot_name);
+
+ face = hb_test_open_font_file ("fonts/cv01.otf");
+ status = hb_test_run ();
+ hb_face_destroy (face);
+ return status;
+}
diff --git a/test/api/test-ot-tag.c b/test/api/test-ot-tag.c
index e821b36..60231af 100644
--- a/test/api/test-ot-tag.c
+++ b/test/api/test-ot-tag.c
@@ -37,50 +37,86 @@ static void
test_simple_tags (const char *s, hb_script_t script)
{
hb_script_t tag;
- hb_tag_t t1, t2;
+ unsigned int count = 2;
+ hb_tag_t t[2];
g_test_message ("Testing script %c%c%c%c: tag %s", HB_UNTAG (hb_script_to_iso15924_tag (script)), s);
tag = hb_tag_from_string (s, -1);
- hb_ot_tags_from_script (script, &t1, &t2);
+ hb_ot_tags_from_script_and_language (script,
+ HB_LANGUAGE_INVALID,
+ &count, t, NULL, NULL);
- g_assert_cmphex (t1, ==, tag);
- g_assert_cmphex (t2, ==, HB_OT_TAG_DEFAULT_SCRIPT);
+ if (count)
+ g_assert_cmphex (t[0], ==, tag);
+ else
+ g_assert_cmphex (HB_TAG_CHAR4 ("DFLT"), ==, tag);
g_assert_cmphex (hb_ot_tag_to_script (tag), ==, script);
}
static void
-test_indic_tags (const char *s1, const char *s2, hb_script_t script)
+test_script_tags_from_language (const char *s, const char *lang_s, hb_script_t script)
{
- hb_script_t tag1, tag2;
- hb_script_t t1, t2;
+ hb_script_t tag;
+ unsigned int count = 1;
+ hb_tag_t t;
+
+ g_test_message ("Testing script %c%c%c%c: script tag %s, language tag %s", HB_UNTAG (hb_script_to_iso15924_tag (script)), s, lang_s);
+ tag = hb_tag_from_string (s, -1);
+
+ hb_ot_tags_from_script_and_language (script, hb_language_from_string (lang_s, -1), &count, &t, NULL, NULL);
+
+ if (count != 0)
+ {
+ g_assert_cmpuint (count, ==, 1);
+ g_assert_cmphex (t, ==, tag);
+ }
+}
- g_test_message ("Testing script %c%c%c%c: new tag %s, old tag %s", HB_UNTAG (hb_script_to_iso15924_tag (script)), s1, s2);
+static void
+test_indic_tags (const char *s1, const char *s2, const char *s3, hb_script_t script)
+{
+ hb_script_t tag1, tag2, tag3;
+ hb_tag_t t[3];
+ unsigned int count = 3;
+
+ g_test_message ("Testing script %c%c%c%c: USE tag %s, new tag %s, old tag %s", HB_UNTAG (hb_script_to_iso15924_tag (script)), s1, s2, s3);
tag1 = hb_tag_from_string (s1, -1);
tag2 = hb_tag_from_string (s2, -1);
+ tag3 = hb_tag_from_string (s3, -1);
- hb_ot_tags_from_script (script, &t1, &t2);
+ hb_ot_tags_from_script_and_language (script,
+ HB_LANGUAGE_INVALID,
+ &count, t, NULL, NULL);
- g_assert_cmphex (t1, ==, tag1);
- g_assert_cmphex (t2, ==, tag2);
+ g_assert_cmpuint (count, ==, 3);
+ g_assert_cmphex (t[0], ==, tag1);
+ g_assert_cmphex (t[1], ==, tag2);
+ g_assert_cmphex (t[2], ==, tag3);
g_assert_cmphex (hb_ot_tag_to_script (tag1), ==, script);
g_assert_cmphex (hb_ot_tag_to_script (tag2), ==, script);
+ g_assert_cmphex (hb_ot_tag_to_script (tag3), ==, script);
}
static void
test_ot_tag_script_degenerate (void)
{
- hb_tag_t t1, t2;
+ hb_tag_t t[2];
+ unsigned int count = 2;
g_assert_cmphex (HB_TAG_CHAR4 ("DFLT"), ==, HB_OT_TAG_DEFAULT_SCRIPT);
/* HIRAGANA and KATAKANA both map to 'kana' */
test_simple_tags ("kana", HB_SCRIPT_KATAKANA);
- hb_ot_tags_from_script (HB_SCRIPT_HIRAGANA, &t1, &t2);
- g_assert_cmphex (t1, ==, HB_TAG_CHAR4 ("kana"));
- g_assert_cmphex (t2, ==, HB_OT_TAG_DEFAULT_SCRIPT);
+
+ hb_ot_tags_from_script_and_language (HB_SCRIPT_HIRAGANA,
+ HB_LANGUAGE_INVALID,
+ &count, t, NULL, NULL);
+
+ g_assert_cmpuint (count, ==, 1);
+ g_assert_cmphex (t[0], ==, HB_TAG_CHAR4 ("kana"));
test_simple_tags ("DFLT", HB_SCRIPT_INVALID);
@@ -121,18 +157,40 @@ test_ot_tag_script_simple (void)
}
static void
+test_ot_tag_script_from_language (void)
+{
+ test_script_tags_from_language (NULL, NULL, HB_SCRIPT_INVALID);
+ test_script_tags_from_language (NULL, "en", HB_SCRIPT_INVALID);
+ test_script_tags_from_language ("copt", "en", HB_SCRIPT_COPTIC);
+ test_script_tags_from_language (NULL, "x-hbsc", HB_SCRIPT_INVALID);
+ test_script_tags_from_language ("copt", "x-hbsc", HB_SCRIPT_COPTIC);
+ test_script_tags_from_language ("abc ", "x-hbscabc", HB_SCRIPT_INVALID);
+ test_script_tags_from_language ("deva", "x-hbscdeva", HB_SCRIPT_INVALID);
+ test_script_tags_from_language ("dev2", "x-hbscdev2", HB_SCRIPT_INVALID);
+ test_script_tags_from_language ("dev3", "x-hbscdev3", HB_SCRIPT_INVALID);
+ test_script_tags_from_language ("copt", "x-hbotpap0-hbsccopt", HB_SCRIPT_INVALID);
+ test_script_tags_from_language (NULL, "en-x-hbsc", HB_SCRIPT_INVALID);
+ test_script_tags_from_language ("copt", "en-x-hbsc", HB_SCRIPT_COPTIC);
+ test_script_tags_from_language ("abc ", "en-x-hbscabc", HB_SCRIPT_INVALID);
+ test_script_tags_from_language ("deva", "en-x-hbscdeva", HB_SCRIPT_INVALID);
+ test_script_tags_from_language ("dev2", "en-x-hbscdev2", HB_SCRIPT_INVALID);
+ test_script_tags_from_language ("dev3", "en-x-hbscdev3", HB_SCRIPT_INVALID);
+ test_script_tags_from_language ("copt", "en-x-hbotpap0-hbsccopt", HB_SCRIPT_INVALID);
+}
+
+static void
test_ot_tag_script_indic (void)
{
- test_indic_tags ("bng2", "beng", HB_SCRIPT_BENGALI);
- test_indic_tags ("dev2", "deva", HB_SCRIPT_DEVANAGARI);
- test_indic_tags ("gjr2", "gujr", HB_SCRIPT_GUJARATI);
- test_indic_tags ("gur2", "guru", HB_SCRIPT_GURMUKHI);
- test_indic_tags ("knd2", "knda", HB_SCRIPT_KANNADA);
- test_indic_tags ("mlm2", "mlym", HB_SCRIPT_MALAYALAM);
- test_indic_tags ("ory2", "orya", HB_SCRIPT_ORIYA);
- test_indic_tags ("tml2", "taml", HB_SCRIPT_TAMIL);
- test_indic_tags ("tel2", "telu", HB_SCRIPT_TELUGU);
- test_indic_tags ("mym2", "mymr", HB_SCRIPT_MYANMAR);
+ test_indic_tags ("bng3", "bng2", "beng", HB_SCRIPT_BENGALI);
+ test_indic_tags ("dev3", "dev2", "deva", HB_SCRIPT_DEVANAGARI);
+ test_indic_tags ("gjr3", "gjr2", "gujr", HB_SCRIPT_GUJARATI);
+ test_indic_tags ("gur3", "gur2", "guru", HB_SCRIPT_GURMUKHI);
+ test_indic_tags ("knd3", "knd2", "knda", HB_SCRIPT_KANNADA);
+ test_indic_tags ("mlm3", "mlm2", "mlym", HB_SCRIPT_MALAYALAM);
+ test_indic_tags ("ory3", "ory2", "orya", HB_SCRIPT_ORIYA);
+ test_indic_tags ("tml3", "tml2", "taml", HB_SCRIPT_TAMIL);
+ test_indic_tags ("tel3", "tel2", "telu", HB_SCRIPT_TELUGU);
+ test_indic_tags ("mym3", "mym2", "mymr", HB_SCRIPT_MYANMAR);
}
@@ -144,10 +202,19 @@ test_language_two_way (const char *tag_s, const char *lang_s)
{
hb_language_t lang = hb_language_from_string (lang_s, -1);
hb_tag_t tag = hb_tag_from_string (tag_s, -1);
+ hb_tag_t tag2;
+ unsigned int count = 1;
g_test_message ("Testing language %s <-> tag %s", lang_s, tag_s);
- g_assert_cmphex (tag, ==, hb_ot_tag_from_language (lang));
+ hb_ot_tags_from_script_and_language (HB_SCRIPT_INVALID,
+ lang,
+ NULL, NULL, &count, &tag2);
+
+ if (count)
+ g_assert_cmphex (tag, ==, tag2);
+ else
+ g_assert_cmphex (tag, ==, HB_TAG_CHAR4 ("dflt"));
g_assert (lang == hb_ot_tag_to_language (tag));
}
@@ -156,10 +223,19 @@ test_tag_from_language (const char *tag_s, const char *lang_s)
{
hb_language_t lang = hb_language_from_string (lang_s, -1);
hb_tag_t tag = hb_tag_from_string (tag_s, -1);
+ hb_tag_t tag2;
+ unsigned int count = 1;
g_test_message ("Testing language %s -> tag %s", lang_s, tag_s);
- g_assert_cmphex (tag, ==, hb_ot_tag_from_language (lang));
+ hb_ot_tags_from_script_and_language (HB_SCRIPT_INVALID,
+ lang,
+ NULL, NULL, &count, &tag2);
+
+ if (count)
+ g_assert_cmphex (tag, ==, tag2);
+ else
+ g_assert_cmphex (tag, ==, HB_TAG_CHAR4 ("dflt"));
}
static void
@@ -174,6 +250,32 @@ test_tag_to_language (const char *tag_s, const char *lang_s)
}
static void
+test_tags_to_script_and_language (const char *script_tag_s,
+ const char *lang_tag_s,
+ const char *script_s,
+ const char *lang_s)
+{
+ hb_script_t actual_script[1];
+ hb_language_t actual_lang[1];
+ hb_tag_t script_tag = hb_tag_from_string (script_tag_s, -1);
+ hb_tag_t lang_tag = hb_tag_from_string (lang_tag_s, -1);
+ hb_ot_tags_to_script_and_language (script_tag, lang_tag, actual_script, actual_lang);
+ g_assert_cmphex (*actual_script, ==, hb_tag_from_string (script_s, -1));
+ g_assert_cmpstr (hb_language_to_string (*actual_lang), ==, lang_s);
+}
+
+static void
+test_ot_tags_to_script_and_language (void)
+{
+ test_tags_to_script_and_language ("DFLT", "ENG", "", "en-x-hbscdflt");
+ test_tags_to_script_and_language ("latn", "ENG", "Latn", "en");
+ test_tags_to_script_and_language ("deva", "MAR", "Deva", "mr-x-hbscdeva");
+ test_tags_to_script_and_language ("dev2", "MAR", "Deva", "mr-x-hbscdev2");
+ test_tags_to_script_and_language ("dev3", "MAR", "Deva", "mr");
+ test_tags_to_script_and_language ("qaa", "QTZ0", "Qaaa", "x-hbotqtz0-hbscqaa");
+}
+
+static void
test_ot_tag_language (void)
{
g_assert_cmphex (HB_TAG_CHAR4 ("dflt"), ==, HB_OT_TAG_DEFAULT_LANGUAGE);
@@ -230,27 +332,27 @@ test_ot_tag_language (void)
test_language_two_way ("TUA", "tru"); /* Turoyo Aramaic */
- test_language_two_way ("ZHH", "zh-hk"); /* Chinese (Hong Kong) */
-
test_tag_from_language ("ZHS", "zh"); /* Chinese */
test_tag_from_language ("ZHS", "zh-cn"); /* Chinese (China) */
test_tag_from_language ("ZHS", "zh-sg"); /* Chinese (Singapore) */
test_tag_from_language ("ZHH", "zh-mo"); /* Chinese (Macao) */
test_tag_from_language ("ZHH", "zh-hant-mo"); /* Chinese (Macao) */
- test_tag_from_language ("ZHH", "zh-hk"); /* Chinese (Hong Kong) */
+ test_language_two_way ("ZHH", "zh-HK"); /* Chinese (Hong Kong) */
test_tag_from_language ("ZHH", "zH-HanT-hK"); /* Chinese (Hong Kong) */
test_tag_from_language ("ZHT", "zh-tw"); /* Chinese (Taiwan) */
- test_tag_from_language ("ZHS", "zh-Hans"); /* Chinese (Simplified) */
- test_tag_from_language ("ZHT", "zh-Hant"); /* Chinese (Traditional) */
+ test_language_two_way ("ZHS", "zh-Hans"); /* Chinese (Simplified) */
+ test_language_two_way ("ZHT", "zh-Hant"); /* Chinese (Traditional) */
test_tag_from_language ("ZHS", "zh-xx"); /* Chinese (Other) */
+ test_tag_from_language ("ZHS", "zh-Hans-TW");
+
+ test_tag_from_language ("ZHH", "yue");
+ test_tag_from_language ("ZHH", "yue-Hant");
+ test_tag_from_language ("ZHS", "yue-Hans");
+
test_tag_from_language ("ZHS", "zh"); /* Chinese */
test_tag_from_language ("ZHS", "zh-xx");
- test_tag_to_language ("ZHS", "zh-Hans");
- test_tag_to_language ("ZHT", "zh-Hant");
- test_tag_to_language ("ZHP", "x-hbotzhp");
-
test_language_two_way ("ABC", "x-hbotabc");
test_tag_from_language ("ABC", "asdf-asdf-wer-x-hbotabc-zxc");
test_tag_from_language ("ABC", "asdf-asdf-wer-x-hbotabc");
@@ -262,39 +364,64 @@ test_ot_tag_language (void)
test_tag_from_language ("XYZ", "xyz"); /* Unknown ISO 639-3 */
test_tag_from_language ("XYZ", "xyz-qw"); /* Unknown ISO 639-3 */
+ /*
+ * Invalid input. The precise answer does not matter, as long as it
+ * does not crash or get into an infinite loop.
+ */
+ test_tag_from_language ("IPPH", "-fonipa");
+
+ /*
+ * Tags that contain "-fonipa" as a substring but which do not contain
+ * the subtag "fonipa".
+ */
+ test_tag_from_language ("ENG", "en-fonipax");
+ test_tag_from_language ("ENG", "en-x-fonipa");
+ test_tag_from_language ("ENG", "en-a-fonipa");
+ test_tag_from_language ("ENG", "en-a-qwe-b-fonipa");
+
/* International Phonetic Alphabet */
test_tag_from_language ("IPPH", "en-fonipa");
+ test_tag_from_language ("IPPH", "en-fonipax-fonipa");
test_tag_from_language ("IPPH", "rm-CH-fonipa-sursilv-x-foobar");
- test_tag_from_language ("IPPH", "und-fonipa");
+ test_language_two_way ("IPPH", "und-fonipa");
test_tag_from_language ("IPPH", "zh-fonipa");
- test_tag_to_language ("IPPH", "und-fonipa");
/* North American Phonetic Alphabet (Americanist Phonetic Notation) */
test_tag_from_language ("APPH", "en-fonnapa");
test_tag_from_language ("APPH", "chr-fonnapa");
- test_tag_from_language ("APPH", "und-fonnapa");
- test_tag_to_language ("APPH", "und-fonnapa");
+ test_language_two_way ("APPH", "und-fonnapa");
+
+ /* Khutsuri Georgian */
+ test_tag_from_language ("KGE", "ka-Geok");
+ test_language_two_way ("KGE", "und-Geok");
+
+ /* Irish Traditional */
+ test_language_two_way ("IRT", "ga-Latg");
+
+ /* Moldavian */
+ test_language_two_way ("MOL", "ro-MD");
+
+ /* Polytonic Greek */
+ test_language_two_way ("PGR", "el-polyton");
+ test_tag_from_language ("PGR", "el-CY-polyton");
/* Estrangela Syriac */
test_tag_from_language ("SYRE", "aii-Syre");
test_tag_from_language ("SYRE", "de-Syre");
test_tag_from_language ("SYRE", "syr-Syre");
- test_tag_from_language ("SYRE", "und-Syre");
- test_tag_to_language ("SYRE", "und-Syre");
+ test_language_two_way ("SYRE", "und-Syre");
/* Western Syriac */
test_tag_from_language ("SYRJ", "aii-Syrj");
test_tag_from_language ("SYRJ", "de-Syrj");
test_tag_from_language ("SYRJ", "syr-Syrj");
- test_tag_from_language ("SYRJ", "und-Syrj");
- test_tag_to_language ("SYRJ", "und-Syrj");
+ test_language_two_way ("SYRJ", "und-Syrj");
/* Eastern Syriac */
test_tag_from_language ("SYRN", "aii-Syrn");
test_tag_from_language ("SYRN", "de-Syrn");
test_tag_from_language ("SYRN", "syr-Syrn");
- test_tag_from_language ("SYRN", "und-Syrn");
- test_tag_to_language ("SYRN", "und-Syrn");
+ test_language_two_way ("SYRN", "und-Syrn");
/* Test that x-hbot overrides the base language */
test_tag_from_language ("ABC", "fa-x-hbotabc-zxc");
@@ -303,6 +430,81 @@ test_ot_tag_language (void)
test_tag_from_language ("ABC", "zh-cn-x-hbotabc-zxc");
test_tag_from_language ("ABC", "zh-xy-x-hbotabc-zxc");
test_tag_from_language ("ABC", "xyz-xy-x-hbotabc-zxc");
+
+ /* Unnormalized BCP 47 tags */
+ test_tag_from_language ("ARA", "ar-aao");
+ test_tag_from_language ("JBO", "art-lojban");
+ test_tag_from_language ("KOK", "kok-gom");
+ test_tag_from_language ("LTZ", "i-lux");
+ test_tag_from_language ("MNG", "drh");
+ test_tag_from_language ("MOR", "ar-ary");
+ test_tag_from_language ("MOR", "ar-ary-DZ");
+ test_tag_from_language ("NOR", "no-bok");
+ test_tag_from_language ("NYN", "no-nyn");
+ test_tag_from_language ("ZHS", "i-hak");
+ test_tag_from_language ("ZHS", "zh-guoyu");
+ test_tag_from_language ("ZHS", "zh-min");
+ test_tag_from_language ("ZHS", "zh-min-nan");
+ test_tag_from_language ("ZHS", "zh-xiang");
+
+ /* A UN M.49 region code, not an extended language subtag */
+ test_tag_from_language ("ARA", "ar-001");
+
+ /* An invalid tag */
+ test_tag_from_language ("TRK", "tr@foo=bar");
+}
+
+static void
+test_tags (hb_script_t script,
+ const char *lang_s,
+ unsigned int script_count,
+ unsigned int language_count,
+ unsigned int expected_script_count,
+ unsigned int expected_language_count,
+ ...)
+{
+ va_list expected_tags;
+ unsigned int i;
+ hb_tag_t *script_tags = malloc (script_count * sizeof (hb_tag_t));
+ hb_tag_t *language_tags = malloc (language_count * sizeof (hb_tag_t));
+ hb_language_t lang;
+ g_assert (script_tags);
+ g_assert (language_tags);
+ lang = hb_language_from_string (lang_s, -1);
+ va_start (expected_tags, expected_language_count);
+
+ hb_ot_tags_from_script_and_language (script, lang, &script_count, script_tags, &language_count, language_tags);
+
+ g_assert_cmpuint (script_count, ==, expected_script_count);
+ g_assert_cmpuint (language_count, ==, expected_language_count);
+
+ for (i = 0; i < script_count + language_count; i++)
+ {
+ hb_tag_t expected_tag = hb_tag_from_string (va_arg (expected_tags, const char *), -1);
+ hb_tag_t actual_tag = i < script_count ? script_tags[i] : language_tags[i - script_count];
+ g_assert_cmphex (actual_tag, ==, expected_tag);
+ }
+
+ free (script_tags);
+ free (language_tags);
+ va_end (expected_tags);
+}
+
+static void
+test_ot_tag_full (void)
+{
+ test_tags (HB_SCRIPT_INVALID, "en", HB_OT_MAX_TAGS_PER_SCRIPT, HB_OT_MAX_TAGS_PER_LANGUAGE, 0, 1, "ENG");
+ test_tags (HB_SCRIPT_INVALID, "en-x-hbscdflt", HB_OT_MAX_TAGS_PER_SCRIPT, HB_OT_MAX_TAGS_PER_LANGUAGE, 1, 1, "DFLT", "ENG");
+ test_tags (HB_SCRIPT_LATIN, "en", HB_OT_MAX_TAGS_PER_SCRIPT, HB_OT_MAX_TAGS_PER_LANGUAGE, 1, 1, "latn", "ENG");
+ test_tags (HB_SCRIPT_LATIN, "en", 0, 0, 0, 0);
+ test_tags (HB_SCRIPT_INVALID, "und-fonnapa", HB_OT_MAX_TAGS_PER_SCRIPT, HB_OT_MAX_TAGS_PER_LANGUAGE, 0, 1, "APPH");
+ test_tags (HB_SCRIPT_INVALID, "en-fonnapa", HB_OT_MAX_TAGS_PER_SCRIPT, HB_OT_MAX_TAGS_PER_LANGUAGE, 0, 1, "APPH");
+ test_tags (HB_SCRIPT_INVALID, "x-hbot1234-hbsc5678", HB_OT_MAX_TAGS_PER_SCRIPT, HB_OT_MAX_TAGS_PER_LANGUAGE, 1, 1, "5678", "1234");
+ test_tags (HB_SCRIPT_INVALID, "x-hbsc5678-hbot1234", HB_OT_MAX_TAGS_PER_SCRIPT, HB_OT_MAX_TAGS_PER_LANGUAGE, 1, 1, "5678", "1234");
+ test_tags (HB_SCRIPT_MALAYALAM, "ml", HB_OT_MAX_TAGS_PER_SCRIPT, HB_OT_MAX_TAGS_PER_LANGUAGE, 3, 2, "mlm3", "mlm2", "mlym", "MAL", "MLR");
+ test_tags (HB_SCRIPT_MALAYALAM, "ml", 1, 1, 1, 1, "mlm3", "MAL");
+ test_tags (HB_SCRIPT_INVALID, "xyz", HB_OT_MAX_TAGS_PER_SCRIPT, HB_OT_MAX_TAGS_PER_LANGUAGE, 0, 1, "XYZ");
+ test_tags (HB_SCRIPT_INVALID, "xy", HB_OT_MAX_TAGS_PER_SCRIPT, HB_OT_MAX_TAGS_PER_LANGUAGE, 0, 0);
}
int
@@ -312,9 +514,14 @@ main (int argc, char **argv)
hb_test_add (test_ot_tag_script_degenerate);
hb_test_add (test_ot_tag_script_simple);
+ hb_test_add (test_ot_tag_script_from_language);
hb_test_add (test_ot_tag_script_indic);
+ hb_test_add (test_ot_tags_to_script_and_language);
+
hb_test_add (test_ot_tag_language);
+ hb_test_add (test_ot_tag_full);
+
return hb_test_run();
}
diff --git a/test/api/test-set.c b/test/api/test-set.c
index 338a610..aa2b388 100644
--- a/test/api/test-set.c
+++ b/test/api/test-set.c
@@ -118,6 +118,9 @@ test_set_basic (void)
g_assert (!hb_set_has (s, 801));
g_assert (!hb_set_has (s, 802));
+ hb_set_del (s, 800);
+ g_assert (!hb_set_has (s, 800));
+
hb_set_destroy (s);
}
@@ -262,6 +265,7 @@ test_set_algebra (void)
hb_set_destroy (s);
hb_set_destroy (o);
+ hb_set_destroy (o2);
}
static void
@@ -380,10 +384,6 @@ test_set_empty (void)
test_empty (b);
- hb_set_invert (b);
-
- test_empty (b);
-
g_assert (!hb_set_allocation_successful (b));
hb_set_clear (b);
diff --git a/test/api/test-shape.c b/test/api/test-shape.c
index 6232e73..146cf0f 100644
--- a/test/api/test-shape.c
+++ b/test/api/test-shape.c
@@ -41,9 +41,9 @@
static const char test_data[] = "test\0data";
static hb_position_t
-glyph_h_advance_func (hb_font_t *font, void *font_data,
+glyph_h_advance_func (hb_font_t *font HB_UNUSED, void *font_data HB_UNUSED,
hb_codepoint_t glyph,
- void *user_data)
+ void *user_data HB_UNUSED)
{
switch (glyph) {
case 1: return 10;
@@ -54,10 +54,10 @@ glyph_h_advance_func (hb_font_t *font, void *font_data,
}
static hb_bool_t
-glyph_func (hb_font_t *font, void *font_data,
- hb_codepoint_t unicode, hb_codepoint_t variant_selector,
+glyph_func (hb_font_t *font HB_UNUSED, void *font_data HB_UNUSED,
+ hb_codepoint_t unicode,
hb_codepoint_t *glyph,
- void *user_data)
+ void *user_data HB_UNUSED)
{
switch (unicode) {
case 'T': *glyph = 1; return TRUE;
@@ -68,9 +68,9 @@ glyph_func (hb_font_t *font, void *font_data,
}
static hb_position_t
-glyph_h_kerning_func (hb_font_t *font, void *font_data,
+glyph_h_kerning_func (hb_font_t *font HB_UNUSED, void *font_data HB_UNUSED,
hb_codepoint_t left, hb_codepoint_t right,
- void *user_data)
+ void *user_data HB_UNUSED)
{
if (left == 1 && right == 2)
return -2;
@@ -101,7 +101,7 @@ test_shape (void)
ffuncs = hb_font_funcs_create ();
hb_font_funcs_set_glyph_h_advance_func (ffuncs, glyph_h_advance_func, NULL, NULL);
- hb_font_funcs_set_glyph_func (ffuncs, glyph_func, malloc (10), free);
+ hb_font_funcs_set_nominal_glyph_func (ffuncs, glyph_func, malloc (10), free);
hb_font_funcs_set_glyph_h_kerning_func (ffuncs, glyph_h_kerning_func, NULL, NULL);
hb_font_set_funcs (font, ffuncs, NULL, NULL);
hb_font_funcs_destroy (ffuncs);
diff --git a/test/api/test-subset-cff1.c b/test/api/test-subset-cff1.c
new file mode 100644
index 0000000..3ee2702
--- /dev/null
+++ b/test/api/test-subset-cff1.c
@@ -0,0 +1,312 @@
+/*
+ * Copyright © 2018 Adobe Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Adobe Author(s): Michiharu Ariza
+ */
+
+#include "hb-test.h"
+#include "hb-subset-test.h"
+
+/* Unit tests for CFF subsetting */
+
+static void
+test_subset_cff1_noop (void)
+{
+ hb_face_t *face_abc = hb_test_open_font_file("fonts/SourceSansPro-Regular.abc.otf");
+
+ hb_set_t *codepoints = hb_set_create ();
+ hb_face_t *face_abc_subset;
+ hb_set_add (codepoints, 'a');
+ hb_set_add (codepoints, 'b');
+ hb_set_add (codepoints, 'c');
+ face_abc_subset = hb_subset_test_create_subset (face_abc, hb_subset_test_create_input (codepoints));
+ hb_set_destroy (codepoints);
+
+ hb_subset_test_check (face_abc, face_abc_subset, HB_TAG ('C','F','F',' '));
+
+ hb_face_destroy (face_abc_subset);
+ hb_face_destroy (face_abc);
+}
+
+static void
+test_subset_cff1 (void)
+{
+ hb_face_t *face_abc = hb_test_open_font_file ("fonts/SourceSansPro-Regular.abc.otf");
+ hb_face_t *face_ac = hb_test_open_font_file ("fonts/SourceSansPro-Regular.ac.otf");
+
+ hb_set_t *codepoints = hb_set_create ();
+ hb_face_t *face_abc_subset;
+ hb_set_add (codepoints, 'a');
+ hb_set_add (codepoints, 'c');
+ face_abc_subset = hb_subset_test_create_subset (face_abc, hb_subset_test_create_input (codepoints));
+ hb_set_destroy (codepoints);
+
+ hb_subset_test_check (face_ac, face_abc_subset, HB_TAG ('C','F','F',' '));
+
+ hb_face_destroy (face_abc_subset);
+ hb_face_destroy (face_abc);
+ hb_face_destroy (face_ac);
+}
+
+static void
+test_subset_cff1_strip_hints (void)
+{
+ hb_face_t *face_abc = hb_test_open_font_file ("fonts/SourceSansPro-Regular.abc.otf");
+ hb_face_t *face_ac = hb_test_open_font_file ("fonts/SourceSansPro-Regular.ac.nohints.otf");
+
+ hb_set_t *codepoints = hb_set_create ();
+ hb_subset_input_t *input;
+ hb_face_t *face_abc_subset;
+ hb_set_add (codepoints, 'a');
+ hb_set_add (codepoints, 'c');
+ input = hb_subset_test_create_input (codepoints);
+ hb_subset_input_set_drop_hints (input, true);
+ face_abc_subset = hb_subset_test_create_subset (face_abc, input);
+ hb_set_destroy (codepoints);
+
+ hb_subset_test_check (face_ac, face_abc_subset, HB_TAG ('C', 'F', 'F', ' '));
+
+ hb_face_destroy (face_abc_subset);
+ hb_face_destroy (face_abc);
+ hb_face_destroy (face_ac);
+}
+
+static void
+test_subset_cff1_desubr (void)
+{
+ hb_face_t *face_abc = hb_test_open_font_file ("fonts/SourceSansPro-Regular.abc.otf");
+ hb_face_t *face_ac = hb_test_open_font_file ("fonts/SourceSansPro-Regular.ac.nosubrs.otf");
+
+ hb_set_t *codepoints = hb_set_create ();
+ hb_subset_input_t *input;
+ hb_face_t *face_abc_subset;
+ hb_set_add (codepoints, 'a');
+ hb_set_add (codepoints, 'c');
+ input = hb_subset_test_create_input (codepoints);
+ hb_subset_input_set_desubroutinize (input, true);
+ face_abc_subset = hb_subset_test_create_subset (face_abc, input);
+ hb_set_destroy (codepoints);
+
+ hb_subset_test_check (face_ac, face_abc_subset, HB_TAG ('C','F','F',' '));
+
+ hb_face_destroy (face_abc_subset);
+ hb_face_destroy (face_abc);
+ hb_face_destroy (face_ac);
+}
+
+static void
+test_subset_cff1_desubr_strip_hints (void)
+{
+ hb_face_t *face_abc = hb_test_open_font_file ("fonts/SourceSansPro-Regular.abc.otf");
+ hb_face_t *face_ac = hb_test_open_font_file ("fonts/SourceSansPro-Regular.ac.nosubrs.nohints.otf");
+
+ hb_set_t *codepoints = hb_set_create ();
+ hb_subset_input_t *input;
+ hb_face_t *face_abc_subset;
+ hb_set_add (codepoints, 'a');
+ hb_set_add (codepoints, 'c');
+ input = hb_subset_test_create_input (codepoints);
+ hb_subset_input_set_drop_hints (input, true);
+ hb_subset_input_set_desubroutinize (input, true);
+ face_abc_subset = hb_subset_test_create_subset (face_abc, input);
+ hb_set_destroy (codepoints);
+
+ hb_subset_test_check (face_ac, face_abc_subset, HB_TAG ('C', 'F', 'F', ' '));
+
+ hb_face_destroy (face_abc_subset);
+ hb_face_destroy (face_abc);
+ hb_face_destroy (face_ac);
+}
+
+static void
+test_subset_cff1_j (void)
+{
+ hb_face_t *face_41_3041_4c2e = hb_test_open_font_file ("fonts/SourceHanSans-Regular.41,3041,4C2E.otf");
+ hb_face_t *face_41_4c2e = hb_test_open_font_file ("fonts/SourceHanSans-Regular.41,4C2E.otf");
+
+ hb_set_t *codepoints = hb_set_create ();
+ hb_face_t *face_41_3041_4c2e_subset;
+ hb_set_add (codepoints, 0x41);
+ hb_set_add (codepoints, 0x4C2E);
+ face_41_3041_4c2e_subset = hb_subset_test_create_subset (face_41_3041_4c2e, hb_subset_test_create_input (codepoints));
+ hb_set_destroy (codepoints);
+
+ hb_subset_test_check (face_41_4c2e, face_41_3041_4c2e_subset, HB_TAG ('C','F','F',' '));
+
+ hb_face_destroy (face_41_3041_4c2e_subset);
+ hb_face_destroy (face_41_3041_4c2e);
+ hb_face_destroy (face_41_4c2e);
+}
+
+static void
+test_subset_cff1_j_strip_hints (void)
+{
+ hb_face_t *face_41_3041_4c2e = hb_test_open_font_file ("fonts/SourceHanSans-Regular.41,3041,4C2E.otf");
+ hb_face_t *face_41_4c2e = hb_test_open_font_file ("fonts/SourceHanSans-Regular.41,4C2E.nohints.otf");
+
+ hb_set_t *codepoints = hb_set_create ();
+ hb_face_t *face_41_3041_4c2e_subset;
+ hb_subset_input_t *input;
+ hb_set_add (codepoints, 0x41);
+ hb_set_add (codepoints, 0x4C2E);
+ input = hb_subset_test_create_input (codepoints);
+ hb_subset_input_set_drop_hints (input, true);
+ face_41_3041_4c2e_subset = hb_subset_test_create_subset (face_41_3041_4c2e, input);
+ hb_set_destroy (codepoints);
+
+ hb_subset_test_check (face_41_4c2e, face_41_3041_4c2e_subset, HB_TAG ('C','F','F',' '));
+
+ hb_face_destroy (face_41_3041_4c2e_subset);
+ hb_face_destroy (face_41_3041_4c2e);
+ hb_face_destroy (face_41_4c2e);
+}
+
+static void
+test_subset_cff1_j_desubr (void)
+{
+ hb_face_t *face_41_3041_4c2e = hb_test_open_font_file ("fonts/SourceHanSans-Regular.41,3041,4C2E.otf");
+ hb_face_t *face_41_4c2e = hb_test_open_font_file ("fonts/SourceHanSans-Regular.41,4C2E.nosubrs.otf");
+
+ hb_set_t *codepoints = hb_set_create ();
+ hb_face_t *face_41_3041_4c2e_subset;
+ hb_subset_input_t *input;
+ hb_set_add (codepoints, 0x41);
+ hb_set_add (codepoints, 0x4C2E);
+ input = hb_subset_test_create_input (codepoints);
+ hb_subset_input_set_desubroutinize (input, true);
+ face_41_3041_4c2e_subset = hb_subset_test_create_subset (face_41_3041_4c2e, input);
+ hb_set_destroy (codepoints);
+
+ hb_subset_test_check (face_41_4c2e, face_41_3041_4c2e_subset, HB_TAG ('C','F','F',' '));
+
+ hb_face_destroy (face_41_3041_4c2e_subset);
+ hb_face_destroy (face_41_3041_4c2e);
+ hb_face_destroy (face_41_4c2e);
+}
+
+static void
+test_subset_cff1_j_desubr_strip_hints (void)
+{
+ hb_face_t *face_41_3041_4c2e = hb_test_open_font_file ("fonts/SourceHanSans-Regular.41,3041,4C2E.otf");
+ hb_face_t *face_41_4c2e = hb_test_open_font_file ("fonts/SourceHanSans-Regular.41,4C2E.nosubrs.nohints.otf");
+
+ hb_set_t *codepoints = hb_set_create ();
+ hb_face_t *face_41_3041_4c2e_subset;
+ hb_subset_input_t *input;
+ hb_set_add (codepoints, 0x41);
+ hb_set_add (codepoints, 0x4C2E);
+ input = hb_subset_test_create_input (codepoints);
+ hb_subset_input_set_drop_hints (input, true);
+ hb_subset_input_set_desubroutinize (input, true);
+ face_41_3041_4c2e_subset = hb_subset_test_create_subset (face_41_3041_4c2e, input);
+ hb_set_destroy (codepoints);
+
+ hb_subset_test_check (face_41_4c2e, face_41_3041_4c2e_subset, HB_TAG ('C','F','F',' '));
+
+ hb_face_destroy (face_41_3041_4c2e_subset);
+ hb_face_destroy (face_41_3041_4c2e);
+ hb_face_destroy (face_41_4c2e);
+}
+
+static void
+test_subset_cff1_expert (void)
+{
+ hb_face_t *face = hb_test_open_font_file ("fonts/cff1_expert.otf");
+ hb_face_t *face_subset = hb_test_open_font_file ("fonts/cff1_expert.2D,F6E9,FB00.otf");
+
+ hb_set_t *codepoints = hb_set_create ();
+ hb_face_t *face_test;
+ hb_set_add (codepoints, 0x2D);
+ hb_set_add (codepoints, 0xF6E9);
+ hb_set_add (codepoints, 0xFB00);
+ face_test = hb_subset_test_create_subset (face, hb_subset_test_create_input (codepoints));
+ hb_set_destroy (codepoints);
+
+ hb_subset_test_check (face_subset, face_test, HB_TAG ('C','F','F',' '));
+
+ hb_face_destroy (face_test);
+ hb_face_destroy (face_subset);
+ hb_face_destroy (face);
+}
+
+static void
+test_subset_cff1_seac (void)
+{
+ hb_face_t *face = hb_test_open_font_file ("fonts/cff1_seac.otf");
+ hb_face_t *face_subset = hb_test_open_font_file ("fonts/cff1_seac.C0.otf");
+ hb_face_t *face_test;
+
+ hb_set_t *codepoints = hb_set_create ();
+ hb_set_add (codepoints, 0xC0); /* Agrave */
+ face_test = hb_subset_test_create_subset (face, hb_subset_test_create_input (codepoints));
+ hb_set_destroy (codepoints);
+
+ hb_subset_test_check (face_subset, face_test, HB_TAG ('C','F','F',' '));
+
+ hb_face_destroy (face_test);
+ hb_face_destroy (face_subset);
+ hb_face_destroy (face);
+}
+
+static void
+test_subset_cff1_dotsection (void)
+{
+ hb_face_t *face = hb_test_open_font_file ("fonts/cff1_dotsect.otf");
+ hb_face_t *face_subset = hb_test_open_font_file ("fonts/cff1_dotsect.nohints.otf");
+
+ hb_set_t *codepoints = hb_set_create ();
+ hb_subset_input_t *input;
+ hb_face_t *face_test;
+ hb_set_add (codepoints, 0x69); /* i */
+ input = hb_subset_test_create_input (codepoints);
+ hb_subset_input_set_drop_hints (input, true);
+ face_test = hb_subset_test_create_subset (face, input);
+ hb_set_destroy (codepoints);
+
+ hb_subset_test_check (face_subset, face_test, HB_TAG ('C','F','F',' '));
+
+ hb_face_destroy (face_test);
+ hb_face_destroy (face_subset);
+ hb_face_destroy (face);
+}
+
+int
+main (int argc, char **argv)
+{
+ hb_test_init (&argc, &argv);
+
+ hb_test_add (test_subset_cff1_noop);
+ hb_test_add (test_subset_cff1);
+ hb_test_add (test_subset_cff1_strip_hints);
+ hb_test_add (test_subset_cff1_desubr);
+ hb_test_add (test_subset_cff1_desubr_strip_hints);
+ hb_test_add (test_subset_cff1_j);
+ hb_test_add (test_subset_cff1_j_strip_hints);
+ hb_test_add (test_subset_cff1_j_desubr);
+ hb_test_add (test_subset_cff1_j_desubr_strip_hints);
+ hb_test_add (test_subset_cff1_expert);
+ hb_test_add (test_subset_cff1_seac);
+ hb_test_add (test_subset_cff1_dotsection);
+
+ return hb_test_run ();
+}
diff --git a/test/api/test-subset-cff2.c b/test/api/test-subset-cff2.c
new file mode 100644
index 0000000..9367965
--- /dev/null
+++ b/test/api/test-subset-cff2.c
@@ -0,0 +1,153 @@
+/*
+ * Copyright © 2018 Adobe Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Adobe Author(s): Michiharu Ariza
+ */
+
+#include "hb-test.h"
+#include "hb-subset-test.h"
+
+/* Unit tests for CFF2 subsetting */
+
+static void
+test_subset_cff2_noop (void)
+{
+ hb_face_t *face_abc = hb_test_open_font_file("fonts/AdobeVFPrototype.abc.otf");
+
+ hb_set_t *codepoints = hb_set_create ();
+ hb_face_t *face_abc_subset;
+ hb_set_add (codepoints, 'a');
+ hb_set_add (codepoints, 'b');
+ hb_set_add (codepoints, 'c');
+ face_abc_subset = hb_subset_test_create_subset (face_abc, hb_subset_test_create_input (codepoints));
+ hb_set_destroy (codepoints);
+
+ hb_subset_test_check (face_abc, face_abc_subset, HB_TAG ('C','F','F','2'));
+
+ hb_face_destroy (face_abc_subset);
+ hb_face_destroy (face_abc);
+}
+
+static void
+test_subset_cff2 (void)
+{
+ hb_face_t *face_abc = hb_test_open_font_file ("fonts/AdobeVFPrototype.abc.otf");
+ hb_face_t *face_ac = hb_test_open_font_file ("fonts/AdobeVFPrototype.ac.otf");
+
+ hb_set_t *codepoints = hb_set_create ();
+ hb_face_t *face_abc_subset;
+ hb_set_add (codepoints, 'a');
+ hb_set_add (codepoints, 'c');
+ face_abc_subset = hb_subset_test_create_subset (face_abc, hb_subset_test_create_input (codepoints));
+ hb_set_destroy (codepoints);
+
+ hb_subset_test_check (face_ac, face_abc_subset, HB_TAG ('C','F','F','2'));
+
+ hb_face_destroy (face_abc_subset);
+ hb_face_destroy (face_abc);
+ hb_face_destroy (face_ac);
+}
+
+static void
+test_subset_cff2_strip_hints (void)
+{
+ hb_face_t *face_abc = hb_test_open_font_file ("fonts/AdobeVFPrototype.abc.otf");
+ hb_face_t *face_ac = hb_test_open_font_file ("fonts/AdobeVFPrototype.ac.nohints.otf");
+
+ hb_set_t *codepoints = hb_set_create ();
+ hb_subset_input_t *input;
+ hb_face_t *face_abc_subset;
+ hb_set_add (codepoints, 'a');
+ hb_set_add (codepoints, 'c');
+ input = hb_subset_test_create_input (codepoints);
+ hb_subset_input_set_drop_hints (input, true);
+ face_abc_subset = hb_subset_test_create_subset (face_abc, input);
+ hb_set_destroy (codepoints);
+
+ hb_subset_test_check (face_ac, face_abc_subset, HB_TAG ('C', 'F', 'F', '2'));
+
+ hb_face_destroy (face_abc_subset);
+ hb_face_destroy (face_abc);
+ hb_face_destroy (face_ac);
+}
+
+static void
+test_subset_cff2_desubr (void)
+{
+ hb_face_t *face_abc = hb_test_open_font_file ("fonts/AdobeVFPrototype.abc.otf");
+ hb_face_t *face_ac = hb_test_open_font_file ("fonts/AdobeVFPrototype.ac.nosubrs.otf");
+
+ hb_set_t *codepoints = hb_set_create ();
+ hb_subset_input_t *input;
+ hb_face_t *face_abc_subset;
+ hb_set_add (codepoints, 'a');
+ hb_set_add (codepoints, 'c');
+ input = hb_subset_test_create_input (codepoints);
+ hb_subset_input_set_desubroutinize (input, true);
+ face_abc_subset = hb_subset_test_create_subset (face_abc, input);
+ hb_set_destroy (codepoints);
+
+ hb_subset_test_check (face_ac, face_abc_subset, HB_TAG ('C', 'F', 'F', '2'));
+
+ hb_face_destroy (face_abc_subset);
+ hb_face_destroy (face_abc);
+ hb_face_destroy (face_ac);
+}
+
+static void
+test_subset_cff2_desubr_strip_hints (void)
+{
+ hb_face_t *face_abc = hb_test_open_font_file ("fonts/AdobeVFPrototype.abc.otf");
+ hb_face_t *face_ac = hb_test_open_font_file ("fonts/AdobeVFPrototype.ac.nosubrs.nohints.otf");
+
+ hb_set_t *codepoints = hb_set_create ();
+ hb_subset_input_t *input;
+ hb_face_t *face_abc_subset;
+ hb_set_add (codepoints, 'a');
+ hb_set_add (codepoints, 'c');
+ input = hb_subset_test_create_input (codepoints);
+ hb_subset_input_set_desubroutinize (input, true);
+ hb_subset_input_set_drop_hints (input, true);
+ face_abc_subset = hb_subset_test_create_subset (face_abc, input);
+ hb_set_destroy (codepoints);
+
+ hb_subset_test_check (face_ac, face_abc_subset, HB_TAG ('C', 'F', 'F', '2'));
+
+ hb_face_destroy (face_abc_subset);
+ hb_face_destroy (face_abc);
+ hb_face_destroy (face_ac);
+}
+
+int
+main (int argc, char **argv)
+{
+ hb_test_init (&argc, &argv);
+
+ hb_test_add (test_subset_cff2_noop);
+ hb_test_add (test_subset_cff2);
+ hb_test_add (test_subset_cff2_strip_hints);
+ hb_test_add (test_subset_cff2_desubr);
+ hb_test_add (test_subset_cff2_desubr_strip_hints);
+
+ return hb_test_run ();
+}
diff --git a/test/api/test-subset-cmap.c b/test/api/test-subset-cmap.c
index 84d34bc..74e91ca 100644
--- a/test/api/test-subset-cmap.c
+++ b/test/api/test-subset-cmap.c
@@ -32,8 +32,8 @@
static void
test_subset_cmap (void)
{
- hb_face_t *face_abc = hb_subset_test_open_font ("fonts/Roboto-Regular.abc.ttf");
- hb_face_t *face_ac = hb_subset_test_open_font ("fonts/Roboto-Regular.ac.ttf");
+ hb_face_t *face_abc = hb_test_open_font_file ("fonts/Roboto-Regular.abc.ttf");
+ hb_face_t *face_ac = hb_test_open_font_file ("fonts/Roboto-Regular.ac.ttf");
hb_set_t *codepoints = hb_set_create ();
hb_face_t *face_abc_subset;
@@ -52,7 +52,7 @@ test_subset_cmap (void)
static void
test_subset_cmap_non_consecutive_glyphs (void)
{
- hb_face_t *face = hb_subset_test_open_font ("fonts/Roboto-Regular.D7,D8,D9,DA,DE.ttf");
+ hb_face_t *face = hb_test_open_font_file ("fonts/Roboto-Regular.D7,D8,D9,DA,DE.ttf");
hb_set_t *codepoints = hb_set_create ();
hb_face_t *face_subset;
@@ -74,7 +74,7 @@ test_subset_cmap_non_consecutive_glyphs (void)
static void
test_subset_cmap_noop (void)
{
- hb_face_t *face_abc = hb_subset_test_open_font("fonts/Roboto-Regular.abc.ttf");
+ hb_face_t *face_abc = hb_test_open_font_file ("fonts/Roboto-Regular.abc.ttf");
hb_set_t *codepoints = hb_set_create();
hb_face_t *face_abc_subset;
diff --git a/test/api/test-subset-glyf.c b/test/api/test-subset-glyf.c
index e4440e0..0e5c293 100644
--- a/test/api/test-subset-glyf.c
+++ b/test/api/test-subset-glyf.c
@@ -60,8 +60,8 @@ static void check_maxp_num_glyphs (hb_face_t *face, uint16_t expected_num_glyphs
static void
test_subset_glyf (void)
{
- hb_face_t *face_abc = hb_subset_test_open_font ("fonts/Roboto-Regular.abc.ttf");
- hb_face_t *face_ac = hb_subset_test_open_font ("fonts/Roboto-Regular.ac.ttf");
+ hb_face_t *face_abc = hb_test_open_font_file ("fonts/Roboto-Regular.abc.ttf");
+ hb_face_t *face_ac = hb_test_open_font_file ("fonts/Roboto-Regular.ac.ttf");
hb_set_t *codepoints = hb_set_create();
hb_face_t *face_abc_subset;
@@ -82,8 +82,8 @@ test_subset_glyf (void)
static void
test_subset_glyf_with_components (void)
{
- hb_face_t *face_components = hb_subset_test_open_font ("fonts/Roboto-Regular.components.ttf");
- hb_face_t *face_subset = hb_subset_test_open_font ("fonts/Roboto-Regular.components.subset.ttf");
+ hb_face_t *face_components = hb_test_open_font_file ("fonts/Roboto-Regular.components.ttf");
+ hb_face_t *face_subset = hb_test_open_font_file ("fonts/Roboto-Regular.components.subset.ttf");
hb_set_t *codepoints = hb_set_create();
hb_face_t *face_generated_subset;
@@ -103,18 +103,20 @@ test_subset_glyf_with_components (void)
static void
test_subset_glyf_with_gsub (void)
{
- hb_face_t *face_fil = hb_subset_test_open_font ("fonts/Roboto-Regular.gsub.fil.ttf");
- hb_face_t *face_fi = hb_subset_test_open_font ("fonts/Roboto-Regular.gsub.fi.ttf");
+ hb_face_t *face_fil = hb_test_open_font_file ("fonts/Roboto-Regular.gsub.fil.ttf");
+ hb_face_t *face_fi = hb_test_open_font_file ("fonts/Roboto-Regular.gsub.fi.ttf");
+ hb_subset_input_t *input;
+ hb_face_t *face_subset;
hb_set_t *codepoints = hb_set_create();
hb_set_add (codepoints, 102); // f
hb_set_add (codepoints, 105); // i
- hb_subset_input_t *input = hb_subset_test_create_input (codepoints);
+ input = hb_subset_test_create_input (codepoints);
hb_set_destroy (codepoints);
- *hb_subset_input_drop_ot_layout (input) = false;
+ hb_subset_input_set_drop_layout (input, false);
- hb_face_t *face_subset = hb_subset_test_create_subset (face_fil, input);
+ face_subset = hb_subset_test_create_subset (face_fil, input);
hb_subset_test_check (face_fi, face_subset, HB_TAG ('g','l','y','f'));
hb_subset_test_check (face_fi, face_subset, HB_TAG ('l','o','c', 'a'));
@@ -128,18 +130,20 @@ test_subset_glyf_with_gsub (void)
static void
test_subset_glyf_without_gsub (void)
{
- hb_face_t *face_fil = hb_subset_test_open_font ("fonts/Roboto-Regular.gsub.fil.ttf");
- hb_face_t *face_fi = hb_subset_test_open_font ("fonts/Roboto-Regular.nogsub.fi.ttf");
+ hb_face_t *face_fil = hb_test_open_font_file ("fonts/Roboto-Regular.gsub.fil.ttf");
+ hb_face_t *face_fi = hb_test_open_font_file ("fonts/Roboto-Regular.nogsub.fi.ttf");
+ hb_subset_input_t *input;
+ hb_face_t *face_subset;
hb_set_t *codepoints = hb_set_create();
hb_set_add (codepoints, 102); // f
hb_set_add (codepoints, 105); // i
- hb_subset_input_t *input = hb_subset_test_create_input (codepoints);
+ input = hb_subset_test_create_input (codepoints);
hb_set_destroy (codepoints);
- *hb_subset_input_drop_ot_layout (input) = true;
+ hb_subset_input_set_drop_layout (input, true);
- hb_face_t *face_subset = hb_subset_test_create_subset (face_fil, input);
+ face_subset = hb_subset_test_create_subset (face_fil, input);
hb_subset_test_check (face_fi, face_subset, HB_TAG ('g','l','y','f'));
hb_subset_test_check (face_fi, face_subset, HB_TAG ('l','o','c', 'a'));
@@ -153,7 +157,7 @@ test_subset_glyf_without_gsub (void)
static void
test_subset_glyf_noop (void)
{
- hb_face_t *face_abc = hb_subset_test_open_font("fonts/Roboto-Regular.abc.ttf");
+ hb_face_t *face_abc = hb_test_open_font_file ("fonts/Roboto-Regular.abc.ttf");
hb_set_t *codepoints = hb_set_create();
hb_face_t *face_abc_subset;
@@ -174,8 +178,8 @@ test_subset_glyf_noop (void)
static void
test_subset_glyf_strip_hints_simple (void)
{
- hb_face_t *face_abc = hb_subset_test_open_font ("fonts/Roboto-Regular.abc.ttf");
- hb_face_t *face_ac = hb_subset_test_open_font ("fonts/Roboto-Regular.ac.nohints.ttf");
+ hb_face_t *face_abc = hb_test_open_font_file ("fonts/Roboto-Regular.abc.ttf");
+ hb_face_t *face_ac = hb_test_open_font_file ("fonts/Roboto-Regular.ac.nohints.ttf");
hb_set_t *codepoints = hb_set_create();
hb_subset_input_t *input;
@@ -183,7 +187,7 @@ test_subset_glyf_strip_hints_simple (void)
hb_set_add (codepoints, 'a');
hb_set_add (codepoints, 'c');
input = hb_subset_test_create_input (codepoints);
- *hb_subset_input_drop_hints(input) = true;
+ hb_subset_input_set_drop_hints (input, true);
face_abc_subset = hb_subset_test_create_subset (face_abc, input);
hb_set_destroy (codepoints);
@@ -199,15 +203,15 @@ test_subset_glyf_strip_hints_simple (void)
static void
test_subset_glyf_strip_hints_composite (void)
{
- hb_face_t *face_components = hb_subset_test_open_font ("fonts/Roboto-Regular.components.ttf");
- hb_face_t *face_subset = hb_subset_test_open_font ("fonts/Roboto-Regular.components.1fc.nohints.ttf");
+ hb_face_t *face_components = hb_test_open_font_file ("fonts/Roboto-Regular.components.ttf");
+ hb_face_t *face_subset = hb_test_open_font_file ("fonts/Roboto-Regular.components.1fc.nohints.ttf");
hb_set_t *codepoints = hb_set_create();
hb_subset_input_t *input;
hb_face_t *face_generated_subset;
hb_set_add (codepoints, 0x1fc);
input = hb_subset_test_create_input (codepoints);
- *hb_subset_input_drop_hints(input) = true;
+ hb_subset_input_set_drop_hints (input, true);
face_generated_subset = hb_subset_test_create_subset (face_components, input);
hb_set_destroy (codepoints);
@@ -224,7 +228,7 @@ test_subset_glyf_strip_hints_composite (void)
static void
test_subset_glyf_strip_hints_invalid (void)
{
- hb_face_t *face = hb_subset_test_open_font ("fonts/oom-ccc61c92d589f895174cdef6ff2e3b20e9999a1a");
+ hb_face_t *face = hb_test_open_font_file ("../fuzzing/fonts/oom-ccc61c92d589f895174cdef6ff2e3b20e9999a1a");
hb_set_t *codepoints = hb_set_create();
const hb_codepoint_t text[] =
@@ -233,16 +237,19 @@ test_subset_glyf_strip_hints_invalid (void)
'3', '@', '_', '%', '&', ')', '*', '$', '!'
};
unsigned int i;
+ hb_subset_input_t *input;
+ hb_face_t *face_subset;
+
for (i = 0; i < sizeof (text) / sizeof (hb_codepoint_t); i++)
{
hb_set_add (codepoints, text[i]);
}
- hb_subset_input_t *input = hb_subset_test_create_input (codepoints);
- *hb_subset_input_drop_hints(input) = true;
+ input = hb_subset_test_create_input (codepoints);
+ hb_subset_input_set_drop_hints (input, true);
hb_set_destroy (codepoints);
- hb_face_t *face_subset = hb_subset_test_create_subset (face, input);
+ face_subset = hb_subset_test_create_subset (face, input);
g_assert (face_subset);
g_assert (face_subset == hb_face_get_empty ());
diff --git a/test/api/test-subset-hdmx.c b/test/api/test-subset-hdmx.c
index c78009b..44e579a 100644
--- a/test/api/test-subset-hdmx.c
+++ b/test/api/test-subset-hdmx.c
@@ -33,8 +33,8 @@
static void
test_subset_hdmx_simple_subset (void)
{
- hb_face_t *face_abc = hb_subset_test_open_font ("fonts/Roboto-Regular.abc.ttf");
- hb_face_t *face_ac = hb_subset_test_open_font ("fonts/Roboto-Regular.ac.ttf");
+ hb_face_t *face_abc = hb_test_open_font_file ("fonts/Roboto-Regular.abc.ttf");
+ hb_face_t *face_ac = hb_test_open_font_file ("fonts/Roboto-Regular.ac.ttf");
hb_set_t *codepoints = hb_set_create ();
hb_face_t *face_abc_subset;
@@ -51,23 +51,42 @@ test_subset_hdmx_simple_subset (void)
}
static void
+test_subset_hdmx_multiple_device_records (void)
+{
+ hb_face_t *face_abc = hb_test_open_font_file ("fonts/Roboto-Regular.multihdmx.abc.ttf");
+ hb_face_t *face_a = hb_test_open_font_file ("fonts/Roboto-Regular.multihdmx.a.ttf");
+
+ hb_set_t *codepoints = hb_set_create ();
+ hb_face_t *face_abc_subset;
+ hb_set_add (codepoints, 'a');
+ face_abc_subset = hb_subset_test_create_subset (face_abc, hb_subset_test_create_input (codepoints));
+ hb_set_destroy (codepoints);
+
+ hb_subset_test_check (face_a, face_abc_subset, HB_TAG ('h','d','m','x'));
+
+ hb_face_destroy (face_abc_subset);
+ hb_face_destroy (face_abc);
+ hb_face_destroy (face_a);
+}
+
+static void
test_subset_hdmx_invalid (void)
{
- hb_face_t *face = hb_subset_test_open_font("fonts/crash-ccc61c92d589f895174cdef6ff2e3b20e9999a1a");
+ hb_face_t *face = hb_test_open_font_file ("../fuzzing/fonts/crash-ccc61c92d589f895174cdef6ff2e3b20e9999a1a");
hb_subset_input_t *input = hb_subset_input_create_or_fail ();
hb_set_t *codepoints = hb_subset_input_unicode_set (input);
+ hb_face_t *subset;
+
hb_set_add (codepoints, 'a');
hb_set_add (codepoints, 'b');
hb_set_add (codepoints, 'c');
- hb_subset_profile_t *profile = hb_subset_profile_create();
- hb_face_t *subset = hb_subset (face, profile, input);
+ subset = hb_subset (face, input);
g_assert (subset);
g_assert (subset == hb_face_get_empty ());
hb_subset_input_destroy (input);
- hb_subset_profile_destroy (profile);
hb_face_destroy (subset);
hb_face_destroy (face);
}
@@ -75,21 +94,21 @@ test_subset_hdmx_invalid (void)
static void
test_subset_hdmx_fails_sanitize (void)
{
- hb_face_t *face = hb_subset_test_open_font("fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5609911946838016");
+ hb_face_t *face = hb_test_open_font_file ("../fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5609911946838016");
hb_subset_input_t *input = hb_subset_input_create_or_fail ();
hb_set_t *codepoints = hb_subset_input_unicode_set (input);
+ hb_face_t *subset;
+
hb_set_add (codepoints, 'a');
hb_set_add (codepoints, 'b');
hb_set_add (codepoints, 'c');
- hb_subset_profile_t *profile = hb_subset_profile_create();
- hb_face_t *subset = hb_subset (face, profile, input);
+ subset = hb_subset (face, input);
g_assert (subset);
g_assert (subset == hb_face_get_empty ());
hb_subset_input_destroy (input);
- hb_subset_profile_destroy (profile);
hb_face_destroy (subset);
hb_face_destroy (face);
}
@@ -97,7 +116,7 @@ test_subset_hdmx_fails_sanitize (void)
static void
test_subset_hdmx_noop (void)
{
- hb_face_t *face_abc = hb_subset_test_open_font("fonts/Roboto-Regular.abc.ttf");
+ hb_face_t *face_abc = hb_test_open_font_file ("fonts/Roboto-Regular.abc.ttf");
hb_set_t *codepoints = hb_set_create();
hb_face_t *face_abc_subset;
@@ -119,6 +138,7 @@ main (int argc, char **argv)
hb_test_init (&argc, &argv);
hb_test_add (test_subset_hdmx_simple_subset);
+ hb_test_add (test_subset_hdmx_multiple_device_records);
hb_test_add (test_subset_hdmx_invalid);
hb_test_add (test_subset_hdmx_fails_sanitize);
hb_test_add (test_subset_hdmx_noop);
diff --git a/test/api/test-subset-hmtx.c b/test/api/test-subset-hmtx.c
index 0ed6256..1b51dc2 100644
--- a/test/api/test-subset-hmtx.c
+++ b/test/api/test-subset-hmtx.c
@@ -47,8 +47,8 @@ static void check_num_hmetrics(hb_face_t *face, uint16_t expected_num_hmetrics)
static void
test_subset_hmtx_simple_subset (void)
{
- hb_face_t *face_abc = hb_subset_test_open_font ("fonts/Roboto-Regular.abc.ttf");
- hb_face_t *face_ac = hb_subset_test_open_font ("fonts/Roboto-Regular.ac.ttf");
+ hb_face_t *face_abc = hb_test_open_font_file ("fonts/Roboto-Regular.abc.ttf");
+ hb_face_t *face_ac = hb_test_open_font_file ("fonts/Roboto-Regular.ac.ttf");
hb_set_t *codepoints = hb_set_create ();
hb_face_t *face_abc_subset;
@@ -69,8 +69,8 @@ test_subset_hmtx_simple_subset (void)
static void
test_subset_hmtx_monospace (void)
{
- hb_face_t *face_abc = hb_subset_test_open_font ("fonts/Inconsolata-Regular.abc.ttf");
- hb_face_t *face_ac = hb_subset_test_open_font ("fonts/Inconsolata-Regular.ac.ttf");
+ hb_face_t *face_abc = hb_test_open_font_file ("fonts/Inconsolata-Regular.abc.ttf");
+ hb_face_t *face_ac = hb_test_open_font_file ("fonts/Inconsolata-Regular.ac.ttf");
hb_set_t *codepoints = hb_set_create ();
hb_face_t *face_abc_subset;
@@ -91,8 +91,8 @@ test_subset_hmtx_monospace (void)
static void
test_subset_hmtx_keep_num_metrics (void)
{
- hb_face_t *face_abc = hb_subset_test_open_font ("fonts/Inconsolata-Regular.abc.widerc.ttf");
- hb_face_t *face_ac = hb_subset_test_open_font ("fonts/Inconsolata-Regular.ac.widerc.ttf");
+ hb_face_t *face_abc = hb_test_open_font_file ("fonts/Inconsolata-Regular.abc.widerc.ttf");
+ hb_face_t *face_ac = hb_test_open_font_file ("fonts/Inconsolata-Regular.ac.widerc.ttf");
hb_set_t *codepoints = hb_set_create ();
hb_face_t *face_abc_subset;
@@ -112,8 +112,8 @@ test_subset_hmtx_keep_num_metrics (void)
static void
test_subset_hmtx_decrease_num_metrics (void)
{
- hb_face_t *face_abc = hb_subset_test_open_font ("fonts/Inconsolata-Regular.abc.widerc.ttf");
- hb_face_t *face_ab = hb_subset_test_open_font ("fonts/Inconsolata-Regular.ab.ttf");
+ hb_face_t *face_abc = hb_test_open_font_file ("fonts/Inconsolata-Regular.abc.widerc.ttf");
+ hb_face_t *face_ab = hb_test_open_font_file ("fonts/Inconsolata-Regular.ab.ttf");
hb_set_t *codepoints = hb_set_create ();
hb_face_t *face_abc_subset;
@@ -133,7 +133,7 @@ test_subset_hmtx_decrease_num_metrics (void)
static void
test_subset_hmtx_noop (void)
{
- hb_face_t *face_abc = hb_subset_test_open_font("fonts/Roboto-Regular.abc.ttf");
+ hb_face_t *face_abc = hb_test_open_font_file ("fonts/Roboto-Regular.abc.ttf");
hb_set_t *codepoints = hb_set_create();
hb_face_t *face_abc_subset;
@@ -153,7 +153,8 @@ test_subset_hmtx_noop (void)
static void
test_subset_invalid_hmtx (void)
{
- hb_face_t *face = hb_subset_test_open_font("fonts/crash-e4e0bb1458a91b692eba492c907ae1f94e635480");
+ hb_face_t *face = hb_test_open_font_file ("../fuzzing/fonts/crash-e4e0bb1458a91b692eba492c907ae1f94e635480");
+ hb_face_t *subset;
hb_subset_input_t *input = hb_subset_input_create_or_fail ();
hb_set_t *codepoints = hb_subset_input_unicode_set (input);
@@ -161,13 +162,11 @@ test_subset_invalid_hmtx (void)
hb_set_add (codepoints, 'b');
hb_set_add (codepoints, 'c');
- hb_subset_profile_t *profile = hb_subset_profile_create();
- hb_face_t *subset = hb_subset (face, profile, input);
+ subset = hb_subset (face, input);
g_assert (subset);
g_assert (subset == hb_face_get_empty ());
hb_subset_input_destroy (input);
- hb_subset_profile_destroy (profile);
hb_face_destroy (subset);
hb_face_destroy (face);
}
diff --git a/test/api/test-subset-os2.c b/test/api/test-subset-os2.c
index de63a3f..dfc9461 100644
--- a/test/api/test-subset-os2.c
+++ b/test/api/test-subset-os2.c
@@ -31,8 +31,8 @@
static void
test_subset_os2 (void)
{
- hb_face_t *face_abc = hb_subset_test_open_font("fonts/Roboto-Regular.abc.ttf");
- hb_face_t *face_b = hb_subset_test_open_font("fonts/Roboto-Regular.b.ttf");
+ hb_face_t *face_abc = hb_test_open_font_file ("fonts/Roboto-Regular.abc.ttf");
+ hb_face_t *face_b = hb_test_open_font_file ("fonts/Roboto-Regular.b.ttf");
hb_set_t *codepoints = hb_set_create();
hb_face_t *face_abc_subset;
diff --git a/test/api/test-subset-post.c b/test/api/test-subset-post.c
index 948b18a..e31b01e 100644
--- a/test/api/test-subset-post.c
+++ b/test/api/test-subset-post.c
@@ -32,13 +32,14 @@
static void
test_post_drops_glyph_names (void)
{
- hb_face_t *face_full = hb_subset_test_open_font ("fonts/Mplus1p-Regular.660E,6975,73E0,5EA6,8F38,6E05.ttf");
- hb_face_t *face_subset = hb_subset_test_open_font ("fonts/Mplus1p-Regular.660E.ttf");
+ hb_face_t *face_full = hb_test_open_font_file ("fonts/Mplus1p-Regular.660E,6975,73E0,5EA6,8F38,6E05.ttf");
+ hb_face_t *face_subset = hb_test_open_font_file ("fonts/Mplus1p-Regular.660E.ttf");
+ hb_face_t *face_full_subset;
hb_set_t *codepoints = hb_set_create ();
hb_set_add (codepoints, 0x660E);
- hb_face_t *face_full_subset = hb_subset_test_create_subset (face_full, hb_subset_test_create_input (codepoints));
+ face_full_subset = hb_subset_test_create_subset (face_full, hb_subset_test_create_input (codepoints));
hb_set_destroy (codepoints);
hb_subset_test_check (face_subset, face_full_subset, HB_TAG ('p','o','s','t'));
diff --git a/test/api/test-subset-vmtx.c b/test/api/test-subset-vmtx.c
index 437f0c2..24a4a76 100644
--- a/test/api/test-subset-vmtx.c
+++ b/test/api/test-subset-vmtx.c
@@ -46,13 +46,14 @@ static void check_num_vmetrics(hb_face_t *face, uint16_t expected_num_vmetrics)
static void
test_subset_vmtx_simple_subset (void)
{
- hb_face_t *face_full = hb_subset_test_open_font ("fonts/Mplus1p-Regular.660E,6975,73E0,5EA6,8F38,6E05.ttf");
- hb_face_t *face_subset = hb_subset_test_open_font ("fonts/Mplus1p-Regular.660E.ttf");
+ hb_face_t *face_full = hb_test_open_font_file ("fonts/Mplus1p-Regular.660E,6975,73E0,5EA6,8F38,6E05.ttf");
+ hb_face_t *face_subset = hb_test_open_font_file ("fonts/Mplus1p-Regular.660E.ttf");
+ hb_face_t *face_full_subset;
hb_set_t *codepoints = hb_set_create ();
hb_set_add (codepoints, 0x660E);
- hb_face_t *face_full_subset = hb_subset_test_create_subset (face_full, hb_subset_test_create_input (codepoints));
+ face_full_subset = hb_subset_test_create_subset (face_full, hb_subset_test_create_input (codepoints));
hb_set_destroy (codepoints);
check_num_vmetrics(face_full_subset, 1); /* nothing has same width */
@@ -66,7 +67,8 @@ test_subset_vmtx_simple_subset (void)
static void
test_subset_vmtx_noop (void)
{
- hb_face_t *face_full = hb_subset_test_open_font ("fonts/Mplus1p-Regular.660E,6975,73E0,5EA6,8F38,6E05.ttf");
+ hb_face_t *face_full = hb_test_open_font_file ("fonts/Mplus1p-Regular.660E,6975,73E0,5EA6,8F38,6E05.ttf");
+ hb_face_t *face_full_subset;
hb_set_t *codepoints = hb_set_create();
hb_set_add (codepoints, 0x660E);
@@ -75,7 +77,7 @@ test_subset_vmtx_noop (void)
hb_set_add (codepoints, 0x5EA6);
hb_set_add (codepoints, 0x8F38);
hb_set_add (codepoints, 0x6E05);
- hb_face_t *face_full_subset = hb_subset_test_create_subset (face_full, hb_subset_test_create_input (codepoints));
+ face_full_subset = hb_subset_test_create_subset (face_full, hb_subset_test_create_input (codepoints));
hb_set_destroy (codepoints);
check_num_vmetrics(face_full_subset, 1); /* all have the same width */
diff --git a/test/api/test-subset.c b/test/api/test-subset.c
index 6d2bf06..85e4fdf 100644
--- a/test/api/test-subset.c
+++ b/test/api/test-subset.c
@@ -32,21 +32,21 @@
static void
test_subset_32_tables (void)
{
- hb_face_t *face = hb_subset_test_open_font("fonts/oom-6ef8c96d3710262511bcc730dce9c00e722cb653");
+ hb_face_t *face = hb_test_open_font_file ("../fuzzing/fonts/oom-6ef8c96d3710262511bcc730dce9c00e722cb653");
hb_subset_input_t *input = hb_subset_input_create_or_fail ();
hb_set_t *codepoints = hb_subset_input_unicode_set (input);
+ hb_face_t *subset;
+
hb_set_add (codepoints, 'a');
hb_set_add (codepoints, 'b');
hb_set_add (codepoints, 'c');
- hb_subset_profile_t *profile = hb_subset_profile_create();
- hb_face_t *subset = hb_subset (face, profile, input);
+ subset = hb_subset (face, input);
g_assert (subset);
g_assert (subset != hb_face_get_empty ());
hb_subset_input_destroy (input);
- hb_subset_profile_destroy (profile);
hb_face_destroy (subset);
hb_face_destroy (face);
}
@@ -54,21 +54,21 @@ test_subset_32_tables (void)
static void
test_subset_no_inf_loop (void)
{
- hb_face_t *face = hb_subset_test_open_font("fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5521982557782016");
+ hb_face_t *face = hb_test_open_font_file ("../fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5521982557782016");
hb_subset_input_t *input = hb_subset_input_create_or_fail ();
hb_set_t *codepoints = hb_subset_input_unicode_set (input);
+ hb_face_t *subset;
+
hb_set_add (codepoints, 'a');
hb_set_add (codepoints, 'b');
hb_set_add (codepoints, 'c');
- hb_subset_profile_t *profile = hb_subset_profile_create();
- hb_face_t *subset = hb_subset (face, profile, input);
+ subset = hb_subset (face, input);
g_assert (subset);
g_assert (subset == hb_face_get_empty ());
hb_subset_input_destroy (input);
- hb_subset_profile_destroy (profile);
hb_face_destroy (subset);
hb_face_destroy (face);
}
@@ -76,21 +76,21 @@ test_subset_no_inf_loop (void)
static void
test_subset_crash (void)
{
- hb_face_t *face = hb_subset_test_open_font("fonts/crash-4b60576767ee4d9fe1cc10959d89baf73d4e8249");
+ hb_face_t *face = hb_test_open_font_file ("../fuzzing/fonts/crash-4b60576767ee4d9fe1cc10959d89baf73d4e8249");
hb_subset_input_t *input = hb_subset_input_create_or_fail ();
hb_set_t *codepoints = hb_subset_input_unicode_set (input);
+ hb_face_t *subset;
+
hb_set_add (codepoints, 'a');
hb_set_add (codepoints, 'b');
hb_set_add (codepoints, 'c');
- hb_subset_profile_t *profile = hb_subset_profile_create();
- hb_face_t *subset = hb_subset (face, profile, input);
+ subset = hb_subset (face, input);
g_assert (subset);
g_assert (subset == hb_face_get_empty ());
hb_subset_input_destroy (input);
- hb_subset_profile_destroy (profile);
hb_face_destroy (subset);
hb_face_destroy (face);
}
diff --git a/test/api/test-unicode.c b/test/api/test-unicode.c
index 88f12e7..6195bb2 100644
--- a/test/api/test-unicode.c
+++ b/test/api/test-unicode.c
@@ -160,69 +160,6 @@ static const test_pair_t combining_class_tests_more[] =
{ 0x111111, 0 }
};
-static const test_pair_t eastasian_width_tests[] =
-{
- /* Neutral */
- { 0x0000, 1 },
- { 0x0483, 1 },
- { 0x0641, 1 },
- { 0xFFFC, 1 },
- { 0x10000, 1 },
- { 0xE0001, 1 },
-
- /* Narrow */
- { 0x0020, 1 },
- { 0x0041, 1 },
- { 0x27E6, 1 },
-
- /* Halfwidth */
- { 0x20A9, 1 },
- { 0xFF61, 1 },
- { 0xFF69, 1 },
- { 0xFFEE, 1 },
-
- /* Ambiguous */
- { 0x00A1, 1 },
- { 0x00D8, 1 },
- { 0x02DD, 1 },
- { 0xE0100, 1 },
- { 0x100000, 1 },
-
- /* Fullwidth */
- { 0x3000, 2 },
- { 0xFF60, 2 },
-
- /* Wide */
- { 0x2329, 2 },
- { 0x3001, 2 },
- { 0xFE69, 2 },
- { 0x30000, 2 },
- { 0x3FFFD, 2 },
-
- { 0x111111, 1 }
-};
-static const test_pair_t eastasian_width_tests_more[] =
-{
- /* Default Wide blocks */
- { 0x4DBF, 2 },
- { 0x9FFF, 2 },
- { 0xFAFF, 2 },
- { 0x2A6DF, 2 },
- { 0x2B73F, 2 },
- { 0x2B81F, 2 },
- { 0x2FA1F, 2 },
-
- /* Uniode-5.2 character additions */
- /* Wide */
- { 0x115F, 2 },
-
- /* Uniode-6.0 character additions */
- /* Wide */
- { 0x2B740, 2 },
- { 0x1B000, 2 },
-
- { 0x111111, 1 }
-};
static const test_pair_t general_category_tests[] =
{
@@ -469,7 +406,6 @@ typedef struct {
static const property_t properties[] =
{
PROPERTY (combining_class, 0),
- PROPERTY (eastasian_width, 1),
PROPERTY (general_category, (unsigned int) HB_UNICODE_GENERAL_CATEGORY_OTHER_LETTER),
PROPERTY (mirroring, RETURNS_UNICODE_ITSELF),
PROPERTY (script, (unsigned int) HB_SCRIPT_UNKNOWN)
@@ -645,18 +581,18 @@ typedef struct {
} data_fixture_t;
static void
-data_fixture_init (data_fixture_t *f, gconstpointer user_data)
+data_fixture_init (data_fixture_t *f, gconstpointer user_data HB_UNUSED)
{
f->data[0].value = MAGIC0;
f->data[1].value = MAGIC1;
}
static void
-data_fixture_finish (data_fixture_t *f, gconstpointer user_data)
+data_fixture_finish (data_fixture_t *f HB_UNUSED, gconstpointer user_data HB_UNUSED)
{
}
static void
-test_unicode_subclassing_nil (data_fixture_t *f, gconstpointer user_data)
+test_unicode_subclassing_nil (data_fixture_t *f, gconstpointer user_data HB_UNUSED)
{
hb_unicode_funcs_t *uf, *aa;
@@ -678,7 +614,7 @@ test_unicode_subclassing_nil (data_fixture_t *f, gconstpointer user_data)
}
static void
-test_unicode_subclassing_default (data_fixture_t *f, gconstpointer user_data)
+test_unicode_subclassing_default (data_fixture_t *f, gconstpointer user_data HB_UNUSED)
{
hb_unicode_funcs_t *uf, *aa;
@@ -697,7 +633,7 @@ test_unicode_subclassing_default (data_fixture_t *f, gconstpointer user_data)
}
static void
-test_unicode_subclassing_deep (data_fixture_t *f, gconstpointer user_data)
+test_unicode_subclassing_deep (data_fixture_t *f, gconstpointer user_data HB_UNUSED)
{
hb_unicode_funcs_t *uf, *aa;
@@ -786,7 +722,6 @@ test_unicode_normalization (gconstpointer user_data)
{
hb_unicode_funcs_t *uf = (hb_unicode_funcs_t *) user_data;
gunichar a, b, ab;
- hb_codepoint_t decomposed[HB_UNICODE_MAX_DECOMPOSITION_LEN];
/* Test compose() */
@@ -849,56 +784,6 @@ test_unicode_normalization (gconstpointer user_data)
g_assert (hb_unicode_decompose (uf, 0xD4CC, &a, &b) && a == 0x1111 && b == 0x1171);
g_assert (hb_unicode_decompose (uf, 0xCE31, &a, &b) && a == 0xCE20 && b == 0x11B8);
g_assert (hb_unicode_decompose (uf, 0xCE20, &a, &b) && a == 0x110E && b == 0x1173);
-
-
- /* Test decompose_compatibility() */
-
- /* Not decomposable */
- g_assert (hb_unicode_decompose_compatibility (uf, 0x0041, decomposed) == 0);
- g_assert (hb_unicode_decompose_compatibility (uf, 0x1F632, decomposed) == 0);
-
- /* Singletons */
- g_assert (hb_unicode_decompose_compatibility (uf, 0x00B5, decomposed) == 1 && decomposed[0] == 0x03BC);
- g_assert (hb_unicode_decompose_compatibility (uf, 0x03D6, decomposed) == 1 && decomposed[0] == 0x03C0);
-
- /* Arabic compatibility */
- g_assert (hb_unicode_decompose_compatibility (uf, 0xFB54, decomposed) == 1 && decomposed[0] == 0x067B);
-
- /* Longest decomposition ever */
- g_assert (18 <= HB_UNICODE_MAX_DECOMPOSITION_LEN);
- g_assert (hb_unicode_decompose_compatibility (uf, 0xFDFA, decomposed) == 18 && decomposed[17] == 0x0645);
-
- /* Note: we deliberately don't test characters that have canonical decompositions but no
- * compatibility decomposition against the decompose_compatibility() function as that we
- * leave up to implementations (for now). */
-
- /* Spaces */
- g_assert (hb_unicode_decompose_compatibility (uf, 0x2002, decomposed) == 1 && decomposed[0] == 0x0020);
- g_assert (hb_unicode_decompose_compatibility (uf, 0x2003, decomposed) == 1 && decomposed[0] == 0x0020);
- g_assert (hb_unicode_decompose_compatibility (uf, 0x2004, decomposed) == 1 && decomposed[0] == 0x0020);
- g_assert (hb_unicode_decompose_compatibility (uf, 0x2005, decomposed) == 1 && decomposed[0] == 0x0020);
- g_assert (hb_unicode_decompose_compatibility (uf, 0x2006, decomposed) == 1 && decomposed[0] == 0x0020);
- g_assert (hb_unicode_decompose_compatibility (uf, 0x2008, decomposed) == 1 && decomposed[0] == 0x0020);
- g_assert (hb_unicode_decompose_compatibility (uf, 0x2009, decomposed) == 1 && decomposed[0] == 0x0020);
- g_assert (hb_unicode_decompose_compatibility (uf, 0x200A, decomposed) == 1 && decomposed[0] == 0x0020);
-
- /* Pairs */
- g_assert (hb_unicode_decompose_compatibility (uf, 0x0587, decomposed) == 2 &&
- decomposed[0] == 0x0565 && decomposed[1] == 0x0582);
- g_assert (hb_unicode_decompose_compatibility (uf, 0x2017, decomposed) == 2 &&
- decomposed[0] == 0x0020 && decomposed[1] == 0x0333);
- g_assert (hb_unicode_decompose_compatibility (uf, 0x2025, decomposed) == 2 &&
- decomposed[0] == 0x002E && decomposed[1] == 0x002E);
- g_assert (hb_unicode_decompose_compatibility (uf, 0x2033, decomposed) == 2 &&
- decomposed[0] == 0x2032 && decomposed[1] == 0x2032);
-
- /* Triples */
- g_assert (hb_unicode_decompose_compatibility (uf, 0x2026, decomposed) == 3 &&
- decomposed[0] == 0x002E && decomposed[1] == 0x002E && decomposed[2] == 0x002E);
- g_assert (hb_unicode_decompose_compatibility (uf, 0x2034, decomposed) == 3 &&
- decomposed[0] == 0x2032 && decomposed[1] == 0x2032 && decomposed[2] == 0x2032);
- g_assert (hb_unicode_decompose_compatibility (uf, 0x213B, decomposed) == 3 &&
- decomposed[0] == 0x0046 && decomposed[1] == 0x0041 && decomposed[2] == 0x0058);
}
diff --git a/test/fuzzing/CMakeLists.txt b/test/fuzzing/CMakeLists.txt
index 2a45ef6..577d13c 100644
--- a/test/fuzzing/CMakeLists.txt
+++ b/test/fuzzing/CMakeLists.txt
@@ -2,7 +2,6 @@ if (HB_CHECK)
file (READ "${CMAKE_CURRENT_SOURCE_DIR}/Makefile.am" MAKEFILEAM)
extract_make_variable (hb_shape_fuzzer_SOURCES ${MAKEFILEAM})
extract_make_variable (hb_subset_fuzzer_SOURCES ${MAKEFILEAM})
- extract_make_variable (hb_subset_get_codepoints_fuzzer_SOURCES ${MAKEFILEAM})
# TODO: enable these two
#extract_make_variable (FUZZING_CPPFLAGS ${MAKEFILEAM}) # extracting regex fail
@@ -16,17 +15,13 @@ if (HB_CHECK)
add_executable (hb-subset-fuzzer ${hb_subset_fuzzer_SOURCES})
target_link_libraries (hb-subset-fuzzer harfbuzz-subset)
- add_executable (hb-subset-get-codepoints-fuzzer ${hb_subset_get_codepoints_fuzzer_SOURCES})
- target_link_libraries (hb-subset-get-codepoints-fuzzer harfbuzz-subset)
-
target_compile_definitions(hb-shape-fuzzer PUBLIC ${FUZZING_CPPFLAGS})
target_compile_definitions(hb-subset-fuzzer PUBLIC ${FUZZING_CPPFLAGS})
- target_compile_definitions(hb-subset-get-codepoints-fuzzer PUBLIC ${FUZZING_CPPFLAGS})
add_test (NAME hb-shape-fuzzer
COMMAND "${PYTHON_EXECUTABLE}" run-shape-fuzzer-tests.py $<TARGET_FILE:hb-shape-fuzzer>
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
add_test (NAME hb-subset-fuzzer
- COMMAND "${PYTHON_EXECUTABLE}" run-subset-fuzzer-tests.py $<TARGET_FILE:hb-subset-fuzzer> $<TARGET_FILE:hb-subset-get-codepoints-fuzzer>
+ COMMAND "${PYTHON_EXECUTABLE}" run-subset-fuzzer-tests.py $<TARGET_FILE:hb-subset-fuzzer>
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
endif ()
diff --git a/test/fuzzing/Makefile.am b/test/fuzzing/Makefile.am
index 5af5a73..a77df70 100644
--- a/test/fuzzing/Makefile.am
+++ b/test/fuzzing/Makefile.am
@@ -8,22 +8,24 @@ MAINTAINERCLEANFILES =
# Convenience targets:
lib:
- @$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src fuzzing
+ @$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src lib
+libs:
+ @$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src libs
-$(top_builddir)/src/libharfbuzz-fuzzing.la: lib
-$(top_builddir)/src/libharfbuzz-subset-fuzzing.la: lib
+$(top_builddir)/src/libharfbuzz.la: lib
+$(top_builddir)/src/libharfbuzz-subset.la: libs
EXTRA_DIST += \
README \
run-shape-fuzzer-tests.py \
run-subset-fuzzer-tests.py \
CMakeLists.txt \
+ fonts \
$(NULL)
check_PROGRAMS = \
hb-shape-fuzzer \
hb-subset-fuzzer \
- hb-subset-get-codepoints-fuzzer \
$(NULL)
AM_CPPFLAGS = \
@@ -31,24 +33,15 @@ AM_CPPFLAGS = \
-I$(top_srcdir)/src/ \
-I$(top_builddir)/src/ \
$(NULL)
-LDADD = \
- $(top_builddir)/src/libharfbuzz-fuzzing.la \
- $(NULL)
hb_shape_fuzzer_SOURCES = \
hb-fuzzer.hh \
hb-shape-fuzzer.cc \
main.cc \
$(NULL)
-hb_shape_fuzzer_LDADD = \
- $(LDADD) \
- $(NULL)
-hb_shape_fuzzer_CPPFLAGS = \
- $(AM_CPPFLAGS) \
- $(NULL)
-hb_shape_fuzzer_DEPENDENCIES = \
- lib \
- $(NULL)
+hb_shape_fuzzer_LDADD = $(top_builddir)/src/libharfbuzz.la
+hb_shape_fuzzer_CPPFLAGS = $(AM_CPPFLAGS)
+hb_shape_fuzzer_DEPENDENCIES = $(top_builddir)/src/libharfbuzz.la
hb_subset_fuzzer_SOURCES = \
hb-fuzzer.hh \
@@ -56,32 +49,15 @@ hb_subset_fuzzer_SOURCES = \
main.cc \
$(NULL)
hb_subset_fuzzer_LDADD = \
- $(top_builddir)/src/libharfbuzz-subset-fuzzing.la \
- $(NULL)
-hb_subset_fuzzer_CPPFLAGS = \
- $(AM_CPPFLAGS) \
- $(NULL)
-hb_subset_fuzzer_DEPENDENCIES = \
- lib \
- $(NULL)
-
-hb_subset_get_codepoints_fuzzer_SOURCES = \
- hb-fuzzer.hh \
- hb-subset-get-codepoints-fuzzer.cc \
- main.cc \
- $(NULL)
-hb_subset_get_codepoints_fuzzer_LDADD = \
- $(top_builddir)/src/libharfbuzz-subset-fuzzing.la \
- $(NULL)
-hb_subset_get_codepoints_fuzzer_CPPFLAGS = \
- $(AM_CPPFLAGS) \
- $(NULL)
-hb_subset_get_codepoints_fuzzer_DEPENDENCIES = \
- lib \
- $(NULL)
+ $(top_builddir)/src/libharfbuzz.la \
+ $(top_builddir)/src/libharfbuzz-subset.la
+hb_subset_fuzzer_CPPFLAGS = $(AM_CPPFLAGS)
+hb_subset_fuzzer_DEPENDENCIES = $(top_builddir)/src/libharfbuzz-subset.la
check:
EXEEXT="$(EXEEXT)" srcdir="$(srcdir)" builddir="$(builddir)" $(srcdir)/run-shape-fuzzer-tests.py
EXEEXT="$(EXEEXT)" srcdir="$(srcdir)" builddir="$(builddir)" $(srcdir)/run-subset-fuzzer-tests.py
+check-valgrind:
+ $(AM_V_at)RUN_VALGRIND=1 $(MAKE) $(AM_MAKEFLGS) check
-include $(top_srcdir)/git.mk
diff --git a/test/fuzzing/Makefile.in b/test/fuzzing/Makefile.in
index dcbe021..7675ade 100644
--- a/test/fuzzing/Makefile.in
+++ b/test/fuzzing/Makefile.in
@@ -90,7 +90,7 @@ POST_UNINSTALL = :
build_triplet = @build@
host_triplet = @host@
check_PROGRAMS = hb-shape-fuzzer$(EXEEXT) hb-subset-fuzzer$(EXEEXT) \
- hb-subset-get-codepoints-fuzzer$(EXEEXT) $(am__EXEEXT_1)
+ $(am__EXEEXT_1)
subdir = test/fuzzing
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
am__aclocal_m4_deps = $(top_srcdir)/m4/ax_check_link_flag.m4 \
@@ -98,8 +98,7 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/ax_check_link_flag.m4 \
$(top_srcdir)/m4/ax_pthread.m4 $(top_srcdir)/m4/gtk-doc.m4 \
$(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
$(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
- $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/pkg.m4 \
- $(top_srcdir)/configure.ac
+ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
$(ACLOCAL_M4)
DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
@@ -113,9 +112,6 @@ am_hb_shape_fuzzer_OBJECTS = \
hb_shape_fuzzer-hb-shape-fuzzer.$(OBJEXT) \
hb_shape_fuzzer-main.$(OBJEXT) $(am__objects_1)
hb_shape_fuzzer_OBJECTS = $(am_hb_shape_fuzzer_OBJECTS)
-am__DEPENDENCIES_1 =
-am__DEPENDENCIES_2 = $(top_builddir)/src/libharfbuzz-fuzzing.la \
- $(am__DEPENDENCIES_1)
AM_V_lt = $(am__v_lt_@AM_V@)
am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
am__v_lt_0 = --silent
@@ -124,11 +120,6 @@ am_hb_subset_fuzzer_OBJECTS = \
hb_subset_fuzzer-hb-subset-fuzzer.$(OBJEXT) \
hb_subset_fuzzer-main.$(OBJEXT) $(am__objects_1)
hb_subset_fuzzer_OBJECTS = $(am_hb_subset_fuzzer_OBJECTS)
-am_hb_subset_get_codepoints_fuzzer_OBJECTS = hb_subset_get_codepoints_fuzzer-hb-subset-get-codepoints-fuzzer.$(OBJEXT) \
- hb_subset_get_codepoints_fuzzer-main.$(OBJEXT) \
- $(am__objects_1)
-hb_subset_get_codepoints_fuzzer_OBJECTS = \
- $(am_hb_subset_get_codepoints_fuzzer_OBJECTS)
AM_V_P = $(am__v_P_@AM_V@)
am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
am__v_P_0 = false
@@ -181,10 +172,8 @@ AM_V_CCLD = $(am__v_CCLD_@AM_V@)
am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
am__v_CCLD_0 = @echo " CCLD " $@;
am__v_CCLD_1 =
-SOURCES = $(hb_shape_fuzzer_SOURCES) $(hb_subset_fuzzer_SOURCES) \
- $(hb_subset_get_codepoints_fuzzer_SOURCES)
-DIST_SOURCES = $(hb_shape_fuzzer_SOURCES) $(hb_subset_fuzzer_SOURCES) \
- $(hb_subset_get_codepoints_fuzzer_SOURCES)
+SOURCES = $(hb_shape_fuzzer_SOURCES) $(hb_subset_fuzzer_SOURCES)
+DIST_SOURCES = $(hb_shape_fuzzer_SOURCES) $(hb_subset_fuzzer_SOURCES)
am__can_run_installinfo = \
case $$AM_UPDATE_INFO_DIR in \
n|no|NO) false;; \
@@ -328,6 +317,8 @@ PACKAGE_URL = @PACKAGE_URL@
PACKAGE_VERSION = @PACKAGE_VERSION@
PATH_SEPARATOR = @PATH_SEPARATOR@
PKG_CONFIG = @PKG_CONFIG@
+PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
+PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
PTHREAD_CC = @PTHREAD_CC@
PTHREAD_CFLAGS = @PTHREAD_CFLAGS@
PTHREAD_LIBS = @PTHREAD_LIBS@
@@ -398,7 +389,7 @@ top_builddir = @top_builddir@
top_srcdir = @top_srcdir@
NULL =
EXTRA_DIST = README run-shape-fuzzer-tests.py \
- run-subset-fuzzer-tests.py CMakeLists.txt $(NULL)
+ run-subset-fuzzer-tests.py CMakeLists.txt fonts $(NULL)
CLEANFILES =
DISTCLEANFILES =
MAINTAINERCLEANFILES =
@@ -408,28 +399,15 @@ AM_CPPFLAGS = \
-I$(top_builddir)/src/ \
$(NULL)
-LDADD = \
- $(top_builddir)/src/libharfbuzz-fuzzing.la \
- $(NULL)
-
hb_shape_fuzzer_SOURCES = \
hb-fuzzer.hh \
hb-shape-fuzzer.cc \
main.cc \
$(NULL)
-hb_shape_fuzzer_LDADD = \
- $(LDADD) \
- $(NULL)
-
-hb_shape_fuzzer_CPPFLAGS = \
- $(AM_CPPFLAGS) \
- $(NULL)
-
-hb_shape_fuzzer_DEPENDENCIES = \
- lib \
- $(NULL)
-
+hb_shape_fuzzer_LDADD = $(top_builddir)/src/libharfbuzz.la
+hb_shape_fuzzer_CPPFLAGS = $(AM_CPPFLAGS)
+hb_shape_fuzzer_DEPENDENCIES = $(top_builddir)/src/libharfbuzz.la
hb_subset_fuzzer_SOURCES = \
hb-fuzzer.hh \
hb-subset-fuzzer.cc \
@@ -437,35 +415,11 @@ hb_subset_fuzzer_SOURCES = \
$(NULL)
hb_subset_fuzzer_LDADD = \
- $(top_builddir)/src/libharfbuzz-subset-fuzzing.la \
- $(NULL)
-
-hb_subset_fuzzer_CPPFLAGS = \
- $(AM_CPPFLAGS) \
- $(NULL)
-
-hb_subset_fuzzer_DEPENDENCIES = \
- lib \
- $(NULL)
-
-hb_subset_get_codepoints_fuzzer_SOURCES = \
- hb-fuzzer.hh \
- hb-subset-get-codepoints-fuzzer.cc \
- main.cc \
- $(NULL)
-
-hb_subset_get_codepoints_fuzzer_LDADD = \
- $(top_builddir)/src/libharfbuzz-subset-fuzzing.la \
- $(NULL)
-
-hb_subset_get_codepoints_fuzzer_CPPFLAGS = \
- $(AM_CPPFLAGS) \
- $(NULL)
-
-hb_subset_get_codepoints_fuzzer_DEPENDENCIES = \
- lib \
- $(NULL)
+ $(top_builddir)/src/libharfbuzz.la \
+ $(top_builddir)/src/libharfbuzz-subset.la
+hb_subset_fuzzer_CPPFLAGS = $(AM_CPPFLAGS)
+hb_subset_fuzzer_DEPENDENCIES = $(top_builddir)/src/libharfbuzz-subset.la
all: all-am
.SUFFIXES:
@@ -517,10 +471,6 @@ hb-subset-fuzzer$(EXEEXT): $(hb_subset_fuzzer_OBJECTS) $(hb_subset_fuzzer_DEPEND
@rm -f hb-subset-fuzzer$(EXEEXT)
$(AM_V_CXXLD)$(CXXLINK) $(hb_subset_fuzzer_OBJECTS) $(hb_subset_fuzzer_LDADD) $(LIBS)
-hb-subset-get-codepoints-fuzzer$(EXEEXT): $(hb_subset_get_codepoints_fuzzer_OBJECTS) $(hb_subset_get_codepoints_fuzzer_DEPENDENCIES) $(EXTRA_hb_subset_get_codepoints_fuzzer_DEPENDENCIES)
- @rm -f hb-subset-get-codepoints-fuzzer$(EXEEXT)
- $(AM_V_CXXLD)$(CXXLINK) $(hb_subset_get_codepoints_fuzzer_OBJECTS) $(hb_subset_get_codepoints_fuzzer_LDADD) $(LIBS)
-
mostlyclean-compile:
-rm -f *.$(OBJEXT)
@@ -531,8 +481,6 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hb_shape_fuzzer-main.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hb_subset_fuzzer-hb-subset-fuzzer.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hb_subset_fuzzer-main.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hb_subset_get_codepoints_fuzzer-hb-subset-get-codepoints-fuzzer.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hb_subset_get_codepoints_fuzzer-main.Po@am__quote@
.cc.o:
@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
@@ -611,34 +559,6 @@ hb_subset_fuzzer-main.obj: main.cc
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(hb_subset_fuzzer_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o hb_subset_fuzzer-main.obj `if test -f 'main.cc'; then $(CYGPATH_W) 'main.cc'; else $(CYGPATH_W) '$(srcdir)/main.cc'; fi`
-hb_subset_get_codepoints_fuzzer-hb-subset-get-codepoints-fuzzer.o: hb-subset-get-codepoints-fuzzer.cc
-@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(hb_subset_get_codepoints_fuzzer_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT hb_subset_get_codepoints_fuzzer-hb-subset-get-codepoints-fuzzer.o -MD -MP -MF $(DEPDIR)/hb_subset_get_codepoints_fuzzer-hb-subset-get-codepoints-fuzzer.Tpo -c -o hb_subset_get_codepoints_fuzzer-hb-subset-get-codepoints-fuzzer.o `test -f 'hb-subset-get-codepoints-fuzzer.cc' || echo '$(srcdir)/'`hb-subset-get-codepoints-fuzzer.cc
-@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/hb_subset_get_codepoints_fuzzer-hb-subset-get-codepoints-fuzzer.Tpo $(DEPDIR)/hb_subset_get_codepoints_fuzzer-hb-subset-get-codepoints-fuzzer.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='hb-subset-get-codepoints-fuzzer.cc' object='hb_subset_get_codepoints_fuzzer-hb-subset-get-codepoints-fuzzer.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(hb_subset_get_codepoints_fuzzer_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o hb_subset_get_codepoints_fuzzer-hb-subset-get-codepoints-fuzzer.o `test -f 'hb-subset-get-codepoints-fuzzer.cc' || echo '$(srcdir)/'`hb-subset-get-codepoints-fuzzer.cc
-
-hb_subset_get_codepoints_fuzzer-hb-subset-get-codepoints-fuzzer.obj: hb-subset-get-codepoints-fuzzer.cc
-@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(hb_subset_get_codepoints_fuzzer_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT hb_subset_get_codepoints_fuzzer-hb-subset-get-codepoints-fuzzer.obj -MD -MP -MF $(DEPDIR)/hb_subset_get_codepoints_fuzzer-hb-subset-get-codepoints-fuzzer.Tpo -c -o hb_subset_get_codepoints_fuzzer-hb-subset-get-codepoints-fuzzer.obj `if test -f 'hb-subset-get-codepoints-fuzzer.cc'; then $(CYGPATH_W) 'hb-subset-get-codepoints-fuzzer.cc'; else $(CYGPATH_W) '$(srcdir)/hb-subset-get-codepoints-fuzzer.cc'; fi`
-@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/hb_subset_get_codepoints_fuzzer-hb-subset-get-codepoints-fuzzer.Tpo $(DEPDIR)/hb_subset_get_codepoints_fuzzer-hb-subset-get-codepoints-fuzzer.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='hb-subset-get-codepoints-fuzzer.cc' object='hb_subset_get_codepoints_fuzzer-hb-subset-get-codepoints-fuzzer.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(hb_subset_get_codepoints_fuzzer_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o hb_subset_get_codepoints_fuzzer-hb-subset-get-codepoints-fuzzer.obj `if test -f 'hb-subset-get-codepoints-fuzzer.cc'; then $(CYGPATH_W) 'hb-subset-get-codepoints-fuzzer.cc'; else $(CYGPATH_W) '$(srcdir)/hb-subset-get-codepoints-fuzzer.cc'; fi`
-
-hb_subset_get_codepoints_fuzzer-main.o: main.cc
-@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(hb_subset_get_codepoints_fuzzer_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT hb_subset_get_codepoints_fuzzer-main.o -MD -MP -MF $(DEPDIR)/hb_subset_get_codepoints_fuzzer-main.Tpo -c -o hb_subset_get_codepoints_fuzzer-main.o `test -f 'main.cc' || echo '$(srcdir)/'`main.cc
-@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/hb_subset_get_codepoints_fuzzer-main.Tpo $(DEPDIR)/hb_subset_get_codepoints_fuzzer-main.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='main.cc' object='hb_subset_get_codepoints_fuzzer-main.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(hb_subset_get_codepoints_fuzzer_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o hb_subset_get_codepoints_fuzzer-main.o `test -f 'main.cc' || echo '$(srcdir)/'`main.cc
-
-hb_subset_get_codepoints_fuzzer-main.obj: main.cc
-@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(hb_subset_get_codepoints_fuzzer_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT hb_subset_get_codepoints_fuzzer-main.obj -MD -MP -MF $(DEPDIR)/hb_subset_get_codepoints_fuzzer-main.Tpo -c -o hb_subset_get_codepoints_fuzzer-main.obj `if test -f 'main.cc'; then $(CYGPATH_W) 'main.cc'; else $(CYGPATH_W) '$(srcdir)/main.cc'; fi`
-@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/hb_subset_get_codepoints_fuzzer-main.Tpo $(DEPDIR)/hb_subset_get_codepoints_fuzzer-main.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='main.cc' object='hb_subset_get_codepoints_fuzzer-main.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(hb_subset_get_codepoints_fuzzer_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o hb_subset_get_codepoints_fuzzer-main.obj `if test -f 'main.cc'; then $(CYGPATH_W) 'main.cc'; else $(CYGPATH_W) '$(srcdir)/main.cc'; fi`
-
mostlyclean-libtool:
-rm -f *.lo
@@ -857,14 +777,18 @@ uninstall-am:
# Convenience targets:
lib:
- @$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src fuzzing
+ @$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src lib
+libs:
+ @$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src libs
-$(top_builddir)/src/libharfbuzz-fuzzing.la: lib
-$(top_builddir)/src/libharfbuzz-subset-fuzzing.la: lib
+$(top_builddir)/src/libharfbuzz.la: lib
+$(top_builddir)/src/libharfbuzz-subset.la: libs
check:
EXEEXT="$(EXEEXT)" srcdir="$(srcdir)" builddir="$(builddir)" $(srcdir)/run-shape-fuzzer-tests.py
EXEEXT="$(EXEEXT)" srcdir="$(srcdir)" builddir="$(builddir)" $(srcdir)/run-subset-fuzzer-tests.py
+check-valgrind:
+ $(AM_V_at)RUN_VALGRIND=1 $(MAKE) $(AM_MAKEFLGS) check
-include $(top_srcdir)/git.mk
diff --git a/test/shaping/data/in-house/fonts/0509e80afb379d16560e9e47bdd7d888bebdebc6.ttf b/test/fuzzing/fonts/0509e80afb379d16560e9e47bdd7d888bebdebc6
index 2036031..2036031 100644
--- a/test/shaping/data/in-house/fonts/0509e80afb379d16560e9e47bdd7d888bebdebc6.ttf
+++ b/test/fuzzing/fonts/0509e80afb379d16560e9e47bdd7d888bebdebc6
Binary files differ
diff --git a/test/shaping/data/in-house/fonts/1a6f1687b7a221f9f2c834b0b360d3c8463b6daf.ttf b/test/fuzzing/fonts/1a6f1687b7a221f9f2c834b0b360d3c8463b6daf
index c71e85a..c71e85a 100644
--- a/test/shaping/data/in-house/fonts/1a6f1687b7a221f9f2c834b0b360d3c8463b6daf.ttf
+++ b/test/fuzzing/fonts/1a6f1687b7a221f9f2c834b0b360d3c8463b6daf
Binary files differ
diff --git a/test/shaping/data/in-house/fonts/205edd09bd3d141cc9580f650109556cc28b22cb.ttf b/test/fuzzing/fonts/205edd09bd3d141cc9580f650109556cc28b22cb
index 4e0ce0a..4e0ce0a 100644
--- a/test/shaping/data/in-house/fonts/205edd09bd3d141cc9580f650109556cc28b22cb.ttf
+++ b/test/fuzzing/fonts/205edd09bd3d141cc9580f650109556cc28b22cb
Binary files differ
diff --git a/test/shaping/data/in-house/fonts/217a934cfe15c548b572c203dceb2befdf026462.ttf b/test/fuzzing/fonts/217a934cfe15c548b572c203dceb2befdf026462
index 12b91a0..12b91a0 100644
--- a/test/shaping/data/in-house/fonts/217a934cfe15c548b572c203dceb2befdf026462.ttf
+++ b/test/fuzzing/fonts/217a934cfe15c548b572c203dceb2befdf026462
Binary files differ
diff --git a/test/shaping/data/in-house/fonts/3511ff5c1647150595846ac414c595cccac34f18.ttf b/test/fuzzing/fonts/3511ff5c1647150595846ac414c595cccac34f18
index 789abf7..789abf7 100644
--- a/test/shaping/data/in-house/fonts/3511ff5c1647150595846ac414c595cccac34f18.ttf
+++ b/test/fuzzing/fonts/3511ff5c1647150595846ac414c595cccac34f18
Binary files differ
diff --git a/test/shaping/data/in-house/fonts/375d6ae32a3cbe52fbf81a4e5777e3377675d5a3.ttf b/test/fuzzing/fonts/375d6ae32a3cbe52fbf81a4e5777e3377675d5a3
index b284c98..b284c98 100644
--- a/test/shaping/data/in-house/fonts/375d6ae32a3cbe52fbf81a4e5777e3377675d5a3.ttf
+++ b/test/fuzzing/fonts/375d6ae32a3cbe52fbf81a4e5777e3377675d5a3
Binary files differ
diff --git a/test/shaping/data/in-house/fonts/43979b90b2dd929723cf4fe1715990bcb9c9a56b.ttf b/test/fuzzing/fonts/43979b90b2dd929723cf4fe1715990bcb9c9a56b
index a5c0156..a5c0156 100644
--- a/test/shaping/data/in-house/fonts/43979b90b2dd929723cf4fe1715990bcb9c9a56b.ttf
+++ b/test/fuzzing/fonts/43979b90b2dd929723cf4fe1715990bcb9c9a56b
Binary files differ
diff --git a/test/shaping/data/in-house/fonts/558661aa659912f4d30ecd27bd09835171a8e2b0.ttf b/test/fuzzing/fonts/558661aa659912f4d30ecd27bd09835171a8e2b0
index 5d72fdf..5d72fdf 100644
--- a/test/shaping/data/in-house/fonts/558661aa659912f4d30ecd27bd09835171a8e2b0.ttf
+++ b/test/fuzzing/fonts/558661aa659912f4d30ecd27bd09835171a8e2b0
Binary files differ
diff --git a/test/shaping/data/in-house/fonts/5a5daf5eb5a4db77a2baa3ad9c7a6ed6e0655fa8.ttf b/test/fuzzing/fonts/5a5daf5eb5a4db77a2baa3ad9c7a6ed6e0655fa8
index 9b4d23f..9b4d23f 100644
--- a/test/shaping/data/in-house/fonts/5a5daf5eb5a4db77a2baa3ad9c7a6ed6e0655fa8.ttf
+++ b/test/fuzzing/fonts/5a5daf5eb5a4db77a2baa3ad9c7a6ed6e0655fa8
Binary files differ
diff --git a/test/shaping/data/in-house/fonts/641bd9db850193064d17575053ae2bf8ec149ddc.ttf b/test/fuzzing/fonts/641bd9db850193064d17575053ae2bf8ec149ddc
index 66cefd4..66cefd4 100644
--- a/test/shaping/data/in-house/fonts/641bd9db850193064d17575053ae2bf8ec149ddc.ttf
+++ b/test/fuzzing/fonts/641bd9db850193064d17575053ae2bf8ec149ddc
Binary files differ
diff --git a/test/shaping/data/in-house/fonts/8240789f6d12d4cfc4b5e8e6f246c3701bcf861f.ttf b/test/fuzzing/fonts/8240789f6d12d4cfc4b5e8e6f246c3701bcf861f
index 8eed14d..8eed14d 100644
--- a/test/shaping/data/in-house/fonts/8240789f6d12d4cfc4b5e8e6f246c3701bcf861f.ttf
+++ b/test/fuzzing/fonts/8240789f6d12d4cfc4b5e8e6f246c3701bcf861f
Binary files differ
diff --git a/test/shaping/data/in-house/fonts/a34a9191d9376bda419836effeef7e75c1386016.ttf b/test/fuzzing/fonts/a34a9191d9376bda419836effeef7e75c1386016
index a358833..a358833 100644
--- a/test/shaping/data/in-house/fonts/a34a9191d9376bda419836effeef7e75c1386016.ttf
+++ b/test/fuzzing/fonts/a34a9191d9376bda419836effeef7e75c1386016
Binary files differ
diff --git a/test/shaping/data/in-house/fonts/a69118c2c2ada48ff803d9149daa54c9ebdae30e.ttf b/test/fuzzing/fonts/a69118c2c2ada48ff803d9149daa54c9ebdae30e
index 3cd5b56..3cd5b56 100644
--- a/test/shaping/data/in-house/fonts/a69118c2c2ada48ff803d9149daa54c9ebdae30e.ttf
+++ b/test/fuzzing/fonts/a69118c2c2ada48ff803d9149daa54c9ebdae30e
Binary files differ
diff --git a/test/shaping/data/in-house/fonts/b9e2aaa0d75fcef6971ec3a96d806ba4a6b31fe2.ttf b/test/fuzzing/fonts/b9e2aaa0d75fcef6971ec3a96d806ba4a6b31fe2
index 500276d..500276d 100644
--- a/test/shaping/data/in-house/fonts/b9e2aaa0d75fcef6971ec3a96d806ba4a6b31fe2.ttf
+++ b/test/fuzzing/fonts/b9e2aaa0d75fcef6971ec3a96d806ba4a6b31fe2
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-5517117891805184 b/test/fuzzing/fonts/clusterfuzz-testcase-5517117891805184
new file mode 100644
index 0000000..0c7b518
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-5517117891805184
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-6107935408390144 b/test/fuzzing/fonts/clusterfuzz-testcase-6107935408390144
new file mode 100644
index 0000000..4c81a86
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-6107935408390144
Binary files differ
diff --git a/test/shaping/data/in-house/fonts/ef2511f215aa3ca847cbfffbf861793b42170875.ttf b/test/fuzzing/fonts/clusterfuzz-testcase-hb-fuzzer-4666056377368576
index 6a3af46..6a3af46 100644
--- a/test/shaping/data/in-house/fonts/ef2511f215aa3ca847cbfffbf861793b42170875.ttf
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-hb-fuzzer-4666056377368576
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-hb-fuzzer-5662671558934528 b/test/fuzzing/fonts/clusterfuzz-testcase-hb-fuzzer-5662671558934528
new file mode 100644
index 0000000..cbb81ac
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-hb-fuzzer-5662671558934528
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-hb-fuzzer-6243458541944832 b/test/fuzzing/fonts/clusterfuzz-testcase-hb-fuzzer-6243458541944832
new file mode 100644
index 0000000..64864aa
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-hb-fuzzer-6243458541944832
Binary files differ
diff --git a/test/shaping/data/in-house/fonts/9d8a94a67932a3ab75a596fc8b5c6d0392ca9e49.ttf b/test/fuzzing/fonts/clusterfuzz-testcase-hb-fuzzer-6303297511096320
index 3fb9951..3fb9951 100644
--- a/test/shaping/data/in-house/fonts/9d8a94a67932a3ab75a596fc8b5c6d0392ca9e49.ttf
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-hb-fuzzer-6303297511096320
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-hb-fuzzer-6696647723581440 b/test/fuzzing/fonts/clusterfuzz-testcase-hb-fuzzer-6696647723581440
new file mode 100644
index 0000000..8b1c293
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-hb-fuzzer-6696647723581440
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-hb-shape-fuzzer-5097734906839040 b/test/fuzzing/fonts/clusterfuzz-testcase-hb-shape-fuzzer-5097734906839040
new file mode 100644
index 0000000..8b45452
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-hb-shape-fuzzer-5097734906839040
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-hb-shape-fuzzer-5634395566768128 b/test/fuzzing/fonts/clusterfuzz-testcase-hb-shape-fuzzer-5634395566768128
new file mode 100644
index 0000000..cd1a293
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-hb-shape-fuzzer-5634395566768128
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-hb-shape-fuzzer-5688420752424960 b/test/fuzzing/fonts/clusterfuzz-testcase-hb-shape-fuzzer-5688420752424960
new file mode 100644
index 0000000..1fe962b
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-hb-shape-fuzzer-5688420752424960
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-hb-shape-fuzzer-5728971283496960 b/test/fuzzing/fonts/clusterfuzz-testcase-hb-shape-fuzzer-5728971283496960
new file mode 100644
index 0000000..25d7bf1
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-hb-shape-fuzzer-5728971283496960
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-hb-shape-fuzzer-5746142327865344 b/test/fuzzing/fonts/clusterfuzz-testcase-hb-shape-fuzzer-5746142327865344
new file mode 100644
index 0000000..1c1607b
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-hb-shape-fuzzer-5746142327865344
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-hb-shape-fuzzer-5750379279548416 b/test/fuzzing/fonts/clusterfuzz-testcase-hb-shape-fuzzer-5750379279548416
new file mode 100644
index 0000000..f014d4b
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-hb-shape-fuzzer-5750379279548416
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-hb-subset-fuzzer-5643036478930944 b/test/fuzzing/fonts/clusterfuzz-testcase-hb-subset-fuzzer-5643036478930944
new file mode 100644
index 0000000..9a52336
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-hb-subset-fuzzer-5643036478930944
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-hb-subset-fuzzer-5686186874503168 b/test/fuzzing/fonts/clusterfuzz-testcase-hb-subset-fuzzer-5686186874503168
new file mode 100644
index 0000000..86f4ad7
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-hb-subset-fuzzer-5686186874503168
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-hb-subset-fuzzer-5762137968869376 b/test/fuzzing/fonts/clusterfuzz-testcase-hb-subset-fuzzer-5762137968869376
new file mode 100644
index 0000000..dca0b7d
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-hb-subset-fuzzer-5762137968869376
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-4884742786777088 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-4884742786777088
new file mode 100644
index 0000000..ac7da9f
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-4884742786777088
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-5255344882188288 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-5255344882188288
new file mode 100644
index 0000000..ab1aede
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-5255344882188288
Binary files differ
diff --git a/test/shaping/data/in-house/fonts/233c1e252e737ca79e03a9fd56b71aaa4a230f2b.ttf b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-5720051798769664
index 999f296..999f296 100644
--- a/test/shaping/data/in-house/fonts/233c1e252e737ca79e03a9fd56b71aaa4a230f2b.ttf
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-5720051798769664
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-5924299061854208 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-5924299061854208
new file mode 100644
index 0000000..a8ea332
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-5924299061854208
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-6460279560863744 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-6460279560863744
new file mode 100644
index 0000000..1cbe75a
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-6460279560863744
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-5126525414014976 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-5126525414014976
new file mode 100644
index 0000000..74cc027
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-5126525414014976
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-5166320261529600 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-5166320261529600
new file mode 100644
index 0000000..b79765a
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-5166320261529600
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-5659690013556736 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-5659690013556736
new file mode 100644
index 0000000..9293c46
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-5659690013556736
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-5662548265009152 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-5662548265009152
new file mode 100644
index 0000000..0b68a30
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-5662548265009152
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-5973566991106048 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-5973566991106048
new file mode 100644
index 0000000..984bb4b
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-harfbuzz_fuzzer-5973566991106048
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-4523479581851648 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-4523479581851648
new file mode 100644
index 0000000..1d16d70
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-4523479581851648
Binary files differ
diff --git a/test/shaping/data/in-house/fonts/dd9f0c7c7c36f75a18be0cab1cddf8f3ab0f366b.ttf b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-4535496598355968
index ba80928..ba80928 100644
--- a/test/shaping/data/in-house/fonts/dd9f0c7c7c36f75a18be0cab1cddf8f3ab0f366b.ttf
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-4535496598355968
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-4548492505645056 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-4548492505645056
new file mode 100644
index 0000000..065080f
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-4548492505645056
Binary files differ
diff --git a/test/shaping/data/in-house/fonts/243798dd281c1c77c065958e1ff467420faa9bde.ttf b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-4595692015190016
index dd8506e..dd8506e 100644
--- a/test/shaping/data/in-house/fonts/243798dd281c1c77c065958e1ff467420faa9bde.ttf
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-4595692015190016
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-4687441845813248 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-4687441845813248
new file mode 100644
index 0000000..d3e9f46
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-4687441845813248
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-4706238090706944 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-4706238090706944
new file mode 100644
index 0000000..269813a
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-4706238090706944
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-4769173588672512 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-4769173588672512
new file mode 100644
index 0000000..5426914
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-4769173588672512
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-4827735151083520 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-4827735151083520
new file mode 100644
index 0000000..f5f1255
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-4827735151083520
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-4841745322868736 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-4841745322868736
new file mode 100644
index 0000000..5e0f74d
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-4841745322868736
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-4884742786777088 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-4884742786777088
new file mode 100644
index 0000000..ac7da9f
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-4884742786777088
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-5216838347653120 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-5216838347653120
new file mode 100644
index 0000000..23cc590
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-5216838347653120
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-5255344882188288 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-5255344882188288
new file mode 100644
index 0000000..ab1aede
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-5255344882188288
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-5294584596791296 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-5294584596791296
new file mode 100644
index 0000000..bc16579
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-5294584596791296
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-5303930168803328 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-5303930168803328
new file mode 100644
index 0000000..805fe4d
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-5303930168803328
Binary files differ
diff --git a/test/shaping/data/in-house/fonts/b6acef662e0beb8d5fcf5b61c6b0ca69537b7402.ttf b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-5331901587914752
index 41897b6..41897b6 100644
--- a/test/shaping/data/in-house/fonts/b6acef662e0beb8d5fcf5b61c6b0ca69537b7402.ttf
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-5331901587914752
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-5388906574905344 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-5388906574905344
new file mode 100644
index 0000000..5f7ff7c
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-5388906574905344
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-5517117891805184 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-5517117891805184
new file mode 100644
index 0000000..0c7b518
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-5517117891805184
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-5617496443846656 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-5617496443846656
new file mode 100644
index 0000000..aeffab5
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-5617496443846656
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-5672141338968064 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-5672141338968064
new file mode 100644
index 0000000..3c8303f
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-5672141338968064
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-5700697074958336 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-5700697074958336
new file mode 100644
index 0000000..2664e30
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-5700697074958336
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-5713868010553344 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-5713868010553344
new file mode 100644
index 0000000..ee0a721
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-5713868010553344
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-5720051798769664 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-5720051798769664
new file mode 100644
index 0000000..999f296
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-5720051798769664
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-5924299061854208 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-5924299061854208
new file mode 100644
index 0000000..a8ea332
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-5924299061854208
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-6023178755244032 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-6023178755244032
new file mode 100644
index 0000000..b0da152
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-6023178755244032
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-6111685556305920 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-6111685556305920
new file mode 100644
index 0000000..8c1940d
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-6111685556305920
Binary files differ
diff --git a/test/shaping/data/in-house/fonts/bbf4a308c402f0678c3e82844892a4da2ebe598f.ttf b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-6160439919509504
index eb37400..eb37400 100644
--- a/test/shaping/data/in-house/fonts/bbf4a308c402f0678c3e82844892a4da2ebe598f.ttf
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-6160439919509504
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-6210176798425088 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-6210176798425088
new file mode 100644
index 0000000..1c62961
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-6210176798425088
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-6260579246276608 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-6260579246276608
new file mode 100644
index 0000000..036a206
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-6260579246276608
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-6264625609834496 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-6264625609834496
new file mode 100644
index 0000000..035dd72
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-6264625609834496
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-6278851874258944 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-6278851874258944
new file mode 100644
index 0000000..775c918
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-6278851874258944
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-6424351550210048 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-6424351550210048
new file mode 100644
index 0000000..afb08c5
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-6424351550210048
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-6460279560863744 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-6460279560863744
new file mode 100644
index 0000000..1cbe75a
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-6460279560863744
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-6576177596596224 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-6576177596596224
new file mode 100644
index 0000000..35171ee
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-6576177596596224
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-6595199411159040 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-6595199411159040
new file mode 100644
index 0000000..a4d503d
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-6595199411159040
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-6624904746106880 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-6624904746106880
new file mode 100644
index 0000000..fcc1b64
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-6624904746106880
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-6723367514144768 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-6723367514144768
new file mode 100644
index 0000000..55b1ef8
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-fuzzer-6723367514144768
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5175735354916864 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5175735354916864
new file mode 100644
index 0000000..72fdfc6
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5175735354916864
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5629524117553152 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5629524117553152
new file mode 100644
index 0000000..01ca517
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5629524117553152
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5630246225707008 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5630246225707008
new file mode 100644
index 0000000..ab534e3
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5630246225707008
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5631444412530688 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5631444412530688
new file mode 100644
index 0000000..25f7d69
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5631444412530688
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5633985665826816 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5633985665826816
new file mode 100644
index 0000000..387d7fd
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5633985665826816
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5634443633491968 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5634443633491968
new file mode 100644
index 0000000..c63bcc5
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5634443633491968
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5634620935110656 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5634620935110656
new file mode 100644
index 0000000..39f9c3c
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5634620935110656
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5635082459545600 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5635082459545600
new file mode 100644
index 0000000..6d0feff
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5635082459545600
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5647267827023872 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5647267827023872
new file mode 100644
index 0000000..068e7e8
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5647267827023872
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5649959857160192 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5649959857160192
new file mode 100644
index 0000000..72e702e
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5649959857160192
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5650286710882304 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5650286710882304
new file mode 100644
index 0000000..95322e1
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5650286710882304
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5652019562414080 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5652019562414080
new file mode 100644
index 0000000..8e85980
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5652019562414080
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5656511058018304 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5656511058018304
new file mode 100644
index 0000000..bb68572
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5656511058018304
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5659641787187200 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5659641787187200
new file mode 100644
index 0000000..8a63dc4
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5659641787187200
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5664873493561344 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5664873493561344
new file mode 100644
index 0000000..dfc36d8
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5664873493561344
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5667182741028864 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5667182741028864
new file mode 100644
index 0000000..0c40dd8
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5667182741028864
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5668791174823936 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5668791174823936
new file mode 100644
index 0000000..1f750c1
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5668791174823936
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5672261407735808 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5672261407735808
new file mode 100644
index 0000000..6297549
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5672261407735808
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5674361600606208 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5674361600606208
new file mode 100644
index 0000000..1d4f84a
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5674361600606208
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5677421274071040 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5677421274071040
new file mode 100644
index 0000000..3be3b91
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5677421274071040
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5679244475105280 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5679244475105280
new file mode 100644
index 0000000..2894bdc
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5679244475105280
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5685596677210112 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5685596677210112
new file mode 100644
index 0000000..d9937a3
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5685596677210112
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5686369209286656 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5686369209286656
new file mode 100644
index 0000000..9f47ca8
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5686369209286656
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5688420752424960 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5688420752424960
new file mode 100644
index 0000000..e9f01a2
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5688420752424960
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5691469793329152 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5691469793329152
new file mode 100644
index 0000000..6c73900
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5691469793329152
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5695615258853376 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5695615258853376
new file mode 100644
index 0000000..af43a44
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5695615258853376
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5696686572175360 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5696686572175360
new file mode 100644
index 0000000..c6e8bfd
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5696686572175360
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5700264032468992 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5700264032468992
new file mode 100644
index 0000000..82a462b
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5700264032468992
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5706010589659136 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5706010589659136
new file mode 100644
index 0000000..7e15f4b
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5706010589659136
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5716208469409792 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5716208469409792
new file mode 100644
index 0000000..00915d6
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5716208469409792
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5718464350650368 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5718464350650368
new file mode 100644
index 0000000..d511e9d
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5718464350650368
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5718889451749376 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5718889451749376
new file mode 100644
index 0000000..6360579
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5718889451749376
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5719982789361664 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5719982789361664
new file mode 100644
index 0000000..0515086
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5719982789361664
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5722888989048832 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5722888989048832
new file mode 100644
index 0000000..df1556b
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5722888989048832
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5725129603022848 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5725129603022848
new file mode 100644
index 0000000..8ba0f9d
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5725129603022848
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5725855502827520 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5725855502827520
new file mode 100644
index 0000000..5781bba
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5725855502827520
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5726089628876800 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5726089628876800
new file mode 100644
index 0000000..61750d4
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5726089628876800
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5729361857085440 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5729361857085440
new file mode 100644
index 0000000..a6ecc61
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5729361857085440
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5733166795456512 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5733166795456512
new file mode 100644
index 0000000..dfaf6d9
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5733166795456512
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5734736291430400 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5734736291430400
new file mode 100644
index 0000000..31c805c
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5734736291430400
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5735679418433536 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5735679418433536
new file mode 100644
index 0000000..ff6ef6e
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5735679418433536
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5736657639178240 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5736657639178240
new file mode 100644
index 0000000..343429c
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5736657639178240
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5738888765636608 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5738888765636608
new file mode 100644
index 0000000..28e72df
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5738888765636608
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5740171484463104 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5740171484463104
new file mode 100644
index 0000000..aef0d92
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5740171484463104
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5750379279548416 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5750379279548416
new file mode 100644
index 0000000..b4551bf
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5750379279548416
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5754863779053568 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5754863779053568
new file mode 100644
index 0000000..03f240f
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5754863779053568
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5762490181353472 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5762490181353472
new file mode 100644
index 0000000..db06a1c
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5762490181353472
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5762953198960640 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5762953198960640
new file mode 100644
index 0000000..9d64eaf
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5762953198960640
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5764636557705216 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5764636557705216
new file mode 100644
index 0000000..b07416b
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5764636557705216
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5768046065483776 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5768046065483776
new file mode 100644
index 0000000..0ab1447
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5768046065483776
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5768601332613120 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5768601332613120
new file mode 100644
index 0000000..385e670
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-5768601332613120
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5067936541179904 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5067936541179904
new file mode 100644
index 0000000..9f57f7b
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5067936541179904
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5359635656605696 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5359635656605696
new file mode 100644
index 0000000..8a659c6
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5359635656605696
Binary files differ
diff --git a/test/api/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5521982557782016 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5521982557782016
index 55541f7..55541f7 100644
--- a/test/api/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5521982557782016
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5521982557782016
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5542653037903872 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5542653037903872
new file mode 100644
index 0000000..6307ddd
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5542653037903872
Binary files differ
diff --git a/test/api/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5609911946838016 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5609911946838016
index 8c647a8..8c647a8 100644
--- a/test/api/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5609911946838016
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5609911946838016
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5629878397829120 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5629878397829120
new file mode 100644
index 0000000..a055cdb
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5629878397829120
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5651059347816448 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5651059347816448
new file mode 100644
index 0000000..b2e4034
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5651059347816448
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5660711141769216 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5660711141769216
new file mode 100644
index 0000000..302a1c4
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5660711141769216
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5669437462544384 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5669437462544384
new file mode 100644
index 0000000..c4eb909
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5669437462544384
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5670861909524480 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5670861909524480
new file mode 100644
index 0000000..49bcb30
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5670861909524480
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5672006905757696 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5672006905757696
new file mode 100644
index 0000000..cb5fb83
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5672006905757696
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5672913680728064 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5672913680728064
new file mode 100644
index 0000000..fdb5bff
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5672913680728064
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5690658895953920 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5690658895953920
new file mode 100644
index 0000000..abafa4b
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5690658895953920
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5695279609675776 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5695279609675776
new file mode 100644
index 0000000..f016262
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5695279609675776
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5696607199166464 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5696607199166464
new file mode 100644
index 0000000..ca4fcd7
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5696607199166464
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5710107829075968 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5710107829075968
new file mode 100644
index 0000000..5fef2f8
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5710107829075968
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5711951464759296 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5711951464759296
new file mode 100644
index 0000000..b20e849
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5711951464759296
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5718215406125056 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5718215406125056
new file mode 100644
index 0000000..a6d87da
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5718215406125056
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5725847365877760 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5725847365877760
new file mode 100644
index 0000000..3764bed
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5725847365877760
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5743250149736448 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5743250149736448
new file mode 100644
index 0000000..b17c949
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5743250149736448
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5747265633779712 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5747265633779712
new file mode 100644
index 0000000..463e0c1
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5747265633779712
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5750092395970560 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5750092395970560
new file mode 100644
index 0000000..d622c25
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5750092395970560
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5750420593442816 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5750420593442816
new file mode 100644
index 0000000..7f41718
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5750420593442816
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5758598970343424 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5758598970343424
new file mode 100644
index 0000000..7087f63
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5758598970343424
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5765071062958080 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5765071062958080
new file mode 100644
index 0000000..1f9be04
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5765071062958080
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5768186323009536 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5768186323009536
new file mode 100644
index 0000000..858604d
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5768186323009536
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-6543700493598720 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-6543700493598720
new file mode 100644
index 0000000..c0e9811
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-6543700493598720
Binary files differ
diff --git a/test/api/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-6651660668502016 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-6651660668502016
index 6206f07..6206f07 100644
--- a/test/api/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-6651660668502016
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-6651660668502016
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-get-codepoints-fuzzer-5203067375976448 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-get-codepoints-fuzzer-5203067375976448
new file mode 100644
index 0000000..cf92d88
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-get-codepoints-fuzzer-5203067375976448
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-get-codepoints-fuzzer-5630904853069824 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-get-codepoints-fuzzer-5630904853069824
new file mode 100644
index 0000000..7c242ee
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-get-codepoints-fuzzer-5630904853069824
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-get-codepoints-fuzzer-5687638085337088 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-get-codepoints-fuzzer-5687638085337088
new file mode 100644
index 0000000..e8706f3
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-get-codepoints-fuzzer-5687638085337088
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-get-codepoints-fuzzer-5736539338833920 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-get-codepoints-fuzzer-5736539338833920
new file mode 100644
index 0000000..f572621
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-get-codepoints-fuzzer-5736539338833920
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-get-codepoints-fuzzer-5930139383758848 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-get-codepoints-fuzzer-5930139383758848
new file mode 100644
index 0000000..940fbd5
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-get-codepoints-fuzzer-5930139383758848
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-get-codepoints-fuzzer-5973295416475648 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-get-codepoints-fuzzer-5973295416475648
new file mode 100644
index 0000000..b506d2a
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-get-codepoints-fuzzer-5973295416475648
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-get-codepoints-fuzzer-6136125075750912 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-get-codepoints-fuzzer-6136125075750912
new file mode 100644
index 0000000..ffcea64
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-get-codepoints-fuzzer-6136125075750912
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-get-codepoints-fuzzer-6394290358976512 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-get-codepoints-fuzzer-6394290358976512
new file mode 100644
index 0000000..8ee7752
--- /dev/null
+++ b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-get-codepoints-fuzzer-6394290358976512
Binary files differ
diff --git a/test/api/fonts/crash-4b60576767ee4d9fe1cc10959d89baf73d4e8249 b/test/fuzzing/fonts/crash-4b60576767ee4d9fe1cc10959d89baf73d4e8249
index b6b47ff..b6b47ff 100644
--- a/test/api/fonts/crash-4b60576767ee4d9fe1cc10959d89baf73d4e8249
+++ b/test/fuzzing/fonts/crash-4b60576767ee4d9fe1cc10959d89baf73d4e8249
Binary files differ
diff --git a/test/api/fonts/crash-b577db318b30f2851828a4c9ef97cb30678b1b54 b/test/fuzzing/fonts/crash-b577db318b30f2851828a4c9ef97cb30678b1b54
index 00be056..00be056 100644
--- a/test/api/fonts/crash-b577db318b30f2851828a4c9ef97cb30678b1b54
+++ b/test/fuzzing/fonts/crash-b577db318b30f2851828a4c9ef97cb30678b1b54
Binary files differ
diff --git a/test/api/fonts/crash-ccc61c92d589f895174cdef6ff2e3b20e9999a1a b/test/fuzzing/fonts/crash-ccc61c92d589f895174cdef6ff2e3b20e9999a1a
index 1af243e..1af243e 100644
--- a/test/api/fonts/crash-ccc61c92d589f895174cdef6ff2e3b20e9999a1a
+++ b/test/fuzzing/fonts/crash-ccc61c92d589f895174cdef6ff2e3b20e9999a1a
Binary files differ
diff --git a/test/api/fonts/crash-e4e0bb1458a91b692eba492c907ae1f94e635480 b/test/fuzzing/fonts/crash-e4e0bb1458a91b692eba492c907ae1f94e635480
index 890c449..890c449 100644
--- a/test/api/fonts/crash-e4e0bb1458a91b692eba492c907ae1f94e635480
+++ b/test/fuzzing/fonts/crash-e4e0bb1458a91b692eba492c907ae1f94e635480
Binary files differ
diff --git a/test/shaping/data/in-house/fonts/e88c339237f52d21e01c55f01b9c1b4cc14a0467.ttf b/test/fuzzing/fonts/e88c339237f52d21e01c55f01b9c1b4cc14a0467
index e9884ea..e9884ea 100644
--- a/test/shaping/data/in-house/fonts/e88c339237f52d21e01c55f01b9c1b4cc14a0467.ttf
+++ b/test/fuzzing/fonts/e88c339237f52d21e01c55f01b9c1b4cc14a0467
Binary files differ
diff --git a/test/shaping/data/in-house/fonts/fab39d60d758cb586db5a504f218442cd1395725.ttf b/test/fuzzing/fonts/fab39d60d758cb586db5a504f218442cd1395725
index 451ed04..451ed04 100644
--- a/test/shaping/data/in-house/fonts/fab39d60d758cb586db5a504f218442cd1395725.ttf
+++ b/test/fuzzing/fonts/fab39d60d758cb586db5a504f218442cd1395725
Binary files differ
diff --git a/test/api/fonts/oom-6ef8c96d3710262511bcc730dce9c00e722cb653 b/test/fuzzing/fonts/oom-6ef8c96d3710262511bcc730dce9c00e722cb653
index 0bb0f0f..0bb0f0f 100644
--- a/test/api/fonts/oom-6ef8c96d3710262511bcc730dce9c00e722cb653
+++ b/test/fuzzing/fonts/oom-6ef8c96d3710262511bcc730dce9c00e722cb653
Binary files differ
diff --git a/test/api/fonts/oom-ccc61c92d589f895174cdef6ff2e3b20e9999a1a b/test/fuzzing/fonts/oom-ccc61c92d589f895174cdef6ff2e3b20e9999a1a
index 1af243e..1af243e 100644
--- a/test/api/fonts/oom-ccc61c92d589f895174cdef6ff2e3b20e9999a1a
+++ b/test/fuzzing/fonts/oom-ccc61c92d589f895174cdef6ff2e3b20e9999a1a
Binary files differ
diff --git a/test/fuzzing/hb-shape-fuzzer.cc b/test/fuzzing/hb-shape-fuzzer.cc
index 79f3222..5723db9 100644
--- a/test/fuzzing/hb-shape-fuzzer.cc
+++ b/test/fuzzing/hb-shape-fuzzer.cc
@@ -3,50 +3,45 @@
#include <hb-ot.h>
#include <string.h>
+#define TEST_OT_FACE_NO_MAIN 1
+#include "../api/test-ot-face.c"
+#undef TEST_OT_FACE_NO_MAIN
+
extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
{
- hb_blob_t *blob = hb_blob_create((const char *)data, size,
- HB_MEMORY_MODE_READONLY, NULL, NULL);
- hb_face_t *face = hb_face_create(blob, 0);
- hb_font_t *font = hb_font_create(face);
- hb_ot_font_set_funcs(font);
- hb_font_set_scale(font, 12, 12);
+ hb_blob_t *blob = hb_blob_create ((const char *)data, size,
+ HB_MEMORY_MODE_READONLY, NULL, NULL);
+ hb_face_t *face = hb_face_create (blob, 0);
+ hb_font_t *font = hb_font_create (face);
+ hb_ot_font_set_funcs (font);
+ hb_font_set_scale (font, 12, 12);
{
const char text[] = "ABCDEXYZ123@_%&)*$!";
- hb_buffer_t *buffer = hb_buffer_create();
- hb_buffer_add_utf8(buffer, text, -1, 0, -1);
- hb_buffer_guess_segment_properties(buffer);
- hb_shape(font, buffer, NULL, 0);
- hb_buffer_destroy(buffer);
+ hb_buffer_t *buffer = hb_buffer_create ();
+ hb_buffer_add_utf8 (buffer, text, -1, 0, -1);
+ hb_buffer_guess_segment_properties (buffer);
+ hb_shape (font, buffer, NULL, 0);
+ hb_buffer_destroy (buffer);
}
- uint32_t text32[16];
- if (size > sizeof(text32)) {
- memcpy(text32, data + size - sizeof(text32), sizeof(text32));
- hb_buffer_t *buffer = hb_buffer_create();
- hb_buffer_add_utf32(buffer, text32, sizeof(text32)/sizeof(text32[0]), 0, -1);
- hb_buffer_guess_segment_properties(buffer);
- hb_shape(font, buffer, NULL, 0);
-
- unsigned int len = hb_buffer_get_length (buffer);
- hb_glyph_info_t *infos = hb_buffer_get_glyph_infos (buffer, NULL);
- //hb_glyph_position_t *positions = hb_buffer_get_glyph_positions (buffer, NULL);
- for (unsigned int i = 0; i < len; i++)
- {
- hb_glyph_info_t info = infos[i];
- //hb_glyph_position_t pos = positions[i];
-
- hb_glyph_extents_t extents;
- hb_font_get_glyph_extents (font, info.codepoint, &extents);
- }
-
- hb_buffer_destroy(buffer);
- }
+ uint32_t text32[16] = {0};
+ unsigned int len = sizeof (text32);
+ if (size < len)
+ len = size;
+ memcpy(text32, data + size - len, len);
+
+ hb_buffer_t *buffer = hb_buffer_create ();
+ hb_buffer_add_utf32 (buffer, text32, sizeof (text32) / sizeof (text32[0]), 0, -1);
+ hb_buffer_guess_segment_properties (buffer);
+ hb_shape (font, buffer, NULL, 0);
+ hb_buffer_destroy (buffer);
+ /* Misc calls on face. */
+ test_face (face, text32[15]);
- hb_font_destroy(font);
- hb_face_destroy(face);
- hb_blob_destroy(blob);
+ hb_font_destroy (font);
+ hb_face_destroy (face);
+ hb_blob_destroy (blob);
return 0;
}
diff --git a/test/fuzzing/hb-subset-fuzzer.cc b/test/fuzzing/hb-subset-fuzzer.cc
index 28ce921..3a71f22 100644
--- a/test/fuzzing/hb-subset-fuzzer.cc
+++ b/test/fuzzing/hb-subset-fuzzer.cc
@@ -6,17 +6,16 @@
#include "hb-subset.h"
-void trySubset (hb_face_t *face,
- const hb_codepoint_t text[],
- int text_length,
- bool drop_hints,
- bool drop_ot_layout)
+static void
+trySubset (hb_face_t *face,
+ const hb_codepoint_t text[],
+ int text_length,
+ bool drop_hints,
+ bool drop_layout)
{
- hb_subset_profile_t *profile = hb_subset_profile_create ();
-
hb_subset_input_t *input = hb_subset_input_create_or_fail ();
- *hb_subset_input_drop_hints (input) = drop_hints;
- *hb_subset_input_drop_ot_layout (input) = drop_ot_layout;
+ hb_subset_input_set_drop_hints (input, drop_hints);
+ hb_subset_input_set_drop_layout (input, drop_layout);
hb_set_t *codepoints = hb_subset_input_unicode_set (input);
for (int i = 0; i < text_length; i++)
@@ -24,23 +23,23 @@ void trySubset (hb_face_t *face,
hb_set_add (codepoints, text[i]);
}
- hb_face_t *result = hb_subset (face, profile, input);
+ hb_face_t *result = hb_subset (face, input);
hb_face_destroy (result);
hb_subset_input_destroy (input);
- hb_subset_profile_destroy (profile);
}
-void trySubset (hb_face_t *face,
- const hb_codepoint_t text[],
- int text_length)
+static void
+trySubset (hb_face_t *face,
+ const hb_codepoint_t text[],
+ int text_length)
{
for (unsigned int drop_hints = 0; drop_hints < 2; drop_hints++)
{
- for (unsigned int drop_ot_layout = 0; drop_ot_layout < 2; drop_ot_layout++)
+ for (unsigned int drop_layout = 0; drop_layout < 2; drop_layout++)
{
trySubset (face, text, text_length,
- (bool) drop_hints, (bool) drop_ot_layout);
+ (bool) drop_hints, (bool) drop_layout);
}
}
}
@@ -48,22 +47,27 @@ void trySubset (hb_face_t *face,
extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
{
hb_blob_t *blob = hb_blob_create ((const char *)data, size,
- HB_MEMORY_MODE_READONLY, NULL, NULL);
+ HB_MEMORY_MODE_READONLY, NULL, NULL);
hb_face_t *face = hb_face_create (blob, 0);
+ /* Just test this API here quickly. */
+ hb_set_t *output = hb_set_create();
+ hb_face_collect_unicodes (face, output);
+ hb_set_destroy (output);
+
const hb_codepoint_t text[] =
{
- 'A', 'B', 'C', 'D', 'E', 'X', 'Y', 'Z', '1', '2',
- '3', '@', '_', '%', '&', ')', '*', '$', '!'
+ 'A', 'B', 'C', 'D', 'E', 'X', 'Y', 'Z', '1', '2',
+ '3', '@', '_', '%', '&', ')', '*', '$', '!'
};
trySubset (face, text, sizeof (text) / sizeof (hb_codepoint_t));
hb_codepoint_t text_from_data[16];
if (size > sizeof(text_from_data)) {
- memcpy(text_from_data,
- data + size - sizeof(text_from_data),
- sizeof(text_from_data));
+ memcpy (text_from_data,
+ data + size - sizeof(text_from_data),
+ sizeof(text_from_data));
unsigned int text_size = sizeof (text_from_data) / sizeof (hb_codepoint_t);
trySubset (face, text_from_data, text_size);
}
diff --git a/test/fuzzing/hb-subset-get-codepoints-fuzzer.cc b/test/fuzzing/hb-subset-get-codepoints-fuzzer.cc
deleted file mode 100644
index 38f338b..0000000
--- a/test/fuzzing/hb-subset-get-codepoints-fuzzer.cc
+++ /dev/null
@@ -1,23 +0,0 @@
-#include "hb-fuzzer.hh"
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-
-#include "hb-subset.h"
-
-extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
-{
- hb_blob_t *blob = hb_blob_create ((const char *)data, size,
- HB_MEMORY_MODE_READONLY, NULL, NULL);
- hb_face_t *face = hb_face_create (blob, 0);
-
- hb_set_t *output = hb_set_create();
- hb_subset_get_all_codepoints (face, output);
-
- hb_set_destroy (output);
- hb_face_destroy (face);
- hb_blob_destroy (blob);
-
- return 0;
-}
diff --git a/test/fuzzing/main.cc b/test/fuzzing/main.cc
index 4692f7b..f15247c 100644
--- a/test/fuzzing/main.cc
+++ b/test/fuzzing/main.cc
@@ -1,21 +1,23 @@
#include "hb-fuzzer.hh"
-#include <iostream>
-#include <iterator>
-#include <fstream>
+#include <stdio.h>
+#include <stdlib.h>
#include <assert.h>
-std::string FileToString(const std::string &Path) {
- /* TODO This silently passes if file does not exist. Fix it! */
- std::ifstream T(Path.c_str());
- return std::string((std::istreambuf_iterator<char>(T)),
- std::istreambuf_iterator<char>());
-}
-
int main(int argc, char **argv) {
+ hb_blob_t *blob = hb_blob_create_from_file (argv[1]);
+ unsigned int len;
+ const char *font_data = hb_blob_get_data (blob, &len);
+ if (len == 0)
+ {
+ printf ("Font not found.\n");
+ exit (1);
+ }
+
for (int i = 1; i < argc; i++) {
- std::string s = FileToString(argv[i]);
- std::cout << argv[i] << std::endl;
- LLVMFuzzerTestOneInput((const unsigned char*)s.data(), s.size());
+ printf ("%s\n", argv[i]);
+ LLVMFuzzerTestOneInput((const uint8_t *) font_data, len);
}
+
+ hb_blob_destroy (blob);
}
diff --git a/test/fuzzing/run-shape-fuzzer-tests.py b/test/fuzzing/run-shape-fuzzer-tests.py
index fea0b01..e3d180f 100755
--- a/test/fuzzing/run-shape-fuzzer-tests.py
+++ b/test/fuzzing/run-shape-fuzzer-tests.py
@@ -2,7 +2,54 @@
from __future__ import print_function, division, absolute_import
-import sys, os, subprocess
+import sys, os, subprocess, tempfile, threading
+
+
+def which(program):
+ # https://stackoverflow.com/a/377028
+ def is_exe(fpath):
+ return os.path.isfile(fpath) and os.access(fpath, os.X_OK)
+
+ fpath, _ = os.path.split(program)
+ if fpath:
+ if is_exe(program):
+ return program
+ else:
+ for path in os.environ["PATH"].split(os.pathsep):
+ exe_file = os.path.join(path, program)
+ if is_exe(exe_file):
+ return exe_file
+
+ return None
+
+
+def cmd(command):
+ # https://stackoverflow.com/a/4408409
+ # https://stackoverflow.com/a/10012262
+ with tempfile.TemporaryFile() as tempf:
+ p = subprocess.Popen (command, stderr=tempf)
+ is_killed = {'value': False}
+
+ def timeout(p, is_killed):
+ is_killed['value'] = True
+ p.kill()
+ timer = threading.Timer (2, timeout, [p, is_killed])
+
+ try:
+ timer.start()
+ p.wait ()
+ tempf.seek (0)
+ text = tempf.read().decode ("utf-8").strip ()
+ returncode = p.returncode
+ finally:
+ timer.cancel()
+
+ if is_killed['value']:
+ text = 'error: timeout, ' + text
+ returncode = 1
+
+ return text, returncode
+
srcdir = os.environ.get ("srcdir", ".")
EXEEXT = os.environ.get ("EXEEXT", "")
@@ -20,14 +67,31 @@ please provide it as the first argument to the tool""")
print ('hb_shape_fuzzer:', hb_shape_fuzzer)
fails = 0
-parent_path = os.path.join (srcdir, "..", "shaping", "data", "in-house", "tests")
-for line in open (os.path.join (parent_path, "fuzzed.tests")):
- font = line.split (":")[0]
- font_path = os.path.join (parent_path, font)
+valgrind = None
+if os.environ.get('RUN_VALGRIND', ''):
+ valgrind = which ('valgrind')
+
+parent_path = os.path.join (srcdir, "fonts")
+for file in os.listdir (parent_path):
+ path = os.path.join(parent_path, file)
+
+ text, returncode = cmd ([hb_shape_fuzzer, path])
+ if text.strip ():
+ print (text)
+
+ failed = False
+ if returncode != 0 or 'error' in text:
+ print ('failure on %s' % file)
+ failed = True
- p = subprocess.Popen ([hb_shape_fuzzer, font_path])
+ if valgrind:
+ text, returncode = cmd ([valgrind, '--error-exitcode=1', hb_shape_fuzzer, path])
+ if returncode:
+ print (text)
+ print ('failure on %s' % file)
+ failed = True
- if p.wait () != 0:
+ if failed:
fails = fails + 1
if fails:
diff --git a/test/fuzzing/run-subset-fuzzer-tests.py b/test/fuzzing/run-subset-fuzzer-tests.py
index 0136288..7392a92 100755
--- a/test/fuzzing/run-subset-fuzzer-tests.py
+++ b/test/fuzzing/run-subset-fuzzer-tests.py
@@ -8,7 +8,6 @@ srcdir = os.environ.get ("srcdir", ".")
EXEEXT = os.environ.get ("EXEEXT", "")
top_builddir = os.environ.get ("top_builddir", ".")
hb_subset_fuzzer = os.path.join (top_builddir, "hb-subset-fuzzer" + EXEEXT)
-hb_subset_get_codepoints_fuzzer = os.path.join (top_builddir, "hb-subset-get-codepoints-fuzzer" + EXEEXT)
if not os.path.exists (hb_subset_fuzzer):
if len (sys.argv) < 2 or not os.path.exists (sys.argv[1]):
@@ -18,35 +17,28 @@ please provide it as the first argument to the tool""")
hb_subset_fuzzer = sys.argv[1]
-if not os.path.exists (hb_subset_get_codepoints_fuzzer):
- if len (sys.argv) < 3 or not os.path.exists (sys.argv[2]):
- print ("""Failed to find hb-subset-get-codepoints-fuzzer binary automatically,
-please provide it as the second argument to the tool""")
- sys.exit (1)
-
- hb_subset_get_codepoints_fuzzer = sys.argv[2]
-
print ('hb_subset_fuzzer:', hb_subset_fuzzer)
fails = 0
-parent_path = os.path.join (srcdir, "..", "subset", "data", "fonts")
-print ("running subset fuzzer against fonts in %s" % parent_path)
-for file in os.listdir (parent_path):
- path = os.path.join(parent_path, file)
+def run_dir (parent_path):
+ global fails
+ for file in os.listdir (parent_path):
+ path = os.path.join(parent_path, file)
- print ("running subset fuzzer against %s" % path)
- p = subprocess.Popen ([hb_subset_fuzzer, path])
+ print ("running subset fuzzer against %s" % path)
+ p = subprocess.Popen ([hb_subset_fuzzer, path])
- if p.wait () != 0:
- print ("failed for %s" % path)
- fails = fails + 1
+ if p.wait () != 0:
+ print ("failed for %s" % path)
+ fails = fails + 1
- print ("running subset get codepoints fuzzer against %s" % path)
- p = subprocess.Popen ([hb_subset_get_codepoints_fuzzer, path])
+ if p.wait () != 0:
+ print ("failed for %s" % path)
+ fails = fails + 1
- if p.wait () != 0:
- print ("failed for %s" % path)
- fails = fails + 1
+run_dir (os.path.join (srcdir, "..", "subset", "data", "fonts"))
+# TODO running these tests very slow tests. Fix and re-enable
+#run_dir (os.path.join (srcdir, "fonts"))
if fails:
print ("%i subset fuzzer related tests failed." % fails)
diff --git a/test/shaping/CMakeLists.txt b/test/shaping/CMakeLists.txt
index 7c2c999..8e33ede 100644
--- a/test/shaping/CMakeLists.txt
+++ b/test/shaping/CMakeLists.txt
@@ -5,6 +5,16 @@ if (HB_BUILD_UTILS)
add_test (NAME ${test}
COMMAND "${PYTHON_EXECUTABLE}" run-tests.py $<TARGET_FILE:hb-shape> "data/in-house/${test}"
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
+ set_property (TEST ${test} PROPERTY SKIP_RETURN_CODE 77)
+ endforeach ()
+
+ file (READ "${CMAKE_CURRENT_SOURCE_DIR}/data/aots/Makefile.sources" INHOUSE)
+ extract_make_variable (TESTS ${INHOUSE})
+ foreach (test IN ITEMS ${TESTS})
+ add_test (NAME ${test}
+ COMMAND "${PYTHON_EXECUTABLE}" run-tests.py $<TARGET_FILE:hb-shape> "data/aots/${test}"
+ WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
+ set_property (TEST ${test} PROPERTY SKIP_RETURN_CODE 77)
endforeach ()
file (READ "${CMAKE_CURRENT_SOURCE_DIR}/data/text-rendering-tests/Makefile.sources" TEXTRENDERING)
@@ -13,5 +23,6 @@ if (HB_BUILD_UTILS)
add_test (NAME ${test}
COMMAND "${PYTHON_EXECUTABLE}" run-tests.py $<TARGET_FILE:hb-shape> "data/text-rendering-tests/${test}"
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
+ set_property (TEST ${test} PROPERTY SKIP_RETURN_CODE 77)
endforeach ()
endif ()
diff --git a/test/shaping/Makefile.am b/test/shaping/Makefile.am
index 7320336..66272da 100644
--- a/test/shaping/Makefile.am
+++ b/test/shaping/Makefile.am
@@ -3,11 +3,15 @@
NULL =
EXTRA_DIST =
CLEANFILES =
+DISTCLEANFILES =
+MAINTAINERCLEANFILES =
SUBDIRS = data
# Convenience targets:
lib:
@$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src lib
+libs:
+ @$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src libs
EXTRA_DIST += \
README.md \
diff --git a/test/shaping/Makefile.in b/test/shaping/Makefile.in
index 0ddfa3c..202db22 100644
--- a/test/shaping/Makefile.in
+++ b/test/shaping/Makefile.in
@@ -96,8 +96,7 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/ax_check_link_flag.m4 \
$(top_srcdir)/m4/ax_pthread.m4 $(top_srcdir)/m4/gtk-doc.m4 \
$(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
$(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
- $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/pkg.m4 \
- $(top_srcdir)/configure.ac
+ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
$(ACLOCAL_M4)
DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
@@ -304,6 +303,8 @@ PACKAGE_URL = @PACKAGE_URL@
PACKAGE_VERSION = @PACKAGE_VERSION@
PATH_SEPARATOR = @PATH_SEPARATOR@
PKG_CONFIG = @PKG_CONFIG@
+PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
+PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
PTHREAD_CC = @PTHREAD_CC@
PTHREAD_CFLAGS = @PTHREAD_CFLAGS@
PTHREAD_LIBS = @PTHREAD_LIBS@
@@ -380,6 +381,8 @@ EXTRA_DIST = README.md CMakeLists.txt hb-diff hb-diff-colorize \
hb-unicode-encode hb-unicode-prettyname record-test.sh \
run-tests.py texts/in-house $(NULL) hb_test_tools.py $(NULL)
CLEANFILES = hb_test_tools.py[co] $(NULL)
+DISTCLEANFILES =
+MAINTAINERCLEANFILES =
SUBDIRS = data
all: all-recursive
@@ -606,10 +609,12 @@ clean-generic:
distclean-generic:
-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+ -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
maintainer-clean-generic:
@echo "This command is intended for maintainers to use"
@echo "it deletes files that may require special tools to rebuild."
+ -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
clean: clean-recursive
clean-am: clean-generic clean-libtool mostlyclean-am
@@ -697,6 +702,8 @@ uninstall-am:
# Convenience targets:
lib:
@$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src lib
+libs:
+ @$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src libs
-include $(top_srcdir)/git.mk
diff --git a/test/shaping/README.md b/test/shaping/README.md
index 99498e6..f386fb9 100644
--- a/test/shaping/README.md
+++ b/test/shaping/README.md
@@ -25,10 +25,10 @@ what this does is:
* 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=`,
+ to an existing or new test file in `data/in-house/tests` using `-o`,
e.g.:
```sh
-$ ./hb-unicode-encode 41 42 43 627 | ./record-test.sh -o=data/in-house/tests/test-name.test ../../util/hb-shape font.ttf
+$ ./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`
diff --git a/test/shaping/data/Makefile.am b/test/shaping/data/Makefile.am
index 4f2c113..01f6c5a 100644
--- a/test/shaping/data/Makefile.am
+++ b/test/shaping/data/Makefile.am
@@ -4,6 +4,7 @@ NULL =
SUBDIRS = \
in-house \
text-rendering-tests \
+ aots \
$(NULL)
# Convenience targets:
diff --git a/test/shaping/data/Makefile.in b/test/shaping/data/Makefile.in
index 5839d8c..78cdb1a 100644
--- a/test/shaping/data/Makefile.in
+++ b/test/shaping/data/Makefile.in
@@ -96,8 +96,7 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/ax_check_link_flag.m4 \
$(top_srcdir)/m4/ax_pthread.m4 $(top_srcdir)/m4/gtk-doc.m4 \
$(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
$(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
- $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/pkg.m4 \
- $(top_srcdir)/configure.ac
+ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
$(ACLOCAL_M4)
DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
@@ -304,6 +303,8 @@ PACKAGE_URL = @PACKAGE_URL@
PACKAGE_VERSION = @PACKAGE_VERSION@
PATH_SEPARATOR = @PATH_SEPARATOR@
PKG_CONFIG = @PKG_CONFIG@
+PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
+PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
PTHREAD_CC = @PTHREAD_CC@
PTHREAD_CFLAGS = @PTHREAD_CFLAGS@
PTHREAD_LIBS = @PTHREAD_LIBS@
@@ -376,6 +377,7 @@ NULL =
SUBDIRS = \
in-house \
text-rendering-tests \
+ aots \
$(NULL)
all: all-recursive
diff --git a/test/shaping/data/aots/COPYING b/test/shaping/data/aots/COPYING
new file mode 100644
index 0000000..d000f23
--- /dev/null
+++ b/test/shaping/data/aots/COPYING
@@ -0,0 +1,13 @@
+Copyright 2000-2016 Adobe Systems Incorporated. All Rights Reserved.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use these files except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
diff --git a/test/shaping/data/aots/Makefile.am b/test/shaping/data/aots/Makefile.am
new file mode 100644
index 0000000..3b1faee
--- /dev/null
+++ b/test/shaping/data/aots/Makefile.am
@@ -0,0 +1,37 @@
+# Process this file with automake to produce Makefile.in
+
+NULL =
+
+# Convenience targets:
+lib:
+ @$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src lib
+
+EXTRA_DIST = \
+ COPYING \
+ fonts \
+ $(TESTS) \
+ $(NULL)
+
+TEST_EXTENSIONS = .tests
+TESTS_LOG_COMPILER = $(srcdir)/../../run-tests.py $(top_builddir)/util/hb-shape$(EXEEXT)
+
+init-aots:
+ git clone https://github.com/adobe-type-tools/aots $(srcdir)/aots
+ make -C$(srcdir)/aots
+ make -C$(srcdir)/aots/harfbuzz
+ touch $(srcdir)/init-aots
+
+update-tests: init-aots lib
+ cp $(srcdir)/hb-aots-tester.cpp $(srcdir)/aots/harfbuzz/hb-aots-tester.cpp
+ $(CXX) -Wno-narrowing $(srcdir)/aots/harfbuzz/hb-aots-tester.cpp \
+ -I$(top_srcdir)/src/ -o $(srcdir)/aots/harfbuzz/aots \
+ -L$(top_builddir)/src/.libs -lharfbuzz
+ rm -rf $(srcdir)/tests/
+ mkdir $(srcdir)/tests/
+ export LD_LIBRARY_PATH=$(realpath $(top_builddir)/src/.libs); cd $(srcdir)/aots/harfbuzz; ./aots
+
+.PHONY: update-tests
+
+include Makefile.sources
+
+-include $(top_srcdir)/git.mk
diff --git a/test/shaping/data/aots/Makefile.in b/test/shaping/data/aots/Makefile.in
new file mode 100644
index 0000000..7cc5193
--- /dev/null
+++ b/test/shaping/data/aots/Makefile.in
@@ -0,0 +1,1012 @@
+# Makefile.in generated by automake 1.15.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2017 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+# Process this file with automake to produce Makefile.in
+VPATH = @srcdir@
+am__is_gnu_make = { \
+ if test -z '$(MAKELEVEL)'; then \
+ false; \
+ elif test -n '$(MAKE_HOST)'; then \
+ true; \
+ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+ true; \
+ else \
+ false; \
+ fi; \
+}
+am__make_running_with_option = \
+ case $${target_option-} in \
+ ?) ;; \
+ *) echo "am__make_running_with_option: internal error: invalid" \
+ "target option '$${target_option-}' specified" >&2; \
+ exit 1;; \
+ esac; \
+ has_opt=no; \
+ sane_makeflags=$$MAKEFLAGS; \
+ if $(am__is_gnu_make); then \
+ sane_makeflags=$$MFLAGS; \
+ else \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ bs=\\; \
+ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
+ esac; \
+ fi; \
+ skip_next=no; \
+ strip_trailopt () \
+ { \
+ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+ }; \
+ for flg in $$sane_makeflags; do \
+ test $$skip_next = yes && { skip_next=no; continue; }; \
+ case $$flg in \
+ *=*|--*) continue;; \
+ -*I) strip_trailopt 'I'; skip_next=yes;; \
+ -*I?*) strip_trailopt 'I';; \
+ -*O) strip_trailopt 'O'; skip_next=yes;; \
+ -*O?*) strip_trailopt 'O';; \
+ -*l) strip_trailopt 'l'; skip_next=yes;; \
+ -*l?*) strip_trailopt 'l';; \
+ -[dEDm]) skip_next=yes;; \
+ -[JT]) skip_next=yes;; \
+ esac; \
+ case $$flg in \
+ *$$target_option*) has_opt=yes; break;; \
+ esac; \
+ done; \
+ test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+TESTS = tests/classdef1_empty.tests tests/classdef1_multiple.tests \
+ tests/classdef1_single.tests tests/classdef1.tests \
+ tests/classdef2_empty.tests tests/classdef2_multiple.tests \
+ tests/classdef2_single.tests tests/classdef2.tests \
+ tests/gpos_chaining1_boundary.tests \
+ tests/gpos_chaining1_lookupflag.tests \
+ tests/gpos_chaining1_multiple_subrules.tests \
+ tests/gpos_chaining1_next_glyph.tests \
+ tests/gpos_chaining1_simple.tests \
+ tests/gpos_chaining1_successive.tests \
+ tests/gpos_chaining2_boundary.tests \
+ tests/gpos_chaining2_lookupflag.tests \
+ tests/gpos_chaining2_multiple_subrules.tests \
+ tests/gpos_chaining2_next_glyph.tests \
+ tests/gpos_chaining2_simple.tests \
+ tests/gpos_chaining2_successive.tests \
+ tests/gpos_chaining3_boundary.tests \
+ tests/gpos_chaining3_lookupflag.tests \
+ tests/gpos_chaining3_next_glyph.tests \
+ tests/gpos_chaining3_simple.tests \
+ tests/gpos_chaining3_successive.tests \
+ tests/gpos_context1_boundary.tests \
+ tests/gpos_context1_expansion.tests \
+ tests/gpos_context1_lookupflag.tests \
+ tests/gpos_context1_multiple_subrules.tests \
+ tests/gpos_context1_next_glyph.tests \
+ tests/gpos_context1_simple.tests \
+ tests/gpos_context1_successive.tests \
+ tests/gpos_context2_boundary.tests \
+ tests/gpos_context2_classes.tests \
+ tests/gpos_context2_expansion.tests \
+ tests/gpos_context2_lookupflag.tests \
+ tests/gpos_context2_multiple_subrules.tests \
+ tests/gpos_context2_next_glyph.tests \
+ tests/gpos_context2_simple.tests \
+ tests/gpos_context2_successive.tests \
+ tests/gpos_context3_boundary.tests \
+ tests/gpos_context3_lookupflag.tests \
+ tests/gpos_context3_next_glyph.tests \
+ tests/gpos_context3_simple.tests \
+ tests/gpos_context3_successive.tests \
+ tests/gpos1_1_lookupflag.tests tests/gpos1_1_simple.tests \
+ tests/gpos1_2_lookupflag.tests tests/gpos1_2.tests \
+ tests/gpos2_1_lookupflag.tests tests/gpos2_1_next_glyph.tests \
+ tests/gpos2_1_simple.tests tests/gpos2_1.tests \
+ tests/gpos2_2.tests tests/gpos3_lookupflag.tests \
+ tests/gpos3.tests tests/gpos4_lookupflag.tests \
+ tests/gpos4_multiple_anchors.tests tests/gpos4_simple.tests \
+ tests/gpos5.tests tests/gpos6.tests tests/gpos7_1.tests \
+ tests/gpos9.tests tests/gsub_chaining1_boundary.tests \
+ tests/gsub_chaining1_lookupflag.tests \
+ tests/gsub_chaining1_multiple_subrules.tests \
+ tests/gsub_chaining1_next_glyph.tests \
+ tests/gsub_chaining1_simple.tests \
+ tests/gsub_chaining1_successive.tests \
+ tests/gsub_chaining2_boundary.tests \
+ tests/gsub_chaining2_lookupflag.tests \
+ tests/gsub_chaining2_multiple_subrules.tests \
+ tests/gsub_chaining2_next_glyph.tests \
+ tests/gsub_chaining2_simple.tests \
+ tests/gsub_chaining2_successive.tests \
+ tests/gsub_chaining3_boundary.tests \
+ tests/gsub_chaining3_lookupflag.tests \
+ tests/gsub_chaining3_next_glyph.tests \
+ tests/gsub_chaining3_simple.tests \
+ tests/gsub_chaining3_successive.tests \
+ tests/gsub_context1_boundary.tests \
+ tests/gsub_context1_expansion.tests \
+ tests/gsub_context1_lookupflag.tests \
+ tests/gsub_context1_multiple_subrules.tests \
+ tests/gsub_context1_next_glyph.tests \
+ tests/gsub_context1_simple.tests \
+ tests/gsub_context1_successive.tests \
+ tests/gsub_context2_boundary.tests \
+ tests/gsub_context2_classes.tests \
+ tests/gsub_context2_expansion.tests \
+ tests/gsub_context2_lookupflag.tests \
+ tests/gsub_context2_multiple_subrules.tests \
+ tests/gsub_context2_next_glyph.tests \
+ tests/gsub_context2_simple.tests \
+ tests/gsub_context2_successive.tests \
+ tests/gsub_context3_boundary.tests \
+ tests/gsub_context3_lookupflag.tests \
+ tests/gsub_context3_next_glyph.tests \
+ tests/gsub_context3_simple.tests \
+ tests/gsub_context3_successive.tests \
+ tests/gsub1_1_lookupflag.tests tests/gsub1_1_modulo.tests \
+ tests/gsub1_1_simple.tests tests/gsub1_2_lookupflag.tests \
+ tests/gsub1_2_simple.tests tests/gsub2_1_lookupflag.tests \
+ tests/gsub2_1_multiple_sequences.tests \
+ tests/gsub2_1_simple.tests tests/gsub3_1_lookupflag.tests \
+ tests/gsub3_1_multiple.tests tests/gsub3_1_simple.tests \
+ tests/gsub4_1_lookupflag.tests \
+ tests/gsub4_1_multiple_ligatures.tests \
+ tests/gsub4_1_multiple_ligsets.tests \
+ tests/gsub4_1_simple.tests tests/gsub7.tests \
+ tests/lookupflag_ignore_attach.tests \
+ tests/lookupflag_ignore_base.tests \
+ tests/lookupflag_ignore_combination.tests \
+ tests/lookupflag_ignore_ligatures.tests \
+ tests/lookupflag_ignore_marks.tests $(am__EXEEXT_1)
+subdir = test/shaping/data/aots
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ax_check_link_flag.m4 \
+ $(top_srcdir)/m4/ax_code_coverage.m4 \
+ $(top_srcdir)/m4/ax_pthread.m4 $(top_srcdir)/m4/gtk-doc.m4 \
+ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
+ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
+ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
+SOURCES =
+DIST_SOURCES =
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+am__tty_colors_dummy = \
+ mgn= red= grn= lgn= blu= brg= std=; \
+ am__color_tests=no
+am__tty_colors = { \
+ $(am__tty_colors_dummy); \
+ if test "X$(AM_COLOR_TESTS)" = Xno; then \
+ am__color_tests=no; \
+ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \
+ am__color_tests=yes; \
+ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \
+ am__color_tests=yes; \
+ fi; \
+ if test $$am__color_tests = yes; then \
+ red=''; \
+ grn=''; \
+ lgn=''; \
+ blu=''; \
+ mgn=''; \
+ brg=''; \
+ std=''; \
+ fi; \
+}
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+ if (++n[$$2] == $(am__install_max)) \
+ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+ END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+ test -z "$$files" \
+ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+ $(am__cd) "$$dir" && rm -f $$files; }; \
+ }
+am__recheck_rx = ^[ ]*:recheck:[ ]*
+am__global_test_result_rx = ^[ ]*:global-test-result:[ ]*
+am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]*
+# A command that, given a newline-separated list of test names on the
+# standard input, print the name of the tests that are to be re-run
+# upon "make recheck".
+am__list_recheck_tests = $(AWK) '{ \
+ recheck = 1; \
+ while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+ { \
+ if (rc < 0) \
+ { \
+ if ((getline line2 < ($$0 ".log")) < 0) \
+ recheck = 0; \
+ break; \
+ } \
+ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \
+ { \
+ recheck = 0; \
+ break; \
+ } \
+ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \
+ { \
+ break; \
+ } \
+ }; \
+ if (recheck) \
+ print $$0; \
+ close ($$0 ".trs"); \
+ close ($$0 ".log"); \
+}'
+# A command that, given a newline-separated list of test names on the
+# standard input, create the global log from their .trs and .log files.
+am__create_global_log = $(AWK) ' \
+function fatal(msg) \
+{ \
+ print "fatal: making $@: " msg | "cat >&2"; \
+ exit 1; \
+} \
+function rst_section(header) \
+{ \
+ print header; \
+ len = length(header); \
+ for (i = 1; i <= len; i = i + 1) \
+ printf "="; \
+ printf "\n\n"; \
+} \
+{ \
+ copy_in_global_log = 1; \
+ global_test_result = "RUN"; \
+ while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+ { \
+ if (rc < 0) \
+ fatal("failed to read from " $$0 ".trs"); \
+ if (line ~ /$(am__global_test_result_rx)/) \
+ { \
+ sub("$(am__global_test_result_rx)", "", line); \
+ sub("[ ]*$$", "", line); \
+ global_test_result = line; \
+ } \
+ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \
+ copy_in_global_log = 0; \
+ }; \
+ if (copy_in_global_log) \
+ { \
+ rst_section(global_test_result ": " $$0); \
+ while ((rc = (getline line < ($$0 ".log"))) != 0) \
+ { \
+ if (rc < 0) \
+ fatal("failed to read from " $$0 ".log"); \
+ print line; \
+ }; \
+ printf "\n"; \
+ }; \
+ close ($$0 ".trs"); \
+ close ($$0 ".log"); \
+}'
+# Restructured Text title.
+am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; }
+# Solaris 10 'make', and several other traditional 'make' implementations,
+# pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it
+# by disabling -e (using the XSI extension "set +e") if it's set.
+am__sh_e_setup = case $$- in *e*) set +e;; esac
+# Default flags passed to test drivers.
+am__common_driver_flags = \
+ --color-tests "$$am__color_tests" \
+ --enable-hard-errors "$$am__enable_hard_errors" \
+ --expect-failure "$$am__expect_failure"
+# To be inserted before the command running the test. Creates the
+# directory for the log if needed. Stores in $dir the directory
+# containing $f, in $tst the test, in $log the log. Executes the
+# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and
+# passes TESTS_ENVIRONMENT. Set up options for the wrapper that
+# will run the test scripts (or their associated LOG_COMPILER, if
+# thy have one).
+am__check_pre = \
+$(am__sh_e_setup); \
+$(am__vpath_adj_setup) $(am__vpath_adj) \
+$(am__tty_colors); \
+srcdir=$(srcdir); export srcdir; \
+case "$@" in \
+ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \
+ *) am__odir=.;; \
+esac; \
+test "x$$am__odir" = x"." || test -d "$$am__odir" \
+ || $(MKDIR_P) "$$am__odir" || exit $$?; \
+if test -f "./$$f"; then dir=./; \
+elif test -f "$$f"; then dir=; \
+else dir="$(srcdir)/"; fi; \
+tst=$$dir$$f; log='$@'; \
+if test -n '$(DISABLE_HARD_ERRORS)'; then \
+ am__enable_hard_errors=no; \
+else \
+ am__enable_hard_errors=yes; \
+fi; \
+case " $(XFAIL_TESTS) " in \
+ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \
+ am__expect_failure=yes;; \
+ *) \
+ am__expect_failure=no;; \
+esac; \
+$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT)
+# A shell command to get the names of the tests scripts with any registered
+# extension removed (i.e., equivalently, the names of the test logs, with
+# the '.log' extension removed). The result is saved in the shell variable
+# '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly,
+# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)",
+# since that might cause problem with VPATH rewrites for suffix-less tests.
+# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'.
+am__set_TESTS_bases = \
+ bases='$(TEST_LOGS)'; \
+ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \
+ bases=`echo $$bases`
+RECHECK_LOGS = $(TEST_LOGS)
+AM_RECURSIVE_TARGETS = check recheck
+am__EXEEXT_1 =
+TEST_SUITE_LOG = test-suite.log
+am__test_logs1 = $(TESTS:=.log)
+am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log)
+TEST_LOGS = $(am__test_logs2:.tests.log=.log)
+TESTS_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver
+TESTS_LOG_COMPILE = $(TESTS_LOG_COMPILER) $(AM_TESTS_LOG_FLAGS) \
+ $(TESTS_LOG_FLAGS)
+am__set_b = \
+ case '$@' in \
+ */*) \
+ case '$*' in \
+ */*) b='$*';; \
+ *) b=`echo '$@' | sed 's/\.log$$//'`; \
+ esac;; \
+ *) \
+ b='$*';; \
+ esac
+am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.sources \
+ $(top_srcdir)/test-driver COPYING
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CAIRO_CFLAGS = @CAIRO_CFLAGS@
+CAIRO_FT_CFLAGS = @CAIRO_FT_CFLAGS@
+CAIRO_FT_LIBS = @CAIRO_FT_LIBS@
+CAIRO_LIBS = @CAIRO_LIBS@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CODE_COVERAGE_CFLAGS = @CODE_COVERAGE_CFLAGS@
+CODE_COVERAGE_CPPFLAGS = @CODE_COVERAGE_CPPFLAGS@
+CODE_COVERAGE_CXXFLAGS = @CODE_COVERAGE_CXXFLAGS@
+CODE_COVERAGE_ENABLED = @CODE_COVERAGE_ENABLED@
+CODE_COVERAGE_LDFLAGS = @CODE_COVERAGE_LDFLAGS@
+CODE_COVERAGE_LIBS = @CODE_COVERAGE_LIBS@
+CORETEXT_CFLAGS = @CORETEXT_CFLAGS@
+CORETEXT_LIBS = @CORETEXT_LIBS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DIRECTWRITE_CXXFLAGS = @DIRECTWRITE_CXXFLAGS@
+DIRECTWRITE_LIBS = @DIRECTWRITE_LIBS@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@
+FONTCONFIG_LIBS = @FONTCONFIG_LIBS@
+FREETYPE_CFLAGS = @FREETYPE_CFLAGS@
+FREETYPE_DEPS = @FREETYPE_DEPS@
+FREETYPE_LIBS = @FREETYPE_LIBS@
+GCOV = @GCOV@
+GENHTML = @GENHTML@
+GIT = @GIT@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_DEPS = @GLIB_DEPS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_MKENUMS = @GLIB_MKENUMS@
+GOBJECT_CFLAGS = @GOBJECT_CFLAGS@
+GOBJECT_LIBS = @GOBJECT_LIBS@
+GRAPHITE2_CFLAGS = @GRAPHITE2_CFLAGS@
+GRAPHITE2_DEPS = @GRAPHITE2_DEPS@
+GRAPHITE2_LIBS = @GRAPHITE2_LIBS@
+GREP = @GREP@
+GTKDOC_CHECK = @GTKDOC_CHECK@
+GTKDOC_CHECK_PATH = @GTKDOC_CHECK_PATH@
+GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@
+GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
+GTKDOC_MKPDF = @GTKDOC_MKPDF@
+GTKDOC_REBASE = @GTKDOC_REBASE@
+HB_LIBTOOL_VERSION_INFO = @HB_LIBTOOL_VERSION_INFO@
+HB_VERSION = @HB_VERSION@
+HB_VERSION_MAJOR = @HB_VERSION_MAJOR@
+HB_VERSION_MICRO = @HB_VERSION_MICRO@
+HB_VERSION_MINOR = @HB_VERSION_MINOR@
+HTML_DIR = @HTML_DIR@
+ICU_CFLAGS = @ICU_CFLAGS@
+ICU_CONFIG = @ICU_CONFIG@
+ICU_LIBS = @ICU_LIBS@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
+INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
+INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
+INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
+INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
+INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
+INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
+INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
+LCOV = @LCOV@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
+PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
+PTHREAD_CC = @PTHREAD_CC@
+PTHREAD_CFLAGS = @PTHREAD_CFLAGS@
+PTHREAD_LIBS = @PTHREAD_LIBS@
+RAGEL = @RAGEL@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+UNISCRIBE_CFLAGS = @UNISCRIBE_CFLAGS@
+UNISCRIBE_LIBS = @UNISCRIBE_LIBS@
+VERSION = @VERSION@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+ax_pthread_config = @ax_pthread_config@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+have_gobject = @have_gobject@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+runstatedir = @runstatedir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+NULL =
+EXTRA_DIST = \
+ COPYING \
+ fonts \
+ $(TESTS) \
+ $(NULL)
+
+TEST_EXTENSIONS = .tests
+TESTS_LOG_COMPILER = $(srcdir)/../../run-tests.py $(top_builddir)/util/hb-shape$(EXEEXT)
+DISABLED_TESTS = \
+ $(NULL)
+
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .log .tests .tests$(EXEEXT) .trs
+$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(srcdir)/Makefile.sources $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+ && { if test -f $@; then exit 0; else break; fi; }; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnits test/shaping/data/aots/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --gnits test/shaping/data/aots/Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+$(srcdir)/Makefile.sources $(am__empty):
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+tags TAGS:
+
+ctags CTAGS:
+
+cscope cscopelist:
+
+
+# Recover from deleted '.trs' file; this should ensure that
+# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create
+# both 'foo.log' and 'foo.trs'. Break the recipe in two subshells
+# to avoid problems with "make -n".
+.log.trs:
+ rm -f $< $@
+ $(MAKE) $(AM_MAKEFLAGS) $<
+
+# Leading 'am--fnord' is there to ensure the list of targets does not
+# expand to empty, as could happen e.g. with make check TESTS=''.
+am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck)
+am--force-recheck:
+ @:
+
+$(TEST_SUITE_LOG): $(TEST_LOGS)
+ @$(am__set_TESTS_bases); \
+ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \
+ redo_bases=`for i in $$bases; do \
+ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \
+ done`; \
+ if test -n "$$redo_bases"; then \
+ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \
+ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \
+ if $(am__make_dryrun); then :; else \
+ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \
+ fi; \
+ fi; \
+ if test -n "$$am__remaking_logs"; then \
+ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
+ "recursion detected" >&2; \
+ elif test -n "$$redo_logs"; then \
+ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
+ fi; \
+ if $(am__make_dryrun); then :; else \
+ st=0; \
+ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \
+ for i in $$redo_bases; do \
+ test -f $$i.trs && test -r $$i.trs \
+ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \
+ test -f $$i.log && test -r $$i.log \
+ || { echo "$$errmsg $$i.log" >&2; st=1; }; \
+ done; \
+ test $$st -eq 0 || exit 1; \
+ fi
+ @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \
+ ws='[ ]'; \
+ results=`for b in $$bases; do echo $$b.trs; done`; \
+ test -n "$$results" || results=/dev/null; \
+ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \
+ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \
+ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \
+ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \
+ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \
+ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \
+ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \
+ if test `expr $$fail + $$xpass + $$error` -eq 0; then \
+ success=true; \
+ else \
+ success=false; \
+ fi; \
+ br='==================='; br=$$br$$br$$br$$br; \
+ result_count () \
+ { \
+ if test x"$$1" = x"--maybe-color"; then \
+ maybe_colorize=yes; \
+ elif test x"$$1" = x"--no-color"; then \
+ maybe_colorize=no; \
+ else \
+ echo "$@: invalid 'result_count' usage" >&2; exit 4; \
+ fi; \
+ shift; \
+ desc=$$1 count=$$2; \
+ if test $$maybe_colorize = yes && test $$count -gt 0; then \
+ color_start=$$3 color_end=$$std; \
+ else \
+ color_start= color_end=; \
+ fi; \
+ echo "$${color_start}# $$desc $$count$${color_end}"; \
+ }; \
+ create_testsuite_report () \
+ { \
+ result_count $$1 "TOTAL:" $$all "$$brg"; \
+ result_count $$1 "PASS: " $$pass "$$grn"; \
+ result_count $$1 "SKIP: " $$skip "$$blu"; \
+ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \
+ result_count $$1 "FAIL: " $$fail "$$red"; \
+ result_count $$1 "XPASS:" $$xpass "$$red"; \
+ result_count $$1 "ERROR:" $$error "$$mgn"; \
+ }; \
+ { \
+ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \
+ $(am__rst_title); \
+ create_testsuite_report --no-color; \
+ echo; \
+ echo ".. contents:: :depth: 2"; \
+ echo; \
+ for b in $$bases; do echo $$b; done \
+ | $(am__create_global_log); \
+ } >$(TEST_SUITE_LOG).tmp || exit 1; \
+ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \
+ if $$success; then \
+ col="$$grn"; \
+ else \
+ col="$$red"; \
+ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \
+ fi; \
+ echo "$${col}$$br$${std}"; \
+ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \
+ echo "$${col}$$br$${std}"; \
+ create_testsuite_report --maybe-color; \
+ echo "$$col$$br$$std"; \
+ if $$success; then :; else \
+ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \
+ if test -n "$(PACKAGE_BUGREPORT)"; then \
+ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \
+ fi; \
+ echo "$$col$$br$$std"; \
+ fi; \
+ $$success || exit 1
+
+check-TESTS:
+ @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list
+ @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list
+ @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+ @set +e; $(am__set_TESTS_bases); \
+ log_list=`for i in $$bases; do echo $$i.log; done`; \
+ trs_list=`for i in $$bases; do echo $$i.trs; done`; \
+ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \
+ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \
+ exit $$?;
+recheck: all
+ @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+ @set +e; $(am__set_TESTS_bases); \
+ bases=`for i in $$bases; do echo $$i; done \
+ | $(am__list_recheck_tests)` || exit 1; \
+ log_list=`for i in $$bases; do echo $$i.log; done`; \
+ log_list=`echo $$log_list`; \
+ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \
+ am__force_recheck=am--force-recheck \
+ TEST_LOGS="$$log_list"; \
+ exit $$?
+.tests.log:
+ @p='$<'; \
+ $(am__set_b); \
+ $(am__check_pre) $(TESTS_LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_TESTS_LOG_DRIVER_FLAGS) $(TESTS_LOG_DRIVER_FLAGS) -- $(TESTS_LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+@am__EXEEXT_TRUE@.tests$(EXEEXT).log:
+@am__EXEEXT_TRUE@ @p='$<'; \
+@am__EXEEXT_TRUE@ $(am__set_b); \
+@am__EXEEXT_TRUE@ $(am__check_pre) $(TESTS_LOG_DRIVER) --test-name "$$f" \
+@am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \
+@am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TESTS_LOG_DRIVER_FLAGS) $(TESTS_LOG_DRIVER_FLAGS) -- $(TESTS_LOG_COMPILE) \
+@am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT)
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ list='$(DISTFILES)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d "$(distdir)/$$file"; then \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+ else \
+ test -f "$(distdir)/$$file" \
+ || cp -p $$d/$$file "$(distdir)/$$file" \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+ $(MAKE) $(AM_MAKEFLAGS) check-TESTS
+check: check-am
+all-am: Makefile
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ if test -z '$(STRIP)'; then \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ install; \
+ else \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+ fi
+mostlyclean-generic:
+ -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS)
+ -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs)
+ -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+ -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-am
+ -rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: check-am install-am install-strip
+
+.PHONY: all all-am check check-TESTS check-am clean clean-generic \
+ clean-libtool cscopelist-am ctags-am distclean \
+ distclean-generic distclean-libtool distdir dvi dvi-am html \
+ html-am info info-am install install-am install-data \
+ install-data-am install-dvi install-dvi-am install-exec \
+ install-exec-am install-html install-html-am install-info \
+ install-info-am install-man install-pdf install-pdf-am \
+ install-ps install-ps-am install-strip installcheck \
+ installcheck-am installdirs maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-generic \
+ mostlyclean-libtool pdf pdf-am ps ps-am recheck tags-am \
+ uninstall uninstall-am
+
+.PRECIOUS: Makefile
+
+
+# Convenience targets:
+lib:
+ @$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src lib
+
+init-aots:
+ git clone https://github.com/adobe-type-tools/aots $(srcdir)/aots
+ make -C$(srcdir)/aots
+ make -C$(srcdir)/aots/harfbuzz
+ touch $(srcdir)/init-aots
+
+update-tests: init-aots lib
+ cp $(srcdir)/hb-aots-tester.cpp $(srcdir)/aots/harfbuzz/hb-aots-tester.cpp
+ $(CXX) -Wno-narrowing $(srcdir)/aots/harfbuzz/hb-aots-tester.cpp \
+ -I$(top_srcdir)/src/ -o $(srcdir)/aots/harfbuzz/aots \
+ -L$(top_builddir)/src/.libs -lharfbuzz
+ rm -rf $(srcdir)/tests/
+ mkdir $(srcdir)/tests/
+ export LD_LIBRARY_PATH=$(realpath $(top_builddir)/src/.libs); cd $(srcdir)/aots/harfbuzz; ./aots
+
+.PHONY: update-tests
+
+-include $(top_srcdir)/git.mk
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/test/shaping/data/aots/Makefile.sources b/test/shaping/data/aots/Makefile.sources
new file mode 100644
index 0000000..9339682
--- /dev/null
+++ b/test/shaping/data/aots/Makefile.sources
@@ -0,0 +1,126 @@
+TESTS = \
+ tests/classdef1_empty.tests \
+ tests/classdef1_multiple.tests \
+ tests/classdef1_single.tests \
+ tests/classdef1.tests \
+ tests/classdef2_empty.tests \
+ tests/classdef2_multiple.tests \
+ tests/classdef2_single.tests \
+ tests/classdef2.tests \
+ tests/gpos_chaining1_boundary.tests \
+ tests/gpos_chaining1_lookupflag.tests \
+ tests/gpos_chaining1_multiple_subrules.tests \
+ tests/gpos_chaining1_next_glyph.tests \
+ tests/gpos_chaining1_simple.tests \
+ tests/gpos_chaining1_successive.tests \
+ tests/gpos_chaining2_boundary.tests \
+ tests/gpos_chaining2_lookupflag.tests \
+ tests/gpos_chaining2_multiple_subrules.tests \
+ tests/gpos_chaining2_next_glyph.tests \
+ tests/gpos_chaining2_simple.tests \
+ tests/gpos_chaining2_successive.tests \
+ tests/gpos_chaining3_boundary.tests \
+ tests/gpos_chaining3_lookupflag.tests \
+ tests/gpos_chaining3_next_glyph.tests \
+ tests/gpos_chaining3_simple.tests \
+ tests/gpos_chaining3_successive.tests \
+ tests/gpos_context1_boundary.tests \
+ tests/gpos_context1_expansion.tests \
+ tests/gpos_context1_lookupflag.tests \
+ tests/gpos_context1_multiple_subrules.tests \
+ tests/gpos_context1_next_glyph.tests \
+ tests/gpos_context1_simple.tests \
+ tests/gpos_context1_successive.tests \
+ tests/gpos_context2_boundary.tests \
+ tests/gpos_context2_classes.tests \
+ tests/gpos_context2_expansion.tests \
+ tests/gpos_context2_lookupflag.tests \
+ tests/gpos_context2_multiple_subrules.tests \
+ tests/gpos_context2_next_glyph.tests \
+ tests/gpos_context2_simple.tests \
+ tests/gpos_context2_successive.tests \
+ tests/gpos_context3_boundary.tests \
+ tests/gpos_context3_lookupflag.tests \
+ tests/gpos_context3_next_glyph.tests \
+ tests/gpos_context3_simple.tests \
+ tests/gpos_context3_successive.tests \
+ tests/gpos1_1_lookupflag.tests \
+ tests/gpos1_1_simple.tests \
+ tests/gpos1_2_lookupflag.tests \
+ tests/gpos1_2.tests \
+ tests/gpos2_1_lookupflag.tests \
+ tests/gpos2_1_next_glyph.tests \
+ tests/gpos2_1_simple.tests \
+ tests/gpos2_1.tests \
+ tests/gpos2_2.tests \
+ tests/gpos3_lookupflag.tests \
+ tests/gpos3.tests \
+ tests/gpos4_lookupflag.tests \
+ tests/gpos4_multiple_anchors.tests \
+ tests/gpos4_simple.tests \
+ tests/gpos5.tests \
+ tests/gpos6.tests \
+ tests/gpos7_1.tests \
+ tests/gpos9.tests \
+ tests/gsub_chaining1_boundary.tests \
+ tests/gsub_chaining1_lookupflag.tests \
+ tests/gsub_chaining1_multiple_subrules.tests \
+ tests/gsub_chaining1_next_glyph.tests \
+ tests/gsub_chaining1_simple.tests \
+ tests/gsub_chaining1_successive.tests \
+ tests/gsub_chaining2_boundary.tests \
+ tests/gsub_chaining2_lookupflag.tests \
+ tests/gsub_chaining2_multiple_subrules.tests \
+ tests/gsub_chaining2_next_glyph.tests \
+ tests/gsub_chaining2_simple.tests \
+ tests/gsub_chaining2_successive.tests \
+ tests/gsub_chaining3_boundary.tests \
+ tests/gsub_chaining3_lookupflag.tests \
+ tests/gsub_chaining3_next_glyph.tests \
+ tests/gsub_chaining3_simple.tests \
+ tests/gsub_chaining3_successive.tests \
+ tests/gsub_context1_boundary.tests \
+ tests/gsub_context1_expansion.tests \
+ tests/gsub_context1_lookupflag.tests \
+ tests/gsub_context1_multiple_subrules.tests \
+ tests/gsub_context1_next_glyph.tests \
+ tests/gsub_context1_simple.tests \
+ tests/gsub_context1_successive.tests \
+ tests/gsub_context2_boundary.tests \
+ tests/gsub_context2_classes.tests \
+ tests/gsub_context2_expansion.tests \
+ tests/gsub_context2_lookupflag.tests \
+ tests/gsub_context2_multiple_subrules.tests \
+ tests/gsub_context2_next_glyph.tests \
+ tests/gsub_context2_simple.tests \
+ tests/gsub_context2_successive.tests \
+ tests/gsub_context3_boundary.tests \
+ tests/gsub_context3_lookupflag.tests \
+ tests/gsub_context3_next_glyph.tests \
+ tests/gsub_context3_simple.tests \
+ tests/gsub_context3_successive.tests \
+ tests/gsub1_1_lookupflag.tests \
+ tests/gsub1_1_modulo.tests \
+ tests/gsub1_1_simple.tests \
+ tests/gsub1_2_lookupflag.tests \
+ tests/gsub1_2_simple.tests \
+ tests/gsub2_1_lookupflag.tests \
+ tests/gsub2_1_multiple_sequences.tests \
+ tests/gsub2_1_simple.tests \
+ tests/gsub3_1_lookupflag.tests \
+ tests/gsub3_1_multiple.tests \
+ tests/gsub3_1_simple.tests \
+ tests/gsub4_1_lookupflag.tests \
+ tests/gsub4_1_multiple_ligatures.tests \
+ tests/gsub4_1_multiple_ligsets.tests \
+ tests/gsub4_1_simple.tests \
+ tests/gsub7.tests \
+ tests/lookupflag_ignore_attach.tests \
+ tests/lookupflag_ignore_base.tests \
+ tests/lookupflag_ignore_combination.tests \
+ tests/lookupflag_ignore_ligatures.tests \
+ tests/lookupflag_ignore_marks.tests \
+ $(NULL)
+
+DISABLED_TESTS = \
+ $(NULL)
diff --git a/test/shaping/data/aots/fonts/classdef1_font1.otf b/test/shaping/data/aots/fonts/classdef1_font1.otf
new file mode 100644
index 0000000..f0add69
--- /dev/null
+++ b/test/shaping/data/aots/fonts/classdef1_font1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/classdef1_font2.otf b/test/shaping/data/aots/fonts/classdef1_font2.otf
new file mode 100644
index 0000000..f01876d
--- /dev/null
+++ b/test/shaping/data/aots/fonts/classdef1_font2.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/classdef1_font3.otf b/test/shaping/data/aots/fonts/classdef1_font3.otf
new file mode 100644
index 0000000..2a0f9cc
--- /dev/null
+++ b/test/shaping/data/aots/fonts/classdef1_font3.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/classdef1_font4.otf b/test/shaping/data/aots/fonts/classdef1_font4.otf
new file mode 100644
index 0000000..9c0f41c
--- /dev/null
+++ b/test/shaping/data/aots/fonts/classdef1_font4.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/classdef2_font1.otf b/test/shaping/data/aots/fonts/classdef2_font1.otf
new file mode 100644
index 0000000..2e2faaf
--- /dev/null
+++ b/test/shaping/data/aots/fonts/classdef2_font1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/classdef2_font2.otf b/test/shaping/data/aots/fonts/classdef2_font2.otf
new file mode 100644
index 0000000..2e2a1af
--- /dev/null
+++ b/test/shaping/data/aots/fonts/classdef2_font2.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/classdef2_font3.otf b/test/shaping/data/aots/fonts/classdef2_font3.otf
new file mode 100644
index 0000000..14c9119
--- /dev/null
+++ b/test/shaping/data/aots/fonts/classdef2_font3.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/classdef2_font4.otf b/test/shaping/data/aots/fonts/classdef2_font4.otf
new file mode 100644
index 0000000..c75c883
--- /dev/null
+++ b/test/shaping/data/aots/fonts/classdef2_font4.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/cmap0_font1.otf b/test/shaping/data/aots/fonts/cmap0_font1.otf
new file mode 100644
index 0000000..772f9a7
--- /dev/null
+++ b/test/shaping/data/aots/fonts/cmap0_font1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/cmap10_font1.otf b/test/shaping/data/aots/fonts/cmap10_font1.otf
new file mode 100644
index 0000000..023e945
--- /dev/null
+++ b/test/shaping/data/aots/fonts/cmap10_font1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/cmap10_font2.otf b/test/shaping/data/aots/fonts/cmap10_font2.otf
new file mode 100644
index 0000000..5202f79
--- /dev/null
+++ b/test/shaping/data/aots/fonts/cmap10_font2.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/cmap12_font1.otf b/test/shaping/data/aots/fonts/cmap12_font1.otf
new file mode 100644
index 0000000..2d74b3a
--- /dev/null
+++ b/test/shaping/data/aots/fonts/cmap12_font1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/cmap14_font1.otf b/test/shaping/data/aots/fonts/cmap14_font1.otf
new file mode 100644
index 0000000..a8e941d
--- /dev/null
+++ b/test/shaping/data/aots/fonts/cmap14_font1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/cmap2_font1.otf b/test/shaping/data/aots/fonts/cmap2_font1.otf
new file mode 100644
index 0000000..a123d9c
--- /dev/null
+++ b/test/shaping/data/aots/fonts/cmap2_font1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/cmap4_font1.otf b/test/shaping/data/aots/fonts/cmap4_font1.otf
new file mode 100644
index 0000000..516ed8e
--- /dev/null
+++ b/test/shaping/data/aots/fonts/cmap4_font1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/cmap4_font2.otf b/test/shaping/data/aots/fonts/cmap4_font2.otf
new file mode 100644
index 0000000..0f678a3
--- /dev/null
+++ b/test/shaping/data/aots/fonts/cmap4_font2.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/cmap4_font3.otf b/test/shaping/data/aots/fonts/cmap4_font3.otf
new file mode 100644
index 0000000..2034ecd
--- /dev/null
+++ b/test/shaping/data/aots/fonts/cmap4_font3.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/cmap4_font4.otf b/test/shaping/data/aots/fonts/cmap4_font4.otf
new file mode 100644
index 0000000..450508e
--- /dev/null
+++ b/test/shaping/data/aots/fonts/cmap4_font4.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/cmap6_font1.otf b/test/shaping/data/aots/fonts/cmap6_font1.otf
new file mode 100644
index 0000000..10b64a7
--- /dev/null
+++ b/test/shaping/data/aots/fonts/cmap6_font1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/cmap6_font2.otf b/test/shaping/data/aots/fonts/cmap6_font2.otf
new file mode 100644
index 0000000..2d2957f
--- /dev/null
+++ b/test/shaping/data/aots/fonts/cmap6_font2.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/cmap8_font1.otf b/test/shaping/data/aots/fonts/cmap8_font1.otf
new file mode 100644
index 0000000..791b9e3
--- /dev/null
+++ b/test/shaping/data/aots/fonts/cmap8_font1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/cmap_composition_font1.otf b/test/shaping/data/aots/fonts/cmap_composition_font1.otf
new file mode 100644
index 0000000..c790717
--- /dev/null
+++ b/test/shaping/data/aots/fonts/cmap_composition_font1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/cmap_subtableselection_font1.otf b/test/shaping/data/aots/fonts/cmap_subtableselection_font1.otf
new file mode 100644
index 0000000..8929f8a
--- /dev/null
+++ b/test/shaping/data/aots/fonts/cmap_subtableselection_font1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/cmap_subtableselection_font2.otf b/test/shaping/data/aots/fonts/cmap_subtableselection_font2.otf
new file mode 100644
index 0000000..2611092
--- /dev/null
+++ b/test/shaping/data/aots/fonts/cmap_subtableselection_font2.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/cmap_subtableselection_font3.otf b/test/shaping/data/aots/fonts/cmap_subtableselection_font3.otf
new file mode 100644
index 0000000..9f39331
--- /dev/null
+++ b/test/shaping/data/aots/fonts/cmap_subtableselection_font3.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/cmap_subtableselection_font4.otf b/test/shaping/data/aots/fonts/cmap_subtableselection_font4.otf
new file mode 100644
index 0000000..83ae88e
--- /dev/null
+++ b/test/shaping/data/aots/fonts/cmap_subtableselection_font4.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/cmap_subtableselection_font5.otf b/test/shaping/data/aots/fonts/cmap_subtableselection_font5.otf
new file mode 100644
index 0000000..8b614ad
--- /dev/null
+++ b/test/shaping/data/aots/fonts/cmap_subtableselection_font5.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos1_1_lookupflag_f1.otf b/test/shaping/data/aots/fonts/gpos1_1_lookupflag_f1.otf
new file mode 100644
index 0000000..3245425
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos1_1_lookupflag_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos1_1_simple_f1.otf b/test/shaping/data/aots/fonts/gpos1_1_simple_f1.otf
new file mode 100644
index 0000000..c5f8888
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos1_1_simple_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos1_1_simple_f2.otf b/test/shaping/data/aots/fonts/gpos1_1_simple_f2.otf
new file mode 100644
index 0000000..905d0a3
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos1_1_simple_f2.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos1_1_simple_f3.otf b/test/shaping/data/aots/fonts/gpos1_1_simple_f3.otf
new file mode 100644
index 0000000..550be87
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos1_1_simple_f3.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos1_1_simple_f4.otf b/test/shaping/data/aots/fonts/gpos1_1_simple_f4.otf
new file mode 100644
index 0000000..448bc8b
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos1_1_simple_f4.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos1_2_font1.otf b/test/shaping/data/aots/fonts/gpos1_2_font1.otf
new file mode 100644
index 0000000..3e7b7bc
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos1_2_font1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos1_2_font2.otf b/test/shaping/data/aots/fonts/gpos1_2_font2.otf
new file mode 100644
index 0000000..ba9d224
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos1_2_font2.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos2_1_font6.otf b/test/shaping/data/aots/fonts/gpos2_1_font6.otf
new file mode 100644
index 0000000..cd4ea94
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos2_1_font6.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos2_1_font7.otf b/test/shaping/data/aots/fonts/gpos2_1_font7.otf
new file mode 100644
index 0000000..2871acc
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos2_1_font7.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos2_1_lookupflag_f1.otf b/test/shaping/data/aots/fonts/gpos2_1_lookupflag_f1.otf
new file mode 100644
index 0000000..6003782
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos2_1_lookupflag_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos2_1_lookupflag_f2.otf b/test/shaping/data/aots/fonts/gpos2_1_lookupflag_f2.otf
new file mode 100644
index 0000000..9d0a273
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos2_1_lookupflag_f2.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos2_1_next_glyph_f1.otf b/test/shaping/data/aots/fonts/gpos2_1_next_glyph_f1.otf
new file mode 100644
index 0000000..64d6c2c
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos2_1_next_glyph_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos2_1_next_glyph_f2.otf b/test/shaping/data/aots/fonts/gpos2_1_next_glyph_f2.otf
new file mode 100644
index 0000000..3d8c37a
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos2_1_next_glyph_f2.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos2_1_simple_f1.otf b/test/shaping/data/aots/fonts/gpos2_1_simple_f1.otf
new file mode 100644
index 0000000..c947776
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos2_1_simple_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos2_2_font1.otf b/test/shaping/data/aots/fonts/gpos2_2_font1.otf
new file mode 100644
index 0000000..dde370a
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos2_2_font1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos2_2_font2.otf b/test/shaping/data/aots/fonts/gpos2_2_font2.otf
new file mode 100644
index 0000000..63d874a
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos2_2_font2.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos2_2_font3.otf b/test/shaping/data/aots/fonts/gpos2_2_font3.otf
new file mode 100644
index 0000000..b530676
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos2_2_font3.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos2_2_font4.otf b/test/shaping/data/aots/fonts/gpos2_2_font4.otf
new file mode 100644
index 0000000..b549e02
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos2_2_font4.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos2_2_font5.otf b/test/shaping/data/aots/fonts/gpos2_2_font5.otf
new file mode 100644
index 0000000..64c40bb
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos2_2_font5.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos3_font1.otf b/test/shaping/data/aots/fonts/gpos3_font1.otf
new file mode 100644
index 0000000..9b6d39a
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos3_font1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos3_font2.otf b/test/shaping/data/aots/fonts/gpos3_font2.otf
new file mode 100644
index 0000000..dee5785
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos3_font2.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos3_font3.otf b/test/shaping/data/aots/fonts/gpos3_font3.otf
new file mode 100644
index 0000000..7522660
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos3_font3.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos4_lookupflag_f1.otf b/test/shaping/data/aots/fonts/gpos4_lookupflag_f1.otf
new file mode 100644
index 0000000..b141116
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos4_lookupflag_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos4_lookupflag_f2.otf b/test/shaping/data/aots/fonts/gpos4_lookupflag_f2.otf
new file mode 100644
index 0000000..84e4843
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos4_lookupflag_f2.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos4_multiple_anchors_1.otf b/test/shaping/data/aots/fonts/gpos4_multiple_anchors_1.otf
new file mode 100644
index 0000000..025f69b
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos4_multiple_anchors_1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos4_simple_1.otf b/test/shaping/data/aots/fonts/gpos4_simple_1.otf
new file mode 100644
index 0000000..da54a1f
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos4_simple_1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos5_font1.otf b/test/shaping/data/aots/fonts/gpos5_font1.otf
new file mode 100644
index 0000000..8c48fb6
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos5_font1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos6_font1.otf b/test/shaping/data/aots/fonts/gpos6_font1.otf
new file mode 100644
index 0000000..f7f92cc
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos6_font1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos7_1_font1.otf b/test/shaping/data/aots/fonts/gpos7_1_font1.otf
new file mode 100644
index 0000000..ced8907
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos7_1_font1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos9_font1.otf b/test/shaping/data/aots/fonts/gpos9_font1.otf
new file mode 100644
index 0000000..e99c25a
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos9_font1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos9_font2.otf b/test/shaping/data/aots/fonts/gpos9_font2.otf
new file mode 100644
index 0000000..9ae824b
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos9_font2.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos_chaining1_boundary_f1.otf b/test/shaping/data/aots/fonts/gpos_chaining1_boundary_f1.otf
new file mode 100644
index 0000000..44c4117
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos_chaining1_boundary_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos_chaining1_boundary_f2.otf b/test/shaping/data/aots/fonts/gpos_chaining1_boundary_f2.otf
new file mode 100644
index 0000000..431b08f
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos_chaining1_boundary_f2.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos_chaining1_boundary_f3.otf b/test/shaping/data/aots/fonts/gpos_chaining1_boundary_f3.otf
new file mode 100644
index 0000000..1bac49a
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos_chaining1_boundary_f3.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos_chaining1_boundary_f4.otf b/test/shaping/data/aots/fonts/gpos_chaining1_boundary_f4.otf
new file mode 100644
index 0000000..3d37782
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos_chaining1_boundary_f4.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos_chaining1_lookupflag_f1.otf b/test/shaping/data/aots/fonts/gpos_chaining1_lookupflag_f1.otf
new file mode 100644
index 0000000..a83342a
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos_chaining1_lookupflag_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos_chaining1_multiple_subrules_f1.otf b/test/shaping/data/aots/fonts/gpos_chaining1_multiple_subrules_f1.otf
new file mode 100644
index 0000000..07bf55c
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos_chaining1_multiple_subrules_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos_chaining1_multiple_subrules_f2.otf b/test/shaping/data/aots/fonts/gpos_chaining1_multiple_subrules_f2.otf
new file mode 100644
index 0000000..dc3754b
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos_chaining1_multiple_subrules_f2.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos_chaining1_next_glyph_f1.otf b/test/shaping/data/aots/fonts/gpos_chaining1_next_glyph_f1.otf
new file mode 100644
index 0000000..17852c2
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos_chaining1_next_glyph_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos_chaining1_simple_f1.otf b/test/shaping/data/aots/fonts/gpos_chaining1_simple_f1.otf
new file mode 100644
index 0000000..31cbe77
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos_chaining1_simple_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos_chaining1_simple_f2.otf b/test/shaping/data/aots/fonts/gpos_chaining1_simple_f2.otf
new file mode 100644
index 0000000..3293ad8
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos_chaining1_simple_f2.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos_chaining1_successive_f1.otf b/test/shaping/data/aots/fonts/gpos_chaining1_successive_f1.otf
new file mode 100644
index 0000000..4c86663
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos_chaining1_successive_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos_chaining2_boundary_f1.otf b/test/shaping/data/aots/fonts/gpos_chaining2_boundary_f1.otf
new file mode 100644
index 0000000..49210fb
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos_chaining2_boundary_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos_chaining2_boundary_f2.otf b/test/shaping/data/aots/fonts/gpos_chaining2_boundary_f2.otf
new file mode 100644
index 0000000..456fc9b
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos_chaining2_boundary_f2.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos_chaining2_boundary_f3.otf b/test/shaping/data/aots/fonts/gpos_chaining2_boundary_f3.otf
new file mode 100644
index 0000000..768492a
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos_chaining2_boundary_f3.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos_chaining2_boundary_f4.otf b/test/shaping/data/aots/fonts/gpos_chaining2_boundary_f4.otf
new file mode 100644
index 0000000..2670da6
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos_chaining2_boundary_f4.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos_chaining2_lookupflag_f1.otf b/test/shaping/data/aots/fonts/gpos_chaining2_lookupflag_f1.otf
new file mode 100644
index 0000000..e8cce56
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos_chaining2_lookupflag_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos_chaining2_multiple_subrules_f1.otf b/test/shaping/data/aots/fonts/gpos_chaining2_multiple_subrules_f1.otf
new file mode 100644
index 0000000..f182c7f
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos_chaining2_multiple_subrules_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos_chaining2_multiple_subrules_f2.otf b/test/shaping/data/aots/fonts/gpos_chaining2_multiple_subrules_f2.otf
new file mode 100644
index 0000000..d24896a
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos_chaining2_multiple_subrules_f2.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos_chaining2_next_glyph_f1.otf b/test/shaping/data/aots/fonts/gpos_chaining2_next_glyph_f1.otf
new file mode 100644
index 0000000..f6bbda4
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos_chaining2_next_glyph_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos_chaining2_simple_f1.otf b/test/shaping/data/aots/fonts/gpos_chaining2_simple_f1.otf
new file mode 100644
index 0000000..1805a03
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos_chaining2_simple_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos_chaining2_simple_f2.otf b/test/shaping/data/aots/fonts/gpos_chaining2_simple_f2.otf
new file mode 100644
index 0000000..1df12f5
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos_chaining2_simple_f2.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos_chaining2_successive_f1.otf b/test/shaping/data/aots/fonts/gpos_chaining2_successive_f1.otf
new file mode 100644
index 0000000..a3aadaf
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos_chaining2_successive_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos_chaining3_boundary_f1.otf b/test/shaping/data/aots/fonts/gpos_chaining3_boundary_f1.otf
new file mode 100644
index 0000000..4f13bdd
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos_chaining3_boundary_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos_chaining3_boundary_f2.otf b/test/shaping/data/aots/fonts/gpos_chaining3_boundary_f2.otf
new file mode 100644
index 0000000..48be5dd
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos_chaining3_boundary_f2.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos_chaining3_boundary_f3.otf b/test/shaping/data/aots/fonts/gpos_chaining3_boundary_f3.otf
new file mode 100644
index 0000000..a10068b
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos_chaining3_boundary_f3.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos_chaining3_boundary_f4.otf b/test/shaping/data/aots/fonts/gpos_chaining3_boundary_f4.otf
new file mode 100644
index 0000000..8030ac0
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos_chaining3_boundary_f4.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos_chaining3_lookupflag_f1.otf b/test/shaping/data/aots/fonts/gpos_chaining3_lookupflag_f1.otf
new file mode 100644
index 0000000..7864ce0
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos_chaining3_lookupflag_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos_chaining3_next_glyph_f1.otf b/test/shaping/data/aots/fonts/gpos_chaining3_next_glyph_f1.otf
new file mode 100644
index 0000000..20a7966
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos_chaining3_next_glyph_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos_chaining3_simple_f1.otf b/test/shaping/data/aots/fonts/gpos_chaining3_simple_f1.otf
new file mode 100644
index 0000000..2c63328
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos_chaining3_simple_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos_chaining3_simple_f2.otf b/test/shaping/data/aots/fonts/gpos_chaining3_simple_f2.otf
new file mode 100644
index 0000000..6ef8fb1
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos_chaining3_simple_f2.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos_chaining3_successive_f1.otf b/test/shaping/data/aots/fonts/gpos_chaining3_successive_f1.otf
new file mode 100644
index 0000000..8e8439d
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos_chaining3_successive_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos_context1_boundary_f1.otf b/test/shaping/data/aots/fonts/gpos_context1_boundary_f1.otf
new file mode 100644
index 0000000..22bb3ea
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos_context1_boundary_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos_context1_boundary_f2.otf b/test/shaping/data/aots/fonts/gpos_context1_boundary_f2.otf
new file mode 100644
index 0000000..7e4c0e1
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos_context1_boundary_f2.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos_context1_expansion_f1.otf b/test/shaping/data/aots/fonts/gpos_context1_expansion_f1.otf
new file mode 100644
index 0000000..f7c60f6
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos_context1_expansion_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos_context1_lookupflag_f1.otf b/test/shaping/data/aots/fonts/gpos_context1_lookupflag_f1.otf
new file mode 100644
index 0000000..e9b03ae
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos_context1_lookupflag_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos_context1_lookupflag_f2.otf b/test/shaping/data/aots/fonts/gpos_context1_lookupflag_f2.otf
new file mode 100644
index 0000000..b9998cd
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos_context1_lookupflag_f2.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos_context1_multiple_subrules_f1.otf b/test/shaping/data/aots/fonts/gpos_context1_multiple_subrules_f1.otf
new file mode 100644
index 0000000..6f1aafa
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos_context1_multiple_subrules_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos_context1_multiple_subrules_f2.otf b/test/shaping/data/aots/fonts/gpos_context1_multiple_subrules_f2.otf
new file mode 100644
index 0000000..ed9a387
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos_context1_multiple_subrules_f2.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos_context1_next_glyph_f1.otf b/test/shaping/data/aots/fonts/gpos_context1_next_glyph_f1.otf
new file mode 100644
index 0000000..6007d54
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos_context1_next_glyph_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos_context1_simple_f1.otf b/test/shaping/data/aots/fonts/gpos_context1_simple_f1.otf
new file mode 100644
index 0000000..5e6cd9e
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos_context1_simple_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos_context1_simple_f2.otf b/test/shaping/data/aots/fonts/gpos_context1_simple_f2.otf
new file mode 100644
index 0000000..b4fddb3
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos_context1_simple_f2.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos_context1_successive_f1.otf b/test/shaping/data/aots/fonts/gpos_context1_successive_f1.otf
new file mode 100644
index 0000000..eb0f962
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos_context1_successive_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos_context2_boundary_f1.otf b/test/shaping/data/aots/fonts/gpos_context2_boundary_f1.otf
new file mode 100644
index 0000000..3fce497
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos_context2_boundary_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos_context2_boundary_f2.otf b/test/shaping/data/aots/fonts/gpos_context2_boundary_f2.otf
new file mode 100644
index 0000000..5b4e012
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos_context2_boundary_f2.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos_context2_classes_f1.otf b/test/shaping/data/aots/fonts/gpos_context2_classes_f1.otf
new file mode 100644
index 0000000..585b511
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos_context2_classes_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos_context2_classes_f2.otf b/test/shaping/data/aots/fonts/gpos_context2_classes_f2.otf
new file mode 100644
index 0000000..411d58e
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos_context2_classes_f2.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos_context2_expansion_f1.otf b/test/shaping/data/aots/fonts/gpos_context2_expansion_f1.otf
new file mode 100644
index 0000000..4b2d36a
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos_context2_expansion_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos_context2_lookupflag_f1.otf b/test/shaping/data/aots/fonts/gpos_context2_lookupflag_f1.otf
new file mode 100644
index 0000000..1c0c480
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos_context2_lookupflag_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos_context2_lookupflag_f2.otf b/test/shaping/data/aots/fonts/gpos_context2_lookupflag_f2.otf
new file mode 100644
index 0000000..bf20d84
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos_context2_lookupflag_f2.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos_context2_multiple_subrules_f1.otf b/test/shaping/data/aots/fonts/gpos_context2_multiple_subrules_f1.otf
new file mode 100644
index 0000000..05b6b73
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos_context2_multiple_subrules_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos_context2_multiple_subrules_f2.otf b/test/shaping/data/aots/fonts/gpos_context2_multiple_subrules_f2.otf
new file mode 100644
index 0000000..f79712c
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos_context2_multiple_subrules_f2.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos_context2_next_glyph_f1.otf b/test/shaping/data/aots/fonts/gpos_context2_next_glyph_f1.otf
new file mode 100644
index 0000000..1b5a256
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos_context2_next_glyph_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos_context2_simple_f1.otf b/test/shaping/data/aots/fonts/gpos_context2_simple_f1.otf
new file mode 100644
index 0000000..9aaec44
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos_context2_simple_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos_context2_simple_f2.otf b/test/shaping/data/aots/fonts/gpos_context2_simple_f2.otf
new file mode 100644
index 0000000..c789b2e
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos_context2_simple_f2.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos_context2_successive_f1.otf b/test/shaping/data/aots/fonts/gpos_context2_successive_f1.otf
new file mode 100644
index 0000000..b89bfb7
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos_context2_successive_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos_context3_boundary_f1.otf b/test/shaping/data/aots/fonts/gpos_context3_boundary_f1.otf
new file mode 100644
index 0000000..f8949d4
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos_context3_boundary_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos_context3_boundary_f2.otf b/test/shaping/data/aots/fonts/gpos_context3_boundary_f2.otf
new file mode 100644
index 0000000..ceb7452
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos_context3_boundary_f2.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos_context3_lookupflag_f1.otf b/test/shaping/data/aots/fonts/gpos_context3_lookupflag_f1.otf
new file mode 100644
index 0000000..40b55ee
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos_context3_lookupflag_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos_context3_lookupflag_f2.otf b/test/shaping/data/aots/fonts/gpos_context3_lookupflag_f2.otf
new file mode 100644
index 0000000..bcf4d17
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos_context3_lookupflag_f2.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos_context3_next_glyph_f1.otf b/test/shaping/data/aots/fonts/gpos_context3_next_glyph_f1.otf
new file mode 100644
index 0000000..6f9d919
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos_context3_next_glyph_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos_context3_simple_f1.otf b/test/shaping/data/aots/fonts/gpos_context3_simple_f1.otf
new file mode 100644
index 0000000..470c2ed
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos_context3_simple_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos_context3_successive_f1.otf b/test/shaping/data/aots/fonts/gpos_context3_successive_f1.otf
new file mode 100644
index 0000000..aeb9bbd
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos_context3_successive_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub1_1_lookupflag_f1.otf b/test/shaping/data/aots/fonts/gsub1_1_lookupflag_f1.otf
new file mode 100644
index 0000000..a539b95
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub1_1_lookupflag_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub1_1_modulo_f1.otf b/test/shaping/data/aots/fonts/gsub1_1_modulo_f1.otf
new file mode 100644
index 0000000..7ba2379
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub1_1_modulo_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub1_1_simple_f1.otf b/test/shaping/data/aots/fonts/gsub1_1_simple_f1.otf
new file mode 100644
index 0000000..c21fcd3
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub1_1_simple_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub1_2_lookupflag_f1.otf b/test/shaping/data/aots/fonts/gsub1_2_lookupflag_f1.otf
new file mode 100644
index 0000000..b13af6e
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub1_2_lookupflag_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub1_2_simple_f1.otf b/test/shaping/data/aots/fonts/gsub1_2_simple_f1.otf
new file mode 100644
index 0000000..d3851b3
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub1_2_simple_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub2_1_lookupflag_f1.otf b/test/shaping/data/aots/fonts/gsub2_1_lookupflag_f1.otf
new file mode 100644
index 0000000..8330ad4
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub2_1_lookupflag_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub2_1_multiple_sequences_f1.otf b/test/shaping/data/aots/fonts/gsub2_1_multiple_sequences_f1.otf
new file mode 100644
index 0000000..c912937
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub2_1_multiple_sequences_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub2_1_simple_f1.otf b/test/shaping/data/aots/fonts/gsub2_1_simple_f1.otf
new file mode 100644
index 0000000..584a7f5
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub2_1_simple_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub3_1_lookupflag_f1.otf b/test/shaping/data/aots/fonts/gsub3_1_lookupflag_f1.otf
new file mode 100644
index 0000000..4ccf55f
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub3_1_lookupflag_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub3_1_multiple_f1.otf b/test/shaping/data/aots/fonts/gsub3_1_multiple_f1.otf
new file mode 100644
index 0000000..075f196
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub3_1_multiple_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub3_1_simple_f1.otf b/test/shaping/data/aots/fonts/gsub3_1_simple_f1.otf
new file mode 100644
index 0000000..201f0f2
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub3_1_simple_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub4_1_lookupflag_f1.otf b/test/shaping/data/aots/fonts/gsub4_1_lookupflag_f1.otf
new file mode 100644
index 0000000..08ec01a
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub4_1_lookupflag_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub4_1_multiple_ligatures_f1.otf b/test/shaping/data/aots/fonts/gsub4_1_multiple_ligatures_f1.otf
new file mode 100644
index 0000000..90da331
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub4_1_multiple_ligatures_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub4_1_multiple_ligatures_f2.otf b/test/shaping/data/aots/fonts/gsub4_1_multiple_ligatures_f2.otf
new file mode 100644
index 0000000..4383ba9
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub4_1_multiple_ligatures_f2.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub4_1_multiple_ligsets_f1.otf b/test/shaping/data/aots/fonts/gsub4_1_multiple_ligsets_f1.otf
new file mode 100644
index 0000000..cea1b1a
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub4_1_multiple_ligsets_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub4_1_simple_f1.otf b/test/shaping/data/aots/fonts/gsub4_1_simple_f1.otf
new file mode 100644
index 0000000..50c713a
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub4_1_simple_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub7_font1.otf b/test/shaping/data/aots/fonts/gsub7_font1.otf
new file mode 100644
index 0000000..b920398
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub7_font1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub7_font2.otf b/test/shaping/data/aots/fonts/gsub7_font2.otf
new file mode 100644
index 0000000..c98bafb
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub7_font2.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub_chaining1_boundary_f1.otf b/test/shaping/data/aots/fonts/gsub_chaining1_boundary_f1.otf
new file mode 100644
index 0000000..444d931
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub_chaining1_boundary_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub_chaining1_boundary_f2.otf b/test/shaping/data/aots/fonts/gsub_chaining1_boundary_f2.otf
new file mode 100644
index 0000000..2268647
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub_chaining1_boundary_f2.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub_chaining1_boundary_f3.otf b/test/shaping/data/aots/fonts/gsub_chaining1_boundary_f3.otf
new file mode 100644
index 0000000..a592947
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub_chaining1_boundary_f3.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub_chaining1_boundary_f4.otf b/test/shaping/data/aots/fonts/gsub_chaining1_boundary_f4.otf
new file mode 100644
index 0000000..f3f6b8c
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub_chaining1_boundary_f4.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub_chaining1_lookupflag_f1.otf b/test/shaping/data/aots/fonts/gsub_chaining1_lookupflag_f1.otf
new file mode 100644
index 0000000..47e4c64
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub_chaining1_lookupflag_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub_chaining1_multiple_subrules_f1.otf b/test/shaping/data/aots/fonts/gsub_chaining1_multiple_subrules_f1.otf
new file mode 100644
index 0000000..741362c
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub_chaining1_multiple_subrules_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub_chaining1_multiple_subrules_f2.otf b/test/shaping/data/aots/fonts/gsub_chaining1_multiple_subrules_f2.otf
new file mode 100644
index 0000000..67801f2
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub_chaining1_multiple_subrules_f2.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub_chaining1_next_glyph_f1.otf b/test/shaping/data/aots/fonts/gsub_chaining1_next_glyph_f1.otf
new file mode 100644
index 0000000..655000a
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub_chaining1_next_glyph_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub_chaining1_simple_f1.otf b/test/shaping/data/aots/fonts/gsub_chaining1_simple_f1.otf
new file mode 100644
index 0000000..c770965
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub_chaining1_simple_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub_chaining1_simple_f2.otf b/test/shaping/data/aots/fonts/gsub_chaining1_simple_f2.otf
new file mode 100644
index 0000000..8999e3f
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub_chaining1_simple_f2.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub_chaining1_successive_f1.otf b/test/shaping/data/aots/fonts/gsub_chaining1_successive_f1.otf
new file mode 100644
index 0000000..ad472ec
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub_chaining1_successive_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub_chaining2_boundary_f1.otf b/test/shaping/data/aots/fonts/gsub_chaining2_boundary_f1.otf
new file mode 100644
index 0000000..845c256
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub_chaining2_boundary_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub_chaining2_boundary_f2.otf b/test/shaping/data/aots/fonts/gsub_chaining2_boundary_f2.otf
new file mode 100644
index 0000000..af0ad1f
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub_chaining2_boundary_f2.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub_chaining2_boundary_f3.otf b/test/shaping/data/aots/fonts/gsub_chaining2_boundary_f3.otf
new file mode 100644
index 0000000..28679c8
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub_chaining2_boundary_f3.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub_chaining2_boundary_f4.otf b/test/shaping/data/aots/fonts/gsub_chaining2_boundary_f4.otf
new file mode 100644
index 0000000..14746c6
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub_chaining2_boundary_f4.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub_chaining2_lookupflag_f1.otf b/test/shaping/data/aots/fonts/gsub_chaining2_lookupflag_f1.otf
new file mode 100644
index 0000000..2f4feed
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub_chaining2_lookupflag_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub_chaining2_multiple_subrules_f1.otf b/test/shaping/data/aots/fonts/gsub_chaining2_multiple_subrules_f1.otf
new file mode 100644
index 0000000..6edeb6b
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub_chaining2_multiple_subrules_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub_chaining2_multiple_subrules_f2.otf b/test/shaping/data/aots/fonts/gsub_chaining2_multiple_subrules_f2.otf
new file mode 100644
index 0000000..ae0298f
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub_chaining2_multiple_subrules_f2.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub_chaining2_next_glyph_f1.otf b/test/shaping/data/aots/fonts/gsub_chaining2_next_glyph_f1.otf
new file mode 100644
index 0000000..878666f
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub_chaining2_next_glyph_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub_chaining2_simple_f1.otf b/test/shaping/data/aots/fonts/gsub_chaining2_simple_f1.otf
new file mode 100644
index 0000000..e860930
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub_chaining2_simple_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub_chaining2_simple_f2.otf b/test/shaping/data/aots/fonts/gsub_chaining2_simple_f2.otf
new file mode 100644
index 0000000..4fdde33
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub_chaining2_simple_f2.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub_chaining2_successive_f1.otf b/test/shaping/data/aots/fonts/gsub_chaining2_successive_f1.otf
new file mode 100644
index 0000000..90f9f73
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub_chaining2_successive_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub_chaining3_boundary_f1.otf b/test/shaping/data/aots/fonts/gsub_chaining3_boundary_f1.otf
new file mode 100644
index 0000000..1aea8be
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub_chaining3_boundary_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub_chaining3_boundary_f2.otf b/test/shaping/data/aots/fonts/gsub_chaining3_boundary_f2.otf
new file mode 100644
index 0000000..97c92c3
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub_chaining3_boundary_f2.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub_chaining3_boundary_f3.otf b/test/shaping/data/aots/fonts/gsub_chaining3_boundary_f3.otf
new file mode 100644
index 0000000..3b8513e
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub_chaining3_boundary_f3.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub_chaining3_boundary_f4.otf b/test/shaping/data/aots/fonts/gsub_chaining3_boundary_f4.otf
new file mode 100644
index 0000000..e81d00e
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub_chaining3_boundary_f4.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub_chaining3_lookupflag_f1.otf b/test/shaping/data/aots/fonts/gsub_chaining3_lookupflag_f1.otf
new file mode 100644
index 0000000..47c1007
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub_chaining3_lookupflag_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub_chaining3_next_glyph_f1.otf b/test/shaping/data/aots/fonts/gsub_chaining3_next_glyph_f1.otf
new file mode 100644
index 0000000..9160eda
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub_chaining3_next_glyph_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub_chaining3_simple_f1.otf b/test/shaping/data/aots/fonts/gsub_chaining3_simple_f1.otf
new file mode 100644
index 0000000..5982eb5
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub_chaining3_simple_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub_chaining3_simple_f2.otf b/test/shaping/data/aots/fonts/gsub_chaining3_simple_f2.otf
new file mode 100644
index 0000000..359b126
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub_chaining3_simple_f2.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub_chaining3_successive_f1.otf b/test/shaping/data/aots/fonts/gsub_chaining3_successive_f1.otf
new file mode 100644
index 0000000..ae39d92
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub_chaining3_successive_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub_context1_boundary_f1.otf b/test/shaping/data/aots/fonts/gsub_context1_boundary_f1.otf
new file mode 100644
index 0000000..0267cab
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub_context1_boundary_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub_context1_boundary_f2.otf b/test/shaping/data/aots/fonts/gsub_context1_boundary_f2.otf
new file mode 100644
index 0000000..24b1716
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub_context1_boundary_f2.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub_context1_expansion_f1.otf b/test/shaping/data/aots/fonts/gsub_context1_expansion_f1.otf
new file mode 100644
index 0000000..c1dda80
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub_context1_expansion_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub_context1_lookupflag_f1.otf b/test/shaping/data/aots/fonts/gsub_context1_lookupflag_f1.otf
new file mode 100644
index 0000000..60676ab
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub_context1_lookupflag_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub_context1_lookupflag_f2.otf b/test/shaping/data/aots/fonts/gsub_context1_lookupflag_f2.otf
new file mode 100644
index 0000000..bcb56e4
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub_context1_lookupflag_f2.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub_context1_multiple_subrules_f1.otf b/test/shaping/data/aots/fonts/gsub_context1_multiple_subrules_f1.otf
new file mode 100644
index 0000000..52cd861
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub_context1_multiple_subrules_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub_context1_multiple_subrules_f2.otf b/test/shaping/data/aots/fonts/gsub_context1_multiple_subrules_f2.otf
new file mode 100644
index 0000000..891356a
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub_context1_multiple_subrules_f2.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub_context1_next_glyph_f1.otf b/test/shaping/data/aots/fonts/gsub_context1_next_glyph_f1.otf
new file mode 100644
index 0000000..2786ded
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub_context1_next_glyph_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub_context1_simple_f1.otf b/test/shaping/data/aots/fonts/gsub_context1_simple_f1.otf
new file mode 100644
index 0000000..ebdaf22
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub_context1_simple_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub_context1_simple_f2.otf b/test/shaping/data/aots/fonts/gsub_context1_simple_f2.otf
new file mode 100644
index 0000000..d4a3fbf
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub_context1_simple_f2.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub_context1_successive_f1.otf b/test/shaping/data/aots/fonts/gsub_context1_successive_f1.otf
new file mode 100644
index 0000000..ce2dce5
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub_context1_successive_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub_context2_boundary_f1.otf b/test/shaping/data/aots/fonts/gsub_context2_boundary_f1.otf
new file mode 100644
index 0000000..6f46192
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub_context2_boundary_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub_context2_boundary_f2.otf b/test/shaping/data/aots/fonts/gsub_context2_boundary_f2.otf
new file mode 100644
index 0000000..ef19d87
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub_context2_boundary_f2.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub_context2_classes_f1.otf b/test/shaping/data/aots/fonts/gsub_context2_classes_f1.otf
new file mode 100644
index 0000000..8507760
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub_context2_classes_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub_context2_classes_f2.otf b/test/shaping/data/aots/fonts/gsub_context2_classes_f2.otf
new file mode 100644
index 0000000..ceb74b2
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub_context2_classes_f2.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub_context2_expansion_f1.otf b/test/shaping/data/aots/fonts/gsub_context2_expansion_f1.otf
new file mode 100644
index 0000000..c12f0ac
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub_context2_expansion_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub_context2_lookupflag_f1.otf b/test/shaping/data/aots/fonts/gsub_context2_lookupflag_f1.otf
new file mode 100644
index 0000000..a0fada4
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub_context2_lookupflag_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub_context2_lookupflag_f2.otf b/test/shaping/data/aots/fonts/gsub_context2_lookupflag_f2.otf
new file mode 100644
index 0000000..cd40a5d
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub_context2_lookupflag_f2.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub_context2_multiple_subrules_f1.otf b/test/shaping/data/aots/fonts/gsub_context2_multiple_subrules_f1.otf
new file mode 100644
index 0000000..53be20d
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub_context2_multiple_subrules_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub_context2_multiple_subrules_f2.otf b/test/shaping/data/aots/fonts/gsub_context2_multiple_subrules_f2.otf
new file mode 100644
index 0000000..6bcc0cb
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub_context2_multiple_subrules_f2.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub_context2_next_glyph_f1.otf b/test/shaping/data/aots/fonts/gsub_context2_next_glyph_f1.otf
new file mode 100644
index 0000000..4ca4e48
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub_context2_next_glyph_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub_context2_simple_f1.otf b/test/shaping/data/aots/fonts/gsub_context2_simple_f1.otf
new file mode 100644
index 0000000..16aae9d
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub_context2_simple_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub_context2_simple_f2.otf b/test/shaping/data/aots/fonts/gsub_context2_simple_f2.otf
new file mode 100644
index 0000000..fc31262
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub_context2_simple_f2.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub_context2_successive_f1.otf b/test/shaping/data/aots/fonts/gsub_context2_successive_f1.otf
new file mode 100644
index 0000000..cf1a89c
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub_context2_successive_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub_context3_boundary_f1.otf b/test/shaping/data/aots/fonts/gsub_context3_boundary_f1.otf
new file mode 100644
index 0000000..01cd29d
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub_context3_boundary_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub_context3_boundary_f2.otf b/test/shaping/data/aots/fonts/gsub_context3_boundary_f2.otf
new file mode 100644
index 0000000..6fa5f05
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub_context3_boundary_f2.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub_context3_lookupflag_f1.otf b/test/shaping/data/aots/fonts/gsub_context3_lookupflag_f1.otf
new file mode 100644
index 0000000..94371b4
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub_context3_lookupflag_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub_context3_lookupflag_f2.otf b/test/shaping/data/aots/fonts/gsub_context3_lookupflag_f2.otf
new file mode 100644
index 0000000..d8150df
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub_context3_lookupflag_f2.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub_context3_next_glyph_f1.otf b/test/shaping/data/aots/fonts/gsub_context3_next_glyph_f1.otf
new file mode 100644
index 0000000..93533b8
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub_context3_next_glyph_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub_context3_simple_f1.otf b/test/shaping/data/aots/fonts/gsub_context3_simple_f1.otf
new file mode 100644
index 0000000..a1cd98c
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub_context3_simple_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub_context3_successive_f1.otf b/test/shaping/data/aots/fonts/gsub_context3_successive_f1.otf
new file mode 100644
index 0000000..d8b3d5c
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub_context3_successive_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/lookupflag_ignore_attach_f1.otf b/test/shaping/data/aots/fonts/lookupflag_ignore_attach_f1.otf
new file mode 100644
index 0000000..80651f1
--- /dev/null
+++ b/test/shaping/data/aots/fonts/lookupflag_ignore_attach_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/lookupflag_ignore_base_f1.otf b/test/shaping/data/aots/fonts/lookupflag_ignore_base_f1.otf
new file mode 100644
index 0000000..3c242b0
--- /dev/null
+++ b/test/shaping/data/aots/fonts/lookupflag_ignore_base_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/lookupflag_ignore_combination_f1.otf b/test/shaping/data/aots/fonts/lookupflag_ignore_combination_f1.otf
new file mode 100644
index 0000000..b88359a
--- /dev/null
+++ b/test/shaping/data/aots/fonts/lookupflag_ignore_combination_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/lookupflag_ignore_ligatures_f1.otf b/test/shaping/data/aots/fonts/lookupflag_ignore_ligatures_f1.otf
new file mode 100644
index 0000000..1dc0c23
--- /dev/null
+++ b/test/shaping/data/aots/fonts/lookupflag_ignore_ligatures_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/lookupflag_ignore_marks_f1.otf b/test/shaping/data/aots/fonts/lookupflag_ignore_marks_f1.otf
new file mode 100644
index 0000000..aa429de
--- /dev/null
+++ b/test/shaping/data/aots/fonts/lookupflag_ignore_marks_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/tests/classdef1.tests b/test/shaping/data/aots/tests/classdef1.tests
new file mode 100644
index 0000000..40ded45
--- /dev/null
+++ b/test/shaping/data/aots/tests/classdef1.tests
@@ -0,0 +1 @@
+../fonts/classdef1_font4.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0011,U+0012,U+0013,U+0014,U+0015:[17|18|19|20|21]
diff --git a/test/shaping/data/aots/tests/classdef1_empty.tests b/test/shaping/data/aots/tests/classdef1_empty.tests
new file mode 100644
index 0000000..71d87f1
--- /dev/null
+++ b/test/shaping/data/aots/tests/classdef1_empty.tests
@@ -0,0 +1 @@
+../fonts/classdef1_font2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0011,U+0012,U+0013,U+0014,U+0015:[17|23|24|25|21]
diff --git a/test/shaping/data/aots/tests/classdef1_multiple.tests b/test/shaping/data/aots/tests/classdef1_multiple.tests
new file mode 100644
index 0000000..c813f49
--- /dev/null
+++ b/test/shaping/data/aots/tests/classdef1_multiple.tests
@@ -0,0 +1 @@
+../fonts/classdef1_font3.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0011,U+0012,U+0013,U+0014,U+0015,U+0016,U+0017,U+0018,U+0019,U+001A,U+001B,U+001C,U+001D,U+001E,U+001F,U+0020,U+0021,U+0022,U+0023,U+0024:[20|23|24|25|24|26|27|28|28|29|30|31|34|33|34|35|37|38|38|39]
diff --git a/test/shaping/data/aots/tests/classdef1_single.tests b/test/shaping/data/aots/tests/classdef1_single.tests
new file mode 100644
index 0000000..b0196d3
--- /dev/null
+++ b/test/shaping/data/aots/tests/classdef1_single.tests
@@ -0,0 +1 @@
+../fonts/classdef2_font1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0011,U+0012,U+0013,U+0014,U+0015:[17|23|24|25|21]
diff --git a/test/shaping/data/aots/tests/classdef2.tests b/test/shaping/data/aots/tests/classdef2.tests
new file mode 100644
index 0000000..d8c7b14
--- /dev/null
+++ b/test/shaping/data/aots/tests/classdef2.tests
@@ -0,0 +1 @@
+../fonts/classdef2_font4.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0011,U+0012,U+0013,U+0014,U+0015:[17|18|19|20|21]
diff --git a/test/shaping/data/aots/tests/classdef2_empty.tests b/test/shaping/data/aots/tests/classdef2_empty.tests
new file mode 100644
index 0000000..a8fd629
--- /dev/null
+++ b/test/shaping/data/aots/tests/classdef2_empty.tests
@@ -0,0 +1 @@
+../fonts/classdef2_font2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0011,U+0012,U+0013,U+0014,U+0015:[17|23|24|25|21]
diff --git a/test/shaping/data/aots/tests/classdef2_multiple.tests b/test/shaping/data/aots/tests/classdef2_multiple.tests
new file mode 100644
index 0000000..39e6835
--- /dev/null
+++ b/test/shaping/data/aots/tests/classdef2_multiple.tests
@@ -0,0 +1 @@
+../fonts/classdef2_font3.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0011,U+0012,U+0013,U+0014,U+0015,U+0016,U+0017,U+0018,U+0019,U+001A,U+001B,U+001C,U+001D,U+001E,U+001F,U+0020,U+0021,U+0022,U+0023,U+0024:[20|23|24|25|24|26|27|28|28|29|30|31|34|33|34|35|37|38|38|39]
diff --git a/test/shaping/data/aots/tests/classdef2_single.tests b/test/shaping/data/aots/tests/classdef2_single.tests
new file mode 100644
index 0000000..b0196d3
--- /dev/null
+++ b/test/shaping/data/aots/tests/classdef2_single.tests
@@ -0,0 +1 @@
+../fonts/classdef2_font1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0011,U+0012,U+0013,U+0014,U+0015:[17|23|24|25|21]
diff --git a/test/shaping/data/aots/tests/gpos1_1_lookupflag.tests b/test/shaping/data/aots/tests/gpos1_1_lookupflag.tests
new file mode 100644
index 0000000..88d7dd7
--- /dev/null
+++ b/test/shaping/data/aots/tests/gpos1_1_lookupflag.tests
@@ -0,0 +1 @@
+../fonts/gpos1_1_lookupflag_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0012,U+0013,U+0014,U+0015:[17|18@1500,0|19@3000,0|20@4200,0|21@6000,0]
diff --git a/test/shaping/data/aots/tests/gpos1_1_simple.tests b/test/shaping/data/aots/tests/gpos1_1_simple.tests
new file mode 100644
index 0000000..101da9c
--- /dev/null
+++ b/test/shaping/data/aots/tests/gpos1_1_simple.tests
@@ -0,0 +1,4 @@
+../fonts/gpos1_1_simple_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0012,U+0013,U+0014,U+0015:[17|18@1300,0|19@3000,0|20@4300,0|21@6000,0]
+../fonts/gpos1_1_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0012,U+0013,U+0014,U+0015:[17|18@1500,-200|19@3000,0|20@4500,-200|21@6000,0]
+../fonts/gpos1_1_simple_f3.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0012,U+0013,U+0014,U+0015:[17|18@1500,0|19@2800,0|20@4300,0|21@5600,0]
+#../fonts/gpos1_1_simple_f4.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0012,U+0013,U+0014,U+0015:[17|18@1500,0|19@3000,-200|20@4500,-200|21@6000,-400]
diff --git a/test/shaping/data/aots/tests/gpos1_2.tests b/test/shaping/data/aots/tests/gpos1_2.tests
new file mode 100644
index 0000000..3ddfa44
--- /dev/null
+++ b/test/shaping/data/aots/tests/gpos1_2.tests
@@ -0,0 +1 @@
+../fonts/gpos1_2_font1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0012,U+0013,U+0014,U+0015:[17|18@1300,0|19@3000,0|20@4200,0|21@6000,0]
diff --git a/test/shaping/data/aots/tests/gpos1_2_lookupflag.tests b/test/shaping/data/aots/tests/gpos1_2_lookupflag.tests
new file mode 100644
index 0000000..82bcc43
--- /dev/null
+++ b/test/shaping/data/aots/tests/gpos1_2_lookupflag.tests
@@ -0,0 +1 @@
+../fonts/gpos1_2_font2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0012,U+0013,U+0014,U+0015:[17|18@1500,0|19@3000,0|20@4200,0|21@6000,0]
diff --git a/test/shaping/data/aots/tests/gpos2_1.tests b/test/shaping/data/aots/tests/gpos2_1.tests
new file mode 100644
index 0000000..4d8b5e9
--- /dev/null
+++ b/test/shaping/data/aots/tests/gpos2_1.tests
@@ -0,0 +1,2 @@
+../fonts/gpos2_1_font6.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0012,U+0013,U+0011,U+0012,U+0014,U+0011:[17|18@1300,0|19@3000,-100|17@4500,0|18@5700,0|20@7500,-400|17@9000,0]
+../fonts/gpos2_1_font7.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0012,U+0013,U+0011,U+0012,U+0014,U+0011,U+0015,U+0016,U+0011:[17|18@1300,0|19@3000,-100|17@4500,0|18@5700,0|20@7500,-400|17@9000,0|21@10000,0|22@12000,-600|17@13500,0]
diff --git a/test/shaping/data/aots/tests/gpos2_1_lookupflag.tests b/test/shaping/data/aots/tests/gpos2_1_lookupflag.tests
new file mode 100644
index 0000000..ce445a1
--- /dev/null
+++ b/test/shaping/data/aots/tests/gpos2_1_lookupflag.tests
@@ -0,0 +1,2 @@
+../fonts/gpos2_1_lookupflag_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0013,U+0014,U+0011,U+0013,U+0012,U+0014,U+0011:[17|19@1300,0|20@3000,-100|17@4500,0|19@5800,0|18@7500,0|20@9000,-100|17@10500,0]
+../fonts/gpos2_1_lookupflag_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0013,U+0014,U+0011,U+0013,U+0012,U+0014,U+0011:[17|19@1500,0|20@2800,-100|17@4300,0|19@5800,0|18@7100,0|20@8600,-100|17@10100,0]
diff --git a/test/shaping/data/aots/tests/gpos2_1_next_glyph.tests b/test/shaping/data/aots/tests/gpos2_1_next_glyph.tests
new file mode 100644
index 0000000..7f27eee
--- /dev/null
+++ b/test/shaping/data/aots/tests/gpos2_1_next_glyph.tests
@@ -0,0 +1,2 @@
+../fonts/gpos2_1_next_glyph_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0012,U+0012,U+0012,U+0012:[18@-100,0|18@1500,-100|18@2900,0|18@4500,-100]
+../fonts/gpos2_1_next_glyph_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0012,U+0012,U+0012,U+0012:[18@-100,0|18@1400,0|18@2900,0|18@4500,0]
diff --git a/test/shaping/data/aots/tests/gpos2_1_simple.tests b/test/shaping/data/aots/tests/gpos2_1_simple.tests
new file mode 100644
index 0000000..71e8c81
--- /dev/null
+++ b/test/shaping/data/aots/tests/gpos2_1_simple.tests
@@ -0,0 +1,2 @@
+../fonts/gpos2_1_simple_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0012,U+0013,U+0011,U+0012,U+0014:[17|18@1300,0|19@3000,-100|17@4500,0|18@6000,0|20@7500,0]
+../fonts/gpos2_1_simple_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0012:[17|18@1500,0]
diff --git a/test/shaping/data/aots/tests/gpos2_2.tests b/test/shaping/data/aots/tests/gpos2_2.tests
new file mode 100644
index 0000000..7be07f7
--- /dev/null
+++ b/test/shaping/data/aots/tests/gpos2_2.tests
@@ -0,0 +1,5 @@
+../fonts/gpos2_2_font1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0012,U+0013,U+0011,U+0012,U+0014:[17|18@1300,0|19@3000,-100|17@4500,0|18@6000,0|20@7500,0]
+../fonts/gpos2_2_font2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0013,U+0014,U+0011,U+0013,U+0012,U+0014,U+0011:[17|19@1300,0|20@3000,-100|17@4500,0|19@5800,0|18@7500,0|20@9000,-100|17@10500,0]
+../fonts/gpos2_2_font3.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0013,U+0014,U+0011,U+0013,U+0012,U+0014,U+0011:[17|19@1500,0|20@2800,-100|17@4300,0|19@5800,0|18@7100,0|20@8600,-100|17@10100,0]
+../fonts/gpos2_2_font4.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0012,U+0012,U+0012,U+0012:[18@-100,0|18@1500,-100|18@2900,0|18@4500,-100]
+../fonts/gpos2_2_font5.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0012,U+0012,U+0012,U+0012:[18@-100,0|18@1400,0|18@2900,0|18@4500,0]
diff --git a/test/shaping/data/aots/tests/gpos3.tests b/test/shaping/data/aots/tests/gpos3.tests
new file mode 100644
index 0000000..d6f37bf
--- /dev/null
+++ b/test/shaping/data/aots/tests/gpos3.tests
@@ -0,0 +1,11 @@
+#../fonts/gpos3_font1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0012,U+0013,U+0011:[17|18@1500,0|19@1599,99|17@4500,0]
+../fonts/gpos3_font1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0012,U+0011,U+0013,U+0011:[17|18@1500,0|17@3000,0|19@4500,0|17@6000,0]
+#../fonts/gpos3_font3.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0012,U+0012,U+0011:[17|18@1500,0|18@1600,100|17@4500,0]
+#../fonts/gpos3_font3.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0012,U+0013,U+0011:[17|18@1500,0|19@1599,99|17@4500,0]
+#../fonts/gpos3_font3.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0014,U+0012,U+0011:[17|20@1500,0|18@1602,102|17@4500,0]
+#../fonts/gpos3_font3.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0014,U+0013,U+0011:[17|20@1500,0|19@1601,101|17@4500,0]
+../fonts/gpos3_font3.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0012,U+0014,U+0011:[17|18@1500,0|20@3000,0|17@4500,0]
+../fonts/gpos3_font3.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0013,U+0012,U+0011:[17|19@1500,0|18@3000,0|17@4500,0]
+../fonts/gpos3_font3.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0013,U+0014,U+0011:[17|19@1500,0|20@3000,0|17@4500,0]
+../fonts/gpos3_font3.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0012:[17|18@1500,0]
+../fonts/gpos3_font3.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0012,U+0015,U+0015,U+0015:[17|18@1500,0|21@3000,0|21@4500,0|21@6000,0]
diff --git a/test/shaping/data/aots/tests/gpos3_lookupflag.tests b/test/shaping/data/aots/tests/gpos3_lookupflag.tests
new file mode 100644
index 0000000..13d593c
--- /dev/null
+++ b/test/shaping/data/aots/tests/gpos3_lookupflag.tests
@@ -0,0 +1,2 @@
+#../fonts/gpos3_font2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0012,U+0015,U+0013,U+0011:[17|18@1500,0|21@3000,0|19@1599,99|17@6000,0]
+#../fonts/gpos3_font2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0012,U+0015,U+0015,U+0015,U+0013,U+0011:[17|18@1500,0|21@3000,0|21@4500,0|21@6000,0|19@1599,99|17@9000,0]
diff --git a/test/shaping/data/aots/tests/gpos4_lookupflag.tests b/test/shaping/data/aots/tests/gpos4_lookupflag.tests
new file mode 100644
index 0000000..9d041bf
--- /dev/null
+++ b/test/shaping/data/aots/tests/gpos4_lookupflag.tests
@@ -0,0 +1,2 @@
+#../fonts/gpos4_lookupflag_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0012,U+0011,U+0013,U+0011:[17|18@1500,0|17@3000,0|19@4500,0|17@6000,0]
+#../fonts/gpos4_lookupflag_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0012,U+0013,U+0011:[17|18@1500,0|19@3000,0|17@4500,0]
diff --git a/test/shaping/data/aots/tests/gpos4_multiple_anchors.tests b/test/shaping/data/aots/tests/gpos4_multiple_anchors.tests
new file mode 100644
index 0000000..af9a1f5
--- /dev/null
+++ b/test/shaping/data/aots/tests/gpos4_multiple_anchors.tests
@@ -0,0 +1 @@
+#../fonts/gpos4_multiple_anchors_1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0013,U+0014,U+0015,U+0016,U+0012,U+0013,U+0014,U+0015,U+0016:[17|19@-100,-80|20@-91,-71|21@-102,-82|22@-93,-73|18@7500,0|19@7420,-60|20@7429,-51|21@7418,-62|22@7427,-53]
diff --git a/test/shaping/data/aots/tests/gpos4_simple.tests b/test/shaping/data/aots/tests/gpos4_simple.tests
new file mode 100644
index 0000000..5d60507
--- /dev/null
+++ b/test/shaping/data/aots/tests/gpos4_simple.tests
@@ -0,0 +1,5 @@
+#../fonts/gpos4_simple_1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0012,U+0013,U+0011:[17|18@1500,0|19@1400,-80|17@4500,0]
+#../fonts/gpos4_simple_1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0011,U+0013,U+0011:[17|17@1500,0|19@3000,0|17@4500,0]
+#../fonts/gpos4_simple_1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0019,U+0019,U+0013,U+0011:[25|25@1500,0|19@3000,0|17@4500,0]
+#../fonts/gpos4_simple_1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0012,U+0013,U+0013,U+0011:[17|18@1500,0|19@1400,-80|19@1400,-80|17@6000,0]
+#../fonts/gpos4_simple_1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0012,U+0014,U+0013,U+0011:[17|18@1500,0|20@3000,0|19@1400,-80|17@6000,0]
diff --git a/test/shaping/data/aots/tests/gpos5.tests b/test/shaping/data/aots/tests/gpos5.tests
new file mode 100644
index 0000000..a20a0b9
--- /dev/null
+++ b/test/shaping/data/aots/tests/gpos5.tests
@@ -0,0 +1,2 @@
+#../fonts/gpos5_font1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+001E,U+0013,U+001F,U+0011:[17|18@1500,0|19@1400,-80|17@4500,0]
+#../fonts/gpos5_font1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+001E,U+001F,U+0013,U+0011:[17|18@1500,0|19@1401,-79|17@4500,0]
diff --git a/test/shaping/data/aots/tests/gpos6.tests b/test/shaping/data/aots/tests/gpos6.tests
new file mode 100644
index 0000000..e5f9b3c
--- /dev/null
+++ b/test/shaping/data/aots/tests/gpos6.tests
@@ -0,0 +1,3 @@
+#../fonts/gpos6_font1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0012,U+0013,U+0011:[17|18@1500,0|19@1400,-80|17@4500,0]
+#../fonts/gpos6_font1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0011,U+0013,U+0011:[17|17@1500,0|19@3000,0|17@4500,0]
+#../fonts/gpos6_font1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0014,U+0014,U+0013,U+0011:[20|20@1500,0|19@3000,0|17@4500,0]
diff --git a/test/shaping/data/aots/tests/gpos7_1.tests b/test/shaping/data/aots/tests/gpos7_1.tests
new file mode 100644
index 0000000..954c8cb
--- /dev/null
+++ b/test/shaping/data/aots/tests/gpos7_1.tests
@@ -0,0 +1,2 @@
+../fonts/gpos7_1_font1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0012,U+0013,U+0014,U+0015:[17|18@1600,0|19@3200,0|20@4800,0|21@6000,0]
+../fonts/gpos7_1_font1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0012,U+0011,U+0012,U+0013,U+0011:[17|18@1500,0|17@3000,0|18@4500,0|19@6000,0|17@7500,0]
diff --git a/test/shaping/data/aots/tests/gpos9.tests b/test/shaping/data/aots/tests/gpos9.tests
new file mode 100644
index 0000000..cb20333
--- /dev/null
+++ b/test/shaping/data/aots/tests/gpos9.tests
@@ -0,0 +1,2 @@
+../fonts/gpos9_font1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0012,U+0013,U+0014,U+0015:[17|18@1300,0|19@3000,0|20@4300,0|21@6000,0]
+../fonts/gpos9_font2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0012,U+0013,U+0014,U+0015,U+0011:[17|18@1300,0|19@2700,0|20@4300,0|21@5700,0|17@7500,0]
diff --git a/test/shaping/data/aots/tests/gpos_chaining1_boundary.tests b/test/shaping/data/aots/tests/gpos_chaining1_boundary.tests
new file mode 100644
index 0000000..646ff2c
--- /dev/null
+++ b/test/shaping/data/aots/tests/gpos_chaining1_boundary.tests
@@ -0,0 +1,4 @@
+../fonts/gpos_chaining1_boundary_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20@1500,0|21@3000,0|22@4500,0|23@6000,0|0@7500,0]
+../fonts/gpos_chaining1_boundary_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20@1500,0|21@3020,0|22@4500,0|23@6000,0|0@7500,0]
+../fonts/gpos_chaining1_boundary_f3.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20@1500,0|21@3020,0|22@4500,0|23@6000,0|0@7500,0]
+../fonts/gpos_chaining1_boundary_f4.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20@1500,0|21@3000,0|22@4520,0|23@6000,0|0@7500,0]
diff --git a/test/shaping/data/aots/tests/gpos_chaining1_lookupflag.tests b/test/shaping/data/aots/tests/gpos_chaining1_lookupflag.tests
new file mode 100644
index 0000000..d0e6e2e
--- /dev/null
+++ b/test/shaping/data/aots/tests/gpos_chaining1_lookupflag.tests
@@ -0,0 +1 @@
+#../fonts/gpos_chaining1_lookupflag_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+005A,U+0015,U+005B,U+0016,U+005C,U+0017,U+005D,U+005E,U+0018,U+005A,U+0019,U+005B,U+001A,U+0000:[0|20@1500,0|90@3000,0|21@4500,0|91@6000,0|22@7500,0|92@9000,0|23@10520,0|93@12000,0|94@13500,0|24@15000,0|90@16500,0|25@18000,0|91@19500,0|26@21000,0|0@22500,0]
diff --git a/test/shaping/data/aots/tests/gpos_chaining1_multiple_subrules.tests b/test/shaping/data/aots/tests/gpos_chaining1_multiple_subrules.tests
new file mode 100644
index 0000000..51bbe03
--- /dev/null
+++ b/test/shaping/data/aots/tests/gpos_chaining1_multiple_subrules.tests
@@ -0,0 +1,2 @@
+../fonts/gpos_chaining1_multiple_subrules_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0017,U+0018,U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20@1500,0|21@3020,0|22@4500,0|23@6000,0|24@7500,0|0@9000,0|20@10500,0|21@12000,0|22@13520,0|23@15000,0|0@16500,0]
+../fonts/gpos_chaining1_multiple_subrules_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0017,U+0018,U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20@1500,0|21@3000,0|22@4520,0|23@6000,0|24@7500,0|0@9000,0|20@10500,0|21@12000,0|22@13520,0|23@15000,0|0@16500,0]
diff --git a/test/shaping/data/aots/tests/gpos_chaining1_next_glyph.tests b/test/shaping/data/aots/tests/gpos_chaining1_next_glyph.tests
new file mode 100644
index 0000000..f8be404
--- /dev/null
+++ b/test/shaping/data/aots/tests/gpos_chaining1_next_glyph.tests
@@ -0,0 +1 @@
+../fonts/gpos_chaining1_next_glyph_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20@1500,0|21@3020,0|22@4520,0|23@6020,0|0@7500,0]
diff --git a/test/shaping/data/aots/tests/gpos_chaining1_simple.tests b/test/shaping/data/aots/tests/gpos_chaining1_simple.tests
new file mode 100644
index 0000000..37efa11
--- /dev/null
+++ b/test/shaping/data/aots/tests/gpos_chaining1_simple.tests
@@ -0,0 +1,11 @@
+../fonts/gpos_chaining1_simple_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20@1500,0|21@3020,0|22@4520,0|23@6000,0|0@7500,0]
+../fonts/gpos_chaining1_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0017,U+0018,U+0019,U+001A,U+0000:[0|20@1500,0|21@3000,0|22@4520,0|23@6000,0|24@7500,0|25@9000,0|26@10500,0|0@12000,0]
+../fonts/gpos_chaining1_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0017,U+0018,U+0019,U+0000,U+0000:[0|20@1500,0|21@3000,0|22@4500,0|23@6000,0|24@7500,0|25@9000,0|0@10500,0|0@12000,0]
+../fonts/gpos_chaining1_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0017,U+0018,U+0019:[0|20@1500,0|21@3000,0|22@4500,0|23@6000,0|24@7500,0|25@9000,0]
+../fonts/gpos_chaining1_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0017,U+0018:[0|20@1500,0|21@3000,0|22@4500,0|23@6000,0|24@7500,0]
+../fonts/gpos_chaining1_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0000,U+0015,U+0016,U+0017,U+0018,U+0019,U+001A,U+0000:[0|0@1500,0|21@3000,0|22@4500,0|23@6000,0|24@7500,0|25@9000,0|26@10500,0|0@12000,0]
+../fonts/gpos_chaining1_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0015,U+0016,U+0017,U+0018,U+0019,U+001A,U+0000:[21|22@1500,0|23@3000,0|24@4500,0|25@6000,0|26@7500,0|0@9000,0]
+../fonts/gpos_chaining1_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0016,U+0017,U+0018,U+0019,U+001A,U+0000:[22|23@1500,0|24@3000,0|25@4500,0|26@6000,0|0@7500,0]
+../fonts/gpos_chaining1_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0000,U+0018,U+0019,U+001A,U+0000:[0|20@1500,0|21@3000,0|22@4500,0|0@6000,0|24@7500,0|25@9000,0|26@10500,0|0@12000,0]
+../fonts/gpos_chaining1_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0017:[0|20@1500,0|21@3000,0|22@4500,0|23@6000,0]
+../fonts/gpos_chaining1_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016:[0|20@1500,0|21@3000,0|22@4500,0]
diff --git a/test/shaping/data/aots/tests/gpos_chaining1_successive.tests b/test/shaping/data/aots/tests/gpos_chaining1_successive.tests
new file mode 100644
index 0000000..7a829cf
--- /dev/null
+++ b/test/shaping/data/aots/tests/gpos_chaining1_successive.tests
@@ -0,0 +1 @@
+../fonts/gpos_chaining1_successive_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0019,U+0014,U+0015,U+0016,U+0017,U+0018,U+0000:[0|25@1500,0|20@3000,0|21@4520,0|22@6020,0|23@7500,0|24@9000,0|0@10500,0]
diff --git a/test/shaping/data/aots/tests/gpos_chaining2_boundary.tests b/test/shaping/data/aots/tests/gpos_chaining2_boundary.tests
new file mode 100644
index 0000000..c35b8c7
--- /dev/null
+++ b/test/shaping/data/aots/tests/gpos_chaining2_boundary.tests
@@ -0,0 +1,4 @@
+../fonts/gpos_chaining2_boundary_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20@1500,0|21@3000,0|22@4500,0|23@6000,0|0@7500,0]
+../fonts/gpos_chaining2_boundary_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20@1500,0|21@3020,0|22@4500,0|23@6000,0|0@7500,0]
+../fonts/gpos_chaining2_boundary_f3.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20@1500,0|21@3020,0|22@4500,0|23@6000,0|0@7500,0]
+../fonts/gpos_chaining2_boundary_f4.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20@1500,0|21@3000,0|22@4520,0|23@6000,0|0@7500,0]
diff --git a/test/shaping/data/aots/tests/gpos_chaining2_lookupflag.tests b/test/shaping/data/aots/tests/gpos_chaining2_lookupflag.tests
new file mode 100644
index 0000000..8b50e14
--- /dev/null
+++ b/test/shaping/data/aots/tests/gpos_chaining2_lookupflag.tests
@@ -0,0 +1 @@
+#../fonts/gpos_chaining2_lookupflag_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+005A,U+0015,U+005B,U+0016,U+005C,U+0017,U+005D,U+005E,U+0018,U+005A,U+0019,U+005B,U+001A,U+0000:[0|20@1500,0|90@3000,0|21@4500,0|91@6000,0|22@7500,0|92@9000,0|23@10520,0|93@12000,0|94@13500,0|24@15000,0|90@16500,0|25@18000,0|91@19500,0|26@21000,0|0@22500,0]
diff --git a/test/shaping/data/aots/tests/gpos_chaining2_multiple_subrules.tests b/test/shaping/data/aots/tests/gpos_chaining2_multiple_subrules.tests
new file mode 100644
index 0000000..8ddc8b2
--- /dev/null
+++ b/test/shaping/data/aots/tests/gpos_chaining2_multiple_subrules.tests
@@ -0,0 +1,2 @@
+../fonts/gpos_chaining2_multiple_subrules_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0017,U+0018,U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20@1500,0|21@3020,0|22@4500,0|23@6000,0|24@7500,0|0@9000,0|20@10500,0|21@12000,0|22@13520,0|23@15000,0|0@16500,0]
+../fonts/gpos_chaining2_multiple_subrules_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0017,U+0018,U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20@1500,0|21@3000,0|22@4520,0|23@6000,0|24@7500,0|0@9000,0|20@10500,0|21@12000,0|22@13520,0|23@15000,0|0@16500,0]
diff --git a/test/shaping/data/aots/tests/gpos_chaining2_next_glyph.tests b/test/shaping/data/aots/tests/gpos_chaining2_next_glyph.tests
new file mode 100644
index 0000000..34170f2
--- /dev/null
+++ b/test/shaping/data/aots/tests/gpos_chaining2_next_glyph.tests
@@ -0,0 +1 @@
+../fonts/gpos_chaining2_next_glyph_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20@1500,0|21@3020,0|22@4520,0|23@6020,0|0@7500,0]
diff --git a/test/shaping/data/aots/tests/gpos_chaining2_simple.tests b/test/shaping/data/aots/tests/gpos_chaining2_simple.tests
new file mode 100644
index 0000000..32fda1b
--- /dev/null
+++ b/test/shaping/data/aots/tests/gpos_chaining2_simple.tests
@@ -0,0 +1,11 @@
+../fonts/gpos_chaining2_simple_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20@1500,0|21@3020,0|22@4520,0|23@6000,0|0@7500,0]
+../fonts/gpos_chaining2_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0017,U+0018,U+0019,U+001A,U+0000:[0|20@1500,0|21@3000,0|22@4520,0|23@6000,0|24@7500,0|25@9000,0|26@10500,0|0@12000,0]
+../fonts/gpos_chaining2_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0017,U+0018,U+0019,U+0000,U+0000:[0|20@1500,0|21@3000,0|22@4500,0|23@6000,0|24@7500,0|25@9000,0|0@10500,0|0@12000,0]
+../fonts/gpos_chaining2_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0017,U+0018,U+0019:[0|20@1500,0|21@3000,0|22@4500,0|23@6000,0|24@7500,0|25@9000,0]
+../fonts/gpos_chaining2_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0017,U+0018:[0|20@1500,0|21@3000,0|22@4500,0|23@6000,0|24@7500,0]
+../fonts/gpos_chaining2_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0000,U+0015,U+0016,U+0017,U+0018,U+0019,U+001A,U+0000:[0|0@1500,0|21@3000,0|22@4500,0|23@6000,0|24@7500,0|25@9000,0|26@10500,0|0@12000,0]
+../fonts/gpos_chaining2_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0015,U+0016,U+0017,U+0018,U+0019,U+001A,U+0000:[21|22@1500,0|23@3000,0|24@4500,0|25@6000,0|26@7500,0|0@9000,0]
+../fonts/gpos_chaining2_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0016,U+0017,U+0018,U+0019,U+001A,U+0000:[22|23@1500,0|24@3000,0|25@4500,0|26@6000,0|0@7500,0]
+../fonts/gpos_chaining2_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0000,U+0018,U+0019,U+001A,U+0000:[0|20@1500,0|21@3000,0|22@4500,0|0@6000,0|24@7500,0|25@9000,0|26@10500,0|0@12000,0]
+../fonts/gpos_chaining2_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0017:[0|20@1500,0|21@3000,0|22@4500,0|23@6000,0]
+../fonts/gpos_chaining2_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016:[0|20@1500,0|21@3000,0|22@4500,0]
diff --git a/test/shaping/data/aots/tests/gpos_chaining2_successive.tests b/test/shaping/data/aots/tests/gpos_chaining2_successive.tests
new file mode 100644
index 0000000..e930863
--- /dev/null
+++ b/test/shaping/data/aots/tests/gpos_chaining2_successive.tests
@@ -0,0 +1 @@
+../fonts/gpos_chaining2_successive_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0019,U+0014,U+0015,U+0016,U+0017,U+0018,U+0000:[0|25@1500,0|20@3000,0|21@4520,0|22@6020,0|23@7500,0|24@9000,0|0@10500,0]
diff --git a/test/shaping/data/aots/tests/gpos_chaining3_boundary.tests b/test/shaping/data/aots/tests/gpos_chaining3_boundary.tests
new file mode 100644
index 0000000..f74dedf
--- /dev/null
+++ b/test/shaping/data/aots/tests/gpos_chaining3_boundary.tests
@@ -0,0 +1,4 @@
+../fonts/gpos_chaining3_boundary_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20@1500,0|21@3000,0|22@4500,0|23@6000,0|0@7500,0]
+../fonts/gpos_chaining3_boundary_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20@1500,0|21@3020,0|22@4500,0|23@6000,0|0@7500,0]
+../fonts/gpos_chaining3_boundary_f3.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20@1500,0|21@3020,0|22@4500,0|23@6000,0|0@7500,0]
+../fonts/gpos_chaining3_boundary_f4.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20@1500,0|21@3000,0|22@4520,0|23@6000,0|0@7500,0]
diff --git a/test/shaping/data/aots/tests/gpos_chaining3_lookupflag.tests b/test/shaping/data/aots/tests/gpos_chaining3_lookupflag.tests
new file mode 100644
index 0000000..0165fb5
--- /dev/null
+++ b/test/shaping/data/aots/tests/gpos_chaining3_lookupflag.tests
@@ -0,0 +1 @@
+#../fonts/gpos_chaining3_lookupflag_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+005A,U+0015,U+005B,U+0016,U+005C,U+0017,U+005D,U+005E,U+0018,U+005A,U+0019,U+005B,U+001A,U+0000:[0|20@1500,0|90@3000,0|21@4500,0|91@6000,0|22@7500,0|92@9000,0|23@10520,0|93@12000,0|94@13500,0|24@15000,0|90@16500,0|25@18000,0|91@19500,0|26@21000,0|0@22500,0]
diff --git a/test/shaping/data/aots/tests/gpos_chaining3_next_glyph.tests b/test/shaping/data/aots/tests/gpos_chaining3_next_glyph.tests
new file mode 100644
index 0000000..614bc2e
--- /dev/null
+++ b/test/shaping/data/aots/tests/gpos_chaining3_next_glyph.tests
@@ -0,0 +1 @@
+../fonts/gpos_chaining3_next_glyph_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0016,U+0015,U+0016,U+0015,U+0016,U+0015,U+0000:[0|22@1500,0|21@3020,0|22@4500,0|21@6020,0|22@7500,0|21@9000,0|0@10500,0]
diff --git a/test/shaping/data/aots/tests/gpos_chaining3_simple.tests b/test/shaping/data/aots/tests/gpos_chaining3_simple.tests
new file mode 100644
index 0000000..f5977c2
--- /dev/null
+++ b/test/shaping/data/aots/tests/gpos_chaining3_simple.tests
@@ -0,0 +1,11 @@
+../fonts/gpos_chaining3_simple_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20@1500,0|21@3020,0|22@4520,0|23@6000,0|0@7500,0]
+../fonts/gpos_chaining3_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0017,U+0018,U+0019,U+001A,U+0000:[0|20@1500,0|21@3000,0|22@4520,0|23@6000,0|24@7500,0|25@9000,0|26@10500,0|0@12000,0]
+../fonts/gpos_chaining3_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0017,U+0018,U+0019,U+0000,U+0000:[0|20@1500,0|21@3000,0|22@4500,0|23@6000,0|24@7500,0|25@9000,0|0@10500,0|0@12000,0]
+../fonts/gpos_chaining3_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0017,U+0018,U+0019:[0|20@1500,0|21@3000,0|22@4500,0|23@6000,0|24@7500,0|25@9000,0]
+../fonts/gpos_chaining3_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0017,U+0018:[0|20@1500,0|21@3000,0|22@4500,0|23@6000,0|24@7500,0]
+../fonts/gpos_chaining3_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0000,U+0015,U+0016,U+0017,U+0018,U+0019,U+001A,U+0000:[0|0@1500,0|21@3000,0|22@4500,0|23@6000,0|24@7500,0|25@9000,0|26@10500,0|0@12000,0]
+../fonts/gpos_chaining3_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0015,U+0016,U+0017,U+0018,U+0019,U+001A,U+0000:[21|22@1500,0|23@3000,0|24@4500,0|25@6000,0|26@7500,0|0@9000,0]
+../fonts/gpos_chaining3_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0016,U+0017,U+0018,U+0019,U+001A,U+0000:[22|23@1500,0|24@3000,0|25@4500,0|26@6000,0|0@7500,0]
+../fonts/gpos_chaining3_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0000,U+0018,U+0019,U+001A,U+0000:[0|20@1500,0|21@3000,0|22@4500,0|0@6000,0|24@7500,0|25@9000,0|26@10500,0|0@12000,0]
+../fonts/gpos_chaining3_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0017:[0|20@1500,0|21@3000,0|22@4500,0|23@6000,0]
+../fonts/gpos_chaining3_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016:[0|20@1500,0|21@3000,0|22@4500,0]
diff --git a/test/shaping/data/aots/tests/gpos_chaining3_successive.tests b/test/shaping/data/aots/tests/gpos_chaining3_successive.tests
new file mode 100644
index 0000000..fa5a50c
--- /dev/null
+++ b/test/shaping/data/aots/tests/gpos_chaining3_successive.tests
@@ -0,0 +1 @@
+../fonts/gpos_chaining3_successive_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0019,U+0014,U+0015,U+0016,U+0017,U+0018,U+0000:[0|25@1500,0|20@3000,0|21@4520,0|22@6020,0|23@7500,0|24@9000,0|0@10500,0]
diff --git a/test/shaping/data/aots/tests/gpos_context1_boundary.tests b/test/shaping/data/aots/tests/gpos_context1_boundary.tests
new file mode 100644
index 0000000..1db8fef
--- /dev/null
+++ b/test/shaping/data/aots/tests/gpos_context1_boundary.tests
@@ -0,0 +1,2 @@
+../fonts/gpos_context1_boundary_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0014,U+0014,U+0014,U+0014,U+0000:[0|20@1500,0|20@3000,0|20@4500,0|20@6000,0|20@7500,0|0@9000,0]
+../fonts/gpos_context1_boundary_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0014,U+0014,U+0014,U+0014,U+0000:[0|20@1520,0|20@3020,0|20@4520,0|20@6020,0|20@7520,0|0@9000,0]
diff --git a/test/shaping/data/aots/tests/gpos_context1_expansion.tests b/test/shaping/data/aots/tests/gpos_context1_expansion.tests
new file mode 100644
index 0000000..2fc54d5
--- /dev/null
+++ b/test/shaping/data/aots/tests/gpos_context1_expansion.tests
@@ -0,0 +1 @@
+../fonts/gpos_context1_expansion_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0000:[0|20@1500,0|21@3000,0|22@4500,0|0@6000,0]
diff --git a/test/shaping/data/aots/tests/gpos_context1_lookupflag.tests b/test/shaping/data/aots/tests/gpos_context1_lookupflag.tests
new file mode 100644
index 0000000..9e8fcd6
--- /dev/null
+++ b/test/shaping/data/aots/tests/gpos_context1_lookupflag.tests
@@ -0,0 +1,2 @@
+#../fonts/gpos_context1_lookupflag_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+005A,U+0015,U+005B,U+005C,U+0016,U+0000:[0|20@1520,0|90@3000,0|21@4520,0|91@6000,0|92@7500,0|22@9020,0|0@10500,0]
+#../fonts/gpos_context1_lookupflag_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+005A,U+0015,U+005B,U+005C,U+0016,U+0000:[0|20@1500,0|90@3000,0|21@4520,0|91@6000,0|92@7500,0|22@9000,0|0@10500,0]
diff --git a/test/shaping/data/aots/tests/gpos_context1_multiple_subrules.tests b/test/shaping/data/aots/tests/gpos_context1_multiple_subrules.tests
new file mode 100644
index 0000000..b994f04
--- /dev/null
+++ b/test/shaping/data/aots/tests/gpos_context1_multiple_subrules.tests
@@ -0,0 +1,2 @@
+../fonts/gpos_context1_multiple_subrules_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0000,U+0014,U+0015,U+0000:[0|20@1520,0|21@3000,0|22@4500,0|0@6000,0|20@7500,0|21@9020,0|0@10500,0]
+../fonts/gpos_context1_multiple_subrules_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0000,U+0014,U+0015,U+0000:[0|20@1500,0|21@3020,0|22@4500,0|0@6000,0|20@7500,0|21@9020,0|0@10500,0]
diff --git a/test/shaping/data/aots/tests/gpos_context1_next_glyph.tests b/test/shaping/data/aots/tests/gpos_context1_next_glyph.tests
new file mode 100644
index 0000000..e67d635
--- /dev/null
+++ b/test/shaping/data/aots/tests/gpos_context1_next_glyph.tests
@@ -0,0 +1 @@
+../fonts/gpos_context1_next_glyph_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0014,U+0014,U+0014,U+0014,U+0000:[0|20@1520,0|20@3000,0|20@4520,0|20@6000,0|20@7500,0|0@9000,0]
diff --git a/test/shaping/data/aots/tests/gpos_context1_simple.tests b/test/shaping/data/aots/tests/gpos_context1_simple.tests
new file mode 100644
index 0000000..4a88e0a
--- /dev/null
+++ b/test/shaping/data/aots/tests/gpos_context1_simple.tests
@@ -0,0 +1,3 @@
+../fonts/gpos_context1_simple_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0000:[0|20@1520,0|21@3020,0|22@4520,0|0@6000,0]
+../fonts/gpos_context1_simple_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0000,U+0014,U+0015,U+0000:[0|20@1500,0|0@3000,0|20@4500,0|21@6000,0|0@7500,0]
+../fonts/gpos_context1_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0014,U+0014,U+0014,U+0014,U+0000:[0|20@1500,0|20@3020,0|20@4500,0|20@6000,0|20@7500,0|0@9000,0]
diff --git a/test/shaping/data/aots/tests/gpos_context1_successive.tests b/test/shaping/data/aots/tests/gpos_context1_successive.tests
new file mode 100644
index 0000000..172d350
--- /dev/null
+++ b/test/shaping/data/aots/tests/gpos_context1_successive.tests
@@ -0,0 +1 @@
+../fonts/gpos_context1_successive_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20@1500,0|21@3020,0|22@4520,0|23@6000,0|0@7500,0]
diff --git a/test/shaping/data/aots/tests/gpos_context2_boundary.tests b/test/shaping/data/aots/tests/gpos_context2_boundary.tests
new file mode 100644
index 0000000..ef63fbb
--- /dev/null
+++ b/test/shaping/data/aots/tests/gpos_context2_boundary.tests
@@ -0,0 +1,2 @@
+../fonts/gpos_context2_boundary_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0014,U+0014,U+0014,U+0014,U+0000:[0|20@1500,0|20@3000,0|20@4500,0|20@6000,0|20@7500,0|0@9000,0]
+../fonts/gpos_context2_boundary_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0014,U+0014,U+0014,U+0014,U+0000:[0|20@1520,0|20@3020,0|20@4520,0|20@6020,0|20@7520,0|0@9000,0]
diff --git a/test/shaping/data/aots/tests/gpos_context2_classes.tests b/test/shaping/data/aots/tests/gpos_context2_classes.tests
new file mode 100644
index 0000000..5a3d008
--- /dev/null
+++ b/test/shaping/data/aots/tests/gpos_context2_classes.tests
@@ -0,0 +1,2 @@
+../fonts/gpos_context2_classes_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+001A,U+001C,U+0018,U+0000,U+0015,U+001B,U+001A,U+0018,U+0000,U+0016,U+001B,U+001A,U+0018:[0|20@1500,0|26@3020,0|28@4500,0|24@6000,0|0@7500,0|21@9000,0|27@10520,0|26@12000,0|24@13500,0|0@15000,0|22@16500,0|27@18000,0|26@19500,0|24@21000,0]
+../fonts/gpos_context2_classes_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0016,U+001B,U+001A,U+0018,U+0000,U+0018,U+0018,U+001D,U+0016,U+0000,U+0016,U+001B,U+001A,U+0018:[0|22@1500,0|27@3020,0|26@4500,0|24@6000,0|0@7500,0|24@9000,0|24@10500,0|29@12020,0|22@13500,0|0@15000,0|22@16500,0|27@18020,0|26@19500,0|24@21000,0]
diff --git a/test/shaping/data/aots/tests/gpos_context2_expansion.tests b/test/shaping/data/aots/tests/gpos_context2_expansion.tests
new file mode 100644
index 0000000..67ed978
--- /dev/null
+++ b/test/shaping/data/aots/tests/gpos_context2_expansion.tests
@@ -0,0 +1 @@
+../fonts/gpos_context2_expansion_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0000:[0|20@1500,0|21@3000,0|22@4500,0|0@6000,0]
diff --git a/test/shaping/data/aots/tests/gpos_context2_lookupflag.tests b/test/shaping/data/aots/tests/gpos_context2_lookupflag.tests
new file mode 100644
index 0000000..f48e825
--- /dev/null
+++ b/test/shaping/data/aots/tests/gpos_context2_lookupflag.tests
@@ -0,0 +1,2 @@
+#../fonts/gpos_context2_lookupflag_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+005A,U+0015,U+005B,U+005C,U+0016,U+0000:[0|20@1520,0|90@3000,0|21@4520,0|91@6000,0|92@7500,0|22@9020,0|0@10500,0]
+#../fonts/gpos_context2_lookupflag_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+005A,U+0015,U+005B,U+005C,U+0016,U+0000:[0|20@1500,0|90@3000,0|21@4520,0|91@6000,0|92@7500,0|22@9000,0|0@10500,0]
diff --git a/test/shaping/data/aots/tests/gpos_context2_multiple_subrules.tests b/test/shaping/data/aots/tests/gpos_context2_multiple_subrules.tests
new file mode 100644
index 0000000..4489372
--- /dev/null
+++ b/test/shaping/data/aots/tests/gpos_context2_multiple_subrules.tests
@@ -0,0 +1,2 @@
+../fonts/gpos_context2_multiple_subrules_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0000,U+0014,U+0015,U+0000:[0|20@1520,0|21@3000,0|22@4500,0|0@6000,0|20@7500,0|21@9020,0|0@10500,0]
+../fonts/gpos_context2_multiple_subrules_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0000,U+0014,U+0015,U+0000:[0|20@1500,0|21@3020,0|22@4500,0|0@6000,0|20@7500,0|21@9020,0|0@10500,0]
diff --git a/test/shaping/data/aots/tests/gpos_context2_next_glyph.tests b/test/shaping/data/aots/tests/gpos_context2_next_glyph.tests
new file mode 100644
index 0000000..e736b3b
--- /dev/null
+++ b/test/shaping/data/aots/tests/gpos_context2_next_glyph.tests
@@ -0,0 +1 @@
+../fonts/gpos_context2_next_glyph_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0014,U+0014,U+0014,U+0014,U+0000:[0|20@1520,0|20@3000,0|20@4520,0|20@6000,0|20@7500,0|0@9000,0]
diff --git a/test/shaping/data/aots/tests/gpos_context2_simple.tests b/test/shaping/data/aots/tests/gpos_context2_simple.tests
new file mode 100644
index 0000000..edbc0be
--- /dev/null
+++ b/test/shaping/data/aots/tests/gpos_context2_simple.tests
@@ -0,0 +1,3 @@
+../fonts/gpos_context2_simple_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0000:[0|20@1520,0|21@3020,0|22@4520,0|0@6000,0]
+../fonts/gpos_context2_simple_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0000,U+0014,U+0015,U+0000:[0|20@1500,0|0@3000,0|20@4500,0|21@6000,0|0@7500,0]
+../fonts/gpos_context2_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0014,U+0014,U+0014,U+0014,U+0000:[0|20@1500,0|20@3020,0|20@4500,0|20@6000,0|20@7500,0|0@9000,0]
diff --git a/test/shaping/data/aots/tests/gpos_context2_successive.tests b/test/shaping/data/aots/tests/gpos_context2_successive.tests
new file mode 100644
index 0000000..8b098d5
--- /dev/null
+++ b/test/shaping/data/aots/tests/gpos_context2_successive.tests
@@ -0,0 +1 @@
+../fonts/gpos_context2_successive_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20@1500,0|21@3020,0|22@4520,0|23@6000,0|0@7500,0]
diff --git a/test/shaping/data/aots/tests/gpos_context3_boundary.tests b/test/shaping/data/aots/tests/gpos_context3_boundary.tests
new file mode 100644
index 0000000..de3c057
--- /dev/null
+++ b/test/shaping/data/aots/tests/gpos_context3_boundary.tests
@@ -0,0 +1,2 @@
+../fonts/gpos_context3_boundary_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0014,U+0014,U+0014,U+0014,U+0000:[0|20@1500,0|20@3000,0|20@4500,0|20@6000,0|20@7500,0|0@9000,0]
+../fonts/gpos_context3_boundary_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0014,U+0014,U+0014,U+0014,U+0000:[0|20@1520,0|20@3020,0|20@4520,0|20@6020,0|20@7520,0|0@9000,0]
diff --git a/test/shaping/data/aots/tests/gpos_context3_lookupflag.tests b/test/shaping/data/aots/tests/gpos_context3_lookupflag.tests
new file mode 100644
index 0000000..21f851b
--- /dev/null
+++ b/test/shaping/data/aots/tests/gpos_context3_lookupflag.tests
@@ -0,0 +1,2 @@
+#../fonts/gpos_context3_lookupflag_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+005A,U+0015,U+005B,U+005C,U+0016,U+0000:[0|20@1520,0|90@3000,0|21@4520,0|91@6000,0|92@7500,0|22@9020,0|0@10500,0]
+#../fonts/gpos_context3_lookupflag_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+005A,U+0015,U+005B,U+005C,U+0016,U+0000:[0|20@1500,0|90@3000,0|21@4520,0|91@6000,0|92@7500,0|22@9000,0|0@10500,0]
diff --git a/test/shaping/data/aots/tests/gpos_context3_next_glyph.tests b/test/shaping/data/aots/tests/gpos_context3_next_glyph.tests
new file mode 100644
index 0000000..049b156
--- /dev/null
+++ b/test/shaping/data/aots/tests/gpos_context3_next_glyph.tests
@@ -0,0 +1 @@
+../fonts/gpos_context3_next_glyph_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0014,U+0014,U+0014,U+0014,U+0000:[0|20@1520,0|20@3000,0|20@4520,0|20@6000,0|20@7500,0|0@9000,0]
diff --git a/test/shaping/data/aots/tests/gpos_context3_simple.tests b/test/shaping/data/aots/tests/gpos_context3_simple.tests
new file mode 100644
index 0000000..3e544f0
--- /dev/null
+++ b/test/shaping/data/aots/tests/gpos_context3_simple.tests
@@ -0,0 +1,2 @@
+../fonts/gpos_context3_simple_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0000:[0|20@1520,0|21@3020,0|22@4520,0|0@6000,0]
+../fonts/gpos_context3_simple_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0000,U+0014,U+0015,U+0000,U+0014,U+0015,U+0016,U+0000:[0|20@1500,0|0@3000,0|20@4500,0|21@6000,0|0@7500,0|20@9020,0|21@10520,0|22@12020,0|0@13500,0]
diff --git a/test/shaping/data/aots/tests/gpos_context3_successive.tests b/test/shaping/data/aots/tests/gpos_context3_successive.tests
new file mode 100644
index 0000000..bfcf24a
--- /dev/null
+++ b/test/shaping/data/aots/tests/gpos_context3_successive.tests
@@ -0,0 +1 @@
+../fonts/gpos_context3_successive_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20@1500,0|21@3020,0|22@4520,0|23@6000,0|0@7500,0]
diff --git a/test/shaping/data/aots/tests/gsub1_1_lookupflag.tests b/test/shaping/data/aots/tests/gsub1_1_lookupflag.tests
new file mode 100644
index 0000000..8865af8
--- /dev/null
+++ b/test/shaping/data/aots/tests/gsub1_1_lookupflag.tests
@@ -0,0 +1 @@
+../fonts/gsub1_1_lookupflag_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0011,U+0012,U+0013,U+0014,U+0015:[17|18|24|20|21]
diff --git a/test/shaping/data/aots/tests/gsub1_1_modulo.tests b/test/shaping/data/aots/tests/gsub1_1_modulo.tests
new file mode 100644
index 0000000..bbfff5e
--- /dev/null
+++ b/test/shaping/data/aots/tests/gsub1_1_modulo.tests
@@ -0,0 +1 @@
+../fonts/gsub1_1_modulo_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0011,U+0012,U+0013,U+0014,U+0015,U+0016,U+0017,U+0018:[17|18|17|24|23|18|23|24]
diff --git a/test/shaping/data/aots/tests/gsub1_1_simple.tests b/test/shaping/data/aots/tests/gsub1_1_simple.tests
new file mode 100644
index 0000000..a3a1385
--- /dev/null
+++ b/test/shaping/data/aots/tests/gsub1_1_simple.tests
@@ -0,0 +1 @@
+../fonts/gsub1_1_simple_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0011,U+0012,U+0013,U+0014,U+0015:[17|23|24|20|21]
diff --git a/test/shaping/data/aots/tests/gsub1_2_lookupflag.tests b/test/shaping/data/aots/tests/gsub1_2_lookupflag.tests
new file mode 100644
index 0000000..887e047
--- /dev/null
+++ b/test/shaping/data/aots/tests/gsub1_2_lookupflag.tests
@@ -0,0 +1 @@
+../fonts/gsub1_2_lookupflag_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0011,U+0012,U+0013,U+0014,U+0015:[17|18|19|25|21]
diff --git a/test/shaping/data/aots/tests/gsub1_2_simple.tests b/test/shaping/data/aots/tests/gsub1_2_simple.tests
new file mode 100644
index 0000000..d657897
--- /dev/null
+++ b/test/shaping/data/aots/tests/gsub1_2_simple.tests
@@ -0,0 +1 @@
+../fonts/gsub1_2_simple_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0011,U+0012,U+0013,U+0014,U+0015:[17|22|19|25|21]
diff --git a/test/shaping/data/aots/tests/gsub2_1_lookupflag.tests b/test/shaping/data/aots/tests/gsub2_1_lookupflag.tests
new file mode 100644
index 0000000..e28e59c
--- /dev/null
+++ b/test/shaping/data/aots/tests/gsub2_1_lookupflag.tests
@@ -0,0 +1 @@
+../fonts/gsub2_1_lookupflag_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0011,U+0012,U+0013,U+0011:[17|18|22|23|17]
diff --git a/test/shaping/data/aots/tests/gsub2_1_multiple_sequences.tests b/test/shaping/data/aots/tests/gsub2_1_multiple_sequences.tests
new file mode 100644
index 0000000..12cbbf6
--- /dev/null
+++ b/test/shaping/data/aots/tests/gsub2_1_multiple_sequences.tests
@@ -0,0 +1 @@
+../fonts/gsub2_1_multiple_sequences_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0011,U+0012,U+0013,U+0011:[17|20|21|22|23|17]
diff --git a/test/shaping/data/aots/tests/gsub2_1_simple.tests b/test/shaping/data/aots/tests/gsub2_1_simple.tests
new file mode 100644
index 0000000..d1d0969
--- /dev/null
+++ b/test/shaping/data/aots/tests/gsub2_1_simple.tests
@@ -0,0 +1,2 @@
+../fonts/gsub2_1_simple_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0011,U+0012,U+0013:[17|20|21|22|19]
+../fonts/gsub2_1_simple_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0011,U+0012,U+0013,U+0012:[17|20|21|22|19|20|21|22]
diff --git a/test/shaping/data/aots/tests/gsub3_1_lookupflag.tests b/test/shaping/data/aots/tests/gsub3_1_lookupflag.tests
new file mode 100644
index 0000000..193c5c4
--- /dev/null
+++ b/test/shaping/data/aots/tests/gsub3_1_lookupflag.tests
@@ -0,0 +1 @@
+../fonts/gsub3_1_lookupflag_f1.otf:--features="-test[4],test[5],test[6]=2,-test[7]" --no-clusters --no-glyph-names --no-positions:U+0011,U+0012,U+0012,U+0012,U+0013,U+0013,U+0013,U+0013,U+0011:[17|18|18|18|19|22|23|19|17]
diff --git a/test/shaping/data/aots/tests/gsub3_1_multiple.tests b/test/shaping/data/aots/tests/gsub3_1_multiple.tests
new file mode 100644
index 0000000..7b1c032
--- /dev/null
+++ b/test/shaping/data/aots/tests/gsub3_1_multiple.tests
@@ -0,0 +1 @@
+../fonts/gsub3_1_multiple_f1.otf:--features="-test[1],test[2],test[3]=2,-test[4],-test[5],test[6],test[7]=2,-test[8]" --no-clusters --no-glyph-names --no-positions:U+0011,U+0012,U+0012,U+0012,U+0012,U+0013,U+0013,U+0013,U+0013,U+0011:[17|18|20|21|18|19|22|23|19|17]
diff --git a/test/shaping/data/aots/tests/gsub3_1_simple.tests b/test/shaping/data/aots/tests/gsub3_1_simple.tests
new file mode 100644
index 0000000..b8a28d1
--- /dev/null
+++ b/test/shaping/data/aots/tests/gsub3_1_simple.tests
@@ -0,0 +1 @@
+#../fonts/gsub3_1_simple_f1.otf:--features="-test[1],test[3],test[5]=2,test[7]=3,-test[9],test[11]" --no-clusters --no-glyph-names --no-positions:U+0011,U+0012,U+0011,U+0012,U+0011,U+0012,U+0011,U+0012,U+0011,U+0012,U+0011,U+0012,U+0011:[17|18|17|20|17|21|17|22|17|18|17|20|17]
diff --git a/test/shaping/data/aots/tests/gsub4_1_lookupflag.tests b/test/shaping/data/aots/tests/gsub4_1_lookupflag.tests
new file mode 100644
index 0000000..c2c5242
--- /dev/null
+++ b/test/shaping/data/aots/tests/gsub4_1_lookupflag.tests
@@ -0,0 +1 @@
+../fonts/gsub4_1_lookupflag_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0011,U+0018,U+0012,U+0018,U+0013,U+0018,U+0018,U+0014,U+0018,U+0011,U+0012,U+0013,U+0016,U+0014:[17|24|23|24|24|24|24|17|18|19|22|20]
diff --git a/test/shaping/data/aots/tests/gsub4_1_multiple_ligatures.tests b/test/shaping/data/aots/tests/gsub4_1_multiple_ligatures.tests
new file mode 100644
index 0000000..33c1a09
--- /dev/null
+++ b/test/shaping/data/aots/tests/gsub4_1_multiple_ligatures.tests
@@ -0,0 +1,2 @@
+../fonts/gsub4_1_multiple_ligatures_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0011,U+0012,U+0013,U+0014,U+0011,U+0012,U+0013,U+0016,U+0014:[17|23|17|24|22|20]
+../fonts/gsub4_1_multiple_ligatures_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0011,U+0012,U+0013,U+0014,U+0011,U+0012,U+0013,U+0016,U+0014:[17|24|20|17|24|22|20]
diff --git a/test/shaping/data/aots/tests/gsub4_1_multiple_ligsets.tests b/test/shaping/data/aots/tests/gsub4_1_multiple_ligsets.tests
new file mode 100644
index 0000000..a63aeed
--- /dev/null
+++ b/test/shaping/data/aots/tests/gsub4_1_multiple_ligsets.tests
@@ -0,0 +1 @@
+../fonts/gsub4_1_multiple_ligsets_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0011,U+0012,U+0013,U+0015,U+0014,U+0013,U+0016:[17|23|21|24|22]
diff --git a/test/shaping/data/aots/tests/gsub4_1_simple.tests b/test/shaping/data/aots/tests/gsub4_1_simple.tests
new file mode 100644
index 0000000..aa4bb4b
--- /dev/null
+++ b/test/shaping/data/aots/tests/gsub4_1_simple.tests
@@ -0,0 +1 @@
+../fonts/gsub4_1_simple_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0011,U+0012,U+0013,U+0014,U+0011,U+0012,U+0013,U+0016,U+0014:[17|23|17|18|19|22|20]
diff --git a/test/shaping/data/aots/tests/gsub7.tests b/test/shaping/data/aots/tests/gsub7.tests
new file mode 100644
index 0000000..e95b1c7
--- /dev/null
+++ b/test/shaping/data/aots/tests/gsub7.tests
@@ -0,0 +1,2 @@
+../fonts/gsub7_font1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0011,U+0012,U+0013,U+0014,U+0015:[17|23|24|20|21]
+../fonts/gsub7_font2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0011,U+0012,U+0013,U+0014,U+0015:[17|23|29|20|21]
diff --git a/test/shaping/data/aots/tests/gsub_chaining1_boundary.tests b/test/shaping/data/aots/tests/gsub_chaining1_boundary.tests
new file mode 100644
index 0000000..6d99d97
--- /dev/null
+++ b/test/shaping/data/aots/tests/gsub_chaining1_boundary.tests
@@ -0,0 +1,4 @@
+../fonts/gsub_chaining1_boundary_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20|21|22|23|0]
+../fonts/gsub_chaining1_boundary_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20|61|22|23|0]
+../fonts/gsub_chaining1_boundary_f3.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20|61|22|23|0]
+../fonts/gsub_chaining1_boundary_f4.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20|21|62|23|0]
diff --git a/test/shaping/data/aots/tests/gsub_chaining1_lookupflag.tests b/test/shaping/data/aots/tests/gsub_chaining1_lookupflag.tests
new file mode 100644
index 0000000..7883c0a
--- /dev/null
+++ b/test/shaping/data/aots/tests/gsub_chaining1_lookupflag.tests
@@ -0,0 +1 @@
+../fonts/gsub_chaining1_lookupflag_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+005A,U+0015,U+005B,U+0016,U+005C,U+0017,U+005D,U+005E,U+0018,U+005A,U+0019,U+005B,U+001A,U+0000:[0|20|90|21|91|22|92|63|93|94|24|90|25|91|26|0]
diff --git a/test/shaping/data/aots/tests/gsub_chaining1_multiple_subrules.tests b/test/shaping/data/aots/tests/gsub_chaining1_multiple_subrules.tests
new file mode 100644
index 0000000..28a5225
--- /dev/null
+++ b/test/shaping/data/aots/tests/gsub_chaining1_multiple_subrules.tests
@@ -0,0 +1,2 @@
+../fonts/gsub_chaining1_multiple_subrules_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0017,U+0018,U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20|61|22|23|24|0|20|21|62|23|0]
+../fonts/gsub_chaining1_multiple_subrules_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0017,U+0018,U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20|21|62|23|24|0|20|21|62|23|0]
diff --git a/test/shaping/data/aots/tests/gsub_chaining1_next_glyph.tests b/test/shaping/data/aots/tests/gsub_chaining1_next_glyph.tests
new file mode 100644
index 0000000..82f9d95
--- /dev/null
+++ b/test/shaping/data/aots/tests/gsub_chaining1_next_glyph.tests
@@ -0,0 +1 @@
+../fonts/gsub_chaining1_next_glyph_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20|61|62|63|0]
diff --git a/test/shaping/data/aots/tests/gsub_chaining1_simple.tests b/test/shaping/data/aots/tests/gsub_chaining1_simple.tests
new file mode 100644
index 0000000..23e091f
--- /dev/null
+++ b/test/shaping/data/aots/tests/gsub_chaining1_simple.tests
@@ -0,0 +1,11 @@
+../fonts/gsub_chaining1_simple_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20|61|62|23|0]
+../fonts/gsub_chaining1_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0017,U+0018,U+0019,U+001A,U+0000:[0|20|21|62|23|24|25|26|0]
+../fonts/gsub_chaining1_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0017,U+0018,U+0019,U+0000,U+0000:[0|20|21|22|23|24|25|0|0]
+../fonts/gsub_chaining1_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0017,U+0018,U+0019:[0|20|21|22|23|24|25]
+../fonts/gsub_chaining1_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0017,U+0018:[0|20|21|22|23|24]
+../fonts/gsub_chaining1_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0000,U+0015,U+0016,U+0017,U+0018,U+0019,U+001A,U+0000:[0|0|21|22|23|24|25|26|0]
+../fonts/gsub_chaining1_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0015,U+0016,U+0017,U+0018,U+0019,U+001A,U+0000:[21|22|23|24|25|26|0]
+../fonts/gsub_chaining1_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0016,U+0017,U+0018,U+0019,U+001A,U+0000:[22|23|24|25|26|0]
+../fonts/gsub_chaining1_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0000,U+0018,U+0019,U+001A,U+0000:[0|20|21|22|0|24|25|26|0]
+../fonts/gsub_chaining1_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0017:[0|20|21|22|23]
+../fonts/gsub_chaining1_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016:[0|20|21|22]
diff --git a/test/shaping/data/aots/tests/gsub_chaining1_successive.tests b/test/shaping/data/aots/tests/gsub_chaining1_successive.tests
new file mode 100644
index 0000000..ab3cfb1
--- /dev/null
+++ b/test/shaping/data/aots/tests/gsub_chaining1_successive.tests
@@ -0,0 +1 @@
+../fonts/gsub_chaining1_successive_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0019,U+0014,U+0015,U+0016,U+0017,U+0018,U+0000:[0|25|20|61|63|24|0]
diff --git a/test/shaping/data/aots/tests/gsub_chaining2_boundary.tests b/test/shaping/data/aots/tests/gsub_chaining2_boundary.tests
new file mode 100644
index 0000000..b06c620
--- /dev/null
+++ b/test/shaping/data/aots/tests/gsub_chaining2_boundary.tests
@@ -0,0 +1,4 @@
+../fonts/gsub_chaining2_boundary_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20|21|22|23|0]
+../fonts/gsub_chaining2_boundary_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20|61|22|23|0]
+../fonts/gsub_chaining2_boundary_f3.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20|61|22|23|0]
+../fonts/gsub_chaining2_boundary_f4.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20|21|62|23|0]
diff --git a/test/shaping/data/aots/tests/gsub_chaining2_lookupflag.tests b/test/shaping/data/aots/tests/gsub_chaining2_lookupflag.tests
new file mode 100644
index 0000000..372b343
--- /dev/null
+++ b/test/shaping/data/aots/tests/gsub_chaining2_lookupflag.tests
@@ -0,0 +1 @@
+../fonts/gsub_chaining2_lookupflag_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+005A,U+0015,U+005B,U+0016,U+005C,U+0017,U+005D,U+005E,U+0018,U+005A,U+0019,U+005B,U+001A,U+0000:[0|20|90|21|91|22|92|63|93|94|24|90|25|91|26|0]
diff --git a/test/shaping/data/aots/tests/gsub_chaining2_multiple_subrules.tests b/test/shaping/data/aots/tests/gsub_chaining2_multiple_subrules.tests
new file mode 100644
index 0000000..e2fbb5c
--- /dev/null
+++ b/test/shaping/data/aots/tests/gsub_chaining2_multiple_subrules.tests
@@ -0,0 +1,2 @@
+../fonts/gsub_chaining2_multiple_subrules_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0017,U+0018,U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20|61|22|23|24|0|20|21|62|23|0]
+../fonts/gsub_chaining2_multiple_subrules_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0017,U+0018,U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20|21|62|23|24|0|20|21|62|23|0]
diff --git a/test/shaping/data/aots/tests/gsub_chaining2_next_glyph.tests b/test/shaping/data/aots/tests/gsub_chaining2_next_glyph.tests
new file mode 100644
index 0000000..84c8252
--- /dev/null
+++ b/test/shaping/data/aots/tests/gsub_chaining2_next_glyph.tests
@@ -0,0 +1 @@
+../fonts/gsub_chaining2_next_glyph_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20|61|62|63|0]
diff --git a/test/shaping/data/aots/tests/gsub_chaining2_simple.tests b/test/shaping/data/aots/tests/gsub_chaining2_simple.tests
new file mode 100644
index 0000000..53fa7e8
--- /dev/null
+++ b/test/shaping/data/aots/tests/gsub_chaining2_simple.tests
@@ -0,0 +1,11 @@
+../fonts/gsub_chaining2_simple_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20|61|62|23|0]
+../fonts/gsub_chaining2_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0017,U+0018,U+0019,U+001A,U+0000:[0|20|21|62|23|24|25|26|0]
+../fonts/gsub_chaining2_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0017,U+0018,U+0019,U+0000,U+0000:[0|20|21|22|23|24|25|0|0]
+../fonts/gsub_chaining2_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0017,U+0018,U+0019:[0|20|21|22|23|24|25]
+../fonts/gsub_chaining2_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0017,U+0018:[0|20|21|22|23|24]
+../fonts/gsub_chaining2_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0000,U+0015,U+0016,U+0017,U+0018,U+0019,U+001A,U+0000:[0|0|21|22|23|24|25|26|0]
+../fonts/gsub_chaining2_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0015,U+0016,U+0017,U+0018,U+0019,U+001A,U+0000:[21|22|23|24|25|26|0]
+../fonts/gsub_chaining2_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0016,U+0017,U+0018,U+0019,U+001A,U+0000:[22|23|24|25|26|0]
+../fonts/gsub_chaining2_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0000,U+0018,U+0019,U+001A,U+0000:[0|20|21|22|0|24|25|26|0]
+../fonts/gsub_chaining2_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0017:[0|20|21|22|23]
+../fonts/gsub_chaining2_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016:[0|20|21|22]
diff --git a/test/shaping/data/aots/tests/gsub_chaining2_successive.tests b/test/shaping/data/aots/tests/gsub_chaining2_successive.tests
new file mode 100644
index 0000000..71cbe0d
--- /dev/null
+++ b/test/shaping/data/aots/tests/gsub_chaining2_successive.tests
@@ -0,0 +1 @@
+../fonts/gsub_chaining2_successive_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0019,U+0014,U+0015,U+0016,U+0017,U+0018,U+0000:[0|25|20|61|63|24|0]
diff --git a/test/shaping/data/aots/tests/gsub_chaining3_boundary.tests b/test/shaping/data/aots/tests/gsub_chaining3_boundary.tests
new file mode 100644
index 0000000..c01dc4b
--- /dev/null
+++ b/test/shaping/data/aots/tests/gsub_chaining3_boundary.tests
@@ -0,0 +1,4 @@
+../fonts/gsub_chaining3_boundary_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20|21|22|23|0]
+../fonts/gsub_chaining3_boundary_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20|61|22|23|0]
+../fonts/gsub_chaining3_boundary_f3.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20|61|22|23|0]
+../fonts/gsub_chaining3_boundary_f4.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20|21|62|23|0]
diff --git a/test/shaping/data/aots/tests/gsub_chaining3_lookupflag.tests b/test/shaping/data/aots/tests/gsub_chaining3_lookupflag.tests
new file mode 100644
index 0000000..be2147b
--- /dev/null
+++ b/test/shaping/data/aots/tests/gsub_chaining3_lookupflag.tests
@@ -0,0 +1 @@
+../fonts/gsub_chaining3_lookupflag_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+005A,U+0015,U+005B,U+0016,U+005C,U+0017,U+005D,U+005E,U+0018,U+005A,U+0019,U+005B,U+001A,U+0000:[0|20|90|21|91|22|92|63|93|94|24|90|25|91|26|0]
diff --git a/test/shaping/data/aots/tests/gsub_chaining3_next_glyph.tests b/test/shaping/data/aots/tests/gsub_chaining3_next_glyph.tests
new file mode 100644
index 0000000..2493c1e
--- /dev/null
+++ b/test/shaping/data/aots/tests/gsub_chaining3_next_glyph.tests
@@ -0,0 +1 @@
+../fonts/gsub_chaining3_next_glyph_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0016,U+0015,U+0016,U+0015,U+0016,U+0015,U+0000:[0|22|61|22|61|22|21|0]
diff --git a/test/shaping/data/aots/tests/gsub_chaining3_simple.tests b/test/shaping/data/aots/tests/gsub_chaining3_simple.tests
new file mode 100644
index 0000000..eb24167
--- /dev/null
+++ b/test/shaping/data/aots/tests/gsub_chaining3_simple.tests
@@ -0,0 +1,11 @@
+../fonts/gsub_chaining3_simple_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20|61|62|23|0]
+../fonts/gsub_chaining3_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0017,U+0018,U+0019,U+001A,U+0000:[0|20|21|62|23|24|25|26|0]
+../fonts/gsub_chaining3_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0017,U+0018,U+0019,U+0000,U+0000:[0|20|21|22|23|24|25|0|0]
+../fonts/gsub_chaining3_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0017,U+0018,U+0019:[0|20|21|22|23|24|25]
+../fonts/gsub_chaining3_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0017,U+0018:[0|20|21|22|23|24]
+../fonts/gsub_chaining3_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0000,U+0015,U+0016,U+0017,U+0018,U+0019,U+001A,U+0000:[0|0|21|22|23|24|25|26|0]
+../fonts/gsub_chaining3_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0015,U+0016,U+0017,U+0018,U+0019,U+001A,U+0000:[21|22|23|24|25|26|0]
+../fonts/gsub_chaining3_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0016,U+0017,U+0018,U+0019,U+001A,U+0000:[22|23|24|25|26|0]
+../fonts/gsub_chaining3_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0000,U+0018,U+0019,U+001A,U+0000:[0|20|21|22|0|24|25|26|0]
+../fonts/gsub_chaining3_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0017:[0|20|21|22|23]
+../fonts/gsub_chaining3_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016:[0|20|21|22]
diff --git a/test/shaping/data/aots/tests/gsub_chaining3_successive.tests b/test/shaping/data/aots/tests/gsub_chaining3_successive.tests
new file mode 100644
index 0000000..edcade1
--- /dev/null
+++ b/test/shaping/data/aots/tests/gsub_chaining3_successive.tests
@@ -0,0 +1 @@
+../fonts/gsub_chaining3_successive_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0019,U+0014,U+0015,U+0016,U+0017,U+0018,U+0000:[0|25|20|61|63|24|0]
diff --git a/test/shaping/data/aots/tests/gsub_context1_boundary.tests b/test/shaping/data/aots/tests/gsub_context1_boundary.tests
new file mode 100644
index 0000000..9b11892
--- /dev/null
+++ b/test/shaping/data/aots/tests/gsub_context1_boundary.tests
@@ -0,0 +1,2 @@
+../fonts/gsub_context1_boundary_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0014,U+0014,U+0014,U+0014,U+0000:[0|20|20|20|20|20|0]
+../fonts/gsub_context1_boundary_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0014,U+0014,U+0014,U+0014,U+0000:[0|60|60|60|60|60|0]
diff --git a/test/shaping/data/aots/tests/gsub_context1_expansion.tests b/test/shaping/data/aots/tests/gsub_context1_expansion.tests
new file mode 100644
index 0000000..92714c5
--- /dev/null
+++ b/test/shaping/data/aots/tests/gsub_context1_expansion.tests
@@ -0,0 +1 @@
+../fonts/gsub_context1_expansion_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0000:[0|20|61|62|63|22|0]
diff --git a/test/shaping/data/aots/tests/gsub_context1_lookupflag.tests b/test/shaping/data/aots/tests/gsub_context1_lookupflag.tests
new file mode 100644
index 0000000..c5d9760
--- /dev/null
+++ b/test/shaping/data/aots/tests/gsub_context1_lookupflag.tests
@@ -0,0 +1,2 @@
+../fonts/gsub_context1_lookupflag_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+005A,U+0015,U+005B,U+005C,U+0016,U+0000:[0|60|90|61|91|92|62|0]
+../fonts/gsub_context1_lookupflag_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+005A,U+0015,U+005B,U+005C,U+0016,U+0000:[0|20|90|61|91|92|0]
diff --git a/test/shaping/data/aots/tests/gsub_context1_multiple_subrules.tests b/test/shaping/data/aots/tests/gsub_context1_multiple_subrules.tests
new file mode 100644
index 0000000..febc419
--- /dev/null
+++ b/test/shaping/data/aots/tests/gsub_context1_multiple_subrules.tests
@@ -0,0 +1,2 @@
+../fonts/gsub_context1_multiple_subrules_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0000,U+0014,U+0015,U+0000:[0|60|21|22|0|20|61|0]
+../fonts/gsub_context1_multiple_subrules_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0000,U+0014,U+0015,U+0000:[0|20|61|22|0|20|61|0]
diff --git a/test/shaping/data/aots/tests/gsub_context1_next_glyph.tests b/test/shaping/data/aots/tests/gsub_context1_next_glyph.tests
new file mode 100644
index 0000000..12414c3
--- /dev/null
+++ b/test/shaping/data/aots/tests/gsub_context1_next_glyph.tests
@@ -0,0 +1 @@
+../fonts/gsub_context1_next_glyph_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0014,U+0014,U+0014,U+0014,U+0000:[0|60|20|60|20|20|0]
diff --git a/test/shaping/data/aots/tests/gsub_context1_simple.tests b/test/shaping/data/aots/tests/gsub_context1_simple.tests
new file mode 100644
index 0000000..44252ec
--- /dev/null
+++ b/test/shaping/data/aots/tests/gsub_context1_simple.tests
@@ -0,0 +1,3 @@
+../fonts/gsub_context1_simple_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0000:[0|60|61|62|0]
+../fonts/gsub_context1_simple_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0000,U+0014,U+0015,U+0000:[0|20|0|20|21|0]
+../fonts/gsub_context1_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0014,U+0014,U+0014,U+0014,U+0000:[0|20|60|20|20|20|0]
diff --git a/test/shaping/data/aots/tests/gsub_context1_successive.tests b/test/shaping/data/aots/tests/gsub_context1_successive.tests
new file mode 100644
index 0000000..e68d6b2
--- /dev/null
+++ b/test/shaping/data/aots/tests/gsub_context1_successive.tests
@@ -0,0 +1 @@
+../fonts/gsub_context1_successive_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20|61|63|0]
diff --git a/test/shaping/data/aots/tests/gsub_context2_boundary.tests b/test/shaping/data/aots/tests/gsub_context2_boundary.tests
new file mode 100644
index 0000000..2054277
--- /dev/null
+++ b/test/shaping/data/aots/tests/gsub_context2_boundary.tests
@@ -0,0 +1,2 @@
+../fonts/gsub_context2_boundary_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0014,U+0014,U+0014,U+0014,U+0000:[0|20|20|20|20|20|0]
+../fonts/gsub_context2_boundary_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0014,U+0014,U+0014,U+0014,U+0000:[0|60|60|60|60|60|0]
diff --git a/test/shaping/data/aots/tests/gsub_context2_classes.tests b/test/shaping/data/aots/tests/gsub_context2_classes.tests
new file mode 100644
index 0000000..2e44007
--- /dev/null
+++ b/test/shaping/data/aots/tests/gsub_context2_classes.tests
@@ -0,0 +1,2 @@
+../fonts/gsub_context2_classes_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+001A,U+001C,U+0018,U+0000,U+0015,U+001B,U+001A,U+0018,U+0000,U+0016,U+001B,U+001A,U+0018:[0|20|66|28|24|0|21|67|26|24|0|22|27|26|24]
+../fonts/gsub_context2_classes_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0016,U+001B,U+001A,U+0018,U+0000,U+0018,U+0018,U+001D,U+0016,U+0000,U+0016,U+001B,U+001A,U+0018:[0|22|67|26|24|0|24|24|69|22|0|22|67|26|24]
diff --git a/test/shaping/data/aots/tests/gsub_context2_expansion.tests b/test/shaping/data/aots/tests/gsub_context2_expansion.tests
new file mode 100644
index 0000000..af0ce71
--- /dev/null
+++ b/test/shaping/data/aots/tests/gsub_context2_expansion.tests
@@ -0,0 +1 @@
+../fonts/gsub_context2_expansion_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0000:[0|20|61|62|63|22|0]
diff --git a/test/shaping/data/aots/tests/gsub_context2_lookupflag.tests b/test/shaping/data/aots/tests/gsub_context2_lookupflag.tests
new file mode 100644
index 0000000..ac41949
--- /dev/null
+++ b/test/shaping/data/aots/tests/gsub_context2_lookupflag.tests
@@ -0,0 +1,2 @@
+../fonts/gsub_context2_lookupflag_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+005A,U+0015,U+005B,U+005C,U+0016,U+0000:[0|60|90|61|91|92|62|0]
+../fonts/gsub_context2_lookupflag_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+005A,U+0015,U+005B,U+005C,U+0016,U+0000:[0|20|90|61|91|92|0]
diff --git a/test/shaping/data/aots/tests/gsub_context2_multiple_subrules.tests b/test/shaping/data/aots/tests/gsub_context2_multiple_subrules.tests
new file mode 100644
index 0000000..75225cd
--- /dev/null
+++ b/test/shaping/data/aots/tests/gsub_context2_multiple_subrules.tests
@@ -0,0 +1,2 @@
+../fonts/gsub_context2_multiple_subrules_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0000,U+0014,U+0015,U+0000:[0|60|21|22|0|20|61|0]
+../fonts/gsub_context2_multiple_subrules_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0000,U+0014,U+0015,U+0000:[0|20|61|22|0|20|61|0]
diff --git a/test/shaping/data/aots/tests/gsub_context2_next_glyph.tests b/test/shaping/data/aots/tests/gsub_context2_next_glyph.tests
new file mode 100644
index 0000000..020d05f
--- /dev/null
+++ b/test/shaping/data/aots/tests/gsub_context2_next_glyph.tests
@@ -0,0 +1 @@
+../fonts/gsub_context2_next_glyph_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0014,U+0014,U+0014,U+0014,U+0000:[0|60|20|60|20|20|0]
diff --git a/test/shaping/data/aots/tests/gsub_context2_simple.tests b/test/shaping/data/aots/tests/gsub_context2_simple.tests
new file mode 100644
index 0000000..5863605
--- /dev/null
+++ b/test/shaping/data/aots/tests/gsub_context2_simple.tests
@@ -0,0 +1,3 @@
+../fonts/gsub_context2_simple_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0000:[0|60|61|62|0]
+../fonts/gsub_context2_simple_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0000,U+0014,U+0015,U+0000:[0|20|0|20|21|0]
+../fonts/gsub_context2_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0014,U+0014,U+0014,U+0014,U+0000:[0|20|60|20|20|20|0]
diff --git a/test/shaping/data/aots/tests/gsub_context2_successive.tests b/test/shaping/data/aots/tests/gsub_context2_successive.tests
new file mode 100644
index 0000000..9aeeac7
--- /dev/null
+++ b/test/shaping/data/aots/tests/gsub_context2_successive.tests
@@ -0,0 +1 @@
+../fonts/gsub_context2_successive_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20|61|63|0]
diff --git a/test/shaping/data/aots/tests/gsub_context3_boundary.tests b/test/shaping/data/aots/tests/gsub_context3_boundary.tests
new file mode 100644
index 0000000..8b40afd
--- /dev/null
+++ b/test/shaping/data/aots/tests/gsub_context3_boundary.tests
@@ -0,0 +1,2 @@
+../fonts/gsub_context3_boundary_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0014,U+0014,U+0014,U+0014,U+0000:[0|20|20|20|20|20|0]
+../fonts/gsub_context3_boundary_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0014,U+0014,U+0014,U+0014,U+0000:[0|60|60|60|60|60|0]
diff --git a/test/shaping/data/aots/tests/gsub_context3_lookupflag.tests b/test/shaping/data/aots/tests/gsub_context3_lookupflag.tests
new file mode 100644
index 0000000..03c0647
--- /dev/null
+++ b/test/shaping/data/aots/tests/gsub_context3_lookupflag.tests
@@ -0,0 +1,2 @@
+../fonts/gsub_context3_lookupflag_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+005A,U+0015,U+005B,U+005C,U+0016,U+0000:[0|60|90|61|91|92|62|0]
+../fonts/gsub_context3_lookupflag_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+005A,U+0015,U+005B,U+005C,U+0016,U+0000:[0|20|90|61|91|92|0]
diff --git a/test/shaping/data/aots/tests/gsub_context3_next_glyph.tests b/test/shaping/data/aots/tests/gsub_context3_next_glyph.tests
new file mode 100644
index 0000000..b28381b
--- /dev/null
+++ b/test/shaping/data/aots/tests/gsub_context3_next_glyph.tests
@@ -0,0 +1 @@
+../fonts/gsub_context3_next_glyph_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0014,U+0014,U+0014,U+0014,U+0000:[0|60|20|60|20|20|0]
diff --git a/test/shaping/data/aots/tests/gsub_context3_simple.tests b/test/shaping/data/aots/tests/gsub_context3_simple.tests
new file mode 100644
index 0000000..ec264ea
--- /dev/null
+++ b/test/shaping/data/aots/tests/gsub_context3_simple.tests
@@ -0,0 +1,2 @@
+../fonts/gsub_context3_simple_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0000:[0|60|61|62|0]
+../fonts/gsub_context3_simple_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0000,U+0014,U+0015,U+0000,U+0014,U+0015,U+0016,U+0000:[0|20|0|20|21|0|60|61|62|0]
diff --git a/test/shaping/data/aots/tests/gsub_context3_successive.tests b/test/shaping/data/aots/tests/gsub_context3_successive.tests
new file mode 100644
index 0000000..b987a61
--- /dev/null
+++ b/test/shaping/data/aots/tests/gsub_context3_successive.tests
@@ -0,0 +1 @@
+../fonts/gsub_context3_successive_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20|61|63|0]
diff --git a/test/shaping/data/aots/tests/lookupflag_ignore_attach.tests b/test/shaping/data/aots/tests/lookupflag_ignore_attach.tests
new file mode 100644
index 0000000..55ae538
--- /dev/null
+++ b/test/shaping/data/aots/tests/lookupflag_ignore_attach.tests
@@ -0,0 +1,5 @@
+#../fonts/lookupflag_ignore_attach_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+000A,U+000B,U+000D,U+001A,U+000A:[10|15|10]
+#../fonts/lookupflag_ignore_attach_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+000A,U+000B,U+0015,U+000D,U+0016,U+0017,U+001D,U+001A,U+000A:[10|15|21|22|23|29|10]
+#../fonts/lookupflag_ignore_attach_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+000A,U+000B,U+0015,U+000D,U+0016,U+001B,U+001A,U+000A:[10|11|21|13|22|27|26|10]
+#../fonts/lookupflag_ignore_attach_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+000A,U+000B,U+001B,U+000D,U+0016,U+0017,U+001A,U+000A:[10|11|27|13|22|23|26|10]
+#../fonts/lookupflag_ignore_attach_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+000A,U+000B,U+001B,U+000D,U+000E,U+0017,U+001A,U+000A:[10|11|27|13|14|23|26|10]
diff --git a/test/shaping/data/aots/tests/lookupflag_ignore_base.tests b/test/shaping/data/aots/tests/lookupflag_ignore_base.tests
new file mode 100644
index 0000000..5f0bfdb
--- /dev/null
+++ b/test/shaping/data/aots/tests/lookupflag_ignore_base.tests
@@ -0,0 +1,2 @@
+../fonts/lookupflag_ignore_base_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0011,U+0012,U+0013,U+0014,U+0015:[17|23|21]
+../fonts/lookupflag_ignore_base_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0011,U+0012,U+0018,U+0018,U+0013,U+0019,U+0014,U+0015:[17|23|24|24|25|21]
diff --git a/test/shaping/data/aots/tests/lookupflag_ignore_combination.tests b/test/shaping/data/aots/tests/lookupflag_ignore_combination.tests
new file mode 100644
index 0000000..d34f16a
--- /dev/null
+++ b/test/shaping/data/aots/tests/lookupflag_ignore_combination.tests
@@ -0,0 +1,3 @@
+../fonts/lookupflag_ignore_combination_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0011,U+0012,U+001A,U+0013,U+0014,U+0015:[17|23|26|21]
+../fonts/lookupflag_ignore_combination_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0011,U+0012,U+001A,U+0013,U+0018,U+001E,U+001F,U+0014,U+0015:[17|23|26|24|30|31|21]
+../fonts/lookupflag_ignore_combination_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0011,U+0012,U+001A,U+0013,U+0018,U+001E,U+0020,U+0014,U+0015:[17|18|26|19|24|30|32|20|21]
diff --git a/test/shaping/data/aots/tests/lookupflag_ignore_ligatures.tests b/test/shaping/data/aots/tests/lookupflag_ignore_ligatures.tests
new file mode 100644
index 0000000..feb31d8
--- /dev/null
+++ b/test/shaping/data/aots/tests/lookupflag_ignore_ligatures.tests
@@ -0,0 +1,3 @@
+../fonts/lookupflag_ignore_ligatures_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0011,U+0012,U+001A,U+001B,U+0013,U+001B,U+0014,U+0015:[17|23|26|27|27|21]
+../fonts/lookupflag_ignore_ligatures_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0011,U+0012,U+001A,U+0018,U+0013,U+001B,U+0014,U+0015:[17|18|26|24|19|27|20|21]
+../fonts/lookupflag_ignore_ligatures_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0011,U+0012,U+001A,U+002A,U+0013,U+001B,U+0014,U+0015:[17|18|26|42|19|27|20|21]
diff --git a/test/shaping/data/aots/tests/lookupflag_ignore_marks.tests b/test/shaping/data/aots/tests/lookupflag_ignore_marks.tests
new file mode 100644
index 0000000..9626599
--- /dev/null
+++ b/test/shaping/data/aots/tests/lookupflag_ignore_marks.tests
@@ -0,0 +1 @@
+../fonts/lookupflag_ignore_marks_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0011,U+0012,U+001C,U+001D,U+0013,U+001D,U+0014,U+0015:[17|23|28|29|29|21]
diff --git a/test/shaping/data/in-house/Makefile.in b/test/shaping/data/in-house/Makefile.in
index b9e702a..590807b 100644
--- a/test/shaping/data/in-house/Makefile.in
+++ b/test/shaping/data/in-house/Makefile.in
@@ -89,29 +89,34 @@ PRE_UNINSTALL = :
POST_UNINSTALL = :
build_triplet = @build@
host_triplet = @host@
-TESTS = tests/arabic-fallback-shaping.tests \
+TESTS = tests/aat-trak.tests tests/aat-morx.tests \
+ tests/arabic-fallback-shaping.tests \
tests/arabic-feature-order.tests \
- tests/arabic-like-joining.tests tests/arabic-mark-order.tests \
- tests/arabic-stch.tests tests/automatic-fractions.tests \
- tests/cluster.tests tests/color-fonts.tests \
+ tests/arabic-like-joining.tests tests/arabic-mark-attach.tests \
+ tests/arabic-mark-order.tests tests/arabic-stch.tests \
+ tests/automatic-fractions.tests tests/cluster.tests \
+ tests/collections.tests tests/color-fonts.tests \
tests/context-matching.tests tests/cursive-positioning.tests \
- tests/default-ignorables.tests tests/emoji-flag-tags.tests \
- tests/fallback-positioning.tests tests/fuzzed.tests \
- tests/hangul-jamo.tests tests/hyphens.tests \
- tests/indic-consonant-with-stacker.tests \
+ tests/default-ignorables.tests tests/emoji.tests \
+ tests/fallback-positioning.tests tests/hangul-jamo.tests \
+ tests/hyphens.tests tests/indic-consonant-with-stacker.tests \
tests/indic-decompose.tests tests/indic-init.tests \
tests/indic-joiner-candrabindu.tests tests/indic-joiners.tests \
tests/indic-old-spec.tests tests/indic-pref-blocking.tests \
tests/indic-script-extensions.tests \
tests/indic-special-cases.tests tests/indic-syllable.tests \
- tests/language-tags.tests tests/ligature-id.tests \
+ tests/indic-vowel-letter-spoofing.tests \
+ tests/kern-format2.tests tests/khmer-mark-order.tests \
+ tests/khmer-misc.tests tests/language-tags.tests \
+ tests/ligature-id.tests tests/macos.tests \
tests/mark-attachment.tests tests/mark-filtering-sets.tests \
tests/mongolian-variation-selector.tests \
- tests/myanmar-syllable.tests tests/none-directional.tests \
+ tests/myanmar-syllable.tests tests/myanmar-zawgyi.tests \
+ tests/none-directional.tests tests/rand.tests \
tests/spaces.tests tests/simple.tests tests/sinhala.tests \
tests/tibetan-contractions-1.tests \
tests/tibetan-contractions-2.tests tests/tibetan-vowels.tests \
- tests/use.tests tests/use-marchen.tests \
+ tests/use.tests tests/use-indic3.tests tests/use-marchen.tests \
tests/use-syllable.tests tests/variations-rvrn.tests \
tests/vertical.tests tests/zero-width-marks.tests \
$(am__EXEEXT_1)
@@ -122,8 +127,7 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/ax_check_link_flag.m4 \
$(top_srcdir)/m4/ax_pthread.m4 $(top_srcdir)/m4/gtk-doc.m4 \
$(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
$(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
- $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/pkg.m4 \
- $(top_srcdir)/configure.ac
+ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
$(ACLOCAL_M4)
DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
@@ -473,6 +477,8 @@ PACKAGE_URL = @PACKAGE_URL@
PACKAGE_VERSION = @PACKAGE_VERSION@
PATH_SEPARATOR = @PATH_SEPARATOR@
PKG_CONFIG = @PKG_CONFIG@
+PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
+PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
PTHREAD_CC = @PTHREAD_CC@
PTHREAD_CFLAGS = @PTHREAD_CFLAGS@
PTHREAD_LIBS = @PTHREAD_LIBS@
diff --git a/test/shaping/data/in-house/Makefile.sources b/test/shaping/data/in-house/Makefile.sources
index ef16fae..0e9a3a2 100644
--- a/test/shaping/data/in-house/Makefile.sources
+++ b/test/shaping/data/in-house/Makefile.sources
@@ -1,18 +1,21 @@
TESTS = \
+ tests/aat-trak.tests \
+ tests/aat-morx.tests \
tests/arabic-fallback-shaping.tests \
tests/arabic-feature-order.tests \
tests/arabic-like-joining.tests \
+ tests/arabic-mark-attach.tests \
tests/arabic-mark-order.tests \
tests/arabic-stch.tests \
tests/automatic-fractions.tests \
tests/cluster.tests \
+ tests/collections.tests \
tests/color-fonts.tests \
tests/context-matching.tests \
tests/cursive-positioning.tests \
tests/default-ignorables.tests \
- tests/emoji-flag-tags.tests \
+ tests/emoji.tests \
tests/fallback-positioning.tests \
- tests/fuzzed.tests \
tests/hangul-jamo.tests \
tests/hyphens.tests \
tests/indic-consonant-with-stacker.tests \
@@ -25,13 +28,20 @@ TESTS = \
tests/indic-script-extensions.tests \
tests/indic-special-cases.tests \
tests/indic-syllable.tests \
+ tests/indic-vowel-letter-spoofing.tests \
+ tests/kern-format2.tests \
+ tests/khmer-mark-order.tests \
+ tests/khmer-misc.tests \
tests/language-tags.tests \
tests/ligature-id.tests \
+ tests/macos.tests \
tests/mark-attachment.tests \
tests/mark-filtering-sets.tests \
tests/mongolian-variation-selector.tests \
tests/myanmar-syllable.tests \
+ tests/myanmar-zawgyi.tests \
tests/none-directional.tests \
+ tests/rand.tests \
tests/spaces.tests \
tests/simple.tests \
tests/sinhala.tests \
@@ -39,6 +49,7 @@ TESTS = \
tests/tibetan-contractions-2.tests \
tests/tibetan-vowels.tests \
tests/use.tests \
+ tests/use-indic3.tests \
tests/use-marchen.tests \
tests/use-syllable.tests \
tests/variations-rvrn.tests \
diff --git a/test/shaping/data/in-house/fonts/03e3f463c3a985bc42096620cc415342818454fb.ttf b/test/shaping/data/in-house/fonts/03e3f463c3a985bc42096620cc415342818454fb.ttf
new file mode 100644
index 0000000..ee540f3
--- /dev/null
+++ b/test/shaping/data/in-house/fonts/03e3f463c3a985bc42096620cc415342818454fb.ttf
Binary files differ
diff --git a/test/shaping/data/in-house/fonts/1a5face3fcbd929d228235c2f72bbd6f8eb37424.ttf b/test/shaping/data/in-house/fonts/1a5face3fcbd929d228235c2f72bbd6f8eb37424.ttf
new file mode 100644
index 0000000..383aee6
--- /dev/null
+++ b/test/shaping/data/in-house/fonts/1a5face3fcbd929d228235c2f72bbd6f8eb37424.ttf
Binary files differ
diff --git a/test/shaping/data/in-house/fonts/28f497629c04ceb15546c9a70e0730125ed6698d.ttf b/test/shaping/data/in-house/fonts/28f497629c04ceb15546c9a70e0730125ed6698d.ttf
new file mode 100644
index 0000000..13c4d8a
--- /dev/null
+++ b/test/shaping/data/in-house/fonts/28f497629c04ceb15546c9a70e0730125ed6698d.ttf
Binary files differ
diff --git a/test/shaping/data/in-house/fonts/2a670df15b73a5dc75a5cc491bde5ac93c5077dc.ttf b/test/shaping/data/in-house/fonts/2a670df15b73a5dc75a5cc491bde5ac93c5077dc.ttf
new file mode 100644
index 0000000..a1fef49
--- /dev/null
+++ b/test/shaping/data/in-house/fonts/2a670df15b73a5dc75a5cc491bde5ac93c5077dc.ttf
Binary files differ
diff --git a/test/shaping/data/in-house/fonts/2c25beb56d9c556622d56b0b5d02b4670c034f89.ttf b/test/shaping/data/in-house/fonts/2c25beb56d9c556622d56b0b5d02b4670c034f89.ttf
new file mode 100644
index 0000000..ef94d3f
--- /dev/null
+++ b/test/shaping/data/in-house/fonts/2c25beb56d9c556622d56b0b5d02b4670c034f89.ttf
Binary files differ
diff --git a/test/shaping/data/in-house/fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf b/test/shaping/data/in-house/fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf
new file mode 100644
index 0000000..3dd30ed
--- /dev/null
+++ b/test/shaping/data/in-house/fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf
Binary files differ
diff --git a/test/shaping/data/in-house/fonts/3c96e7a303c58475a8c750bf4289bbe73784f37d.ttf b/test/shaping/data/in-house/fonts/3c96e7a303c58475a8c750bf4289bbe73784f37d.ttf
new file mode 100644
index 0000000..cebd375
--- /dev/null
+++ b/test/shaping/data/in-house/fonts/3c96e7a303c58475a8c750bf4289bbe73784f37d.ttf
Binary files differ
diff --git a/test/shaping/data/in-house/fonts/3cf6f8ac6d647473a43a3100e7494b202b2cfafe.ttf b/test/shaping/data/in-house/fonts/3cf6f8ac6d647473a43a3100e7494b202b2cfafe.ttf
new file mode 100644
index 0000000..63c0c71
--- /dev/null
+++ b/test/shaping/data/in-house/fonts/3cf6f8ac6d647473a43a3100e7494b202b2cfafe.ttf
Binary files differ
diff --git a/test/shaping/data/in-house/fonts/46669c8860cbfea13562a6ca0d83130ee571137b.ttf b/test/shaping/data/in-house/fonts/46669c8860cbfea13562a6ca0d83130ee571137b.ttf
new file mode 100644
index 0000000..7d488a3
--- /dev/null
+++ b/test/shaping/data/in-house/fonts/46669c8860cbfea13562a6ca0d83130ee571137b.ttf
Binary files differ
diff --git a/test/shaping/data/in-house/fonts/4afb0e8b9a86bb9bd73a1247de4e33fbe3c1fd93.ttf b/test/shaping/data/in-house/fonts/4afb0e8b9a86bb9bd73a1247de4e33fbe3c1fd93.ttf
new file mode 100644
index 0000000..274fc08
--- /dev/null
+++ b/test/shaping/data/in-house/fonts/4afb0e8b9a86bb9bd73a1247de4e33fbe3c1fd93.ttf
Binary files differ
diff --git a/test/shaping/data/in-house/fonts/4cbbc461be066fccc611dcc634af6e8cb2705537.ttf b/test/shaping/data/in-house/fonts/4cbbc461be066fccc611dcc634af6e8cb2705537.ttf
new file mode 100644
index 0000000..03166b0
--- /dev/null
+++ b/test/shaping/data/in-house/fonts/4cbbc461be066fccc611dcc634af6e8cb2705537.ttf
Binary files differ
diff --git a/test/shaping/data/in-house/fonts/4d4206e30b2dbf1c1ef492a8eae1c9e7829ebad8.ttf b/test/shaping/data/in-house/fonts/4d4206e30b2dbf1c1ef492a8eae1c9e7829ebad8.ttf
new file mode 100644
index 0000000..14de6a1
--- /dev/null
+++ b/test/shaping/data/in-house/fonts/4d4206e30b2dbf1c1ef492a8eae1c9e7829ebad8.ttf
Binary files differ
diff --git a/test/shaping/data/in-house/fonts/5bb74492f5e0ffa1fbb72e4c881be035120b6513.ttf b/test/shaping/data/in-house/fonts/5bb74492f5e0ffa1fbb72e4c881be035120b6513.ttf
new file mode 100644
index 0000000..588ce3b
--- /dev/null
+++ b/test/shaping/data/in-house/fonts/5bb74492f5e0ffa1fbb72e4c881be035120b6513.ttf
Binary files differ
diff --git a/test/shaping/data/in-house/fonts/604026ae5aaca83c49cd8416909d71ba3e1c1194.ttf b/test/shaping/data/in-house/fonts/604026ae5aaca83c49cd8416909d71ba3e1c1194.ttf
new file mode 100644
index 0000000..a6f1c9d
--- /dev/null
+++ b/test/shaping/data/in-house/fonts/604026ae5aaca83c49cd8416909d71ba3e1c1194.ttf
Binary files differ
diff --git a/test/shaping/data/in-house/fonts/641ca9d7808b01cafa9a666c13811c9b56eb9c52.ttf b/test/shaping/data/in-house/fonts/641ca9d7808b01cafa9a666c13811c9b56eb9c52.ttf
new file mode 100644
index 0000000..1328e13
--- /dev/null
+++ b/test/shaping/data/in-house/fonts/641ca9d7808b01cafa9a666c13811c9b56eb9c52.ttf
Binary files differ
diff --git a/test/shaping/data/in-house/fonts/738d9f3b8c2dfd03875bf35a61d28fd78faf17c8.ttf b/test/shaping/data/in-house/fonts/738d9f3b8c2dfd03875bf35a61d28fd78faf17c8.ttf
new file mode 100644
index 0000000..c3e4167
--- /dev/null
+++ b/test/shaping/data/in-house/fonts/738d9f3b8c2dfd03875bf35a61d28fd78faf17c8.ttf
Binary files differ
diff --git a/test/shaping/data/in-house/fonts/7d18685e1529e4ceaad5b6095dfab2f9789e5bce.ttf b/test/shaping/data/in-house/fonts/7d18685e1529e4ceaad5b6095dfab2f9789e5bce.ttf
new file mode 100644
index 0000000..ffdddf3
--- /dev/null
+++ b/test/shaping/data/in-house/fonts/7d18685e1529e4ceaad5b6095dfab2f9789e5bce.ttf
Binary files differ
diff --git a/test/shaping/data/in-house/fonts/8116e5d8fedfbec74e45dc350d2416d810bed8c4.ttf b/test/shaping/data/in-house/fonts/8116e5d8fedfbec74e45dc350d2416d810bed8c4.ttf
new file mode 100644
index 0000000..e8512bb
--- /dev/null
+++ b/test/shaping/data/in-house/fonts/8116e5d8fedfbec74e45dc350d2416d810bed8c4.ttf
Binary files differ
diff --git a/test/shaping/data/in-house/fonts/86cdd983c4e4c4d7f27dd405d6ceb7d4b9ed3d35.ttf b/test/shaping/data/in-house/fonts/86cdd983c4e4c4d7f27dd405d6ceb7d4b9ed3d35.ttf
new file mode 100644
index 0000000..5a47a39
--- /dev/null
+++ b/test/shaping/data/in-house/fonts/86cdd983c4e4c4d7f27dd405d6ceb7d4b9ed3d35.ttf
Binary files differ
diff --git a/test/shaping/data/in-house/fonts/881642af1667ae30a54e58de8be904566d00508f.ttf b/test/shaping/data/in-house/fonts/881642af1667ae30a54e58de8be904566d00508f.ttf
new file mode 100644
index 0000000..a749cdf
--- /dev/null
+++ b/test/shaping/data/in-house/fonts/881642af1667ae30a54e58de8be904566d00508f.ttf
Binary files differ
diff --git a/test/shaping/data/in-house/fonts/8d9c4b193808b8bde94389ba7831c1fc6f9e794e.ttf b/test/shaping/data/in-house/fonts/8d9c4b193808b8bde94389ba7831c1fc6f9e794e.ttf
new file mode 100644
index 0000000..f1b84a4
--- /dev/null
+++ b/test/shaping/data/in-house/fonts/8d9c4b193808b8bde94389ba7831c1fc6f9e794e.ttf
Binary files differ
diff --git a/test/shaping/data/in-house/fonts/9fc3e6960b3520e5304033ef5fd540285f72f14d.ttf b/test/shaping/data/in-house/fonts/9fc3e6960b3520e5304033ef5fd540285f72f14d.ttf
new file mode 100644
index 0000000..1841cf3
--- /dev/null
+++ b/test/shaping/data/in-house/fonts/9fc3e6960b3520e5304033ef5fd540285f72f14d.ttf
Binary files differ
diff --git a/test/shaping/data/in-house/fonts/DFONT.dfont b/test/shaping/data/in-house/fonts/DFONT.dfont
new file mode 100644
index 0000000..a6ea700
--- /dev/null
+++ b/test/shaping/data/in-house/fonts/DFONT.dfont
Binary files differ
diff --git a/test/shaping/data/in-house/fonts/MORXTwentyeight.ttf b/test/shaping/data/in-house/fonts/MORXTwentyeight.ttf
new file mode 100644
index 0000000..edabb43
--- /dev/null
+++ b/test/shaping/data/in-house/fonts/MORXTwentyeight.ttf
Binary files differ
diff --git a/test/shaping/data/in-house/fonts/TRAK.ttf b/test/shaping/data/in-house/fonts/TRAK.ttf
new file mode 100644
index 0000000..07ae3af
--- /dev/null
+++ b/test/shaping/data/in-house/fonts/TRAK.ttf
Binary files differ
diff --git a/test/shaping/data/in-house/fonts/TTC.ttc b/test/shaping/data/in-house/fonts/TTC.ttc
new file mode 100644
index 0000000..a21fe89
--- /dev/null
+++ b/test/shaping/data/in-house/fonts/TTC.ttc
Binary files differ
diff --git a/test/shaping/data/in-house/fonts/ab14b4eb9d7a67e293f51d30d719add06c9d6e06.ttf b/test/shaping/data/in-house/fonts/ab14b4eb9d7a67e293f51d30d719add06c9d6e06.ttf
new file mode 100644
index 0000000..a64ecea
--- /dev/null
+++ b/test/shaping/data/in-house/fonts/ab14b4eb9d7a67e293f51d30d719add06c9d6e06.ttf
Binary files differ
diff --git a/test/shaping/data/in-house/fonts/af85624080af5627fb050f570d148a62f04fda74.ttf b/test/shaping/data/in-house/fonts/af85624080af5627fb050f570d148a62f04fda74.ttf
new file mode 100644
index 0000000..9cd40d4
--- /dev/null
+++ b/test/shaping/data/in-house/fonts/af85624080af5627fb050f570d148a62f04fda74.ttf
Binary files differ
diff --git a/test/shaping/data/in-house/fonts/b6031119874ae9ff1dd65383a335e361c0962220.ttf b/test/shaping/data/in-house/fonts/b6031119874ae9ff1dd65383a335e361c0962220.ttf
new file mode 100644
index 0000000..a9dc202
--- /dev/null
+++ b/test/shaping/data/in-house/fonts/b6031119874ae9ff1dd65383a335e361c0962220.ttf
Binary files differ
diff --git a/test/shaping/data/in-house/fonts/b722a7d09e60421f3efbc706ad348ab47b88567b.ttf b/test/shaping/data/in-house/fonts/b722a7d09e60421f3efbc706ad348ab47b88567b.ttf
new file mode 100644
index 0000000..ca23ef8
--- /dev/null
+++ b/test/shaping/data/in-house/fonts/b722a7d09e60421f3efbc706ad348ab47b88567b.ttf
Binary files differ
diff --git a/test/shaping/data/in-house/fonts/bb29ce50df2bdba2d10726427c6b7609bf460e04.ttf b/test/shaping/data/in-house/fonts/bb29ce50df2bdba2d10726427c6b7609bf460e04.ttf
deleted file mode 100644
index fba200f..0000000
--- a/test/shaping/data/in-house/fonts/bb29ce50df2bdba2d10726427c6b7609bf460e04.ttf
+++ /dev/null
Binary files differ
diff --git a/test/shaping/data/in-house/fonts/d3129450fafe5e5c98cfc25a4e71809b1b4d2855.ttf b/test/shaping/data/in-house/fonts/d3129450fafe5e5c98cfc25a4e71809b1b4d2855.ttf
new file mode 100644
index 0000000..dbd928a
--- /dev/null
+++ b/test/shaping/data/in-house/fonts/d3129450fafe5e5c98cfc25a4e71809b1b4d2855.ttf
Binary files differ
diff --git a/test/shaping/data/in-house/fonts/dcf774ca21062e7439f98658b18974ea8b956d0c.ttf b/test/shaping/data/in-house/fonts/dcf774ca21062e7439f98658b18974ea8b956d0c.ttf
new file mode 100644
index 0000000..4d3e11d
--- /dev/null
+++ b/test/shaping/data/in-house/fonts/dcf774ca21062e7439f98658b18974ea8b956d0c.ttf
Binary files differ
diff --git a/test/shaping/data/in-house/fonts/e39391c77a6321c2ac7a2d644de0396470cd4bfe.ttf b/test/shaping/data/in-house/fonts/e39391c77a6321c2ac7a2d644de0396470cd4bfe.ttf
new file mode 100644
index 0000000..b1605c4
--- /dev/null
+++ b/test/shaping/data/in-house/fonts/e39391c77a6321c2ac7a2d644de0396470cd4bfe.ttf
Binary files differ
diff --git a/test/shaping/data/in-house/tests/aat-morx.tests b/test/shaping/data/in-house/tests/aat-morx.tests
new file mode 100644
index 0000000..27f5bcc
--- /dev/null
+++ b/test/shaping/data/in-house/tests/aat-morx.tests
@@ -0,0 +1 @@
+../fonts/MORXTwentyeight.ttf::U+0041,U+0078,U+0045,U+0079,U+0044,U+0079,U+0079:[A_E_D=0+1394|x=0+529|y=0+510|y=5+510|y=6+510]
diff --git a/test/shaping/data/in-house/tests/aat-trak.tests b/test/shaping/data/in-house/tests/aat-trak.tests
new file mode 100644
index 0000000..4bbe729
--- /dev/null
+++ b/test/shaping/data/in-house/tests/aat-trak.tests
@@ -0,0 +1,11 @@
+../fonts/TRAK.ttf::U+0041,U+0042,U+0043:[A.alt=0+1000|B=1+1000|C.alt=2+1000]
+../fonts/TRAK.ttf:--font-ptem=.5:U+0041,U+0042,U+0043:[A.alt=0@100,0+1200|B=1@100,0+1200|C.alt=2@100,0+1200]
+../fonts/TRAK.ttf:--font-ptem=1:U+0041,U+0042,U+0043:[A.alt=0@100,0+1200|B=1@100,0+1200|C.alt=2@100,0+1200]
+../fonts/TRAK.ttf:--font-ptem=2:U+0041,U+0042,U+0043:[A.alt=0@93,0+1187|B=1@93,0+1187|C.alt=2@93,0+1187]
+../fonts/TRAK.ttf:--font-ptem=9:U+0041,U+0042,U+0043:[A.alt=0+1000|B=1+1000|C.alt=2+1000]
+../fonts/TRAK.ttf:--font-ptem=24:U+0041,U+0042,U+0043:[A.alt=0@-12,0+976|B=1@-12,0+976|C.alt=2@-12,0+976]
+../fonts/TRAK.ttf:--font-ptem=72:U+0041,U+0042,U+0043:[A.alt=0@-50,0+900|B=1@-50,0+900|C.alt=2@-50,0+900]
+../fonts/TRAK.ttf:--font-ptem=144:U+0041,U+0042,U+0043:[A.alt=0@-107,0+786|B=1@-107,0+786|C.alt=2@-107,0+786]
+../fonts/TRAK.ttf:--font-ptem=144:U+0041,U+0042,U+0043:[A.alt=0@-107,0+786|B=1@-107,0+786|C.alt=2@-107,0+786]
+../fonts/TRAK.ttf:--font-ptem=144 --features=-trak:U+0041,U+0042,U+0043:[A.alt=0+1000|B=1+1000|C.alt=2+1000]
+../fonts/TRAK.ttf:--font-ptem=144 --features=-trak[1;3]:U+0041,U+0042,U+0043,U+0041,U+0042,U+0043:[A.alt=0@-107,0+786|B=1+1000|C.alt=2+1000|A.alt=3@-107,0+786|B=4@-107,0+786|C.alt=5@-107,0+786]
diff --git a/test/shaping/data/in-house/tests/arabic-fallback-shaping.tests b/test/shaping/data/in-house/tests/arabic-fallback-shaping.tests
index 274829c..8b7ced0 100644
--- a/test/shaping/data/in-house/tests/arabic-fallback-shaping.tests
+++ b/test/shaping/data/in-house/tests/arabic-fallback-shaping.tests
@@ -1 +1 @@
-../fonts/df768b9c257e0c9c35786c47cae15c46571d56be.ttf::U+0633,U+064F,U+0644,U+064E,U+0651,U+0627,U+0651,U+0650,U+0645,U+062A,U+06CC:[uni06CC.fina=10+1655|uni062A.medi=9+868|uni0645.init=8+1098|uni0650=2@221,0+0|uni0651=2@260,736+0|uni064E=2@935,1259+0|uni0651=2@974,736+0|uni06440627.fina=2+1470|uni064F=0@558,-10+0|uni0633.init=0+1585]
+../fonts/df768b9c257e0c9c35786c47cae15c46571d56be.ttf::U+0633,U+064F,U+0644,U+064E,U+0651,U+0627,U+0651,U+0650,U+0645,U+062A,U+06CC:[uni06CC.fina=10+1655|uni062A.medi=9+868|uni0645.init=8+1098|uni0650=2@148,0+0|uni0651=2@187,736+0|uni064E=2@883,1259+0|uni0651=2@922,736+0|uni06440627.fina=2+1470|uni064F=0@629,-10+0|uni0633.init=0+1585]
diff --git a/test/shaping/data/in-house/tests/arabic-mark-attach.tests b/test/shaping/data/in-house/tests/arabic-mark-attach.tests
new file mode 100644
index 0000000..a577e51
--- /dev/null
+++ b/test/shaping/data/in-house/tests/arabic-mark-attach.tests
@@ -0,0 +1 @@
+../fonts/641ca9d7808b01cafa9a666c13811c9b56eb9c52.ttf::U+064A,U+0633,U+06E1,U+200D,U+0654,U+064E,U+0644:[afii57444.zz04=6+1091|afii57454=1@75,925+0|uni0654=1+0|space=1+0|uni06E1=1@950,1115+0|afii57427.zz03_calt=1+1847|afii57450.zz21=0+345]
diff --git a/test/shaping/data/in-house/tests/cluster.tests b/test/shaping/data/in-house/tests/cluster.tests
index fd0a0fe..928843f 100644
--- a/test/shaping/data/in-house/tests/cluster.tests
+++ b/test/shaping/data/in-house/tests/cluster.tests
@@ -1,2 +1,2 @@
-../fonts/4fac3929fc3332834e93673780ec0fe94342d193.ttf:--cluster-level=2:U+0078,U+030A,U+0058,U+030A:[gid2=0+1083|gid3=1@-1131,-8+0|gid1=2+1200|gid3=3@-1190,349+0]
+../fonts/4fac3929fc3332834e93673780ec0fe94342d193.ttf:--cluster-level=2:U+0078,U+030A,U+0058,U+030A:[gid2=0+1083|gid3=1@-1132,-8+0|gid1=2+1200|gid3=3@-1190,349+0]
../fonts/43ef465752be9af900745f72fe29cb853a1401a5.ttf:--cluster-level=1:U+05D4,U+05B7,U+05E9,U+05BC,U+05C1,U+05B8,U+05DE,U+05B4,U+05DD:[uni05DD=8+1359|uni05B4=7@111,0+0|uni05DE=6+1391|uni05B8=5+0|uni05BC=3+0|uni05C1=3+0|uni05E9=2+1451|uni05B7=1@28,0+0|uni05D4=0+1338]
diff --git a/test/shaping/data/in-house/tests/collections.tests b/test/shaping/data/in-house/tests/collections.tests
new file mode 100644
index 0000000..07dac9d
--- /dev/null
+++ b/test/shaping/data/in-house/tests/collections.tests
@@ -0,0 +1,6 @@
+../fonts/DFONT.dfont:--face-index=0 --font-funcs=ot:U+2026,U+0020,U+002E:[ellipsis=0+723|space=1+250|period=2+241]
+../fonts/DFONT.dfont:--face-index=1 --font-funcs=ot:U+2026,U+0020,U+002E:[gid0=0+1000|gid0=1+1000|gid0=2+1000]
+../fonts/DFONT.dfont:--face-index=2 --font-funcs=ot:U+2026,U+0020,U+002E:[gid0=0+1000|gid0=1+1000|gid0=2+1000]
+../fonts/TTC.ttc:--face-index=0 --font-funcs=ot:U+2026,U+0020,U+002E:[ellipsis=0+723|space=1+250|period=2+241]
+../fonts/TTC.ttc:--face-index=1 --font-funcs=ot:U+2026,U+0020,U+002E:[ellipsis=0+723|space=1+250|period=2+241]
+../fonts/TTC.ttc:--face-index=2 --font-funcs=ot:U+2026,U+0020,U+002E:[gid0=0+1000|gid0=1+1000|gid0=2+1000]
diff --git a/test/shaping/data/in-house/tests/color-fonts.tests b/test/shaping/data/in-house/tests/color-fonts.tests
index e7311bc..b325d78 100644
--- a/test/shaping/data/in-house/tests/color-fonts.tests
+++ b/test/shaping/data/in-house/tests/color-fonts.tests
@@ -1 +1 @@
-../fonts/ee39587d13b2afa5499cc79e45780aa79293bbd4.ttf:--font-funcs=ot --show-extents:U+1F42F:[gid1=0+2963<0,2178,2963,-2788>]
+../fonts/ee39587d13b2afa5499cc79e45780aa79293bbd4.ttf:--font-funcs=ot --show-extents:U+1F42F:[gid1=0+2963<0,2179,2963,-2789>]
diff --git a/test/shaping/data/in-house/tests/cursive-positioning.tests b/test/shaping/data/in-house/tests/cursive-positioning.tests
index 74d283d..15a1ffc 100644
--- a/test/shaping/data/in-house/tests/cursive-positioning.tests
+++ b/test/shaping/data/in-house/tests/cursive-positioning.tests
@@ -2,3 +2,4 @@
../fonts/298c9e1d955f10f6f72c6915c3c6ff9bf9695cec.ttf::U+0643,U+0645,U+0645,U+062B,U+0644:[gid8=4+738|gid5=3@441,1197+0|gid6=3@0,432+405|gid9=2@0,477+500|gid9=1@0,577+452|gid10=0@20,1177+207]
#../fonts/706c5d7b625f207bc0d874c67237aad6f1e9cd6f.ttf::U+0B1F,U+0B4D,U+0B1A,U+0B4D,U+0B1A:[ttaorya=0+1307|casubscriptorya=0@-242,104+-231|casubscriptnarroworya=0@20,104+507]
../fonts/07f054357ff8638bac3711b422a1e31180bba863.ttf:--font-funcs=ot --no-glyph-names:U+0606,U+06E1:[2=0@40,502+0|1=0+1000]
+../fonts/9fc3e6960b3520e5304033ef5fd540285f72f14d.ttf::U+16F0A,U+16F57,U+16F8F:[u16F0A=0+422|u16F57=0@0,209+338|u16F8F=0+0]
diff --git a/test/shaping/data/in-house/tests/emoji-flag-tags.tests b/test/shaping/data/in-house/tests/emoji-flag-tags.tests
deleted file mode 100644
index 189de55..0000000
--- a/test/shaping/data/in-house/tests/emoji-flag-tags.tests
+++ /dev/null
@@ -1,2 +0,0 @@
-../fonts/53374c7ca3657be37efde7ed02ae34229a56ae1f.ttf::U+1F3F4,U+E0055,U+E0053,U+E0064,U+E0065,U+E007F:[u1F3F4=0+2126|space=1+0|space=2+0|space=3+0|space=4+0|space=5+0]
-../fonts/53374c7ca3657be37efde7ed02ae34229a56ae1f.ttf::U+1F3F4,U+E0064,U+E0065,U+E007F:[de=0+3200]
diff --git a/test/shaping/data/in-house/tests/emoji.tests b/test/shaping/data/in-house/tests/emoji.tests
new file mode 100644
index 0000000..7ee01f3
--- /dev/null
+++ b/test/shaping/data/in-house/tests/emoji.tests
@@ -0,0 +1,5 @@
+../fonts/53374c7ca3657be37efde7ed02ae34229a56ae1f.ttf::U+1F3F4,U+E0055,U+E0053,U+E0064,U+E0065,U+E007F:[u1F3F4=0+2126|space=0+0|space=0+0|space=0+0|space=0+0|space=0+0]
+../fonts/53374c7ca3657be37efde7ed02ae34229a56ae1f.ttf::U+1F3F4,U+E0064,U+E0065,U+E007F:[de=0+3200]
+../fonts/3cf6f8ac6d647473a43a3100e7494b202b2cfafe.ttf:--font-funcs=ot --direction=l:U+1F481,U+1F3FB,U+200D,U+2642,U+FE0F:[gid7=0+2550]
+../fonts/3cf6f8ac6d647473a43a3100e7494b202b2cfafe.ttf:--font-funcs=ot --direction=r:U+1F481,U+1F3FB,U+200D,U+2642,U+FE0F:[gid7=0+2550]
+../fonts/8d9c4b193808b8bde94389ba7831c1fc6f9e794e.ttf::U+1F3F4,U+E0067,U+E0062,U+E0077,U+E006C,U+E0073,U+E007F:[.notdef=0+1229|space=0+0|space=0+0|space=0+0|space=0+0|space=0+0|space=0+0]
diff --git a/test/shaping/data/in-house/tests/fallback-positioning.tests b/test/shaping/data/in-house/tests/fallback-positioning.tests
index 5047d84..0ffee50 100644
--- a/test/shaping/data/in-house/tests/fallback-positioning.tests
+++ b/test/shaping/data/in-house/tests/fallback-positioning.tests
@@ -1,2 +1,2 @@
-../fonts/8228d035fcd65d62ec9728fb34f42c63be93a5d3.ttf::U+0078,U+0301,U+0058,U+0301:[x=0+1030|acutecomb=0@-21,-27+0|X=2+1295|acutecomb=2@-147,320+0]
-../fonts/856ff9562451293cbeff6f396d4e3877c4f0a436.ttf::U+0061,U+035C,U+0062:[uni0061=0+512|uni035C=0@-64,-128+0|uni0062=2+512]
+../fonts/8228d035fcd65d62ec9728fb34f42c63be93a5d3.ttf::U+0078,U+0301,U+0058,U+0301:[x=0+1030|acutecomb=0@-19,-27+0|X=2+1295|acutecomb=2@-151,320+0]
+../fonts/856ff9562451293cbeff6f396d4e3877c4f0a436.ttf::U+0061,U+035C,U+0062:[uni0061=0+512|uni035C=0@0,-128+0|uni0062=2+512]
diff --git a/test/shaping/data/in-house/tests/fuzzed.tests b/test/shaping/data/in-house/tests/fuzzed.tests
deleted file mode 100644
index 43a1933..0000000
--- a/test/shaping/data/in-house/tests/fuzzed.tests
+++ /dev/null
@@ -1,23 +0,0 @@
-../fonts/1a6f1687b7a221f9f2c834b0b360d3c8463b6daf.ttf:--font-funcs=ot:U+0041:[gid0=0+1000]
-../fonts/5a5daf5eb5a4db77a2baa3ad9c7a6ed6e0655fa8.ttf:--font-funcs=ot:U+0041:[gid0=0+1000]
-../fonts/0509e80afb379d16560e9e47bdd7d888bebdebc6.ttf:--font-funcs=ot:U+0041:[gid0=0+1000]
-../fonts/641bd9db850193064d17575053ae2bf8ec149ddc.ttf:--font-funcs=ot:U+0041:[gid0=0+1000]
-../fonts/375d6ae32a3cbe52fbf81a4e5777e3377675d5a3.ttf:--font-funcs=ot:U+0041:[gid0=0+4352]
-../fonts/8240789f6d12d4cfc4b5e8e6f246c3701bcf861f.ttf:--font-funcs=ot:U+0041:[gid0=0+1024]
-../fonts/b9e2aaa0d75fcef6971ec3a96d806ba4a6b31fe2.ttf:--font-funcs=ot:U+0041:[gid0=0+1000|gid1=0+1000|gid8=0+1000|gid3=0+1000|gid0=0+1000|gid1=0+1000|gid1=0+1000|gid8=0+1000|gid3=0+1000|gid0=0+1000|gid1=0+1000|gid8=0+1000|gid3=0+1000|gid0=0+1000|gid1=0+1000|gid1=0+1000]
-../fonts/43979b90b2dd929723cf4fe1715990bcb9c9a56b.ttf:--font-funcs=ot:U+0041:[gid0=0+1000]
-../fonts/3511ff5c1647150595846ac414c595cccac34f18.ttf:--font-funcs=ot --no-positions --no-clusters --no-glyph-names:U+0041:[0|512|15104|11004|3408|18244|17872|17961|0|992|15616|0|14151|20559|20992|5440|256|0|10|8960|256|1024|1490|0|768|4096|256|2216|0|256|256|0|768|10752|11004|3408|18244|17734|53248|256|0|512|14848|10793|57344|768|18227|20285|20480|0|256|0|810|0|11004|3408|18244|17734|53289|57344|768|15667|71|0|20559|21248|256|0|2816|2776|0|51516|0|32|26209|28005|65249|29690|0|51548|0|2454|28783|29556|1291|3458|80|0|2804|210|28786|25968|45763|50546|0|59136|0|38144|256|0|2560|30208|52224|580|17996|21504|6734|108|116|24846|1024|0|255|65280|256|0|8704|1345|23109|8192|10823|21076|8192|12877|20300|8192|6738|20301|8192|16980|21067|8251|18944|255|65280|15360|256|255|65280|256|768|255|65280|256|768|255|65280|256|1024|12|65280|256|1280|255|65280|256|1536|1899|25970|110|11264|27502|29285|12907|25974|28160|14443|25970|28288|3|118|18259|21826|45716|46369|0|0|1|16|17|256|4|16|18244|17734|28|12|0|284|0|28|18256|20307|45114|47616|226|10296|0|57927|1|0|0|21248|5440|256|0|10|768|256|1024|512|0|297|16|24833|28774|10794|2304|29|32|42|64515|42|42|64525|20551|17477|18128|10720|3|61|3408|18244|17734|53289|57344|768|15616|512|55|10576|20307|0|255|56063|53504|42|42|64525|12288|18176|80|20307|1|0|62]
-../fonts/fab39d60d758cb586db5a504f218442cd1395725.ttf:--font-funcs=ot:U+0041,U+0041:[gid0=0+1000|gid0=1+1000]
-../fonts/205edd09bd3d141cc9580f650109556cc28b22cb.ttf:--font-funcs=ot:U+0041:[gid0=0+1000]
-../fonts/217a934cfe15c548b572c203dceb2befdf026462.ttf:--font-funcs=ot:U+0061,U+0061,U+0061:[]
-../fonts/558661aa659912f4d30ecd27bd09835171a8e2b0.ttf:--font-funcs=ot:U+FFFD,U+E0100,U+FFFD,U+E0010:[]
-../fonts/a34a9191d9376bda419836effeef7e75c1386016.ttf:--font-funcs=ot:U+0041:[]
-../fonts/a69118c2c2ada48ff803d9149daa54c9ebdae30e.ttf:--font-funcs=ot:U+0041:[gid0=0+1229]
-../fonts/b6acef662e0beb8d5fcf5b61c6b0ca69537b7402.ttf:--font-funcs=ot:U+0041:[gid0=0+1000]
-../fonts/e88c339237f52d21e01c55f01b9c1b4cc14a0467.ttf:--font-funcs=ot:U+0041:[gid0=0+1000]
-../fonts/243798dd281c1c77c065958e1ff467420faa9bde.ttf:--font-funcs=ot:U+0041:[gid0=0+1000]
-../fonts/dd9f0c7c7c36f75a18be0cab1cddf8f3ab0f366b.ttf:--font-funcs=ot --no-positions --no-clusters --no-glyph-names:U+0041:[0|0|2|0|0|2|0|0|2|0|0|2|0|0|2|0|0|2|0|0|0|2|0|0|0|2|0|0|2|0|0|2|0|0|2|0|0|2|0|0|0|2|0|0|2|0|0|2|0|0|2|0]
-../fonts/ef2511f215aa3ca847cbfffbf861793b42170875.ttf:--font-funcs=ot:U+0041:[gid0=0+1000]
-../fonts/9d8a94a67932a3ab75a596fc8b5c6d0392ca9e49.ttf:--font-funcs=ot:U+0041:[gid0=0+1000]
-../fonts/bbf4a308c402f0678c3e82844892a4da2ebe598f.ttf:--font-funcs=ot:U+0041:[gid0=0+1000]
-../fonts/233c1e252e737ca79e03a9fd56b71aaa4a230f2b.ttf:--font-funcs=ot:U+0041:[gid0=0+1000]
diff --git a/test/shaping/data/in-house/tests/indic-joiner-candrabindu.tests b/test/shaping/data/in-house/tests/indic-joiner-candrabindu.tests
index 87b3603..6b75137 100644
--- a/test/shaping/data/in-house/tests/indic-joiner-candrabindu.tests
+++ b/test/shaping/data/in-house/tests/indic-joiner-candrabindu.tests
@@ -1,2 +1,2 @@
../fonts/5028afb650b1bb718ed2131e872fbcce57828fff.ttf::U+0B13,U+200D,U+0B01:[omorya=0+1450]
-../fonts/5028afb650b1bb718ed2131e872fbcce57828fff.ttf::U+0B13,U+200C,U+0B01:[oorya=0+1309|space=0+0|candrabinduorya=0+0]
+../fonts/5028afb650b1bb718ed2131e872fbcce57828fff.ttf::U+0B13,U+200C,U+0B01:[oorya=0+1309|space=1+0|candrabinduorya=1+0]
diff --git a/test/shaping/data/in-house/tests/indic-joiners.tests b/test/shaping/data/in-house/tests/indic-joiners.tests
index 57107d5..80e392c 100644
--- a/test/shaping/data/in-house/tests/indic-joiners.tests
+++ b/test/shaping/data/in-house/tests/indic-joiners.tests
@@ -1,2 +1,6 @@
-../fonts/f443753e8ffe8e8aae606cfba158e00334b6efb1.ttf::U+179A,U+1784,U+17D2,U+179F,U+200C,U+17CA,U+17B8,U+0020:[uni179a=0+775|uni1784=1+1550|uni179f.sub=1+775|space=1+0|uni17ca=1+0|uni17b8=1@0,300+0|space=7+600]
+../fonts/f443753e8ffe8e8aae606cfba158e00334b6efb1.ttf::U+179A,U+1784,U+17D2,U+179F,U+200C,U+17CA,U+17B8,U+0020:[uni179a=0+775|uni1784=1+1550|uni179f.sub=1+775|space=4+0|uni17ca=4+0|uni17b8=4@0,300+0|space=7+600]
../fonts/f443753e8ffe8e8aae606cfba158e00334b6efb1.ttf::U+179A,U+1784,U+17D2,U+179F,U+17CA,U+17B8:[uni179a=0+775|uni1784=1+1550|uni179f.sub=1+775|uni17bb=1@-75,-700+0|uni17b8=1+0]
+../fonts/8116e5d8fedfbec74e45dc350d2416d810bed8c4.ttf:--font-funcs=ft:U+091F,U+094D,U+200C,U+092F,U+093F:[uni091F=0+876|uni094D=0@4,0+0|space=2+0|uni093F.750=3+397|uni092F=3+924]
+../fonts/8116e5d8fedfbec74e45dc350d2416d810bed8c4.ttf:--font-funcs=ft:U+091F,U+094D,U+200D,U+092F,U+093F:[uni093F=0+398|uni091F=0+876|uni094D=0@4,0+0|space=0+0|uni092F=0+924]
+../fonts/8116e5d8fedfbec74e45dc350d2416d810bed8c4.ttf:--font-funcs=ft:U+091F,U+094D,U+200D,U+091F,U+094D,U+200C,U+091F,U+094D,U+200D,U+092F,U+093F:[uni091F=0+876|uni094D=0@4,0+0|space=0+0|uni091F=3+876|uni094D=3@4,0+0|space=5+0|uni093F=6+398|uni091F=6+876|uni094D=6@4,0+0|space=6+0|uni092F=6+924]
+../fonts/8116e5d8fedfbec74e45dc350d2416d810bed8c4.ttf:--font-funcs=ft:U+091F,U+094D,U+200D,U+091F,U+094D,U+200D,U+091F,U+094D,U+200D,U+092F,U+093F:[uni093F=0+398|uni091F=0+876|uni094D=0@4,0+0|space=0+0|uni091F=0+876|uni094D=0@4,0+0|space=0+0|uni091F=0+876|uni094D=0@4,0+0|space=0+0|uni092F=0+924]
diff --git a/test/shaping/data/in-house/tests/indic-old-spec.tests b/test/shaping/data/in-house/tests/indic-old-spec.tests
index cd56319..eb967ad 100644
--- a/test/shaping/data/in-house/tests/indic-old-spec.tests
+++ b/test/shaping/data/in-house/tests/indic-old-spec.tests
@@ -1,2 +1,4 @@
../fonts/57a9d9f83020155cbb1d2be1f43d82388cbecc88.ttf::U+0C9A,U+0CCD,U+0C9A,U+0CCD:[U0C9A_U0CCD.haln=0+1066|U0C9A_0CCD.blwf=0+0]
../fonts/270b89df543a7e48e206a2d830c0e10e5265c630.ttf::U+0D38,U+0D4D,U+0D31,U+0D4D,U+0D31,U+0D4D:[glyph201=0+1183|U0D4D=0+0]
+../fonts/b722a7d09e60421f3efbc706ad348ab47b88567b.ttf::U+091F,U+094D,U+0930,U+094D,U+0020:[Tra=0+550|virAma=0@-73,-110+0|space=4+500]
+../fonts/b722a7d09e60421f3efbc706ad348ab47b88567b.ttf::U+091F,U+094D,U+0930,U+0942:[Tra=0+550|UT=0@42,-150+0]
diff --git a/test/shaping/data/in-house/tests/indic-vowel-letter-spoofing.tests b/test/shaping/data/in-house/tests/indic-vowel-letter-spoofing.tests
new file mode 100644
index 0000000..f8305a3
--- /dev/null
+++ b/test/shaping/data/in-house/tests/indic-vowel-letter-spoofing.tests
@@ -0,0 +1,53 @@
+../fonts/1a5face3fcbd929d228235c2f72bbd6f8eb37424.ttf::U+0904,U+0020,U+0905,U+0946:[ashortdeva=0+764|space=1+260|adeva=2+764|uni25CC=2+510|eshortvowelsigndeva=2+0]
+../fonts/1a5face3fcbd929d228235c2f72bbd6f8eb37424.ttf::U+0906,U+0020,U+0905,U+093E:[aadeva=0+1023|space=1+260|adeva=2+764|uni25CC=2+510|aavowelsigndeva=2+259]
+../fonts/1a5face3fcbd929d228235c2f72bbd6f8eb37424.ttf::U+0908,U+0020,U+0930,U+094D,U+0907:[iideva=0+491|space=1+260|uni25CC=2+510|rephdeva=2+0|ideva=2+491]
+../fonts/1a5face3fcbd929d228235c2f72bbd6f8eb37424.ttf::U+090A,U+0020,U+0909,U+0941:[uudeva=0+765|space=1+260|udeva=2+548|uni25CC=2+510|uvowelsigndeva=2+0]
+../fonts/1a5face3fcbd929d228235c2f72bbd6f8eb37424.ttf::U+090D,U+0020,U+090F,U+0945:[ecandradeva=0+553|space=1+260|edeva=2+553|uni25CC=2+510|ecandravowelsigndeva=2+0]
+../fonts/1a5face3fcbd929d228235c2f72bbd6f8eb37424.ttf::U+090E,U+0020,U+090F,U+0946:[eshortdeva=0+553|space=1+260|edeva=2+553|uni25CC=2+510|eshortvowelsigndeva=2+0]
+../fonts/1a5face3fcbd929d228235c2f72bbd6f8eb37424.ttf::U+0910,U+0020,U+090F,U+0947:[aideva=0+553|space=1+260|edeva=2+553|uni25CC=2+510|evowelsigndeva=2+0]
+../fonts/1a5face3fcbd929d228235c2f72bbd6f8eb37424.ttf::U+0911,U+0020,U+0905,U+0949,U+0020,U+0906,U+0945:[ocandradeva=0+1023|space=1+260|adeva=2+764|uni25CC=2+510|ocandravowelsigndeva=2+259|space=4+260|aadeva=5+1023|uni25CC=5+510|ecandravowelsigndeva=5+0]
+../fonts/1a5face3fcbd929d228235c2f72bbd6f8eb37424.ttf::U+0912,U+0020,U+0905,U+094A,U+0020,U+0906,U+0946:[oshortdeva=0+1023|space=1+260|adeva=2+764|uni25CC=2+510|oshortvowelsigndeva=2+259|space=4+260|aadeva=5+1023|uni25CC=5+510|eshortvowelsigndeva=5+0]
+../fonts/1a5face3fcbd929d228235c2f72bbd6f8eb37424.ttf::U+0913,U+0020,U+0905,U+094B,U+0020,U+0906,U+0947:[odeva=0+1023|space=1+260|adeva=2+764|uni25CC=2+510|ovowelsigndeva=2+259|space=4+260|aadeva=5+1023|uni25CC=5+510|evowelsigndeva=5+0]
+../fonts/1a5face3fcbd929d228235c2f72bbd6f8eb37424.ttf::U+0914,U+0020,U+0905,U+094C,U+0020,U+0906,U+0948:[audeva=0+1023|space=1+260|adeva=2+764|uni25CC=2+510|auvowelsigndeva=2+259|space=4+260|aadeva=5+1023|uni25CC=5+510|aivowelsigndeva=5+0]
+../fonts/1a5face3fcbd929d228235c2f72bbd6f8eb37424.ttf::U+0972,U+0020,U+0905,U+0945:[acandradeva=0+764|space=1+260|adeva=2+764|uni25CC=2+510|ecandravowelsigndeva=2+0]
+../fonts/1a5face3fcbd929d228235c2f72bbd6f8eb37424.ttf::U+0973,U+0020,U+0905,U+093A:[oedeva=0+764|space=1+260|adeva=2+764|uni25CC=2+510|oevowelsigndeva=2+0]
+../fonts/1a5face3fcbd929d228235c2f72bbd6f8eb37424.ttf::U+0974,U+0020,U+0905,U+093B,U+0020,U+0906,U+093A:[ooedeva=0+1023|space=1+260|adeva=2+764|uni25CC=2+510|ooevowelsigndeva=2+259|space=4+260|aadeva=5+1023|uni25CC=5+510|oevowelsigndeva=5+0]
+../fonts/1a5face3fcbd929d228235c2f72bbd6f8eb37424.ttf::U+0975,U+0020,U+0905,U+094F:[awdeva=0+1023|space=1+260|adeva=2+764|uni25CC=2+510|awvowelsigndeva=2+259]
+../fonts/1a5face3fcbd929d228235c2f72bbd6f8eb37424.ttf::U+0976,U+0020,U+0905,U+0956:[uedeva=0+764|space=1+260|adeva=2+764|uni25CC=2+510|uevowelsigndeva=2@50,0+0]
+../fonts/1a5face3fcbd929d228235c2f72bbd6f8eb37424.ttf::U+0977,U+0020,U+0905,U+0957:[uuedeva=0+764|space=1+260|adeva=2+764|uni25CC=2+510|uuevowelsigndeva=2@50,0+0]
+../fonts/881642af1667ae30a54e58de8be904566d00508f.ttf::U+0986,U+0020,U+0985,U+09BE:[aabeng=0+1158|space=1+260|abeng=2+893|uni25CC=2+510|aavowelsignbeng=2+266]
+../fonts/881642af1667ae30a54e58de8be904566d00508f.ttf::U+09E0,U+0020,U+098B,U+09C3:[rrvocalicbeng=0+853|space=1+260|rvocalicbeng=2+853|uni25CC=2+510|rvocalicvowelsignbeng=2+0]
+../fonts/881642af1667ae30a54e58de8be904566d00508f.ttf::U+09E1,U+0020,U+098C,U+09E2:[llvocalicbeng=0+639|space=1+260|lvocalicbeng=2+639|uni25CC=2+510|lvocalicvowelsignbeng=2+0]
+../fonts/604026ae5aaca83c49cd8416909d71ba3e1c1194.ttf::U+0A06,U+0020,U+0A05,U+0A3E:[aaguru=0+2001|space=1+532|aguru=2+1520|uni25CC=2+1044|aamatraguru=2+481]
+../fonts/604026ae5aaca83c49cd8416909d71ba3e1c1194.ttf::U+0A07,U+0020,U+0A72,U+0A3F:[iguru=0+1671|space=1+532|iriguru=2+1141|imatraguru=2+530|uni25CC=2+1044]
+../fonts/604026ae5aaca83c49cd8416909d71ba3e1c1194.ttf::U+0A08,U+0020,U+0A72,U+0A40:[iiguru=0+1671|space=1+532|iriguru=2+1141|uni25CC=2+1044|iimatraguru=2+530]
+../fonts/604026ae5aaca83c49cd8416909d71ba3e1c1194.ttf::U+0A09,U+0020,U+0A73,U+0A41:[uguru=0+1356|space=1+532|uraguru=2+1356|uni25CC=2+1044|umatraguru=2@102,0+0]
+../fonts/604026ae5aaca83c49cd8416909d71ba3e1c1194.ttf::U+0A0A,U+0020,U+0A73,U+0A42:[uuguru=0+1356|space=1+532|uraguru=2+1356|uni25CC=2+1044|uumatraguru=2@102,0+0]
+../fonts/604026ae5aaca83c49cd8416909d71ba3e1c1194.ttf::U+0A0F,U+0020,U+0A72,U+0A47:[eeguru=0+1141|space=1+532|iriguru=2+1141|uni25CC=2+1044|eematraguru=2+0]
+../fonts/604026ae5aaca83c49cd8416909d71ba3e1c1194.ttf::U+0A10,U+0020,U+0A05,U+0A48:[aiguru=0+1520|space=1+532|aguru=2+1520|uni25CC=2+1044|aimatraguru=2+0]
+../fonts/604026ae5aaca83c49cd8416909d71ba3e1c1194.ttf::U+0A13,U+0020,U+0A73,U+0A4B:[ooguru=0+1356|space=1+532|uraguru=2+1356|uni25CC=2+1044|oomatraguru=2+0]
+../fonts/604026ae5aaca83c49cd8416909d71ba3e1c1194.ttf::U+0A14,U+0020,U+0A05,U+0A4C:[auguru=0+1520|space=1+532|aguru=2+1520|uni25CC=2+1044|aumatraguru=2+0]
+../fonts/738d9f3b8c2dfd03875bf35a61d28fd78faf17c8.ttf::U+0A86,U+0020,U+0A85,U+0ABE:[gid3=0+2351|gid1=1+612|gid2=2+1808|gid17=2+1044|gid10=2+543]
+../fonts/738d9f3b8c2dfd03875bf35a61d28fd78faf17c8.ttf::U+0A8D,U+0020,U+0A85,U+0AC5:[gid4=0+1808|gid1=1+612|gid2=2+1808|gid17=2+1044|gid11=2+0]
+../fonts/738d9f3b8c2dfd03875bf35a61d28fd78faf17c8.ttf::U+0A8F,U+0020,U+0A85,U+0AC7:[gid5=0+1808|gid1=1+612|gid2=2+1808|gid17=2+1044|gid12=2+0]
+../fonts/738d9f3b8c2dfd03875bf35a61d28fd78faf17c8.ttf::U+0A90,U+0020,U+0A85,U+0AC8:[gid6=0+1808|gid1=1+612|gid2=2+1808|gid17=2+1044|gid13=2+0]
+../fonts/738d9f3b8c2dfd03875bf35a61d28fd78faf17c8.ttf::U+0A91,U+0020,U+0A85,U+0AC9:[gid7=0+2351|gid1=1+612|gid2=2+1808|gid17=2+1044|gid14=2+543]
+../fonts/738d9f3b8c2dfd03875bf35a61d28fd78faf17c8.ttf::U+0A93,U+0020,U+0A85,U+0ACB,U+0020,U+0A85,U+0ABE,U+0AC5:[gid8=0+2351|gid1=1+612|gid2=2+1808|gid17=2+1044|gid15=2+543|gid1=4+612|gid2=5+1808|gid17=5+1044|gid11=5+0|gid10=5+543]
+../fonts/738d9f3b8c2dfd03875bf35a61d28fd78faf17c8.ttf::U+0A94,U+0020,U+0A85,U+0ACC,U+0020,U+0A85,U+0ABE,U+0AC8:[gid9=0+2351|gid1=1+612|gid2=2+1808|gid17=2+1044|gid16=2+543|gid1=4+612|gid2=5+1808|gid17=5+1044|gid13=5+0|gid10=5+543]
+../fonts/738d9f3b8c2dfd03875bf35a61d28fd78faf17c8.ttf::U+0AC9,U+0020,U+0AC5,U+0ABE:[gid17=0+1044|gid14=0+543|gid1=1+612|gid17=1+1044|gid11=1+0|gid17=1+1044|gid10=1+543]
+../fonts/2c25beb56d9c556622d56b0b5d02b4670c034f89.ttf::U+0B06,U+0020,U+0B05,U+0B3E:[aaorya=0+1681|space=1+881|aorya=2+1284|uni25CC=2+1044|aavowelsignorya=2+387]
+../fonts/2c25beb56d9c556622d56b0b5d02b4670c034f89.ttf::U+0B10,U+0020,U+0B0F,U+0B57:[aiorya=0+1681|space=1+881|eorya=2+1315|uni25CC=2+1044|aulengthmarkorya=2+387]
+../fonts/2c25beb56d9c556622d56b0b5d02b4670c034f89.ttf::U+0B14,U+0020,U+0B13,U+0B57:[auorya=0+1679|space=1+881|oorya=2+1309|uni25CC=2+1044|aulengthmarkorya=2+387]
+../fonts/03e3f463c3a985bc42096620cc415342818454fb.ttf::U+0C13,U+0020,U+0C12,U+0C55:[gid3=0+1497|gid1=1+580|gid2=2+1497|gid13=2+1184|gid12=2+0]
+../fonts/03e3f463c3a985bc42096620cc415342818454fb.ttf::U+0C14,U+0020,U+0C12,U+0C4C:[gid4=0+1497|gid1=1+580|gid2=2+1497|gid13=2+1184|gid11=2+634]
+../fonts/03e3f463c3a985bc42096620cc415342818454fb.ttf::U+0C40,U+0020,U+0C3F,U+0C55:[gid13=0+1184|gid6=0+0|gid1=1+580|gid13=1+1184|gid5=1+0|gid13=1+1184|gid12=1+0]
+../fonts/03e3f463c3a985bc42096620cc415342818454fb.ttf::U+0C47,U+0020,U+0C46,U+0C55:[gid13=0+1184|gid8=0+0|gid1=1+580|gid13=1+1184|gid7=1+0|gid13=1+1184|gid12=1+0]
+../fonts/03e3f463c3a985bc42096620cc415342818454fb.ttf::U+0C4B,U+0020,U+0C4A,U+0C55:[gid13=0+1184|gid10=0+634|gid1=1+580|gid13=1+1184|gid9=1+634|gid13=1+1184|gid12=1+0]
+../fonts/7d18685e1529e4ceaad5b6095dfab2f9789e5bce.ttf::U+0C8A,U+0020,U+0C89,U+0CBE:[gid3=0+3269|gid1=1+590|gid2=2+2502|gid10=2+1184|gid7=2+919]
+../fonts/7d18685e1529e4ceaad5b6095dfab2f9789e5bce.ttf::U+0C94,U+0020,U+0C92,U+0CCC:[gid6=0+1596|gid1=1+590|gid5=2+1590|gid10=2+1184|gid8=2+880]
+../fonts/7d18685e1529e4ceaad5b6095dfab2f9789e5bce.ttf::U+0CE0,U+0020,U+0C8B,U+0CBE:[gid9=0+3214|gid1=1+590|gid4=2+2440|gid10=2+1184|gid7=2+919]
+../fonts/af85624080af5627fb050f570d148a62f04fda74.ttf::U+0D08,U+0020,U+0D07,U+0D57:[gid3=0+3574|gid1=1+632|gid2=2+2019|gid14=2+1184|gid13=2+1555]
+../fonts/af85624080af5627fb050f570d148a62f04fda74.ttf::U+0D0A,U+0020,U+0D09,U+0D57:[gid5=0+2972|gid1=1+632|gid4=2+1417|gid14=2+1184|gid13=2+1555]
+../fonts/af85624080af5627fb050f570d148a62f04fda74.ttf::U+0D10,U+0020,U+0D0E,U+0D46:[gid7=0+4073|gid1=1+632|gid6=2+2608|gid12=2+1465|gid14=2+1184]
+../fonts/af85624080af5627fb050f570d148a62f04fda74.ttf::U+0D13,U+0020,U+0D12,U+0D3E:[gid9=0+2557|gid1=1+632|gid8=2+1524|gid14=2+1184|gid11=2+1033]
+../fonts/af85624080af5627fb050f570d148a62f04fda74.ttf::U+0D14,U+0020,U+0D12,U+0D57:[gid10=0+3073|gid1=1+632|gid8=2+1524|gid14=2+1184|gid13=2+1555]
diff --git a/test/shaping/data/in-house/tests/kern-format2.tests b/test/shaping/data/in-house/tests/kern-format2.tests
new file mode 100644
index 0000000..f7cd840
--- /dev/null
+++ b/test/shaping/data/in-house/tests/kern-format2.tests
@@ -0,0 +1,3 @@
+../fonts/e39391c77a6321c2ac7a2d644de0396470cd4bfe.ttf::U+0061,U+0062,U+0063,U+0064,U+0065,U+0066,U+0067,U+0068,U+0069,U+006A,U+006B,U+006C,U+006D,U+006E,U+006F,U+0070:[a=0+626|b=1+672|c=2+564|d=3@-15,0+657|e=4+621|f=5+403|g=6@-10,0+662|h=7+666|i=8+316|j=9+316|k=10+591|l=11+316|m=12+1021|n=13+666|o=14+644|p=15+672]
+../fonts/e39391c77a6321c2ac7a2d644de0396470cd4bfe.ttf::U+0063,U+006B,U+0063,U+006B,U+0063,U+006B:[c=0+579|k=1+591|c=2+579|k=3+591|c=4+579|k=5+591]
+../fonts/e39391c77a6321c2ac7a2d644de0396470cd4bfe.ttf::U+0041,U+0056:[A=0+701|V=1@-40,0+703]
diff --git a/test/shaping/data/in-house/tests/khmer-mark-order.tests b/test/shaping/data/in-house/tests/khmer-mark-order.tests
new file mode 100644
index 0000000..d581dd1
--- /dev/null
+++ b/test/shaping/data/in-house/tests/khmer-mark-order.tests
@@ -0,0 +1,25 @@
+../fonts/b6031119874ae9ff1dd65383a335e361c0962220.ttf::U+179F,U+17CA,U+17BE,U+1794:[uni17C1=0+288|uni179F=0+928|uni17BB=0@-6,-26+0|uni17B8=0@-32,-29+0|uni1794=3+635]
+../fonts/b6031119874ae9ff1dd65383a335e361c0962220.ttf::U+179F,U+17C9,U+17BE,U+17BB,U+1794:[uni17C1=0+288|uni179F=0+928|uni17C9=0@-32,-29+0|uni17B8=0@-32,237+0|uni25CC=0+635|uni17BB=0@-20,-26+0|uni1794=4+635]
+../fonts/b6031119874ae9ff1dd65383a335e361c0962220.ttf::U+179F,U+17C9,U+17C1,U+17B8,U+17BB,U+1794:[uni17C1=0+288|uni179F=0+928|uni17C9=0@-32,-29+0|uni17B8=0@-32,237+0|uni25CC=0+635|uni17BB=0@-20,-26+0|uni1794=5+635]
+../fonts/b6031119874ae9ff1dd65383a335e361c0962220.ttf::U+179F,U+17C9,U+17B8,U+17C1,U+17BB,U+1794:[uni179F=0+928|uni17C9=0@-32,-29+0|uni17B8=0@-32,237+0|uni17C1=0+288|uni25CC=0+635|uni17BB=0@-20,-26+0|uni1794=5+635]
+../fonts/b6031119874ae9ff1dd65383a335e361c0962220.ttf::U+179F,U+17C9,U+17BE,U+17BB,U+17BB,U+1794:[uni17C1=0+288|uni179F=0+928|uni17C9=0@-32,-29+0|uni17B8=0@-32,237+0|uni25CC=0+635|uni17BB=0@-20,-26+0|uni25CC=0+635|uni17BB=0@-20,-26+0|uni1794=5+635]
+../fonts/b6031119874ae9ff1dd65383a335e361c0962220.ttf::U+179F,U+17C9,U+17C1,U+17B8,U+17BB,U+17BB,U+1794:[uni17C1=0+288|uni179F=0+928|uni17C9=0@-32,-29+0|uni17B8=0@-32,237+0|uni25CC=0+635|uni17BB=0@-20,-26+0|uni25CC=0+635|uni17BB=0@-20,-26+0|uni1794=6+635]
+../fonts/b6031119874ae9ff1dd65383a335e361c0962220.ttf::U+179F,U+17C9,U+17B8,U+17C1,U+17BB,U+17BB,U+1794:[uni179F=0+928|uni17C9=0@-32,-29+0|uni17B8=0@-32,237+0|uni17C1=0+288|uni25CC=0+635|uni17BB=0@-20,-26+0|uni25CC=0+635|uni17BB=0@-20,-26+0|uni1794=6+635]
+../fonts/b6031119874ae9ff1dd65383a335e361c0962220.ttf::U+179F,U+17CA,U+17BE,U+17BB,U+1794:[uni17C1=0+288|uni179F=0+928|uni17BB=0@-6,-26+0|uni17B8=0@-32,-29+0|uni25CC=0+635|uni17BB=0@-20,-26+0|uni1794=4+635]
+../fonts/b6031119874ae9ff1dd65383a335e361c0962220.ttf::U+179F,U+17CA,U+17C1,U+17B8,U+17BB,U+1794:[uni17C1=0+288|uni179F=0+928|uni17BB=0@-6,-26+0|uni17B8=0@-32,-29+0|uni25CC=0+635|uni17BB=0@-20,-26+0|uni1794=5+635]
+../fonts/b6031119874ae9ff1dd65383a335e361c0962220.ttf::U+179F,U+17CA,U+17B8,U+17C1,U+17BB,U+1794:[uni179F=0+928|uni17BB=0@-6,-26+0|uni17B8=0@-32,-29+0|uni17C1=0+288|uni25CC=0+635|uni17BB=0@-20,-26+0|uni1794=5+635]
+../fonts/b6031119874ae9ff1dd65383a335e361c0962220.ttf::U+179F,U+17CA,U+17BE,U+17BB,U+17BB,U+1794:[uni17C1=0+288|uni179F=0+928|uni17BB=0@-6,-26+0|uni17B8=0@-32,-29+0|uni25CC=0+635|uni17BB=0@-20,-26+0|uni25CC=0+635|uni17BB=0@-20,-26+0|uni1794=5+635]
+../fonts/b6031119874ae9ff1dd65383a335e361c0962220.ttf::U+179F,U+17CA,U+17C1,U+17B8,U+17BB,U+17BB,U+1794:[uni17C1=0+288|uni179F=0+928|uni17BB=0@-6,-26+0|uni17B8=0@-32,-29+0|uni25CC=0+635|uni17BB=0@-20,-26+0|uni25CC=0+635|uni17BB=0@-20,-26+0|uni1794=6+635]
+../fonts/b6031119874ae9ff1dd65383a335e361c0962220.ttf::U+179F,U+17CA,U+17B8,U+17C1,U+17BB,U+17BB,U+1794:[uni179F=0+928|uni17BB=0@-6,-26+0|uni17B8=0@-32,-29+0|uni17C1=0+288|uni25CC=0+635|uni17BB=0@-20,-26+0|uni25CC=0+635|uni17BB=0@-20,-26+0|uni1794=6+635]
+../fonts/b6031119874ae9ff1dd65383a335e361c0962220.ttf::U+179F,U+17C9,U+17BE,U+17B8,U+1794:[uni17C1=0+288|uni179F=0+928|uni17C9=0@-32,-29+0|uni17B8=0@-32,237+0|uni25CC=0+635|uni17B8=0@-20,-84+0|uni1794=4+635]
+../fonts/b6031119874ae9ff1dd65383a335e361c0962220.ttf::U+179F,U+17C9,U+17B8,U+17BE,U+1794:[uni179F=0+928|uni17C9=0@-32,-29+0|uni17B8=0@-32,237+0|uni17C1=0+288|uni25CC=0+635|uni17B8=0@-20,-84+0|uni1794=4+635]
+../fonts/b6031119874ae9ff1dd65383a335e361c0962220.ttf::U+179F,U+17C9,U+17BE,U+17B8,U+17BB,U+1794:[uni17C1=0+288|uni179F=0+928|uni17C9=0@-32,-29+0|uni17B8=0@-32,237+0|uni25CC=0+635|uni17B8=0@-20,-84+0|uni25CC=0+635|uni17BB=0@-20,-26+0|uni1794=5+635]
+../fonts/b6031119874ae9ff1dd65383a335e361c0962220.ttf::U+179F,U+17C9,U+17B8,U+17BE,U+17BB,U+1794:[uni179F=0+928|uni17C9=0@-32,-29+0|uni17B8=0@-32,237+0|uni17C1=0+288|uni25CC=0+635|uni17B8=0@-20,-84+0|uni25CC=0+635|uni17BB=0@-20,-26+0|uni1794=5+635]
+../fonts/b6031119874ae9ff1dd65383a335e361c0962220.ttf::U+179F,U+17CA,U+17BE,U+17B8,U+1794:[uni17C1=0+288|uni179F=0+928|uni17BB=0@-6,-26+0|uni17B8=0@-32,-29+0|uni25CC=0+635|uni17B8=0@-20,-84+0|uni1794=4+635]
+../fonts/b6031119874ae9ff1dd65383a335e361c0962220.ttf::U+179F,U+17CA,U+17B8,U+17BE,U+1794:[uni179F=0+928|uni17BB=0@-6,-26+0|uni17B8=0@-32,-29+0|uni17C1=0+288|uni25CC=0+635|uni17B8=0@-20,-84+0|uni1794=4+635]
+../fonts/b6031119874ae9ff1dd65383a335e361c0962220.ttf::U+179F,U+17CA,U+17BE,U+17B8,U+17BB,U+1794:[uni17C1=0+288|uni179F=0+928|uni17BB=0@-6,-26+0|uni17B8=0@-32,-29+0|uni25CC=0+635|uni17B8=0@-20,-84+0|uni25CC=0+635|uni17BB=0@-20,-26+0|uni1794=5+635]
+../fonts/b6031119874ae9ff1dd65383a335e361c0962220.ttf::U+179F,U+17CA,U+17B8,U+17BE,U+17BB,U+1794:[uni179F=0+928|uni17BB=0@-6,-26+0|uni17B8=0@-32,-29+0|uni17C1=0+288|uni25CC=0+635|uni17B8=0@-20,-84+0|uni25CC=0+635|uni17BB=0@-20,-26+0|uni1794=5+635]
+../fonts/b6031119874ae9ff1dd65383a335e361c0962220.ttf::U+179F,U+17BE,U+17B8,U+17BB,U+1794:[uni17C1=0+288|uni179F=0+928|uni17B8=0@-32,-29+0|uni25CC=0+635|uni17B8=0@-20,-84+0|uni25CC=0+635|uni17BB=0@-20,-26+0|uni1794=4+635]
+../fonts/b6031119874ae9ff1dd65383a335e361c0962220.ttf::U+179F,U+17BE,U+17BB,U+17B8,U+1794:[uni17C1=0+288|uni179F=0+928|uni17B8=0@-32,-29+0|uni25CC=0+635|uni17BB=0@-20,-26+0|uni17B8=0@-20,-84+0|uni1794=4+635]
+../fonts/b6031119874ae9ff1dd65383a335e361c0962220.ttf::U+179F,U+17B8,U+17BE,U+17BB,U+1794:[uni179F=0+928|uni17B8=0@-32,-29+0|uni17C1=0+288|uni25CC=0+635|uni17B8=0@-20,-84+0|uni25CC=0+635|uni17BB=0@-20,-26+0|uni1794=4+635]
+../fonts/b6031119874ae9ff1dd65383a335e361c0962220.ttf::U+179F,U+17B8,U+17BB,U+17BE,U+1794:[uni179F=0+928|uni17B8=0@-32,-29+0|uni25CC=0+635|uni17BB=0@-20,-26+0|uni17C1=0+288|uni25CC=0+635|uni17B8=0@-20,-84+0|uni1794=4+635]
diff --git a/test/shaping/data/in-house/tests/khmer-misc.tests b/test/shaping/data/in-house/tests/khmer-misc.tests
new file mode 100644
index 0000000..a7a1c6d
--- /dev/null
+++ b/test/shaping/data/in-house/tests/khmer-misc.tests
@@ -0,0 +1,89 @@
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+1781,U+17D2,U+1798,U+17C2:[uni17C2=0+288|uni1781=0+635|uni17D21798=0@22,-26+0]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+1787,U+17B6:[uni178717B6=0+923]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+1790,U+17D2,U+1784,U+17C3:[uni17C3=0+288|uni1790=0+635|uni17D21784=0@-1,-26+0]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+1798,U+17B6:[uni179817B6=0+923]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+1798,U+17D2,U+1796,U+17BB:[uni1798=0+635|uni17D21796=0@-1,-26+0|uni17BB=0@-22,-296+0]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+179A:[uni179A=0+288]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+179A,U+17B8:[uni179A=0+288|uni17B8.r=0@76,-29+0]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+179A,U+17CD:[uni179A=0+288|uni17CD.r=0@18,-29+0]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+179F,U+17C5:[uni17C1=0+288|uni179F17C5=0+1216]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+179A,U+17D2,U+17A5:[uni179A=0+288|uni17D2=0+0|uni17A5=2+635]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+1784,U+17B9,U+17D2,U+1788:[uni1784=0+635|uni17B9=0@-46,30+0|uni17D21788=0+234]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+1784,U+17D2,U+1788,U+17B9:[uni1784=0+635|uni17D21788=0+234|uni17B9=0@8,30+0]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+1784,U+17D2,U+1782,U+17D2,U+179A:[uni17D2179A.low=0+287|uni1784=0+635|uni17D21782=0@0,-26+0]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+1784,U+17D2,U+179A,U+17D2,U+1782:[uni17D2179A.low=0+287|uni1784=0+635|uni17D21782=0@0,-26+0]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+1798,U+17C9,U+17D2,U+179B,U+17C1,U+17C7:[uni17C1=0+288|uni1798=0+635|uni17C9=0@-46,-29+0|uni17D2179B=0@-1,-26+0|uni17C7=0+386]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+1798,U+200C,U+17C9,U+17D2,U+179B,U+17C1,U+17C7:[uni17C1=0+288|uni1798=0+635|space=0+0|uni17C9=0@-46,-29+0|uni17D2179B=0@-1,-26+0|uni17C7=0+386]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+1794,U+17CA,U+17D0:[uni1794=0+635|uni17CA=0@-46,-29+0|uni17D0=0@-46,113+0]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+1793,U+17C2,U+17CE:[uni17C2=0+288|uni1793=0+635|uni17CE=0@-36,-29+0]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+1780,U+17C1,U+17D2,U+179A:[uni17D2179A=0+287|uni17C1=0+288|uni1780=0+636]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+1780,U+17C0,U+17D2,U+179A:[uni17D2179A=0+287|uni17C1=0+288|uni1780=0+636|uni17C0.right1=0+288]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+1780,U+17C4,U+17D2,U+179A:[uni17D2179A=0+287|uni17C1=0+288|uni178017B6=0+924]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+1780,U+17C5,U+17D2,U+179A:[uni17D2179A=0+287|uni17C1=0+288|uni178017C5=0+924]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+1796,U+17D1,U+17B6:[uni179617B6=0+923|uni17D1=0@-311,-19+0]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+1780,U+1793,U+17D2,U+178F,U+17D2,U+179A,U+17B6,U+1780,U+17CB:[uni1780=0+636|uni17D2179A.low=1+287|uni179317B6=1+924|uni17D2178F=1@-290,-26+0|uni1780=7+636|uni17CB=7@-23,-29+0]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+1780,U+1793,U+17D2,U+179A,U+17D2,U+179F,U+17B7,U+1780,U+17CB:[uni1780=0+636|uni17D2179A=1+287|uni1793=1+635|uni17D2179F=1+302|uni17B7=1@-4,30+0|uni1780=7+636|uni17CB=7@-23,-29+0]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+1780,U+1793,U+17D2,U+179A,U+17D2,U+179F,U+17B8,U+1780,U+17CB:[uni1780=0+636|uni17D2179A=1+287|uni1793=1+635|uni17D2179F=1+302|uni17B8=1@-4,30+0|uni1780=7+636|uni17CB=7@-23,-29+0]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+1780,U+17D2,U+179F,U+17B6,U+1793,U+17D2,U+178F:[uni1780=0+636|uni17D2179F17B6=0+584|uni1793=4+635|uni17D2178F=4@-1,-26+0]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+1780,U+17D2,U+179F,U+17B7,U+1793,U+17D2,U+178F:[uni1780=0+636|uni17D2179F=0+302|uni17B7=0@-4,30+0|uni1793=4+635|uni17D2178F=4@-1,-26+0]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+1780,U+17D2,U+179F,U+17B8,U+1793,U+17D2,U+178F:[uni1780=0+636|uni17D2179F=0+302|uni17B8=0@-4,30+0|uni1793=4+635|uni17D2178F=4@-1,-26+0]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+1780,U+17D2,U+179F,U+17B9,U+1793,U+17D2,U+178F:[uni1780=0+636|uni17D2179F=0+302|uni17B9=0@-4,30+0|uni1793=4+635|uni17D2178F=4@-1,-26+0]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+1780,U+17D2,U+179F,U+17BA,U+1793,U+17D2,U+178F:[uni1780=0+636|uni17D2179F=0+302|uni17BA=0@-4,30+0|uni1793=4+635|uni17D2178F=4@-1,-26+0]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+1780,U+17D2,U+179F,U+17BB,U+1793,U+17D2,U+178F:[uni1780=0+636|uni17D2179F=0+302|uni17BB=0@1,-260+0|uni1793=4+635|uni17D2178F=4@-1,-26+0]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+1780,U+17D2,U+179F,U+17BC,U+1793,U+17D2,U+178F:[uni1780=0+636|uni17D2179F=0+302|uni17BC=0@1,-260+0|uni1793=4+635|uni17D2178F=4@-1,-26+0]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+1780,U+17D2,U+179F,U+17BD,U+1793,U+17D2,U+178F:[uni1780=0+636|uni17D2179F=0+302|uni17BD=0@1,-260+0|uni1793=4+635|uni17D2178F=4@-1,-26+0]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+1780,U+17D2,U+179F,U+17BF,U+1793,U+17D2,U+178F:[uni17C1=0+288|uni1780=0+636|uni17D2179F=0+302|uni17BF.right2=0+288|uni1793=4+635|uni17D2178F=4@-1,-26+0]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+1783,U+17D2,U+179B,U+17D2,U+179F,U+17B6,U+17C6:[uni1783=0+928|uni17D2179B=0@15,-26+0|uni17D2179F17B6.low=0+584|uni17C6=0@39,-29+0]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+1783,U+17D2,U+179B,U+17D2,U+179F,U+17B7,U+17C7:[uni1783=0+928|uni17D2179B=0@15,-26+0|uni17D2179F.low=0+302|uni17B7=0@-4,30+0|uni17C7=0+386]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+1783,U+17D2,U+179B,U+17D2,U+179F,U+17BB,U+17C6:[uni1783=0+928|uni17D2179B=0@15,-26+0|uni17D2179F.low=0+302|uni17BB=0+0|uni17C6=0@-4,30+0]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+1783,U+17D2,U+179B,U+17D2,U+179F,U+17BB,U+17C7:[uni1783=0+928|uni17D2179B=0@15,-26+0|uni17D2179F.low=0+302|uni17BB=0+0|uni17C7=0+386]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+1783,U+17D2,U+179B,U+17D2,U+179F,U+17C1,U+17C7:[uni17C1=0+288|uni1783=0+928|uni17D2179B=0@15,-26+0|uni17D2179F.low=0+302|uni17C7=0+386]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+1783,U+17D2,U+179B,U+17D2,U+179F,U+17C4,U+17C7:[uni17C1=0+288|uni1783=0+928|uni17D2179B=0@15,-26+0|uni17D2179F17B6.low=0+584|uni17C7=0+386]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+1783,U+17D2,U+179B,U+17D2,U+179F,U+17C6:[uni1783=0+928|uni17D2179B=0@15,-26+0|uni17D2179F.low=0+302|uni17C6=0@-4,30+0]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+1783,U+17D2,U+179B,U+17D2,U+179F,U+17C7:[uni1783=0+928|uni17D2179B=0@15,-26+0|uni17D2179F.low=0+302|uni17C7=0+386]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+1789,U+17BC:[uni1789=0+952|uni17BC=0@-173,-260+0]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+1789,U+17D2,U+1789:[uni1789.a=0+952|uni17D21789.a=0@19,-22+0]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+1789,U+17D2,U+1789,U+17BB:[uni1789.a=0+952|uni17D21789.a=0@19,-22+0|uni17BB=0@-160,-296+0]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+1789,U+17D2,U+1789,U+17BC:[uni1789.a=0+952|uni17D21789.a=0@19,-22+0|uni17BC=0@-160,-296+0]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+1789,U+17D2,U+1789,U+17BD:[uni1789.a=0+952|uni17D21789.a=0@19,-22+0|uni17BD=0@-160,-296+0]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+178F,U+17D2,U+179A,U+17D2,U+179F,U+17C0:[uni17C1=0+288|uni17D2179A=0+287|uni178F=0+635|uni17D2179F=0+302|uni17C0.right2=0+288]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+178F,U+17D2,U+179A,U+17D2,U+179F,U+17C1:[uni17C1=0+288|uni17D2179A=0+287|uni178F=0+635|uni17D2179F=0+302]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+178F,U+17D2,U+179A,U+17D2,U+179F,U+17C2:[uni17C2=0+288|uni17D2179A=0+287|uni178F=0+635|uni17D2179F=0+302]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+178F,U+17D2,U+179A,U+17D2,U+179F,U+17C3:[uni17C3=0+288|uni17D2179A=0+287|uni178F=0+635|uni17D2179F=0+302]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+178F,U+17D2,U+179A,U+17D2,U+179F,U+17C4:[uni17C1=0+288|uni17D2179A=0+287|uni178F=0+635|uni17D2179F17B6=0+584]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+178F,U+17D2,U+179A,U+17D2,U+179F,U+17C5:[uni17C1=0+288|uni17D2179A=0+287|uni178F=0+635|uni17D2179F17C5=0+584]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+1792,U+17D2,U+179B,U+17BB,U+17C6,U+1780,U+17CB:[uni1792=0+635|uni17D2179B=0@-2,-26+0|uni17BB=0@-19,-296+0|uni17C6=0@-46,-29+0|uni1780=5+636|uni17CB=5@-23,-29+0]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+1792,U+17D2,U+179B,U+17C4,U+1780,U+17CB:[uni17C1=0+288|uni179217B6=0+923|uni17D2179B=0@-290,-26+0|uni1780=4+636|uni17CB=4@-23,-29+0]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+1792,U+17D2,U+179B,U+17C5,U+1780,U+17CB:[uni17C1=0+288|uni179217C5=0+923|uni17D2179B=0@-290,-26+0|uni1780=4+636|uni17CB=4@-23,-29+0]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+1792,U+17D2,U+179B,U+17C6,U+1780,U+17CB:[uni1792=0+635|uni17D2179B=0@-2,-26+0|uni17C6=0@-46,-29+0|uni1780=4+636|uni17CB=4@-23,-29+0]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+1798,U+17D2,U+178F,U+17D2,U+179B,U+17C9,U+17B6:[uni179817B6=0+923|uni17D2178F=0@-289,-26+0|uni17D2179B=0@-289,-296+0|uni17C9=0@-334,-29+0]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+1798,U+17D2,U+178F,U+17D2,U+179B,U+17C9,U+17BB:[uni1798=0+635|uni17D2178F=0@-1,-26+0|uni17D2179B=0@-1,-296+0|uni17C9=0@-46,-29+0|uni17BB=0@-18,-566+0]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+1798,U+17D2,U+178F,U+17D2,U+179B,U+17C9,U+17BF:[uni17C1=0+288|uni1798=0+635|uni17D2178F=0@-1,-26+0|uni17D2179B=0@-1,-296+0|uni17C9=0@-46,-29+0|uni17BF.right1=0+288]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+1798,U+17D2,U+178F,U+17D2,U+179B,U+17C9,U+17C0:[uni17C1=0+288|uni1798=0+635|uni17D2178F=0@-1,-26+0|uni17D2179B=0@-1,-296+0|uni17C9=0@-46,-29+0|uni17C0.right1=0+288]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+1799,U+17D2,U+1799,U+17BE,U+17A0,U+17D2,U+179C,U+17D2,U+179B,U+17C3:[uni17C1=0+288|uni1799=0+953|uni17D21799=0+298|uni17B8=0@1,30+0|uni17C3=4+288|uni17A0=4+928|uni17D2179C=4@20,-26+0|uni17D2179B=4@19,-296+0]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+179A,U+17D2,U+179A:[uni17D2179A=0+287|uni179A=0+288]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+179F,U+17B6,U+179F,U+17D2,U+178F,U+17D2,U+179A,U+1783,U+17D2,U+1788,U+1784,U+17B6:[uni179F17B6=0+1216|uni17D2179A=2+287|uni179F=2+928|uni17D2178F=2@14,-26+0|uni1783=7+928|uni17D21788=7+234|uni178417B6=10+923]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+179F,U+17B6,U+179F,U+17D2,U+178F,U+17D2,U+179A,U+1783,U+17D2,U+1788,U+1784,U+17B7:[uni179F17B6=0+1216|uni17D2179A=2+287|uni179F=2+928|uni17D2178F=2@14,-26+0|uni1783=7+928|uni17D21788=7+234|uni1784=10+635|uni17B7=10@-46,30+0]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+179F,U+17B6,U+179F,U+17D2,U+178F,U+17D2,U+179A,U+1783,U+17D2,U+1788,U+1784,U+17B8:[uni179F17B6=0+1216|uni17D2179A=2+287|uni179F=2+928|uni17D2178F=2@14,-26+0|uni1783=7+928|uni17D21788=7+234|uni1784=10+635|uni17B8=10@-46,30+0]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+179F,U+17D2,U+178F,U+17D2,U+179A,U+17B8,U+179C,U+17D0,U+1781,U+17D2,U+1789,U+17D2,U+179F,U+17B6:[uni17D2179A=0+287|uni179F=0+928|uni17D2178F=0@14,-26+0|uni17B8=0@-32,-29+0|uni179C=6+326|uni17D0=6@139,40+0|uni1781=8+635|uni17D21789=8@-4,-26+0|uni17D2179F17B6.low=8+584]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+179F,U+17D2,U+179A,U+17D2,U+178F,U+17B6:[uni17D2179A=0+287|uni179F17B6=0+1216|uni17D2178F=0@-274,-26+0]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+179F,U+17D2,U+179A,U+17D2,U+178F,U+17B7:[uni17D2179A=0+287|uni179F=0+928|uni17D2178F=0@14,-26+0|uni17B7=0@-32,-29+0]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+179F,U+17D2,U+179A,U+17D2,U+178F,U+17B8:[uni17D2179A=0+287|uni179F=0+928|uni17D2178F=0@14,-26+0|uni17B8=0@-32,-29+0]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+179F,U+17D2,U+179A,U+17D2,U+178F,U+17B9:[uni17D2179A=0+287|uni179F=0+928|uni17D2178F=0@14,-26+0|uni17B9=0@-32,-29+0]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+179F,U+17D2,U+179A,U+17D2,U+178F,U+17BA:[uni17D2179A=0+287|uni179F=0+928|uni17D2178F=0@14,-26+0|uni17BA=0@-32,-29+0]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+179F,U+17D2,U+179A,U+17D2,U+178F,U+17BB:[uni17D2179A=0+287|uni179F=0+928|uni17D2178F=0@14,-26+0|uni17BB=0@-6,-296+0]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+179F,U+17D2,U+179A,U+17D2,U+178F,U+17BC:[uni17D2179A=0+287|uni179F=0+928|uni17D2178F=0@14,-26+0|uni17BC=0@-6,-296+0]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+179F,U+17D2,U+179A,U+17D2,U+178F,U+17BD:[uni17D2179A=0+287|uni179F=0+928|uni17D2178F=0@14,-26+0|uni17BD=0@-6,-296+0]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+179F,U+17D2,U+179A,U+17D2,U+178F,U+17BE:[uni17C1=0+288|uni17D2179A=0+287|uni179F=0+928|uni17D2178F=0@14,-26+0|uni17B8=0@-32,-29+0]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+179F,U+17D2,U+179A,U+17D2,U+178F,U+17BF:[uni17C1=0+288|uni17D2179A=0+287|uni179F=0+928|uni17D2178F=0@14,-26+0|uni17BF.right2=0+288]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+179F,U+17D2,U+179A,U+17D2,U+178F,U+17CA,U+17BF:[uni17C1=0+288|uni17D2179A=0+287|uni179F=0+928|uni17D2178F=0@14,-26+0|uni17CA=0@-32,-29+0|uni17BF.right1=0+288]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+179F,U+17D2,U+179A,U+17D2,U+178F,U+17CA,U+17C0:[uni17C1=0+288|uni17D2179A=0+287|uni179F=0+928|uni17D2178F=0@14,-26+0|uni17CA=0@-32,-29+0|uni17C0.right1.high=0+288]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+179F,U+17D2,U+179A,U+17D2,U+178F,U+17CA,U+17C1:[uni17C1=0+288|uni17D2179A=0+287|uni179F=0+928|uni17D2178F=0@14,-26+0|uni17CA=0@-32,-29+0]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+179F,U+17D2,U+179A,U+17D2,U+178F,U+17CA,U+17C2:[uni17C2=0+288|uni17D2179A=0+287|uni179F=0+928|uni17D2178F=0@14,-26+0|uni17CA=0@-32,-29+0]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+179F,U+17D2,U+179A,U+17D2,U+178F,U+17CA,U+17C3:[uni17C3=0+288|uni17D2179A=0+287|uni179F=0+928|uni17D2178F=0@14,-26+0|uni17CA=0@-32,-29+0]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+179F,U+17D2,U+179A,U+17D2,U+178F,U+17CA,U+17C6:[uni17D2179A=0+287|uni179F=0+928|uni17D2178F=0@14,-26+0|uni17CA=0@-32,-29+0|uni17C6=0@-32,113+0]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+17A0,U+17D2,U+1782,U+17D2,U+179F,U+17CA,U+17BE:[uni17C1=0+288|uni17A0=0+928|uni17D21782=0@20,-26+0|uni17D2179F.low=0+302|uni17BB=0+0|uni17B8=0@-4,30+0]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+17A0,U+17D2,U+1782,U+17D2,U+179F,U+17CA,U+17BF:[uni17C1=0+288|uni17A0=0+928|uni17D21782=0@20,-26+0|uni17D2179F.low=0+302|uni17CA=0@-4,30+0|uni17BF.right1=0+288]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+17A0,U+17D2,U+1782,U+17D2,U+179F,U+17CA,U+17C0:[uni17C1=0+288|uni17A0=0+928|uni17D21782=0@20,-26+0|uni17D2179F.low=0+302|uni17CA=0@-4,30+0|uni17C0.right1.high=0+288]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+17A0,U+17D2,U+179A,U+17D2,U+179C,U+1784,U+17D2,U+1780:[uni17D2179A=0+287|uni17A0=0+928|uni17D2179C=0@20,-26+0|uni1784=5+635|uni17D21780=5@0,-26+0]
+../fonts/3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf::U+17A0,U+17D2,U+179A,U+17D2,U+179C,U+17B6,U+17C6,U+1784:[uni17D2179A=0+287|uni17A017B6=0+1216|uni17D2179C=0@-268,-26+0|uni17C6=0@47,-29+0|uni1784=7+635]
diff --git a/test/shaping/data/in-house/tests/language-tags.tests b/test/shaping/data/in-house/tests/language-tags.tests
index 4c62113..c7be180 100644
--- a/test/shaping/data/in-house/tests/language-tags.tests
+++ b/test/shaping/data/in-house/tests/language-tags.tests
@@ -10,3 +10,4 @@
../fonts/6991b13ce889466be6de3f66e891de2bc0f117ee.ttf:--language=zh-HK:U+004A:[gid6=0+1000]
../fonts/6991b13ce889466be6de3f66e891de2bc0f117ee.ttf:--language=zh-mo:U+004A:[gid6=0+1000]
../fonts/6991b13ce889466be6de3f66e891de2bc0f117ee.ttf:--language=zh-Hant-mo:U+004A:[gid6=0+1000]
+../fonts/d3129450fafe5e5c98cfc25a4e71809b1b4d2855.ttf:--language=dv --no-glyph-names:U+007C:[2=0+156]
diff --git a/test/shaping/data/in-house/tests/macos.tests b/test/shaping/data/in-house/tests/macos.tests
new file mode 100644
index 0000000..7855c0d
--- /dev/null
+++ b/test/shaping/data/in-house/tests/macos.tests
@@ -0,0 +1,37 @@
+# 10.12.6 https://gist.github.com/ebraminio/1704341fa16b06979e605aafd88198cf
+/System/Library/Fonts/Helvetica.dfont@c7bec2785a4c402b7809b5e35337c3d24c18e281:--font-funcs ot:U+006D,U+0300:[m=0+1706|gravecmb=0@-284,10+0]
+/System/Library/Fonts/LucidaGrande.ttc@d89a9d7e57767bfe3b5a4cfd22bb1e9dbe03a062:--font-funcs ot:U+006D,U+0300:[mgrave=0+1912]
+/System/Library/Fonts/Times.dfont@39c954614d3f3317b28564db06d5b7b7a6ff0e39:--font-funcs ot:U+0066,U+0069:[fi=0+1139]
+/Library/Fonts/Khmer MN.ttc@5f5b1072df99b7355d3066ea85fe82969d13c94a:--font-funcs ot:U+17A2,U+1780,U+17D2,U+179F,U+179A,U+1781,U+17D2,U+1798,U+17C2,U+179A:[km_qa=0+1025|km_ka=1+1025|km_sa.sub=1+517|km_ro=4+593|km_vs_ae=5+605|km_kha=5+1025|km_mo.sub=5+0|km_ro=9+593]
+/Library/Fonts/Tamil MN.ttc@37a2020c3f86ebcc45e02c1de5fdf81e2676989d:--font-funcs ot:U+0BA4,U+0BCA,U+0B95,U+0BC1,U+0B95,U+0BCD,U+0B95,U+0BAA,U+0BCD,U+0BAA,U+0B9F,U+0BCD,U+0B9F,U+0BC1:[tgm_e=0+1702|tgc_ta=0+1598|tgm_aa=0+1149|tgc_ku=2+1962|tgc_k=4+1592|tgc_ka=6+1592|tgc_p=7+1370|tgc_pa=9+1370|tgc_tt=10+1596|tgc_ttu=12+1833]
+/System/Library/Fonts/Times.dfont@39c954614d3f3317b28564db06d5b7b7a6ff0e39:--font-funcs ot:U+0041,U+0066,U+0300,U+0066,U+0069,U+005A:[A=0+1479|f=1+682|gravecmb=1@-551,588+0|fi=3+1139|Z=5+1251]
+/System/Library/Fonts/LucidaGrande.ttc@d89a9d7e57767bfe3b5a4cfd22bb1e9dbe03a062:--font-funcs ot:U+05E1,U+05B0:[shevahebrew=0@51,0+0|samekhhebrew=0+1361]
+/Library/Fonts/Apple Chancery.ttf@5fc49ae9bce39e2105864323183b68ea34c9e562:--font-funcs ot:U+0054,U+0068,U+0020,U+0074,U+0068,U+0020,U+006C,U+006C,U+0020,U+0074,U+0065,U+0020,U+0074,U+006F,U+0020,U+0074,U+0072,U+0020,U+0066,U+0072,U+0020,U+0066,U+0075,U+0020,U+0066,U+006A:[T_h=0+2308|space=2+569|t_h=3+1687|space=5+569|l_l=6+1108|space=8+569|t_e=9+1408|space=11+569|t_o=12+1531|space=14+569|t_r=15+1385|space=17+569|f_r=18+1432|space=20+569|f_u=21+1733|space=23+569|f_j=24+1098]
+/Library/Fonts/Apple Chancery.ttf@5fc49ae9bce39e2105864323183b68ea34c9e562:--font-funcs ot:U+0054,U+0065,U+0020,U+0041,U+0056,U+0020,U+0054,U+0072,U+0020,U+0056,U+0061,U+0020,U+0072,U+0054,U+0020,U+0065,U+0054,U+0020,U+0054,U+0064:[T=0+1497|e=1@-62,0+699|space=2+569|A=3+1431|V=4@-37,0+1377|space=5+569|T=6+1510|r=7@-50,0+803|space=8+569|V=9+1376|a=10@-37,0+1014|space=11+569|r=12+853|T=13+1560|space=14+569|e=15+761|T=16+1560|space=17+569|T=18+1515|d=19@-45,0+1006]
+/System/Library/Fonts/GeezaPro.ttc@f43ee7151c2e9f1dddfbc26cfc148609eb5c5820:--font-funcs ot:U+0627,U+0644,U+0623,U+064E,U+0628,U+0652,U+062C,U+064E,U+062F,U+0650,U+064A,U+064E,U+0651,U+0629,U+0640,U+0627,U+0644,U+0639,U+064E,U+0631,U+064E,U+0628,U+0650,U+064A,U+064E,U+0651,U+0629:[u0629.final.tehMarbuta=26+713|u064e_u0651.shaddaFatha=23@0,-200+0|u064a.medial.yeh=23+656|u0650.kasra=21@80,290+80|u0628.initial.beh=21@-80,0+576|u064e.fatha=19@200,-570+200|u0631.final.reh=19@-200,0+702|u064e.fatha=17@200,-200+200|u0639.medial.ain=17@-200,0+738|u0644.initial.lam=16+515|u0627.final.alef=15+647|u0640.tatweel=14+449|u0629.final.tehMarbuta=13+713|u064e_u0651.shaddaFatha=10@0,-200+0|u064a.initial.yeh=10+656|u0650.kasra=8@80,570+80|u062f.final.dal=8@-80,0+822|u064e.fatha=6@290,-160+290|u062c.medial.jeem=6@-290,0+1069|u0652.sukun=4@0,-200+0|u0628.initial.beh=4+656|u064e.fatha=1@-252,120+-252|u0644_u0623.isolated.lamHamzaOnAlef=1@120,0+1282|u0627.alef=0+647]
+/System/Library/Fonts/GeezaPro.ttc@f43ee7151c2e9f1dddfbc26cfc148609eb5c5820:--font-funcs ot:U+0628,U+064A,U+064E,U+0651,U+0629:[u0629.final.tehMarbuta=4+713|u064e_u0651.shaddaFatha=1@0,-200+0|u064a.medial.yeh=1+656|u0628.initial.beh=0+656]
+/System/Library/Fonts/GeezaPro.ttc@f43ee7151c2e9f1dddfbc26cfc148609eb5c5820:--font-funcs ot:U+0631,U+0628:[u0628.beh=1+1415|u0631.reh=0@-202,0+700]
+/System/Library/Fonts/GeezaPro.ttc@f43ee7151c2e9f1dddfbc26cfc148609eb5c5820:--font-funcs ot:U+0628,U+064F:[u064f.damma=0@250,-250+250|u0628.beh=0@-250,0+1165]
+/System/Library/Fonts/SFNSDisplay.ttf@92787c30716672737e9059bc367c15d04fbc1ced:--font-funcs ot:U+0054,U+0065,U+0020,U+0041,U+0056,U+0020,U+0054,U+0072,U+0020,U+0056,U+0061,U+0020,U+0072,U+0054,U+0020,U+0065,U+0054,U+0020,U+0054,U+0064:[gid225=0+1105|gid584=1@-105,0+979|gid3=2+490|gid4=3+1227|gid265=4@-65,0+1227|gid3=5+490|gid225=6+1130|gid728=7@-80,0+569|gid3=8+490|gid265=9+1227|gid505=10@-65,0+997|gid3=11+490|gid728=12+609|gid225=13@-40,0+1170|gid3=14+490|gid584=15+1004|gid225=16@-80,0+1130|gid3=17+490|gid225=18+1105|gid576=19@-105,0+1068]
+/System/Library/Fonts/SFNSDisplay.ttf@92787c30716672737e9059bc367c15d04fbc1ced:--font-ptem 9 --font-funcs ot:U+0054,U+0065,U+0020,U+0041,U+0056,U+0020,U+0054,U+0072,U+0020,U+0056,U+0061,U+0020,U+0072,U+0054,U+0020,U+0065,U+0054,U+0020,U+0054,U+0064:[gid225=0@46,0+1197|gid584=1@-59,0+1071|gid3=2@46,0+582|gid4=3@46,0+1319|gid265=4@-19,0+1319|gid3=5@46,0+582|gid225=6@46,0+1222|gid728=7@-34,0+661|gid3=8@46,0+582|gid265=9@46,0+1319|gid505=10@-19,0+1089|gid3=11@46,0+582|gid728=12@46,0+701|gid225=13@6,0+1262|gid3=14@46,0+582|gid584=15@46,0+1096|gid225=16@-34,0+1222|gid3=17@46,0+582|gid225=18@46,0+1197|gid576=19@-59,0+1160]
+/System/Library/Fonts/Apple Color Emoji.ttc@d2fe8a134483aa48a43a9d1e4b7204d37a4abdf5:--remove-default-ignorables --font-funcs ot:U+1F468,U+200D,U+1F469,U+200D,U+1F467,U+200D,U+1F466:[u1F46A.MWGB=0+800]
+/Library/Fonts/Zapfino.ttf@9ee799ffb09516ead6b0cf6f2ca807276e150748:--font-funcs ot:U+005A,U+0061,U+0070,U+0066,U+0069,U+006E,U+005A,U+0061,U+0070,U+0066,U+0069,U+006E,U+005A,U+0061,U+0070,U+0066,U+0069,U+006E,U+005A,U+0061,U+0070,U+0066,U+0069,U+006E,U+005A,U+0061,U+0070,U+0066,U+0069,U+006E,U+005A,U+0061,U+0070,U+0066,U+0069,U+006E,U+005A,U+0061,U+0070,U+0066,U+0069,U+006E,U+005A,U+0061,U+0070,U+0066,U+0069,U+006E,U+005A,U+0061,U+0070,U+0066,U+0069,U+006E,U+005A,U+0061,U+0070,U+0066,U+0069,U+006E,U+005A,U+0061,U+0070,U+0066,U+0069,U+006E,U+005A,U+0061,U+0070,U+0066,U+0069,U+006E,U+006F:[Z=0+416|a=1@-21,0+264|p_f=2+433|i=4+181|n=5+261|Z=6+416|a=7@-21,0+264|p_f=8+433|i=10+181|n=11+261|Z=12+416|a=13@-21,0+264|p_f=14+433|i=16+181|n=17+261|Z=18+416|a=19@-21,0+264|p_f=20+433|i=22+181|n=23+261|Z=24+416|a=25@-21,0+264|p_f=26+433|i=28+181|n=29+261|Z=30+416|a=31@-21,0+264|p_f=32+433|i=34+181|n=35+261|Z=36+416|a=37@-21,0+264|p_f=38+433|i=40+181|n=41+261|Z=42+416|a=43@-21,0+264|p_f=44+433|i=46+181|n=47+261|Z=48+416|a=49@-21,0+264|p_f=50+433|i=52+181|n=53+261|Z=54+416|a=55@-21,0+264|p_f=56+433|i=58+181|n=59+261|Z=60+416|a=61@-21,0+264|p_f=62+433|i=64+181|n=65+261|Z_a_p_f_i_n_o=66+2333]
+
+# 10.13.6 https://gist.github.com/ebraminio/d432e831b3f7ebe30245dde5775e1c7e
+/System/Library/Fonts/Helvetica.ttc@8a928f9866299d2455f41360202b7a3b48503a5e:--font-funcs ot:U+006D,U+0300:[m=0+1706|gravecmb=0@-284,10+0]
+/System/Library/Fonts/LucidaGrande.ttc@63ba1b1de4709bd832ca76bd62368dd99fc34269:--font-funcs ot:U+006D,U+0300:[mgrave=0+1912]
+/System/Library/Fonts/Times.ttc@896098b6979306ad84355025459f7c68b029139c:--font-funcs ot:U+0066,U+0069:[fi=0+1139]
+/Library/Fonts/Khmer MN.ttc@782ba6cf3fca0512ab348dfe08345a2d5dc5bf2c:--font-funcs ot:U+17A2,U+1780,U+17D2,U+179F,U+179A,U+1781,U+17D2,U+1798,U+17C2,U+179A:[km_qa=0+1025|km_ka=1+1025|km_sa.sub=1+517|km_ro=4+593|km_vs_ae=5+605|km_kha=5+1025|km_mo.sub=5+0|km_ro=9+593]
+/Library/Fonts/Tamil MN.ttc@3de37f3f8f3cb6015b093fbd6e9d323daaf6fb1d:--font-funcs ot:U+0BA4,U+0BCA,U+0B95,U+0BC1,U+0B95,U+0BCD,U+0B95,U+0BAA,U+0BCD,U+0BAA,U+0B9F,U+0BCD,U+0B9F,U+0BC1:[tgm_e=0+1702|tgc_ta=0+1598|tgm_aa=0+1149|tgc_ku=2+1962|tgc_k=4+1592|tgc_ka=6+1592|tgc_p=7+1370|tgc_pa=9+1370|tgc_tt=10+1596|tgc_ttu=12+1833]
+/System/Library/Fonts/Times.ttc@896098b6979306ad84355025459f7c68b029139c:--font-funcs ot:U+0041,U+0066,U+0300,U+0066,U+0069,U+005A:[A=0+1479|f=1+682|gravecmb=1@-551,588+0|fi=3+1139|Z=5+1251]
+/System/Library/Fonts/LucidaGrande.ttc@63ba1b1de4709bd832ca76bd62368dd99fc34269:--font-funcs ot:U+05E1,U+05B0:[shevahebrew=0@51,0+0|samekhhebrew=0+1361]
+/Library/Fonts/Apple Chancery.ttf@4ec49cba0d4e68d025ada0498c4df1b2f9fd57ac:--font-funcs ot:U+0054,U+0068,U+0020,U+0074,U+0068,U+0020,U+006C,U+006C,U+0020,U+0074,U+0065,U+0020,U+0074,U+006F,U+0020,U+0074,U+0072,U+0020,U+0066,U+0072,U+0020,U+0066,U+0075,U+0020,U+0066,U+006A:[T_h=0+2308|space=2+569|t_h=3+1687|space=5+569|l_l=6+1108|space=8+569|t_e=9+1408|space=11+569|t_o=12+1531|space=14+569|t_r=15+1385|space=17+569|f_r=18+1432|space=20+569|f_u=21+1733|space=23+569|f_j=24+1098]
+/Library/Fonts/Apple Chancery.ttf@4ec49cba0d4e68d025ada0498c4df1b2f9fd57ac:--font-funcs ot:U+0054,U+0065,U+0020,U+0041,U+0056,U+0020,U+0054,U+0072,U+0020,U+0056,U+0061,U+0020,U+0072,U+0054,U+0020,U+0065,U+0054,U+0020,U+0054,U+0064:[T=0+1497|e=1@-62,0+699|space=2+569|A=3+1431|V=4@-37,0+1377|space=5+569|T=6+1510|r=7@-50,0+803|space=8+569|V=9+1376|a=10@-37,0+1014|space=11+569|r=12+853|T=13+1560|space=14+569|e=15+761|T=16+1560|space=17+569|T=18+1515|d=19@-45,0+1006]
+/System/Library/Fonts/GeezaPro.ttc@ab26ea45dcaa5e1c5a958e42af10e10d330e7334:--font-funcs ot:U+0627,U+0644,U+0623,U+064E,U+0628,U+0652,U+062C,U+064E,U+062F,U+0650,U+064A,U+064E,U+0651,U+0629,U+0640,U+0627,U+0644,U+0639,U+064E,U+0631,U+064E,U+0628,U+0650,U+064A,U+064E,U+0651,U+0629:[u0629.final.tehMarbuta=26+713|u064e_u0651.shaddaFatha=23@0,-200+0|u064a.medial.yeh=23+656|u0650.kasra=21@80,290+80|u0628.initial.beh=21@-80,0+576|u064e.fatha=19@200,-570+200|u0631.final.reh=19@-200,0+702|u064e.fatha=17@200,-200+200|u0639.medial.ain=17@-200,0+738|u0644.initial.lam=16+515|u0627.final.alef=15+647|u0640.tatweel=14+449|u0629.final.tehMarbuta=13+713|u064e_u0651.shaddaFatha=10@0,-200+0|u064a.initial.yeh=10+656|u0650.kasra=8@80,570+80|u062f.final.dal=8@-80,0+822|u064e.fatha=6@290,-160+290|u062c.medial.jeem=6@-290,0+1069|u0652.sukun=4@0,-200+0|u0628.initial.beh=4+656|u064e.fatha=1@-252,120+-252|u0644_u0623.isolated.lamHamzaOnAlef=1@120,0+1282|u0627.alef=0+647]
+/System/Library/Fonts/GeezaPro.ttc@ab26ea45dcaa5e1c5a958e42af10e10d330e7334:--font-funcs ot:U+0628,U+064A,U+064E,U+0651,U+0629:[u0629.final.tehMarbuta=4+713|u064e_u0651.shaddaFatha=1@0,-200+0|u064a.medial.yeh=1+656|u0628.initial.beh=0+656]
+/System/Library/Fonts/GeezaPro.ttc@ab26ea45dcaa5e1c5a958e42af10e10d330e7334:--font-funcs ot:U+0631,U+0628:[u0628.beh=1+1415|u0631.reh=0@-202,0+700]
+/System/Library/Fonts/GeezaPro.ttc@ab26ea45dcaa5e1c5a958e42af10e10d330e7334:--font-funcs ot:U+0628,U+064F:[u064f.damma=0@250,-250+250|u0628.beh=0@-250,0+1165]
+/System/Library/Fonts/SFNSDisplay.ttf@c8948f464ff822a5f9bbf2e12d0e4e32268815aa:--font-funcs ot:U+0054,U+0065,U+0020,U+0041,U+0056,U+0020,U+0054,U+0072,U+0020,U+0056,U+0061,U+0020,U+0072,U+0054,U+0020,U+0065,U+0054,U+0020,U+0054,U+0064:[gid282=0+1055|gid658=1@-135,0+914|gid3=2+420|gid4=3+1227|gid332=4@-65,0+1227|gid3=5+420|gid282=6+1075|gid813=7@-115,0+516|gid3=8+420|gid332=9+1217|gid572=10@-75,0+953|gid3=11+420|gid813=12+546|gid282=13@-85,0+1105|gid3=14+420|gid658=15+914|gid282=16@-135,0+1055|gid3=17+420|gid282=18+1055|gid649=19@-135,0+999]
+/System/Library/Fonts/SFNSDisplay.ttf@c8948f464ff822a5f9bbf2e12d0e4e32268815aa:--font-ptem 9 --font-funcs ot:U+0054,U+0065,U+0020,U+0041,U+0056,U+0020,U+0054,U+0072,U+0020,U+0056,U+0061,U+0020,U+0072,U+0054,U+0020,U+0065,U+0054,U+0020,U+0054,U+0064:[gid282=0@46,0+1147|gid658=1@-89,0+1006|gid3=2@46,0+512|gid4=3@46,0+1319|gid332=4@-19,0+1319|gid3=5@46,0+512|gid282=6@46,0+1167|gid813=7@-69,0+608|gid3=8@46,0+512|gid332=9@46,0+1309|gid572=10@-29,0+1045|gid3=11@46,0+512|gid813=12@46,0+638|gid282=13@-39,0+1197|gid3=14@46,0+512|gid658=15@46,0+1006|gid282=16@-89,0+1147|gid3=17@46,0+512|gid282=18@46,0+1147|gid649=19@-89,0+1091]
+/System/Library/Fonts/Apple Color Emoji.ttc@2e09b1f3d42c3821cc6c4ac5b6ce16237ab0d496:--remove-default-ignorables --font-funcs ot:U+1F468,U+200D,U+1F469,U+200D,U+1F467,U+200D,U+1F466:[u1F46A.MWGB=0+800]
+/Library/Fonts/Zapfino.ttf@99a1e15163c3e9567d5b1019c45e9254dae63b08:--font-funcs ot:U+005A,U+0061,U+0070,U+0066,U+0069,U+006E,U+005A,U+0061,U+0070,U+0066,U+0069,U+006E,U+005A,U+0061,U+0070,U+0066,U+0069,U+006E,U+005A,U+0061,U+0070,U+0066,U+0069,U+006E,U+005A,U+0061,U+0070,U+0066,U+0069,U+006E,U+005A,U+0061,U+0070,U+0066,U+0069,U+006E,U+005A,U+0061,U+0070,U+0066,U+0069,U+006E,U+005A,U+0061,U+0070,U+0066,U+0069,U+006E,U+005A,U+0061,U+0070,U+0066,U+0069,U+006E,U+005A,U+0061,U+0070,U+0066,U+0069,U+006E,U+005A,U+0061,U+0070,U+0066,U+0069,U+006E,U+005A,U+0061,U+0070,U+0066,U+0069,U+006E,U+006F:[Z=0+416|a=1@-21,0+264|p_f=2+433|i=4+181|n=5+261|Z=6+416|a=7@-21,0+264|p_f=8+433|i=10+181|n=11+261|Z=12+416|a=13@-21,0+264|p_f=14+433|i=16+181|n=17+261|Z=18+416|a=19@-21,0+264|p_f=20+433|i=22+181|n=23+261|Z=24+416|a=25@-21,0+264|p_f=26+433|i=28+181|n=29+261|Z=30+416|a=31@-21,0+264|p_f=32+433|i=34+181|n=35+261|Z=36+416|a=37@-21,0+264|p_f=38+433|i=40+181|n=41+261|Z=42+416|a=43@-21,0+264|p_f=44+433|i=46+181|n=47+261|Z=48+416|a=49@-21,0+264|p_f=50+433|i=52+181|n=53+261|Z=54+416|a=55@-21,0+264|p_f=56+433|i=58+181|n=59+261|Z=60+416|a=61@-21,0+264|p_f=62+433|i=64+181|n=65+261|Z_a_p_f_i_n_o=66+2333]
diff --git a/test/shaping/data/in-house/tests/mongolian-variation-selector.tests b/test/shaping/data/in-house/tests/mongolian-variation-selector.tests
index efb4cf4..c5e35c8 100644
--- a/test/shaping/data/in-house/tests/mongolian-variation-selector.tests
+++ b/test/shaping/data/in-house/tests/mongolian-variation-selector.tests
@@ -1,4 +1,19 @@
../fonts/37033cc5cf37bb223d7355153016b6ccece93b28.ttf::U+1826,U+180B,U+1826:[uni1826.E85E_ue.init1=0+599|uni1826.E856_ue.fina=2+750]
../fonts/ef86fe710cfea877bbe0dbb6946a1f88d0661031.ttf::U+1820,U+180B:[uni1820.E821_a.isol1=0+1199]
-../fonts/bb29ce50df2bdba2d10726427c6b7609bf460e04.ttf::U+183A,U+1823,U+182E,U+182B,U+1822,U+1826,U+180B,U+1832,U+180B,U+1827,U+1837,U+0020,U+182D,U+182D,U+180B,U+0020,U+182D,U+180C,U+0020,U+182D,U+180D,U+200D,U+0020,U+182D,U+200D,U+182D,U+180B,U+200D,U+0020,U+182D,U+180C,U+200D,U+0020,U+182D,U+180D,U+200D,U+0020,U+200D,U+182D,U+200D,U+200D,U+182D,U+180B,U+200D,U+0020,U+200D,U+182D,U+180C,U+200D,U+0020,U+200D,U+182D,U+180D,U+200D,U+0020,U+200D,U+182D,U+200D,U+182D,U+180B,U+0020,U+200D,U+182D,U+180C,U+0020,U+1820,U+200C,U+182D,U+1820,U+1837,U+0020,U+1830,U+1824,U+1837,U+200D,U+200D,U+182D,U+1820,U+200D,U+0020,U+200D,U+182D,U+1824,U+182F,U+1822,U+0020,U+182A,U+1820,U+1822,U+182D,U+180E,U+1820,U+202F,U+1836,U+1822,U+1828:[uni183A1823.E971_ko.init=0+950|uni182E.E904_m.medi=2+400|uni182B1822.E8A6_pi.medi=3+1150|uni1826.E854_ue.medi1=5+1100|uni1832.E916_t.medi1=7+1000|uni1827.E85C_ee.medi=9+750|uni1837.E931_r.fina=10+750|space=11+500|uni182D.E8E2_g.init=12+1000|uni182D.E8E8_g.fina1=13+1250|space=15+500|uni182D.EA1B_g.isol2=16+1000|space=18+500|uni182D.EA1E_g.init3=19+650|space=19+0|space=22+500|uni182D.E8E2_g.init=23+1000|space=23+0|uni182D.E8E5_g.medi1=25+800|space=25+0|space=28+500|uni182D.EA1D_g.init2=29+950|space=29+0|space=32+500|uni182D.EA1E_g.init3=33+650|space=33+0|space=36+500|space=36+0|uni182D.E8E4_g.medi=38+800|space=38+0|space=38+0|uni182D.E8E5_g.medi1=41+800|space=41+0|space=44+500|space=44+0|uni182D.E8E6_g.medi2=46+650|space=46+0|space=49+500|space=49+0|uni182D.E8E6_g.medi2=51+650|space=51+0|space=54+500|space=54+0|uni182D.E8E4_g.medi=56+800|space=56+0|uni182D.E8E8_g.fina1=58+1250|space=60+500|space=60+0|uni182D.E8E9_g.fina2=62+1050|space=64+500|uni1820.E820_a.isol=65+1550|space=65+0|uni182D.E8E2_g.init=67+1000|uni1820.E823_a.medi=68+400|uni1837.E931_r.fina=69+750|space=70+500|uni1830.E90B_s.init=71+850|uni1824.E844_u.medi=72+600|uni1837.E930_r.medi=73+600|space=73+0|space=73+0|uni182D.E8E5_g.medi1=76+800|uni1820.E823_a.medi=77+400|space=77+0|space=79+500|space=79+0|uni182D.E8E5_g.medi1=81+800|uni1824.E844_u.medi=82+600|uni182F.E908_l.medi=83+400|uni1822.E837_i.fina=84+600|space=85+500|uni182A1820.E875_ba.init=86+1000|uni1822.E836_i.medi2=88+1000|uni182D.E8E8_g.fina1=89+1250|space=90+0|uni1820.E827_a.fina2=91+600|uni202F.nobreak=92+500|uni1836.E92B_y.init1=93+500|uni1822.E834_i.medi=94+500|uni1828.E866_n.fina=95+850]
../fonts/a34a7b00f22ffb5fd7eef6933b81c7e71bc2cdfb.ttf::U+180A,U+1868,U+180A,U+1868,U+180B,U+180A,U+1868,U+180C,U+180A,U+1868,U+180D,U+180A:[gid1=0+268|gid10=1+778|gid1=2+268|gid9=3+575|gid1=5+268|gid10=6+778|gid1=8+268|gid8=9+575|gid1=11+268]
+../fonts/4d4206e30b2dbf1c1ef492a8eae1c9e7829ebad8.ttf::U+183A,U+1823,U+182E,U+182B,U+1822,U+1826,U+180B,U+1832,U+180B,U+1827,U+1837:[uni183A1823.E971_ko.init=0+950|uni182E.E904_m.medi=2+400|uni182B1822.E8A6_pi.medi=3+1150|uni1826.E854_ue.medi1=5+1100|uni1832.E916_t.medi1=7+1000|uni1827.E85C_ee.medi=9+750|uni1837.E931_r.fina=10+750]
+../fonts/4d4206e30b2dbf1c1ef492a8eae1c9e7829ebad8.ttf::U+182D,U+182D,U+180B:[uni182D.E8E2_g.init=0+1000|uni182D.E8E8_g.fina1=1+1250]
+../fonts/4d4206e30b2dbf1c1ef492a8eae1c9e7829ebad8.ttf::U+182D,U+180C:[uni182D.EA1B_g.isol2=0+1000]
+../fonts/4d4206e30b2dbf1c1ef492a8eae1c9e7829ebad8.ttf::U+182D,U+180D,U+200D:[uni182D.EA1E_g.init3=0+650|space=0+0]
+../fonts/4d4206e30b2dbf1c1ef492a8eae1c9e7829ebad8.ttf::U+182D,U+200D,U+182D,U+180B,U+200D:[uni182D.E8E2_g.init=0+1000|space=0+0|uni182D.E8E5_g.medi1=2+800|space=2+0]
+../fonts/4d4206e30b2dbf1c1ef492a8eae1c9e7829ebad8.ttf::U+182D,U+180C,U+200D:[uni182D.EA1D_g.init2=0+950|space=0+0]
+../fonts/4d4206e30b2dbf1c1ef492a8eae1c9e7829ebad8.ttf::U+182D,U+180D,U+200D:[uni182D.EA1E_g.init3=0+650|space=0+0]
+../fonts/4d4206e30b2dbf1c1ef492a8eae1c9e7829ebad8.ttf::U+200D,U+182D,U+200D,U+200D,U+182D,U+180B,U+200D:[space=0+0|uni182D.E8E4_g.medi=1+800|space=1+0|space=1+0|uni182D.E8E5_g.medi1=4+800|space=4+0]
+../fonts/4d4206e30b2dbf1c1ef492a8eae1c9e7829ebad8.ttf::U+200D,U+182D,U+180C,U+200D:[space=0+0|uni182D.E8E6_g.medi2=1+650|space=1+0]
+../fonts/4d4206e30b2dbf1c1ef492a8eae1c9e7829ebad8.ttf::U+200D,U+182D,U+180D,U+200D:[space=0+0|uni182D.E8E6_g.medi2=1+650|space=1+0]
+../fonts/4d4206e30b2dbf1c1ef492a8eae1c9e7829ebad8.ttf::U+200D,U+182D,U+200D,U+182D,U+180B:[space=0+0|uni182D.E8E4_g.medi=1+800|space=1+0|uni182D.E8E8_g.fina1=3+1250]
+../fonts/4d4206e30b2dbf1c1ef492a8eae1c9e7829ebad8.ttf::U+200D,U+182D,U+180C:[space=0+0|uni182D.E8E9_g.fina2=1+1050]
+../fonts/4d4206e30b2dbf1c1ef492a8eae1c9e7829ebad8.ttf::U+1820,U+200C,U+182D,U+1820,U+1837:[uni1820.E820_a.isol=0+1550|space=1+0|uni182D.E8E2_g.init=2+1000|uni1820.E823_a.medi=3+400|uni1837.E931_r.fina=4+750]
+../fonts/4d4206e30b2dbf1c1ef492a8eae1c9e7829ebad8.ttf::U+1830,U+1824,U+1837,U+200D,U+200D,U+182D,U+1820,U+200D:[uni1830.E90B_s.init=0+850|uni1824.E844_u.medi=1+600|uni1837.E930_r.medi=2+600|space=2+0|space=2+0|uni182D.E8E5_g.medi1=5+800|uni1820.E823_a.medi=6+400|space=6+0]
+../fonts/4d4206e30b2dbf1c1ef492a8eae1c9e7829ebad8.ttf::U+200D,U+182D,U+1824,U+182F,U+1822:[space=0+0|uni182D.E8E5_g.medi1=1+800|uni1824.E844_u.medi=2+600|uni182F.E908_l.medi=3+400|uni1822.E837_i.fina=4+600]
+../fonts/4d4206e30b2dbf1c1ef492a8eae1c9e7829ebad8.ttf::U+182A,U+1820,U+1822,U+182D,U+180E,U+1820,U+202F,U+1836,U+1822,U+1828:[uni182A1820.E875_ba.init=0+1000|uni1822.E836_i.medi2=2+1000|uni182D.E8E8_g.fina1=3+1250|space=4+0|uni1820.E827_a.fina2=5+600|uni202F.nobreak=6+500|uni1836.E92B_y.init1=7+500|uni1822.E834_i.medi=8+500|uni1828.E866_n.fina=9+850]
diff --git a/test/shaping/data/in-house/tests/myanmar-zawgyi.tests b/test/shaping/data/in-house/tests/myanmar-zawgyi.tests
new file mode 100644
index 0000000..b79d4fb
--- /dev/null
+++ b/test/shaping/data/in-house/tests/myanmar-zawgyi.tests
@@ -0,0 +1 @@
+../fonts/ab14b4eb9d7a67e293f51d30d719add06c9d6e06.ttf:--script=Qaag:U+1000,U+103A,U+1004,U+1037,U+1039,U+1041:[Ka=0+2217|Ya-Semivowel=0+286|Nga=2+1247|Dot Below=2+0|Virama-Killer=2+0|One-Myanmar=5+1247]
diff --git a/test/shaping/data/in-house/tests/rand.tests b/test/shaping/data/in-house/tests/rand.tests
new file mode 100644
index 0000000..df324b9
--- /dev/null
+++ b/test/shaping/data/in-house/tests/rand.tests
@@ -0,0 +1,3 @@
+../fonts/5bb74492f5e0ffa1fbb72e4c881be035120b6513.ttf:--no-glyph-names --features=-rand:U+0054,U+0055,U+0056:[1=0+560|2=1+602|3=2+602]
+../fonts/5bb74492f5e0ffa1fbb72e4c881be035120b6513.ttf:--no-glyph-names --features=rand=2:U+0054,U+0055,U+0056:[5=0+560|8=1+602|11=2+602]
+../fonts/5bb74492f5e0ffa1fbb72e4c881be035120b6513.ttf:--no-glyph-names:U+0054,U+0055,U+0056,U+0054,U+0055,U+0056,U+0054,U+0055,U+0056,U+0054,U+0055,U+0056:[5=0+560|7=1+602|10=2+602|4=3+560|7=4+602|10=5+602|6=6+560|9=7+602|10=8+602|5=9+560|8=10+602|12=11+602]
diff --git a/test/shaping/data/in-house/tests/spaces.tests b/test/shaping/data/in-house/tests/spaces.tests
index 3ebaac5..ea90998 100644
--- a/test/shaping/data/in-house/tests/spaces.tests
+++ b/test/shaping/data/in-house/tests/spaces.tests
@@ -15,3 +15,20 @@
../fonts/1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf:--font-funcs=ot:U+202F:[gid1=0+280]
../fonts/1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf:--font-funcs=ot:U+205F:[gid1=0+455]
../fonts/1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf:--font-funcs=ot:U+3000:[gid1=0+2048]
+../fonts/1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf:--font-funcs=ot --direction=ttb:U+0020:[gid1=0@-280,0+0,-2048]
+../fonts/1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf:--font-funcs=ot --direction=ttb:U+00A0:[gid1=0@-280,0+0,-2048]
+../fonts/1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf:--font-funcs=ot --direction=ttb:U+1680:[gid0=0@-346,0+0,-2048]
+../fonts/1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf:--font-funcs=ot --direction=ttb:U+2000:[gid1=0@-280,0+0,-1024]
+../fonts/1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf:--font-funcs=ot --direction=ttb:U+2001:[gid1=0@-280,0+0,-2048]
+../fonts/1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf:--font-funcs=ot --direction=ttb:U+2002:[gid1=0@-280,0+0,-1024]
+../fonts/1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf:--font-funcs=ot --direction=ttb:U+2003:[gid1=0@-280,0+0,-2048]
+../fonts/1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf:--font-funcs=ot --direction=ttb:U+2004:[gid1=0@-280,0+0,-683]
+../fonts/1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf:--font-funcs=ot --direction=ttb:U+2005:[gid1=0@-280,0+0,-512]
+../fonts/1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf:--font-funcs=ot --direction=ttb:U+2006:[gid1=0@-280,0+0,-341]
+../fonts/1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf:--font-funcs=ot --direction=ttb:U+2007:[gid1=0@-280,0+0,-2048]
+../fonts/1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf:--font-funcs=ot --direction=ttb:U+2008:[gid1=0@-280,0+0,-2048]
+../fonts/1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf:--font-funcs=ot --direction=ttb:U+2009:[gid1=0@-280,0+0,-410]
+../fonts/1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf:--font-funcs=ot --direction=ttb:U+200A:[gid1=0@-280,0+0,-128]
+../fonts/1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf:--font-funcs=ot --direction=ttb:U+202F:[gid1=0@-280,0+0,-1024]
+../fonts/1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf:--font-funcs=ot --direction=ttb:U+205F:[gid1=0@-280,0+0,-455]
+../fonts/1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf:--font-funcs=ot --direction=ttb:U+3000:[gid1=0@-280,0+0,-2048]
diff --git a/test/shaping/data/in-house/tests/use-indic3.tests b/test/shaping/data/in-house/tests/use-indic3.tests
new file mode 100644
index 0000000..8c3ae13
--- /dev/null
+++ b/test/shaping/data/in-house/tests/use-indic3.tests
@@ -0,0 +1 @@
+../fonts/3c96e7a303c58475a8c750bf4289bbe73784f37d.ttf::U+0C95,U+0CCD,U+0CB0:[uni0C95=0+1176|uni0CB0_uni0CCD.blwf=0+275]
diff --git a/test/shaping/data/in-house/tests/use-syllable.tests b/test/shaping/data/in-house/tests/use-syllable.tests
index 5d2fab3..6a247ed 100644
--- a/test/shaping/data/in-house/tests/use-syllable.tests
+++ b/test/shaping/data/in-house/tests/use-syllable.tests
@@ -6,3 +6,7 @@
../fonts/373e67bf41ca264e260a9716162b71a23549e885.ttf:--no-glyph-names:U+A8AC,U+A8B4,U+A8B5:[2=0+377|3=0+242|4=0+210]
../fonts/59a585a63b3df608fbeef00956c8c108deec7de6.ttf:--no-glyph-names:U+1BC7,U+1BEA,U+1BF3:[1=0+749|2=0+402|4=0+535|3=0+401]
../fonts/1ed7e9064f008f62de6ff0207bb4dd29409597a5.ttf::U+11064,U+1107F,U+11052,U+11065,U+1107F,U+11053:[brm_num100.1=0+2224|brm_num1000.2=3+1834]
+../fonts/28f497629c04ceb15546c9a70e0730125ed6698d.ttf::U+11013,U+11042,U+11046:[brm_KA=0+754|brm_vowelEE=0@-383,0+0|brm_virama=0@-524,0+0]
+../fonts/28f497629c04ceb15546c9a70e0730125ed6698d.ttf::U+11013,U+11044,U+11046:[brm_KA=0+754|brm_vowelOO=0@-647,0+0|brm_virama=0@-524,0+0]
+../fonts/28f497629c04ceb15546c9a70e0730125ed6698d.ttf::U+11013,U+1103C:[brm_KA=0+754|brm_vowelU=0@-403,0+0]
+../fonts/86cdd983c4e4c4d7f27dd405d6ceb7d4b9ed3d35.ttf::U+111C8,U+111C9,U+111C9:[u111C8=0+500|u111C9=0@-500,0+0|u111C9=0@-500,0+0]
diff --git a/test/shaping/data/in-house/tests/use.tests b/test/shaping/data/in-house/tests/use.tests
index 172946c..dd2a3a2 100644
--- a/test/shaping/data/in-house/tests/use.tests
+++ b/test/shaping/data/in-house/tests/use.tests
@@ -2,4 +2,13 @@
../fonts/4cce528e99f600ed9c25a2b69e32eb94a03b4ae8.ttf::U+1A48,U+1A58,U+1A25,U+1A48,U+1A58,U+1A25,U+1A6E,U+1A63:[uni1A48=0+1212|uni1A25=0+1912|uni1A58=0+0|uni1A48=3+1212|uni1A6E=3+0|uni1A25=3+1912|uni1A58=3+0|uni1A63=3+1212]
../fonts/f518eb6f6b5eec2946c9fbbbde44e45d46f5e2ac.ttf::U+1A48,U+1A58,U+1A25,U+1A48,U+1A58,U+1A25,U+1A6E,U+1A63:[uni1A48=0+1212|uni1A25=0+1912|uni1A58=0+0|uni1A48=3+1212|uni1A6E=3+1211|uni1A25=3+1912|uni1A58=3+0|uni1A63=3+1212]
../fonts/6ff0fbead4462d9f229167b4e6839eceb8465058.ttf:--font-funcs=ot:U+11103,U+11128:[u11103=0+837|u11128=0+0]
+../fonts/2a670df15b73a5dc75a5cc491bde5ac93c5077dc.ttf::U+11124,U+1112E:[u11124=0+514|u11131=0+0|u11127=0+0]
+../fonts/2a670df15b73a5dc75a5cc491bde5ac93c5077dc.ttf::U+11124,U+11131,U+11127:[u11124=0+514|u11131=0+0|u11127=0+0]
+../fonts/2a670df15b73a5dc75a5cc491bde5ac93c5077dc.ttf::U+11124,U+11127,U+11131:[u11124=0+514|u11127=0+0|uni25CC=0+547|u11131=0+0]
+../fonts/2a670df15b73a5dc75a5cc491bde5ac93c5077dc.ttf::U+11124,U+11134,U+11131:[u11124=0+514|u11134=0+0|u11131=0+0]
+../fonts/2a670df15b73a5dc75a5cc491bde5ac93c5077dc.ttf::U+11124,U+11131,U+11134:[u11124=0+514|u11131=0+0|uni25CC=0+547|u11134=0+0]
../fonts/573d3a3177c9a8646e94c8a0d7b224334340946a.ttf:--font-funcs=ft:U+11410,U+11442,U+11411,U+11440,U+11443,U+11410,U+11442,U+11411,U+11441,U+11443:[E_dv.alt=0+275|Ga.icd=0+367|Gha.diag=0@100,0+386|AA_dv.alt=0+208|Candrabindu=0@17,-8+0|E_dv.alt=5+275|Ga.icd=5+367|Gha.diag=5@100,0+386|AU_dv_part.alt=5+213|Candrabindu.sm=5@-52,179+0]
+../fonts/dcf774ca21062e7439f98658b18974ea8b956d0c.ttf::U+11328,U+1134D,U+1CF4:[gid1=0+793|gid2=0+0|gid3=0+0]
+../fonts/4afb0e8b9a86bb9bd73a1247de4e33fbe3c1fd93.ttf::U+1C00,U+1C27,U+1C28,U+1C34,U+1C35:[uni1C35=0+500|uni1C34=0+500|uni1C28=0+500|uni1C27=0+500|uni1C00=0+500]
+../fonts/4afb0e8b9a86bb9bd73a1247de4e33fbe3c1fd93.ttf::U+0D4E,U+0D15,U+0D4D,U+0D15,U+0D46:[uni0D15=0+500|uni0D4E=0+500|uni0D4D=0+500|uni0D46=3+500|uni0D15=3+500]
+../fonts/4afb0e8b9a86bb9bd73a1247de4e33fbe3c1fd93.ttf::U+1102D,U+11046,U+11013,U+11046,U+11013,U+11046:[u11013=0+500|u11046_u11013=0+500|u1102D_u11046=0+500|u11046=0+500]
diff --git a/test/shaping/data/in-house/tests/vertical.tests b/test/shaping/data/in-house/tests/vertical.tests
index 17df28e..3958813 100644
--- a/test/shaping/data/in-house/tests/vertical.tests
+++ b/test/shaping/data/in-house/tests/vertical.tests
@@ -1,3 +1,4 @@
../fonts/191826b9643e3f124d865d617ae609db6a2ce203.ttf:--direction=t --font-funcs=ft:U+300C:[uni300C.vert=0@-512,-578+0,-1024]
../fonts/f9b1dd4dcb515e757789a22cb4241107746fd3d0.ttf:--direction=t --font-funcs=ft:U+0041,U+0042:[gid1=0@-654,-2128+0,-2789|gid2=1@-665,-2125+0,-2789]
-../fonts/f9b1dd4dcb515e757789a22cb4241107746fd3d0.ttf:--direction=t --font-funcs=ot:U+0041,U+0042:[gid1=0@-654,-2189+0,-2789|gid2=1@-665,-2189+0,-2789]
+../fonts/f9b1dd4dcb515e757789a22cb4241107746fd3d0.ttf:--direction=t --font-funcs=ot:U+0041,U+0042:[gid1=0@-654,-1468+0,-2048|gid2=1@-665,-1462+0,-2048]
+../fonts/4cbbc461be066fccc611dcc634af6e8cb2705537.ttf:--direction=t --font-funcs=ot:U+FF38:[gid2=0@-500,-867+0,-1000]
diff --git a/test/shaping/data/text-rendering-tests/Makefile.in b/test/shaping/data/text-rendering-tests/Makefile.in
index c164de2..ca784f5 100644
--- a/test/shaping/data/text-rendering-tests/Makefile.in
+++ b/test/shaping/data/text-rendering-tests/Makefile.in
@@ -94,12 +94,26 @@ TESTS = tests/AVAR-1.tests tests/CFF-1.tests tests/CFF2-1.tests \
tests/CVAR-1.tests tests/CVAR-2.tests tests/GLYF-1.tests \
tests/GPOS-1.tests tests/GPOS-2.tests tests/GPOS-3.tests \
tests/GPOS-4.tests tests/GPOS-5.tests tests/GSUB-1.tests \
- tests/GSUB-2.tests tests/GVAR-1.tests tests/GVAR-2.tests \
- tests/GVAR-3.tests tests/GVAR-4.tests tests/GVAR-5.tests \
- tests/GVAR-6.tests tests/GVAR-7.tests tests/GVAR-8.tests \
- tests/GVAR-9.tests tests/HVAR-1.tests tests/HVAR-2.tests \
- tests/KERN-1.tests tests/KERN-2.tests tests/SHBALI-3.tests \
- tests/SHKNDA-1.tests $(am__EXEEXT_1)
+ tests/GSUB-2.tests tests/GSUB-3.tests tests/GVAR-1.tests \
+ tests/GVAR-2.tests tests/GVAR-3.tests tests/GVAR-4.tests \
+ tests/GVAR-5.tests tests/GVAR-6.tests tests/GVAR-7.tests \
+ tests/GVAR-8.tests tests/GVAR-9.tests tests/HVAR-1.tests \
+ tests/HVAR-2.tests tests/KERN-1.tests tests/KERN-2.tests \
+ tests/MORX-10.tests tests/MORX-11.tests tests/MORX-12.tests \
+ tests/MORX-13.tests tests/MORX-14.tests tests/MORX-16.tests \
+ tests/MORX-17.tests tests/MORX-18.tests tests/MORX-19.tests \
+ tests/MORX-1.tests tests/MORX-20.tests tests/MORX-21.tests \
+ tests/MORX-22.tests tests/MORX-23.tests tests/MORX-24.tests \
+ tests/MORX-25.tests tests/MORX-26.tests tests/MORX-27.tests \
+ tests/MORX-28.tests tests/MORX-29.tests tests/MORX-2.tests \
+ tests/MORX-30.tests tests/MORX-31.tests tests/MORX-32.tests \
+ tests/MORX-33.tests tests/MORX-34.tests tests/MORX-35.tests \
+ tests/MORX-36.tests tests/MORX-37.tests tests/MORX-38.tests \
+ tests/MORX-39.tests tests/MORX-3.tests tests/MORX-40.tests \
+ tests/MORX-41.tests tests/MORX-4.tests tests/MORX-5.tests \
+ tests/MORX-6.tests tests/MORX-7.tests tests/MORX-8.tests \
+ tests/MORX-9.tests tests/SHBALI-3.tests tests/SHKNDA-1.tests \
+ $(am__EXEEXT_1)
subdir = test/shaping/data/text-rendering-tests
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
am__aclocal_m4_deps = $(top_srcdir)/m4/ax_check_link_flag.m4 \
@@ -107,8 +121,7 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/ax_check_link_flag.m4 \
$(top_srcdir)/m4/ax_pthread.m4 $(top_srcdir)/m4/gtk-doc.m4 \
$(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
$(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
- $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/pkg.m4 \
- $(top_srcdir)/configure.ac
+ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
$(ACLOCAL_M4)
DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
@@ -458,6 +471,8 @@ PACKAGE_URL = @PACKAGE_URL@
PACKAGE_VERSION = @PACKAGE_VERSION@
PATH_SEPARATOR = @PATH_SEPARATOR@
PKG_CONFIG = @PKG_CONFIG@
+PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
+PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
PTHREAD_CC = @PTHREAD_CC@
PTHREAD_CFLAGS = @PTHREAD_CFLAGS@
PTHREAD_LIBS = @PTHREAD_LIBS@
@@ -540,32 +555,8 @@ TEST_EXTENSIONS = .tests
TESTS_LOG_COMPILER = $(srcdir)/../../run-tests.py $(top_builddir)/util/hb-shape$(EXEEXT)
DISBALED_TESTS = \
tests/CMAP-3.tests \
- tests/MORX-10.tests \
- tests/MORX-11.tests \
- tests/MORX-12.tests \
- tests/MORX-13.tests \
- tests/MORX-14.tests \
- tests/MORX-16.tests \
- tests/MORX-17.tests \
- tests/MORX-18.tests \
- tests/MORX-19.tests \
- tests/MORX-1.tests \
- tests/MORX-20.tests \
- tests/MORX-21.tests \
- tests/MORX-22.tests \
- tests/MORX-23.tests \
- tests/MORX-25.tests \
- tests/MORX-26.tests \
- tests/MORX-27.tests \
- tests/MORX-28.tests \
- tests/MORX-2.tests \
- tests/MORX-3.tests \
- tests/MORX-4.tests \
- tests/MORX-5.tests \
- tests/MORX-6.tests \
- tests/MORX-7.tests \
- tests/MORX-8.tests \
- tests/MORX-9.tests \
+ tests/MORX-31.tests \
+ tests/MORX-41.tests \
tests/SHARAN-1.tests \
tests/SHBALI-1.tests \
tests/SHBALI-2.tests \
diff --git a/test/shaping/data/text-rendering-tests/Makefile.sources b/test/shaping/data/text-rendering-tests/Makefile.sources
index 4be9d05..ccbbb37 100644
--- a/test/shaping/data/text-rendering-tests/Makefile.sources
+++ b/test/shaping/data/text-rendering-tests/Makefile.sources
@@ -15,6 +15,7 @@ TESTS = \
tests/GPOS-5.tests \
tests/GSUB-1.tests \
tests/GSUB-2.tests \
+ tests/GSUB-3.tests \
tests/GVAR-1.tests \
tests/GVAR-2.tests \
tests/GVAR-3.tests \
@@ -28,12 +29,6 @@ TESTS = \
tests/HVAR-2.tests \
tests/KERN-1.tests \
tests/KERN-2.tests \
- tests/SHBALI-3.tests \
- tests/SHKNDA-1.tests \
- $(NULL)
-
-DISBALED_TESTS = \
- tests/CMAP-3.tests \
tests/MORX-10.tests \
tests/MORX-11.tests \
tests/MORX-12.tests \
@@ -48,18 +43,40 @@ DISBALED_TESTS = \
tests/MORX-21.tests \
tests/MORX-22.tests \
tests/MORX-23.tests \
+ tests/MORX-24.tests \
tests/MORX-25.tests \
tests/MORX-26.tests \
tests/MORX-27.tests \
tests/MORX-28.tests \
+ tests/MORX-29.tests \
tests/MORX-2.tests \
+ tests/MORX-30.tests \
+ tests/MORX-31.tests \
+ tests/MORX-32.tests \
+ tests/MORX-33.tests \
+ tests/MORX-34.tests \
+ tests/MORX-35.tests \
+ tests/MORX-36.tests \
+ tests/MORX-37.tests \
+ tests/MORX-38.tests \
+ tests/MORX-39.tests \
tests/MORX-3.tests \
+ tests/MORX-40.tests \
+ tests/MORX-41.tests \
tests/MORX-4.tests \
tests/MORX-5.tests \
tests/MORX-6.tests \
tests/MORX-7.tests \
tests/MORX-8.tests \
tests/MORX-9.tests \
+ tests/SHBALI-3.tests \
+ tests/SHKNDA-1.tests \
+ $(NULL)
+
+DISBALED_TESTS = \
+ tests/CMAP-3.tests \
+ tests/MORX-31.tests \
+ tests/MORX-41.tests \
tests/SHARAN-1.tests \
tests/SHBALI-1.tests \
tests/SHBALI-2.tests \
diff --git a/test/shaping/data/text-rendering-tests/extract-tests.py b/test/shaping/data/text-rendering-tests/extract-tests.py
index 36963e5..f1722b5 100755
--- a/test/shaping/data/text-rendering-tests/extract-tests.py
+++ b/test/shaping/data/text-rendering-tests/extract-tests.py
@@ -28,12 +28,13 @@ def glyphstr(glyphs):
html = ET.fromstring(sys.stdin.read())
found = False
+
for elt in html.findall(".//*[@class='expected'][@ft:id]", namespaces):
found = True
name = elt.get(ns('ft:id'))
text = elt.get(ns('ft:render'))
font = elt.get(ns('ft:font'))
- vars = elt.get(ns('ft:var'), '').replace(':', '=').replace(';', ',')
+ variations = elt.get(ns('ft:var'), '').replace(':', '=').replace(';', ',')
glyphs = []
for use in elt.findall(".//use"):
x = int(use.get('x'))
@@ -43,8 +44,19 @@ for elt in html.findall(".//*[@class='expected'][@ft:id]", namespaces):
glyphname = '.'.join(href[1:].split('/')[1].split('.')[1:])
glyphs.append((glyphname, x, y))
opts = '--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft'
- if vars:
- opts = opts + ' --variations=%s' % vars
+ if variations:
+ opts = opts + ' --variations=%s' % variations
print ("../fonts/%s:%s:%s:%s" % (font, opts, unistr(text), glyphstr(glyphs)))
+for elt in html.findall(".//*[@class='expected-no-crash'][@ft:id]", namespaces):
+ found = True
+ name = elt.get(ns('ft:id'))
+ text = elt.get(ns('ft:render'))
+ font = elt.get(ns('ft:font'))
+ variations = elt.get(ns('ft:var'), '').replace(':', '=').replace(';', ',')
+ opts = ''
+ if variations:
+ opts = '--variations=%s' % variations
+ print ("../fonts/%s:%s:%s:*" % (font, opts, unistr(text)))
+
sys.exit(0 if found else 1)
diff --git a/test/shaping/data/text-rendering-tests/fonts/TestGSUBThree.ttf b/test/shaping/data/text-rendering-tests/fonts/TestGSUBThree.ttf
new file mode 100644
index 0000000..8fce4ac
--- /dev/null
+++ b/test/shaping/data/text-rendering-tests/fonts/TestGSUBThree.ttf
Binary files differ
diff --git a/test/shaping/data/text-rendering-tests/fonts/TestGVAR-Composite-0.ttf b/test/shaping/data/text-rendering-tests/fonts/TestGVAR-Composite-0.ttf
new file mode 100644
index 0000000..07e6882
--- /dev/null
+++ b/test/shaping/data/text-rendering-tests/fonts/TestGVAR-Composite-0.ttf
Binary files differ
diff --git a/test/shaping/data/text-rendering-tests/fonts/TestGVAR-Composite-Missing.ttf b/test/shaping/data/text-rendering-tests/fonts/TestGVAR-Composite-Missing.ttf
new file mode 100644
index 0000000..58dd961
--- /dev/null
+++ b/test/shaping/data/text-rendering-tests/fonts/TestGVAR-Composite-Missing.ttf
Binary files differ
diff --git a/test/shaping/data/text-rendering-tests/fonts/TestMORXForty.ttf b/test/shaping/data/text-rendering-tests/fonts/TestMORXForty.ttf
new file mode 100644
index 0000000..37d0b63
--- /dev/null
+++ b/test/shaping/data/text-rendering-tests/fonts/TestMORXForty.ttf
Binary files differ
diff --git a/test/shaping/data/text-rendering-tests/fonts/TestMORXFourtyone.ttf b/test/shaping/data/text-rendering-tests/fonts/TestMORXFourtyone.ttf
new file mode 100644
index 0000000..98ebe33
--- /dev/null
+++ b/test/shaping/data/text-rendering-tests/fonts/TestMORXFourtyone.ttf
Binary files differ
diff --git a/test/shaping/data/text-rendering-tests/fonts/TestMORXThirtyeight.ttf b/test/shaping/data/text-rendering-tests/fonts/TestMORXThirtyeight.ttf
new file mode 100644
index 0000000..29a41d0
--- /dev/null
+++ b/test/shaping/data/text-rendering-tests/fonts/TestMORXThirtyeight.ttf
Binary files differ
diff --git a/test/shaping/data/text-rendering-tests/fonts/TestMORXThirtyfive.ttf b/test/shaping/data/text-rendering-tests/fonts/TestMORXThirtyfive.ttf
new file mode 100644
index 0000000..f157063
--- /dev/null
+++ b/test/shaping/data/text-rendering-tests/fonts/TestMORXThirtyfive.ttf
Binary files differ
diff --git a/test/shaping/data/text-rendering-tests/fonts/TestMORXThirtyfour.ttf b/test/shaping/data/text-rendering-tests/fonts/TestMORXThirtyfour.ttf
new file mode 100644
index 0000000..a70dadc
--- /dev/null
+++ b/test/shaping/data/text-rendering-tests/fonts/TestMORXThirtyfour.ttf
Binary files differ
diff --git a/test/shaping/data/text-rendering-tests/fonts/TestMORXThirtynine.ttf b/test/shaping/data/text-rendering-tests/fonts/TestMORXThirtynine.ttf
new file mode 100644
index 0000000..c106ae9
--- /dev/null
+++ b/test/shaping/data/text-rendering-tests/fonts/TestMORXThirtynine.ttf
Binary files differ
diff --git a/test/shaping/data/text-rendering-tests/fonts/TestMORXThirtyone.ttf b/test/shaping/data/text-rendering-tests/fonts/TestMORXThirtyone.ttf
new file mode 100644
index 0000000..c64c12c
--- /dev/null
+++ b/test/shaping/data/text-rendering-tests/fonts/TestMORXThirtyone.ttf
Binary files differ
diff --git a/test/shaping/data/text-rendering-tests/fonts/TestMORXThirtyseven.ttf b/test/shaping/data/text-rendering-tests/fonts/TestMORXThirtyseven.ttf
new file mode 100644
index 0000000..22057f1
--- /dev/null
+++ b/test/shaping/data/text-rendering-tests/fonts/TestMORXThirtyseven.ttf
Binary files differ
diff --git a/test/shaping/data/text-rendering-tests/fonts/TestMORXThirtysix.ttf b/test/shaping/data/text-rendering-tests/fonts/TestMORXThirtysix.ttf
new file mode 100644
index 0000000..6676e52
--- /dev/null
+++ b/test/shaping/data/text-rendering-tests/fonts/TestMORXThirtysix.ttf
Binary files differ
diff --git a/test/shaping/data/text-rendering-tests/fonts/TestMORXThirtythree.ttf b/test/shaping/data/text-rendering-tests/fonts/TestMORXThirtythree.ttf
new file mode 100644
index 0000000..5cab73e
--- /dev/null
+++ b/test/shaping/data/text-rendering-tests/fonts/TestMORXThirtythree.ttf
Binary files differ
diff --git a/test/shaping/data/text-rendering-tests/fonts/TestMORXThirtytwo.ttf b/test/shaping/data/text-rendering-tests/fonts/TestMORXThirtytwo.ttf
new file mode 100644
index 0000000..07ed76c
--- /dev/null
+++ b/test/shaping/data/text-rendering-tests/fonts/TestMORXThirtytwo.ttf
Binary files differ
diff --git a/test/shaping/data/text-rendering-tests/fonts/TestMORXTwentyfour.ttf b/test/shaping/data/text-rendering-tests/fonts/TestMORXTwentyfour.ttf
new file mode 100644
index 0000000..271dddb
--- /dev/null
+++ b/test/shaping/data/text-rendering-tests/fonts/TestMORXTwentyfour.ttf
Binary files differ
diff --git a/test/shaping/data/text-rendering-tests/fonts/TestMORXTwentynine.ttf b/test/shaping/data/text-rendering-tests/fonts/TestMORXTwentynine.ttf
new file mode 100644
index 0000000..9f015ca
--- /dev/null
+++ b/test/shaping/data/text-rendering-tests/fonts/TestMORXTwentynine.ttf
Binary files differ
diff --git a/test/shaping/data/text-rendering-tests/fonts/TestTRAKOne.ttf b/test/shaping/data/text-rendering-tests/fonts/TestTRAKOne.ttf
new file mode 100644
index 0000000..425bce6
--- /dev/null
+++ b/test/shaping/data/text-rendering-tests/fonts/TestTRAKOne.ttf
Binary files differ
diff --git a/test/shaping/data/text-rendering-tests/tests/GSUB-3.tests b/test/shaping/data/text-rendering-tests/tests/GSUB-3.tests
new file mode 100644
index 0000000..c2f7e6e
--- /dev/null
+++ b/test/shaping/data/text-rendering-tests/tests/GSUB-3.tests
@@ -0,0 +1 @@
+../fonts/TestGSUBThree.ttf::U+006C,U+006F,U+006C:*
diff --git a/test/shaping/data/text-rendering-tests/tests/MORX-1.tests b/test/shaping/data/text-rendering-tests/tests/MORX-1.tests
new file mode 100644
index 0000000..794b01b
--- /dev/null
+++ b/test/shaping/data/text-rendering-tests/tests/MORX-1.tests
@@ -0,0 +1 @@
+../fonts/TestMORXOne.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0041,U+0042,U+0043:[A.alt|B@1000,0|C.alt@2000,0]
diff --git a/test/shaping/data/text-rendering-tests/tests/MORX-10.tests b/test/shaping/data/text-rendering-tests/tests/MORX-10.tests
new file mode 100644
index 0000000..a6a5444
--- /dev/null
+++ b/test/shaping/data/text-rendering-tests/tests/MORX-10.tests
@@ -0,0 +1 @@
+../fonts/TestMORXTen.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0041,U+0042,U+0041,U+0042,U+0041,U+0042:[A|B@638,0|A@1288,0|B@1926,0|B@2576,0|A@3226,0]
diff --git a/test/shaping/data/text-rendering-tests/tests/MORX-11.tests b/test/shaping/data/text-rendering-tests/tests/MORX-11.tests
new file mode 100644
index 0000000..1fce69b
--- /dev/null
+++ b/test/shaping/data/text-rendering-tests/tests/MORX-11.tests
@@ -0,0 +1 @@
+../fonts/TestMORXEleven.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0042,U+0041,U+0042,U+0042,U+0041,U+0041,U+0042,U+0058:[B|A@650,0|B@1288,0|B@1938,0|A@2588,0|X@3226,0|A@3812,0|B@4450,0]
diff --git a/test/shaping/data/text-rendering-tests/tests/MORX-12.tests b/test/shaping/data/text-rendering-tests/tests/MORX-12.tests
new file mode 100644
index 0000000..8b9886f
--- /dev/null
+++ b/test/shaping/data/text-rendering-tests/tests/MORX-12.tests
@@ -0,0 +1,3 @@
+../fonts/TestMORXTwelve.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0058,U+0041,U+0042,U+0043,U+0058,U+0031:[X|C@598,0|A@1230,0|B@1868,0|X@2518,0|one@3116,0]
+../fonts/TestMORXTwelve.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0058,U+0041,U+0042,U+0043,U+0058,U+0032:[X|C@598,0|A@1230,0|B@1868,0|X@2518,0|two@3116,0]
+../fonts/TestMORXTwelve.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0058,U+0041,U+0042,U+0043,U+0058,U+0033:[X|B@598,0|C@1248,0|A@1880,0|X@2518,0|three@3116,0]
diff --git a/test/shaping/data/text-rendering-tests/tests/MORX-13.tests b/test/shaping/data/text-rendering-tests/tests/MORX-13.tests
new file mode 100644
index 0000000..42d8107
--- /dev/null
+++ b/test/shaping/data/text-rendering-tests/tests/MORX-13.tests
@@ -0,0 +1 @@
+../fonts/TestMORXThirteen.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0041,U+0042,U+0043,U+0044,U+0045:[B|C@626,0|D@1222,0|E@1896,0|A@2452,0]
diff --git a/test/shaping/data/text-rendering-tests/tests/MORX-14.tests b/test/shaping/data/text-rendering-tests/tests/MORX-14.tests
new file mode 100644
index 0000000..d01f2e9
--- /dev/null
+++ b/test/shaping/data/text-rendering-tests/tests/MORX-14.tests
@@ -0,0 +1,2 @@
+../fonts/TestMORXFourteen.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0041,U+0042,U+0043,U+0044,U+0045:[B|C@626,0|D@1222,0|E@1896,0|A@2452,0]
+../fonts/TestMORXFourteen.ttf::U+0041,U+0042,U+0042,U+0042,U+0043,U+0043,U+0043,U+0044,U+0044,U+0044,U+0042,U+0043,U+0044,U+0043,U+0045:*
diff --git a/test/shaping/data/text-rendering-tests/tests/MORX-16.tests b/test/shaping/data/text-rendering-tests/tests/MORX-16.tests
new file mode 100644
index 0000000..ce0d5b2
--- /dev/null
+++ b/test/shaping/data/text-rendering-tests/tests/MORX-16.tests
@@ -0,0 +1 @@
+../fonts/TestMORXSixteen.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0041,U+0042,U+0043,U+0044,U+0045:[B|C@626,0|D@1222,0|E@1896,0|A@2452,0]
diff --git a/test/shaping/data/text-rendering-tests/tests/MORX-17.tests b/test/shaping/data/text-rendering-tests/tests/MORX-17.tests
new file mode 100644
index 0000000..6e1c94c
--- /dev/null
+++ b/test/shaping/data/text-rendering-tests/tests/MORX-17.tests
@@ -0,0 +1 @@
+../fonts/TestMORXSeventeen.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0041,U+0042:[B|A@626,0]
diff --git a/test/shaping/data/text-rendering-tests/tests/MORX-18.tests b/test/shaping/data/text-rendering-tests/tests/MORX-18.tests
new file mode 100644
index 0000000..b032a76
--- /dev/null
+++ b/test/shaping/data/text-rendering-tests/tests/MORX-18.tests
@@ -0,0 +1,4 @@
+../fonts/TestMORXEighteen.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0041,U+0042,U+0043,U+0044,U+0045:[A|B.alt@639,0|C@1639,0|D.alt1@2235,0|E@3235,0]
+../fonts/TestMORXEighteen.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0041,U+0042,U+0042,U+0042,U+0044,U+0045:[A|B@639,0|B@1265,0|B.alt@1891,0|D.alt1@2891,0|E@3891,0]
+../fonts/TestMORXEighteen.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0041,U+0042,U+0044,U+0045:[A|B.alt@639,0|D.alt1@1639,0|E@2639,0]
+../fonts/TestMORXEighteen.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0041,U+0042,U+0045:[A|B@639,0|E@1265,0]
diff --git a/test/shaping/data/text-rendering-tests/tests/MORX-19.tests b/test/shaping/data/text-rendering-tests/tests/MORX-19.tests
new file mode 100644
index 0000000..e9b9dc4
--- /dev/null
+++ b/test/shaping/data/text-rendering-tests/tests/MORX-19.tests
@@ -0,0 +1,2 @@
+../fonts/TestMORXEighteen.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0041,U+0043,U+0044,U+0045:[A.alt|C@1000,0|D.alt1@1596,0|E@2596,0]
+../fonts/TestMORXEighteen.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0044:[D.alt]
diff --git a/test/shaping/data/text-rendering-tests/tests/MORX-2.tests b/test/shaping/data/text-rendering-tests/tests/MORX-2.tests
new file mode 100644
index 0000000..3e64d23
--- /dev/null
+++ b/test/shaping/data/text-rendering-tests/tests/MORX-2.tests
@@ -0,0 +1,16 @@
+../fonts/TestMORXTwo.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+004F,U+004F,U+004F,U+0041,U+0042,U+0058,U+0059,U+005A,U+0043,U+0044,U+004F,U+004F,U+004F,U+24FF:[O|O@418,0|O@836,0|A@1254,0|B@2084,0|X@2914,0|Y@3744,0|Z@4574,0|C@5404,0|D@6234,0|O@7064,0|O@7482,0|O@7900,0|zero@8318,0]
+../fonts/TestMORXTwo.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+004F,U+004F,U+004F,U+0041,U+0042,U+0058,U+0059,U+005A,U+0043,U+0044,U+004F,U+004F,U+004F,U+278A:[O|O@418,0|O@836,0|B@1254,0|X@2084,0|Y@2914,0|Z@3744,0|C@4574,0|D@5404,0|A@6234,0|O@7064,0|O@7482,0|O@7900,0|one@8318,0]
+../fonts/TestMORXTwo.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+004F,U+004F,U+004F,U+0041,U+0042,U+0058,U+0059,U+005A,U+0043,U+0044,U+004F,U+004F,U+004F,U+278B:[O|O@418,0|O@836,0|D@1254,0|A@2084,0|B@2914,0|X@3744,0|Y@4574,0|Z@5404,0|C@6234,0|O@7064,0|O@7482,0|O@7900,0|two@8318,0]
+../fonts/TestMORXTwo.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+004F,U+004F,U+004F,U+0041,U+0042,U+0058,U+0059,U+005A,U+0043,U+0044,U+004F,U+004F,U+004F,U+0033:[O|O@418,0|O@836,0|D@1254,0|B@2084,0|X@2914,0|Y@3744,0|Z@4574,0|C@5404,0|A@6234,0|O@7064,0|O@7482,0|O@7900,0|three@8318,0]
+../fonts/TestMORXTwo.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+004F,U+004F,U+004F,U+0041,U+0042,U+0058,U+0059,U+005A,U+0043,U+0044,U+004F,U+004F,U+004F,U+0034:[O|O@418,0|O@836,0|X@1254,0|Y@2084,0|Z@2914,0|C@3744,0|D@4574,0|A@5404,0|B@6234,0|O@7064,0|O@7482,0|O@7900,0|four@8318,0]
+../fonts/TestMORXTwo.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+004F,U+004F,U+004F,U+0041,U+0042,U+0058,U+0059,U+005A,U+0043,U+0044,U+004F,U+004F,U+004F,U+0035:[O|O@418,0|O@836,0|X@1254,0|Y@2084,0|Z@2914,0|C@3744,0|D@4574,0|B@5404,0|A@6234,0|O@7064,0|O@7482,0|O@7900,0|five@8318,0]
+../fonts/TestMORXTwo.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+004F,U+004F,U+004F,U+0041,U+0042,U+0058,U+0059,U+005A,U+0043,U+0044,U+004F,U+004F,U+004F,U+0036:[O|O@418,0|O@836,0|C@1254,0|D@2084,0|A@2914,0|B@3744,0|X@4574,0|Y@5404,0|Z@6234,0|O@7064,0|O@7482,0|O@7900,0|six@8318,0]
+../fonts/TestMORXTwo.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+004F,U+004F,U+004F,U+0041,U+0042,U+0058,U+0059,U+005A,U+0043,U+0044,U+004F,U+004F,U+004F,U+0037:[O|O@418,0|O@836,0|D@1254,0|C@2084,0|A@2914,0|B@3744,0|X@4574,0|Y@5404,0|Z@6234,0|O@7064,0|O@7482,0|O@7900,0|seven@8318,0]
+../fonts/TestMORXTwo.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+004F,U+004F,U+004F,U+0041,U+0042,U+0058,U+0059,U+005A,U+0043,U+0044,U+004F,U+004F,U+004F,U+0038:[O|O@418,0|O@836,0|C@1254,0|D@2084,0|B@2914,0|X@3744,0|Y@4574,0|Z@5404,0|A@6234,0|O@7064,0|O@7482,0|O@7900,0|eight@8318,0]
+../fonts/TestMORXTwo.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+004F,U+004F,U+004F,U+0041,U+0042,U+0058,U+0059,U+005A,U+0043,U+0044,U+004F,U+004F,U+004F,U+0039:[O|O@418,0|O@836,0|D@1254,0|C@2084,0|B@2914,0|X@3744,0|Y@4574,0|Z@5404,0|A@6234,0|O@7064,0|O@7482,0|O@7900,0|nine@8318,0]
+../fonts/TestMORXTwo.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+004F,U+004F,U+004F,U+0041,U+0042,U+0058,U+0059,U+005A,U+0043,U+0044,U+004F,U+004F,U+004F,U+2793:[O|O@418,0|O@836,0|D@1254,0|X@2084,0|Y@2914,0|Z@3744,0|C@4574,0|A@5404,0|B@6234,0|O@7064,0|O@7482,0|O@7900,0|one_zero@8318,0]
+../fonts/TestMORXTwo.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+004F,U+004F,U+004F,U+0041,U+0042,U+0058,U+0059,U+005A,U+0043,U+0044,U+004F,U+004F,U+004F,U+24EB:[O|O@418,0|O@836,0|D@1254,0|X@2084,0|Y@2914,0|Z@3744,0|C@4574,0|B@5404,0|A@6234,0|O@7064,0|O@7482,0|O@7900,0|one_one@8318,0]
+../fonts/TestMORXTwo.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+004F,U+004F,U+004F,U+0041,U+0042,U+0058,U+0059,U+005A,U+0043,U+0044,U+004F,U+004F,U+004F,U+24EC:[O|O@418,0|O@836,0|C@1254,0|D@2084,0|X@2914,0|Y@3744,0|Z@4574,0|A@5404,0|B@6234,0|O@7064,0|O@7482,0|O@7900,0|one_two@8318,0]
+../fonts/TestMORXTwo.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+004F,U+004F,U+004F,U+0041,U+0042,U+0058,U+0059,U+005A,U+0043,U+0044,U+004F,U+004F,U+004F,U+24ED:[O|O@418,0|O@836,0|C@1254,0|D@2084,0|X@2914,0|Y@3744,0|Z@4574,0|B@5404,0|A@6234,0|O@7064,0|O@7482,0|O@7900,0|one_three@8318,0]
+../fonts/TestMORXTwo.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+004F,U+004F,U+004F,U+0041,U+0042,U+0058,U+0059,U+005A,U+0043,U+0044,U+004F,U+004F,U+004F,U+24EE:[O|O@418,0|O@836,0|D@1254,0|C@2084,0|X@2914,0|Y@3744,0|Z@4574,0|A@5404,0|B@6234,0|O@7064,0|O@7482,0|O@7900,0|one_four@8318,0]
+../fonts/TestMORXTwo.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+004F,U+004F,U+004F,U+0041,U+0042,U+0058,U+0059,U+005A,U+0043,U+0044,U+004F,U+004F,U+004F,U+24EF:[O|O@418,0|O@836,0|D@1254,0|C@2084,0|X@2914,0|Y@3744,0|Z@4574,0|B@5404,0|A@6234,0|O@7064,0|O@7482,0|O@7900,0|one_five@8318,0]
diff --git a/test/shaping/data/text-rendering-tests/tests/MORX-20.tests b/test/shaping/data/text-rendering-tests/tests/MORX-20.tests
new file mode 100644
index 0000000..8d04192
--- /dev/null
+++ b/test/shaping/data/text-rendering-tests/tests/MORX-20.tests
@@ -0,0 +1,7 @@
+../fonts/TestMORXTwenty.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0041,U+0042,U+0043,U+0044,U+0045:[A|B@639,0|C.alt@1265,0|D@2265,0|E.alt1@2939,0]
+../fonts/TestMORXTwenty.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0041,U+0042,U+0043:[A|B@639,0|C.alt@1265,0]
+../fonts/TestMORXTwenty.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0041,U+0042,U+0045:[A|B.alt@639,0|E.alt1@1639,0]
+../fonts/TestMORXTwenty.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0041,U+0045:[A.alt|E.alt1@1000,0]
+../fonts/TestMORXTwenty.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0045,U+0045:[E|E@556,0]
+../fonts/TestMORXTwenty.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0041:[A.alt]
+../fonts/TestMORXTwenty.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0045:[E]
diff --git a/test/shaping/data/text-rendering-tests/tests/MORX-21.tests b/test/shaping/data/text-rendering-tests/tests/MORX-21.tests
new file mode 100644
index 0000000..a608755
--- /dev/null
+++ b/test/shaping/data/text-rendering-tests/tests/MORX-21.tests
@@ -0,0 +1 @@
+../fonts/TestMORXTwentyone.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0041,U+0042,U+0043,U+0044,U+0045:[A|B.alt@639,0|C@1639,0|D@2235,0|E@2909,0]
diff --git a/test/shaping/data/text-rendering-tests/tests/MORX-22.tests b/test/shaping/data/text-rendering-tests/tests/MORX-22.tests
new file mode 100644
index 0000000..960874c
--- /dev/null
+++ b/test/shaping/data/text-rendering-tests/tests/MORX-22.tests
@@ -0,0 +1 @@
+../fonts/TestMORXTwentytwo.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0041:[C]
diff --git a/test/shaping/data/text-rendering-tests/tests/MORX-23.tests b/test/shaping/data/text-rendering-tests/tests/MORX-23.tests
new file mode 100644
index 0000000..9575a80
--- /dev/null
+++ b/test/shaping/data/text-rendering-tests/tests/MORX-23.tests
@@ -0,0 +1 @@
+../fonts/TestMORXTwentythree.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0041,U+0042,U+0043,U+0044,U+0045:[E|E@556,0|E@1112,0|E@1668,0|E@2224,0]
diff --git a/test/shaping/data/text-rendering-tests/tests/MORX-24.tests b/test/shaping/data/text-rendering-tests/tests/MORX-24.tests
new file mode 100644
index 0000000..79a3d7b
--- /dev/null
+++ b/test/shaping/data/text-rendering-tests/tests/MORX-24.tests
@@ -0,0 +1 @@
+../fonts/TestMORXTwentyfour.ttf::U+0041,U+0042,U+0043,U+0044,U+0045:*
diff --git a/test/shaping/data/text-rendering-tests/tests/MORX-25.tests b/test/shaping/data/text-rendering-tests/tests/MORX-25.tests
new file mode 100644
index 0000000..ccd0563
--- /dev/null
+++ b/test/shaping/data/text-rendering-tests/tests/MORX-25.tests
@@ -0,0 +1,9 @@
+../fonts/TestMORXTwentyfive.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0041,U+0042,U+0043,U+0044,U+0045:[A.alt|B.alt@1000,0|C.alt@2000,0|D.alt@3000,0|E.alt@4000,0]
+../fonts/TestMORXTwentyfive.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0045,U+0042,U+0043,U+0044,U+0041:[E|B@556,0|C@1182,0|D@1778,0|A@2452,0]
+../fonts/TestMORXTwentyfive.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0043,U+0042,U+0041,U+0042,U+0043:[C|B@596,0|A.alt@1222,0|B.alt@2222,0|C.alt@3222,0]
+../fonts/TestMORXTwentyfive.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0041,U+0042,U+0043:[A.alt|B.alt@1000,0|C.alt@2000,0]
+../fonts/TestMORXTwentyfive.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0043,U+0042,U+0041:[C|B@596,0|A@1222,0]
+../fonts/TestMORXTwentyfive.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0041,U+0042:[A.alt|B.alt@1000,0]
+../fonts/TestMORXTwentyfive.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0042,U+0041:[B|A@626,0]
+../fonts/TestMORXTwentyfive.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0041:[A]
+../fonts/TestMORXTwentyfive.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0042:[B]
diff --git a/test/shaping/data/text-rendering-tests/tests/MORX-26.tests b/test/shaping/data/text-rendering-tests/tests/MORX-26.tests
new file mode 100644
index 0000000..bebae60
--- /dev/null
+++ b/test/shaping/data/text-rendering-tests/tests/MORX-26.tests
@@ -0,0 +1,2 @@
+../fonts/TestMORXTwentysix.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0041,U+0042:[A|B@639,0]
+../fonts/TestMORXTwentysix.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0042:[B.alt]
diff --git a/test/shaping/data/text-rendering-tests/tests/MORX-27.tests b/test/shaping/data/text-rendering-tests/tests/MORX-27.tests
new file mode 100644
index 0000000..1ec96a2
--- /dev/null
+++ b/test/shaping/data/text-rendering-tests/tests/MORX-27.tests
@@ -0,0 +1,3 @@
+../fonts/TestMORXTwentyseven.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0041,U+0045,U+0042:[A_E_B]
+../fonts/TestMORXTwentyseven.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0041,U+0045,U+0043:[A_E_C]
+../fonts/TestMORXTwentyseven.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0041,U+0045,U+0044:[A_E_D]
diff --git a/test/shaping/data/text-rendering-tests/tests/MORX-28.tests b/test/shaping/data/text-rendering-tests/tests/MORX-28.tests
new file mode 100644
index 0000000..59f5d25
--- /dev/null
+++ b/test/shaping/data/text-rendering-tests/tests/MORX-28.tests
@@ -0,0 +1,5 @@
+../fonts/TestMORXTwentyeight.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0041,U+0045,U+0044:[A_E_D]
+../fonts/TestMORXTwentyeight.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0041,U+0078,U+0045,U+0044:[A_E_D|x@1394,0]
+../fonts/TestMORXTwentyeight.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0041,U+0045,U+0079,U+0044:[A_E_D|y@1394,0]
+../fonts/TestMORXTwentyeight.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0041,U+0078,U+0045,U+0079,U+0044:[A_E_D|x@1394,0|y@1923,0]
+../fonts/TestMORXTwentyeight.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0041,U+0078,U+0078,U+0078,U+0045,U+0079,U+0079,U+0079,U+0044:[A_E_D|x@1394,0|x@1923,0|x@2452,0|y@2981,0|y@3491,0|y@4001,0]
diff --git a/test/shaping/data/text-rendering-tests/tests/MORX-29.tests b/test/shaping/data/text-rendering-tests/tests/MORX-29.tests
new file mode 100644
index 0000000..82fd963
--- /dev/null
+++ b/test/shaping/data/text-rendering-tests/tests/MORX-29.tests
@@ -0,0 +1,4 @@
+../fonts/TestMORXTwentynine.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0050,U+0051,U+0052,U+004D,U+004D,U+0058,U+0058,U+004D,U+004D,U+0059,U+0059,U+0041,U+005A,U+005A:[P|Q@333,0|R@699,0|M@1050,0|M@1880,0|X@2710,0|X@3074,0|M@3438,0|I@4268,0|N@5098,0|S@5928,0|M@6758,0|Y@7588,0|Y@7920,0|A@8252,0|Z@9082,0|Z@9404,0]
+../fonts/TestMORXTwentynine.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0050,U+0051,U+0052,U+004D,U+004D,U+0058,U+0058,U+004D,U+004D,U+0059,U+0059,U+0042,U+005A,U+005A:[P|Q@333,0|R@699,0|M@1050,0|M@1880,0|X@2710,0|X@3074,0|M@3438,0|M@4268,0|I@5098,0|N@5928,0|S@6758,0|Y@7588,0|Y@7920,0|B@8252,0|Z@9082,0|Z@9404,0]
+../fonts/TestMORXTwentynine.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0050,U+0051,U+0052,U+004D,U+004D,U+0058,U+0058,U+004D,U+004D,U+0059,U+0059,U+0043,U+005A,U+005A:[P|Q@333,0|R@699,0|M@1050,0|M@1880,0|X@2710,0|X@3074,0|M@3438,0|M@4268,0|Y@5098,0|Y@5430,0|I@5762,0|N@6592,0|S@7422,0|C@8252,0|Z@9082,0|Z@9404,0]
+../fonts/TestMORXTwentynine.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0050,U+0051,U+0052,U+004D,U+004D,U+0058,U+0058,U+004D,U+004D,U+0059,U+0059,U+0044,U+005A,U+005A:[P|Q@333,0|R@699,0|M@1050,0|M@1880,0|X@2710,0|X@3074,0|M@3438,0|M@4268,0|Y@5098,0|Y@5430,0|D@5762,0|I@6592,0|N@7422,0|S@8252,0|Z@9082,0|Z@9404,0]
diff --git a/test/shaping/data/text-rendering-tests/tests/MORX-3.tests b/test/shaping/data/text-rendering-tests/tests/MORX-3.tests
new file mode 100644
index 0000000..fc7fe94
--- /dev/null
+++ b/test/shaping/data/text-rendering-tests/tests/MORX-3.tests
@@ -0,0 +1,16 @@
+../fonts/TestMORXThree.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0041,U+0042,U+0058,U+0043,U+0044,U+0030:[A|B@363,0|X@722,0|C@1086,0|D@1402,0|zero@1793,0]
+../fonts/TestMORXThree.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0041,U+0042,U+0058,U+0043,U+0044,U+0031:[A|B@363,0|X@722,0|C@1086,0|D@1402,0|one@1793,0]
+../fonts/TestMORXThree.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0041,U+0042,U+0058,U+0043,U+0044,U+0032:[A|B@363,0|X@722,0|C@1086,0|D@1402,0|two@1793,0]
+../fonts/TestMORXThree.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0041,U+0042,U+0058,U+0043,U+0044,U+0033:[A|B@363,0|X@722,0|C@1086,0|D@1402,0|three@1793,0]
+../fonts/TestMORXThree.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0041,U+0042,U+0058,U+0043,U+0044,U+0034:[A|B@363,0|X@722,0|C@1086,0|D@1402,0|four@1793,0]
+../fonts/TestMORXThree.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0041,U+0042,U+0058,U+0043,U+0044,U+0035:[A|B@363,0|X@722,0|C@1086,0|D@1402,0|five@1793,0]
+../fonts/TestMORXThree.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0041,U+0042,U+0058,U+0043,U+0044,U+0036:[A|B@363,0|X@722,0|C@1086,0|D@1402,0|six@1793,0]
+../fonts/TestMORXThree.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0041,U+0042,U+0058,U+0043,U+0044,U+0037:[A|B@363,0|X@722,0|C@1086,0|D@1402,0|seven@1793,0]
+../fonts/TestMORXThree.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0041,U+0042,U+0058,U+0043,U+0044,U+0038:[A|B@363,0|X@722,0|C@1086,0|D@1402,0|eight@1793,0]
+../fonts/TestMORXThree.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0041,U+0042,U+0058,U+0043,U+0044,U+0039:[A|B@363,0|X@722,0|C@1086,0|D@1402,0|nine@1793,0]
+../fonts/TestMORXThree.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0041,U+0042,U+0058,U+0043,U+0044,U+2793:[A|B@363,0|X@722,0|C@1086,0|D@1402,0|one_zero@1793,0]
+../fonts/TestMORXThree.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0041,U+0042,U+0058,U+0043,U+0044,U+24EB:[A|B@363,0|X@722,0|C@1086,0|D@1402,0|one_one@1793,0]
+../fonts/TestMORXThree.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0041,U+0042,U+0058,U+0043,U+0044,U+24EC:[A|B@363,0|X@722,0|C@1086,0|D@1402,0|one_two@1793,0]
+../fonts/TestMORXThree.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0041,U+0042,U+0058,U+0043,U+0044,U+24ED:[A|B@363,0|X@722,0|C@1086,0|D@1402,0|one_three@1793,0]
+../fonts/TestMORXThree.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0041,U+0042,U+0058,U+0043,U+0044,U+24EE:[A|B@363,0|X@722,0|C@1086,0|D@1402,0|one_four@1793,0]
+../fonts/TestMORXThree.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0041,U+0042,U+0058,U+0043,U+0044,U+24EF:[A|B@363,0|X@722,0|C@1086,0|D@1402,0|one_five@1793,0]
diff --git a/test/shaping/data/text-rendering-tests/tests/MORX-30.tests b/test/shaping/data/text-rendering-tests/tests/MORX-30.tests
new file mode 100644
index 0000000..ad4ab21
--- /dev/null
+++ b/test/shaping/data/text-rendering-tests/tests/MORX-30.tests
@@ -0,0 +1,4 @@
+../fonts/TestMORXTwentynine.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0050,U+0051,U+0052,U+004D,U+004D,U+0058,U+0058,U+0058,U+0041,U+0059,U+0059,U+0041,U+005A,U+005A:[P|Q@333,0|R@699,0|M@1050,0|I@1880,0|N@2710,0|S@3540,0|I@4370,0|N@5200,0|S@6030,0|M@6860,0|X@7690,0|X@8054,0|X@8418,0|A@8782,0|Y@9612,0|Y@9944,0|A@10276,0|Z@11106,0|Z@11428,0]
+../fonts/TestMORXTwentynine.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0050,U+0051,U+0052,U+004D,U+004D,U+0058,U+0058,U+0058,U+0041,U+0059,U+0059,U+0042,U+005A,U+005A:[P|Q@333,0|R@699,0|M@1050,0|I@1880,0|I@2710,0|N@3540,0|S@4370,0|N@5200,0|S@6030,0|M@6860,0|X@7690,0|X@8054,0|X@8418,0|A@8782,0|Y@9612,0|Y@9944,0|B@10276,0|Z@11106,0|Z@11428,0]
+../fonts/TestMORXTwentynine.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0050,U+0051,U+0052,U+004D,U+004D,U+0058,U+0058,U+0058,U+0042,U+0059,U+0059,U+0041,U+005A,U+005A:[P|Q@333,0|R@699,0|M@1050,0|I@1880,0|N@2710,0|S@3540,0|M@4370,0|I@5200,0|N@6030,0|S@6860,0|X@7690,0|X@8054,0|X@8418,0|B@8782,0|Y@9612,0|Y@9944,0|A@10276,0|Z@11106,0|Z@11428,0]
+../fonts/TestMORXTwentynine.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0050,U+0051,U+0052,U+004D,U+004D,U+0058,U+0058,U+0058,U+0042,U+0059,U+0059,U+0042,U+005A,U+005A:[P|Q@333,0|R@699,0|M@1050,0|M@1880,0|I@2710,0|N@3540,0|S@4370,0|I@5200,0|N@6030,0|S@6860,0|X@7690,0|X@8054,0|X@8418,0|B@8782,0|Y@9612,0|Y@9944,0|B@10276,0|Z@11106,0|Z@11428,0]
diff --git a/test/shaping/data/text-rendering-tests/tests/MORX-31.tests b/test/shaping/data/text-rendering-tests/tests/MORX-31.tests
new file mode 100644
index 0000000..ac09e27
--- /dev/null
+++ b/test/shaping/data/text-rendering-tests/tests/MORX-31.tests
@@ -0,0 +1,8 @@
+../fonts/TestMORXThirtyone.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0058,U+0058,U+0041,U+0059,U+0059,U+0041,U+005A,U+005A:[I|N@830,0|I@1660,0|N@2490,0|S@3320,0|S@4150,0|X@4980,0|X@5344,0|A@5708,0|Y@6538,0|Y@6870,0|A@7202,0|Z@8032,0|Z@8354,0]
+../fonts/TestMORXThirtyone.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0058,U+0058,U+0041,U+0059,U+0059,U+0042,U+0059,U+0059:[I|N@830,0|S@1660,0|I@2490,0|N@3320,0|S@4150,0|X@4980,0|X@5344,0|A@5708,0|Y@6538,0|Y@6870,0|B@7202,0|Y@8032,0|Y@8364,0]
+../fonts/TestMORXThirtyone.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0058,U+0058,U+0042,U+0059,U+0059,U+0041,U+005A,U+005A:[X|I@364,0|I@1194,0|N@2024,0|S@2854,0|N@3684,0|S@4514,0|X@5344,0|B@5708,0|Y@6538,0|Y@6870,0|A@7202,0|Z@8032,0|Z@8354,0]
+../fonts/TestMORXThirtyone.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0058,U+0058,U+0042,U+0059,U+0059,U+0042,U+005A,U+005A:[X|I@364,0|N@1194,0|I@2024,0|N@2854,0|S@3684,0|S@4514,0|X@5344,0|B@5708,0|Y@6538,0|Y@6870,0|B@7202,0|Z@8032,0|Z@8354,0]
+../fonts/TestMORXThirtyone.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+004D,U+0050,U+0051,U+0052,U+0041,U+0058,U+0059,U+005A,U+0041:[I|N@830,0|S@1660,0|M@2490,0|I@3320,0|N@4150,0|S@4980,0|P@5810,0|Q@6143,0|R@6509,0|A@6860,0|X@7690,0|Y@8054,0|Z@8386,0|A@8708,0]
+../fonts/TestMORXThirtyone.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+004D,U+0050,U+0051,U+0052,U+0041,U+0058,U+0059,U+005A,U+0042:[I|N@830,0|S@1660,0|M@2490,0|P@3320,0|I@3653,0|N@4483,0|S@5313,0|Q@6143,0|R@6509,0|A@6860,0|X@7690,0|Y@8054,0|Z@8386,0|B@8708,0]
+../fonts/TestMORXThirtyone.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+004D,U+0050,U+0051,U+0052,U+0042,U+0058,U+0059,U+005A,U+0041:[M|I@830,0|N@1660,0|S@2490,0|I@3320,0|N@4150,0|S@4980,0|P@5810,0|Q@6143,0|R@6509,0|B@6860,0|X@7690,0|Y@8054,0|Z@8386,0|A@8708,0]
+../fonts/TestMORXThirtyone.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+004D,U+0050,U+0051,U+0052,U+0042,U+0058,U+0059,U+005A,U+0042:[M|I@830,0|N@1660,0|S@2490,0|P@3320,0|I@3653,0|N@4483,0|S@5313,0|Q@6143,0|R@6509,0|B@6860,0|X@7690,0|Y@8054,0|Z@8386,0|B@8708,0]
diff --git a/test/shaping/data/text-rendering-tests/tests/MORX-32.tests b/test/shaping/data/text-rendering-tests/tests/MORX-32.tests
new file mode 100644
index 0000000..6f3ae88
--- /dev/null
+++ b/test/shaping/data/text-rendering-tests/tests/MORX-32.tests
@@ -0,0 +1,4 @@
+../fonts/TestMORXThirtytwo.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0041:[I|N@830,0|S@1660,0|A@2490,0]
+../fonts/TestMORXThirtytwo.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0058,U+0041,U+0059:[I|N@830,0|S@1660,0|X@2490,0|A@2854,0|Y@3684,0]
+../fonts/TestMORXThirtytwo.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0042:[B|I@830,0|N@1660,0|S@2490,0]
+../fonts/TestMORXThirtytwo.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0058,U+0042,U+0059:[X|I@364,0|N@1194,0|S@2024,0|B@2854,0|Y@3684,0]
diff --git a/test/shaping/data/text-rendering-tests/tests/MORX-33.tests b/test/shaping/data/text-rendering-tests/tests/MORX-33.tests
new file mode 100644
index 0000000..17d080a
--- /dev/null
+++ b/test/shaping/data/text-rendering-tests/tests/MORX-33.tests
@@ -0,0 +1,3 @@
+../fonts/TestMORXThirtythree.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0068,U+0061:[h|a@618,0|h@1179,0|a@1797,0]
+../fonts/TestMORXThirtythree.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0068,U+0061,U+0068,U+0061:[h|a@618,0|h@1179,0|a@1797,0|h@2358,0|a@2976,0|h@3537,0|a@4155,0]
+../fonts/TestMORXThirtythree.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0061,U+0068:[a|h@561,0]
diff --git a/test/shaping/data/text-rendering-tests/tests/MORX-34.tests b/test/shaping/data/text-rendering-tests/tests/MORX-34.tests
new file mode 100644
index 0000000..8c309df
--- /dev/null
+++ b/test/shaping/data/text-rendering-tests/tests/MORX-34.tests
@@ -0,0 +1 @@
+../fonts/TestMORXThirtyfour.ttf::U+0068,U+0061:*
diff --git a/test/shaping/data/text-rendering-tests/tests/MORX-35.tests b/test/shaping/data/text-rendering-tests/tests/MORX-35.tests
new file mode 100644
index 0000000..a033185
--- /dev/null
+++ b/test/shaping/data/text-rendering-tests/tests/MORX-35.tests
@@ -0,0 +1,2 @@
+../fonts/TestMORXThirtyfive.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0041:[A|B@639,0|C@1265,0|E@1861,0]
+../fonts/TestMORXThirtyfive.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0058,U+0041,U+0059:[X|A@586,0|B@1225,0|C@1851,0|E@2447,0|Y@3003,0]
diff --git a/test/shaping/data/text-rendering-tests/tests/MORX-36.tests b/test/shaping/data/text-rendering-tests/tests/MORX-36.tests
new file mode 100644
index 0000000..6b2340e
--- /dev/null
+++ b/test/shaping/data/text-rendering-tests/tests/MORX-36.tests
@@ -0,0 +1 @@
+../fonts/TestMORXThirtysix.ttf::U+0041:*
diff --git a/test/shaping/data/text-rendering-tests/tests/MORX-37.tests b/test/shaping/data/text-rendering-tests/tests/MORX-37.tests
new file mode 100644
index 0000000..f28c5e2
--- /dev/null
+++ b/test/shaping/data/text-rendering-tests/tests/MORX-37.tests
@@ -0,0 +1,4 @@
+../fonts/TestMORXThirtyseven.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0041,U+0042:[A.alt|B.alt@1000,0]
+../fonts/TestMORXThirtyseven.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0042,U+0041:[B|A@650,0]
+../fonts/TestMORXThirtyseven.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+05D0,U+05D1:[uni05D1|uni05D0@542,0]
+../fonts/TestMORXThirtyseven.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+05D1,U+05D0:[uni05D0.alt|uni05D1.alt@1000,0]
diff --git a/test/shaping/data/text-rendering-tests/tests/MORX-38.tests b/test/shaping/data/text-rendering-tests/tests/MORX-38.tests
new file mode 100644
index 0000000..abefe29
--- /dev/null
+++ b/test/shaping/data/text-rendering-tests/tests/MORX-38.tests
@@ -0,0 +1,4 @@
+../fonts/TestMORXThirtyeight.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0041,U+0042:[A.alt|B.alt@1000,0]
+../fonts/TestMORXThirtyeight.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0042,U+0041:[B|A@650,0]
+../fonts/TestMORXThirtyeight.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+05D0,U+05D1:[uni05D1.alt|uni05D0.alt@1000,0]
+../fonts/TestMORXThirtyeight.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+05D1,U+05D0:[uni05D0|uni05D1@606,0]
diff --git a/test/shaping/data/text-rendering-tests/tests/MORX-39.tests b/test/shaping/data/text-rendering-tests/tests/MORX-39.tests
new file mode 100644
index 0000000..83bfa52
--- /dev/null
+++ b/test/shaping/data/text-rendering-tests/tests/MORX-39.tests
@@ -0,0 +1,4 @@
+../fonts/TestMORXThirtynine.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0041,U+0042:[A|B@639,0]
+../fonts/TestMORXThirtynine.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0042,U+0041:[B.alt|A.alt@1000,0]
+../fonts/TestMORXThirtynine.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+05D0,U+05D1:[uni05D1.alt|uni05D0.alt@1000,0]
+../fonts/TestMORXThirtynine.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+05D1,U+05D0:[uni05D0|uni05D1@606,0]
diff --git a/test/shaping/data/text-rendering-tests/tests/MORX-4.tests b/test/shaping/data/text-rendering-tests/tests/MORX-4.tests
new file mode 100644
index 0000000..cbb1ce8
--- /dev/null
+++ b/test/shaping/data/text-rendering-tests/tests/MORX-4.tests
@@ -0,0 +1,15 @@
+../fonts/TestMORXFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0050,U+0051,U+0052,U+0041,U+0058,U+0059,U+005A,U+0031:[P|Q@333,0|R@699,0|A@1050,0|X@1880,0|Y@2244,0|Z@2576,0|one@2898,0]
+../fonts/TestMORXFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0050,U+0051,U+0052,U+0041,U+0058,U+0059,U+005A,U+0032:[P|Q@333,0|R@699,0|A@1050,0|X@1880,0|Y@2244,0|Z@2576,0|two@2898,0]
+../fonts/TestMORXFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0050,U+0051,U+0052,U+0041,U+0044,U+0058,U+0059,U+005A,U+0033:[P|Q@333,0|R@699,0|D@1050,0|A@1880,0|X@2710,0|Y@3074,0|Z@3406,0|three@3728,0]
+../fonts/TestMORXFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0050,U+0051,U+0052,U+0041,U+0042,U+0058,U+0059,U+005A,U+0034:[P|Q@333,0|R@699,0|A@1050,0|B@1880,0|X@2710,0|Y@3074,0|Z@3406,0|four@3728,0]
+../fonts/TestMORXFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0050,U+0051,U+0052,U+0041,U+0042,U+0058,U+0059,U+005A,U+0035:[P|Q@333,0|R@699,0|B@1050,0|A@1880,0|X@2710,0|Y@3074,0|Z@3406,0|five@3728,0]
+../fonts/TestMORXFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0050,U+0051,U+0052,U+0041,U+0042,U+0058,U+0059,U+005A,U+0036:[P|Q@333,0|R@699,0|A@1050,0|B@1880,0|X@2710,0|Y@3074,0|Z@3406,0|six@3728,0]
+../fonts/TestMORXFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0050,U+0051,U+0052,U+0041,U+0042,U+0058,U+0059,U+005A,U+0037:[P|Q@333,0|R@699,0|B@1050,0|A@1880,0|X@2710,0|Y@3074,0|Z@3406,0|seven@3728,0]
+../fonts/TestMORXFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0050,U+0051,U+0052,U+0041,U+0043,U+0044,U+0058,U+0059,U+005A,U+0038:[P|Q@333,0|R@699,0|C@1050,0|D@1880,0|A@2710,0|X@3540,0|Y@3904,0|Z@4236,0|eight@4558,0]
+../fonts/TestMORXFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0050,U+0051,U+0052,U+0041,U+0043,U+0044,U+0058,U+0059,U+005A,U+0039:[P|Q@333,0|R@699,0|D@1050,0|C@1880,0|A@2710,0|X@3540,0|Y@3904,0|Z@4236,0|nine@4558,0]
+../fonts/TestMORXFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0050,U+0051,U+0052,U+0041,U+0042,U+0044,U+0058,U+0059,U+005A,U+2793:[P|Q@333,0|R@699,0|D@1050,0|A@1880,0|B@2710,0|X@3540,0|Y@3904,0|Z@4236,0|one_zero@4558,0]
+../fonts/TestMORXFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0050,U+0051,U+0052,U+0041,U+0042,U+0044,U+0058,U+0059,U+005A,U+24EB:[P|Q@333,0|R@699,0|D@1050,0|B@1880,0|A@2710,0|X@3540,0|Y@3904,0|Z@4236,0|one_one@4558,0]
+../fonts/TestMORXFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0050,U+0051,U+0052,U+0041,U+0042,U+0043,U+0044,U+0058,U+0059,U+005A,U+24EC:[P|Q@333,0|R@699,0|C@1050,0|D@1880,0|A@2710,0|B@3540,0|X@4370,0|Y@4734,0|Z@5066,0|one_two@5388,0]
+../fonts/TestMORXFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0050,U+0051,U+0052,U+0041,U+0042,U+0043,U+0044,U+0058,U+0059,U+005A,U+24ED:[P|Q@333,0|R@699,0|C@1050,0|D@1880,0|B@2710,0|A@3540,0|X@4370,0|Y@4734,0|Z@5066,0|one_three@5388,0]
+../fonts/TestMORXFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0050,U+0051,U+0052,U+0041,U+0042,U+0043,U+0044,U+0058,U+0059,U+005A,U+24EE:[P|Q@333,0|R@699,0|D@1050,0|C@1880,0|A@2710,0|B@3540,0|X@4370,0|Y@4734,0|Z@5066,0|one_four@5388,0]
+../fonts/TestMORXFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0050,U+0051,U+0052,U+0041,U+0042,U+0043,U+0044,U+0058,U+0059,U+005A,U+24EF:[P|Q@333,0|R@699,0|D@1050,0|C@1880,0|B@2710,0|A@3540,0|X@4370,0|Y@4734,0|Z@5066,0|one_five@5388,0]
diff --git a/test/shaping/data/text-rendering-tests/tests/MORX-40.tests b/test/shaping/data/text-rendering-tests/tests/MORX-40.tests
new file mode 100644
index 0000000..c99155e
--- /dev/null
+++ b/test/shaping/data/text-rendering-tests/tests/MORX-40.tests
@@ -0,0 +1,4 @@
+../fonts/TestMORXForty.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0041,U+0042:[A|B@639,0]
+../fonts/TestMORXForty.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0042,U+0041:[B.alt|A.alt@1000,0]
+../fonts/TestMORXForty.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+05D0,U+05D1:[uni05D1|uni05D0@542,0]
+../fonts/TestMORXForty.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+05D1,U+05D0:[uni05D0.alt|uni05D1.alt@1000,0]
diff --git a/test/shaping/data/text-rendering-tests/tests/MORX-41.tests b/test/shaping/data/text-rendering-tests/tests/MORX-41.tests
new file mode 100644
index 0000000..815bebe
--- /dev/null
+++ b/test/shaping/data/text-rendering-tests/tests/MORX-41.tests
@@ -0,0 +1,4 @@
+../fonts/TestMORXFourtyone.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0061,U+0063:[a_c]
+../fonts/TestMORXFourtyone.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0062,U+0063:[b_c]
+../fonts/TestMORXFourtyone.ttf::U+0063,U+0063:*
+../fonts/TestMORXFourtyone.ttf::U+0061,U+0062,U+0063,U+0063:*
diff --git a/test/shaping/data/text-rendering-tests/tests/MORX-5.tests b/test/shaping/data/text-rendering-tests/tests/MORX-5.tests
new file mode 100644
index 0000000..ca8d086
--- /dev/null
+++ b/test/shaping/data/text-rendering-tests/tests/MORX-5.tests
@@ -0,0 +1,25 @@
+../fonts/TestMORXFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0050,U+0051,U+0052,U+0041,U+0058,U+0059,U+005A,U+0033:[P|Q@333,0|R@699,0|A@1050,0|X@1880,0|Y@2244,0|Z@2576,0|three@2898,0]
+../fonts/TestMORXFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0050,U+0051,U+0052,U+0041,U+0058,U+0059,U+005A,U+0034:[P|Q@333,0|R@699,0|A@1050,0|X@1880,0|Y@2244,0|Z@2576,0|four@2898,0]
+../fonts/TestMORXFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0050,U+0051,U+0052,U+0041,U+0058,U+0059,U+005A,U+0035:[P|Q@333,0|R@699,0|A@1050,0|X@1880,0|Y@2244,0|Z@2576,0|five@2898,0]
+../fonts/TestMORXFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0050,U+0051,U+0052,U+0041,U+0058,U+0059,U+005A,U+0036:[P|Q@333,0|R@699,0|A@1050,0|X@1880,0|Y@2244,0|Z@2576,0|six@2898,0]
+../fonts/TestMORXFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0050,U+0051,U+0052,U+0041,U+0058,U+0059,U+005A,U+0037:[P|Q@333,0|R@699,0|A@1050,0|X@1880,0|Y@2244,0|Z@2576,0|seven@2898,0]
+../fonts/TestMORXFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0050,U+0051,U+0052,U+0041,U+0058,U+0059,U+005A,U+0038:[P|Q@333,0|R@699,0|A@1050,0|X@1880,0|Y@2244,0|Z@2576,0|eight@2898,0]
+../fonts/TestMORXFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0050,U+0051,U+0052,U+0041,U+0042,U+0058,U+0059,U+005A,U+0038:[P|Q@333,0|R@699,0|A@1050,0|B@1880,0|X@2710,0|Y@3074,0|Z@3406,0|eight@3728,0]
+../fonts/TestMORXFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0050,U+0051,U+0052,U+0041,U+0058,U+0059,U+005A,U+0039:[P|Q@333,0|R@699,0|A@1050,0|X@1880,0|Y@2244,0|Z@2576,0|nine@2898,0]
+../fonts/TestMORXFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0050,U+0051,U+0052,U+0041,U+0042,U+0058,U+0059,U+005A,U+0039:[P|Q@333,0|R@699,0|A@1050,0|B@1880,0|X@2710,0|Y@3074,0|Z@3406,0|nine@3728,0]
+../fonts/TestMORXFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0050,U+0051,U+0052,U+0041,U+0058,U+0059,U+005A,U+2793:[P|Q@333,0|R@699,0|A@1050,0|X@1880,0|Y@2244,0|Z@2576,0|one_zero@2898,0]
+../fonts/TestMORXFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0050,U+0051,U+0052,U+0041,U+0042,U+0058,U+0059,U+005A,U+2793:[P|Q@333,0|R@699,0|A@1050,0|B@1880,0|X@2710,0|Y@3074,0|Z@3406,0|one_zero@3728,0]
+../fonts/TestMORXFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0050,U+0051,U+0052,U+0041,U+0058,U+0059,U+005A,U+24EB:[P|Q@333,0|R@699,0|A@1050,0|X@1880,0|Y@2244,0|Z@2576,0|one_one@2898,0]
+../fonts/TestMORXFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0050,U+0051,U+0052,U+0041,U+0042,U+0058,U+0059,U+005A,U+24EB:[P|Q@333,0|R@699,0|A@1050,0|B@1880,0|X@2710,0|Y@3074,0|Z@3406,0|one_one@3728,0]
+../fonts/TestMORXFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0050,U+0051,U+0052,U+0041,U+0058,U+0059,U+005A,U+24EC:[P|Q@333,0|R@699,0|A@1050,0|X@1880,0|Y@2244,0|Z@2576,0|one_two@2898,0]
+../fonts/TestMORXFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0050,U+0051,U+0052,U+0041,U+0042,U+0058,U+0059,U+005A,U+24EC:[P|Q@333,0|R@699,0|A@1050,0|B@1880,0|X@2710,0|Y@3074,0|Z@3406,0|one_two@3728,0]
+../fonts/TestMORXFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0050,U+0051,U+0052,U+0041,U+0042,U+0043,U+0058,U+0059,U+005A,U+24EC:[P|Q@333,0|R@699,0|A@1050,0|B@1880,0|C@2710,0|X@3540,0|Y@3904,0|Z@4236,0|one_two@4558,0]
+../fonts/TestMORXFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0050,U+0051,U+0052,U+0041,U+0058,U+0059,U+005A,U+24ED:[P|Q@333,0|R@699,0|A@1050,0|X@1880,0|Y@2244,0|Z@2576,0|one_three@2898,0]
+../fonts/TestMORXFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0050,U+0051,U+0052,U+0041,U+0042,U+0058,U+0059,U+005A,U+24ED:[P|Q@333,0|R@699,0|A@1050,0|B@1880,0|X@2710,0|Y@3074,0|Z@3406,0|one_three@3728,0]
+../fonts/TestMORXFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0050,U+0051,U+0052,U+0041,U+0042,U+0043,U+0058,U+0059,U+005A,U+24ED:[P|Q@333,0|R@699,0|A@1050,0|B@1880,0|C@2710,0|X@3540,0|Y@3904,0|Z@4236,0|one_three@4558,0]
+../fonts/TestMORXFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0050,U+0051,U+0052,U+0041,U+0058,U+0059,U+005A,U+24EE:[P|Q@333,0|R@699,0|A@1050,0|X@1880,0|Y@2244,0|Z@2576,0|one_four@2898,0]
+../fonts/TestMORXFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0050,U+0051,U+0052,U+0041,U+0042,U+0058,U+0059,U+005A,U+24EE:[P|Q@333,0|R@699,0|A@1050,0|B@1880,0|X@2710,0|Y@3074,0|Z@3406,0|one_four@3728,0]
+../fonts/TestMORXFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0050,U+0051,U+0052,U+0041,U+0042,U+0043,U+0058,U+0059,U+005A,U+24EE:[P|Q@333,0|R@699,0|A@1050,0|B@1880,0|C@2710,0|X@3540,0|Y@3904,0|Z@4236,0|one_four@4558,0]
+../fonts/TestMORXFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0050,U+0051,U+0052,U+0041,U+0058,U+0059,U+005A,U+24EF:[P|Q@333,0|R@699,0|A@1050,0|X@1880,0|Y@2244,0|Z@2576,0|one_five@2898,0]
+../fonts/TestMORXFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0050,U+0051,U+0052,U+0041,U+0042,U+0058,U+0059,U+005A,U+24EF:[P|Q@333,0|R@699,0|A@1050,0|B@1880,0|X@2710,0|Y@3074,0|Z@3406,0|one_five@3728,0]
+../fonts/TestMORXFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0050,U+0051,U+0052,U+0041,U+0042,U+0043,U+0058,U+0059,U+005A,U+24EF:[P|Q@333,0|R@699,0|A@1050,0|B@1880,0|C@2710,0|X@3540,0|Y@3904,0|Z@4236,0|one_five@4558,0]
diff --git a/test/shaping/data/text-rendering-tests/tests/MORX-6.tests b/test/shaping/data/text-rendering-tests/tests/MORX-6.tests
new file mode 100644
index 0000000..ff9c061
--- /dev/null
+++ b/test/shaping/data/text-rendering-tests/tests/MORX-6.tests
@@ -0,0 +1 @@
+../fonts/TestMORXTwo.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+004F,U+004F,U+004F,U+0041,U+0042,U+0043,U+0044,U+0045,U+0046,U+0047,U+004F,U+004F,U+004F,U+0033,U+0031,U+0034,U+0031:[O|O@418,0|O@836,0|E@1254,0|F@2084,0|A@2914,0|G@3744,0|B@4574,0|C@5404,0|D@6234,0|O@7064,0|O@7482,0|O@7900,0|three@8318,0|one@9168,0|four@10018,0|one@10868,0]
diff --git a/test/shaping/data/text-rendering-tests/tests/MORX-7.tests b/test/shaping/data/text-rendering-tests/tests/MORX-7.tests
new file mode 100644
index 0000000..f250848
--- /dev/null
+++ b/test/shaping/data/text-rendering-tests/tests/MORX-7.tests
@@ -0,0 +1 @@
+../fonts/TestMORXTwo.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+004F,U+0042,U+0043,U+0044,U+0031:[B|C@830,0|D@1660,0|O@2490,0|one@2908,0]
diff --git a/test/shaping/data/text-rendering-tests/tests/MORX-8.tests b/test/shaping/data/text-rendering-tests/tests/MORX-8.tests
new file mode 100644
index 0000000..aa0d28b
--- /dev/null
+++ b/test/shaping/data/text-rendering-tests/tests/MORX-8.tests
@@ -0,0 +1,3 @@
+../fonts/TestMORXEight.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0030,U+0041,U+0042,U+0043:[zero|A@914,0|B@1552,0|C@2202,0]
+../fonts/TestMORXEight.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0031,U+0041,U+0042,U+0043:[one|B@914,0|C@1564,0|A@2196,0]
+../fonts/TestMORXEight.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0032,U+0041,U+0042,U+0043:[two|C@914,0|A@1546,0|B@2184,0]
diff --git a/test/shaping/data/text-rendering-tests/tests/MORX-9.tests b/test/shaping/data/text-rendering-tests/tests/MORX-9.tests
new file mode 100644
index 0000000..a899908
--- /dev/null
+++ b/test/shaping/data/text-rendering-tests/tests/MORX-9.tests
@@ -0,0 +1 @@
+../fonts/TestMORXNine.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0041,U+0042,U+0058,U+0041,U+0042:[B|A@650,0|X@1288,0|A@1874,0|B@2512,0]
diff --git a/test/shaping/hb_test_tools.py b/test/shaping/hb_test_tools.py
index 8348dc2..feff70a 100644
--- a/test/shaping/hb_test_tools.py
+++ b/test/shaping/hb_test_tools.py
@@ -4,6 +4,10 @@ from __future__ import print_function, division, absolute_import
import sys, os, re, difflib, unicodedata, errno, cgi
from itertools import *
+try:
+ import unicodedata2 as unicodedata
+except Exception:
+ pass
diff_symbols = "-+=*&^%$#@!~/"
diff_colors = ['red', 'green', 'blue']
@@ -56,10 +60,10 @@ try:
yield 0x10000 + (high_surrogate - 0xD800) * 0x400 + (cp - 0xDC00)
high_surrogate = None
else:
- yield 0xFFFC
+ yield 0xFFFD
else:
if high_surrogate:
- yield 0xFFFC
+ yield 0xFFFD
high_surrogate = None
if 0xD800 <= cp <= 0xDBFF:
high_surrogate = cp
@@ -67,7 +71,7 @@ try:
yield cp
high_surrogate = None
if high_surrogate:
- yield 0xFFFC
+ yield 0xFFFD
except NameError:
unichr = chr
diff --git a/test/shaping/record-test.sh b/test/shaping/record-test.sh
index 93ebcfc..4ab74f0 100755
--- a/test/shaping/record-test.sh
+++ b/test/shaping/record-test.sh
@@ -3,8 +3,9 @@
dir=`mktemp -d`
out=/dev/stdout
-if test "x${1:0:3}" == 'x-o='; then
- out=${1:3}
+if test "x$1" == 'x-o'; then
+ shift
+ out=$1
shift
fi
hb_shape=$1
diff --git a/test/shaping/run-tests.py b/test/shaping/run-tests.py
index 73b61c2..26853e4 100755
--- a/test/shaping/run-tests.py
+++ b/test/shaping/run-tests.py
@@ -2,31 +2,34 @@
from __future__ import print_function, division, absolute_import
-import sys, os, subprocess
-
+import sys, os, subprocess, hashlib, tempfile, shutil
def cmd(command):
- p = subprocess.Popen (
- command, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
- p.wait ()
- print (p.stderr.read (), end="") # file=sys.stderr
- return p.stdout.read ().decode ("utf-8").strip (), p.returncode
-
+ global process
+ process.stdin.write ((' '.join (command) + '\n').encode ("utf-8"))
+ process.stdin.flush ()
+ return process.stdout.readline().decode ("utf-8").strip ()
args = sys.argv[1:]
-if not args or sys.argv[1].find('hb-shape') == -1 or not os.path.exists (sys.argv[1]):
+
+reference = False
+if len (args) and args[0] == "--reference":
+ reference = True
+ args = args[1:]
+
+if not args or args[0].find('hb-shape') == -1 or not os.path.exists (args[0]):
print ("""First argument does not seem to point to usable hb-shape.""")
sys.exit (1)
hb_shape, args = args[0], args[1:]
-extra_options = "--verify"
+process = subprocess.Popen ([hb_shape, '--batch'],
+ stdin=subprocess.PIPE,
+ stdout=subprocess.PIPE,
+ stderr=sys.stdout)
+passes = 0
fails = 0
-
-reference = False
-if len (args) and args[0] == "--reference":
- reference = True
- args = args[1:]
+skips = 0
if not len (args):
args = ['-']
@@ -44,56 +47,95 @@ for filename in args:
f = open (filename)
for line in f:
+ comment = False
+ if line.startswith ("#"):
+ comment = True
+ line = line[1:]
+
+ if line.startswith (' '):
+ if not reference:
+ print ("#%s" % line)
+ continue
+
+ line = line.strip ()
+ if not line:
+ continue
+
fontfile, options, unicodes, glyphs_expected = line.split (":")
- cwd = os.path.dirname(filename)
- fontfile = os.path.normpath (os.path.join (cwd, fontfile))
+ if fontfile.startswith ('/') or fontfile.startswith ('"/'):
+ fontfile, expected_hash = fontfile.split('@')
+
+ try:
+ with open (fontfile, 'rb') as ff:
+ actual_hash = hashlib.sha1 (ff.read()).hexdigest ().strip ()
+ if actual_hash != expected_hash:
+ print ('different version of %s found; Expected hash %s, got %s; skipping.' %
+ (fontfile, expected_hash, actual_hash))
+ skips += 1
+ continue
+ except:
+ print ('%s not found, skip.' % fontfile)
+ skips += 1
+ continue
+ else:
+ cwd = os.path.dirname(filename)
+ fontfile = os.path.normpath (os.path.join (cwd, fontfile))
- if line.startswith ("#"):
+ extra_options = ["--shaper=ot"]
+ if glyphs_expected != '*':
+ extra_options.append("--verify")
+
+ if comment:
if not reference:
- print ("# %s %s --unicodes %s" % (hb_shape, fontfile, unicodes))
+ print ('# %s "%s" --unicodes %s' % (hb_shape, fontfile, unicodes))
continue
if not reference:
- print ("%s %s %s %s --unicodes %s" %
- (hb_shape, fontfile, extra_options, options, unicodes))
-
- glyphs1, returncode = cmd ([hb_shape, "--font-funcs=ft",
- fontfile, extra_options, "--unicodes",
- unicodes] + (options.split (' ') if options else []))
+ print ('%s "%s" %s %s --unicodes %s' %
+ (hb_shape, fontfile, ' '.join(extra_options), options, unicodes))
- if returncode:
- print ("hb-shape --font-funcs=ft failed.") # file=sys.stderr
- fails = fails + 1
- #continue
+ # hack to support fonts with space on run-tests.py, after several other tries...
+ if ' ' in fontfile:
+ new_fontfile = os.path.join (tempfile.gettempdir (), 'tmpfile')
+ shutil.copyfile(fontfile, new_fontfile)
+ fontfile = new_fontfile
- glyphs2, returncode = cmd ([hb_shape, "--font-funcs=ot",
- fontfile, extra_options, "--unicodes",
+ glyphs1 = cmd ([hb_shape, "--font-funcs=ft",
+ fontfile] + extra_options + ["--unicodes",
unicodes] + (options.split (' ') if options else []))
- if returncode:
- print ("ERROR: hb-shape --font-funcs=ot failed.") # file=sys.stderr
- fails = fails + 1
- #continue
+ glyphs2 = cmd ([hb_shape, "--font-funcs=ot",
+ fontfile] + extra_options + ["--unicodes",
+ unicodes] + (options.split (' ') if options else []))
- if glyphs1 != glyphs2:
+ if glyphs1 != glyphs2 and glyphs_expected != '*':
print ("FT funcs: " + glyphs1) # file=sys.stderr
print ("OT funcs: " + glyphs2) # file=sys.stderr
- fails = fails + 1
+ fails += 1
+ else:
+ passes += 1
if reference:
print (":".join ([fontfile, options, unicodes, glyphs1]))
continue
- if glyphs1.strip() != glyphs_expected.strip():
+ if glyphs1.strip() != glyphs_expected and glyphs_expected != '*':
print ("Actual: " + glyphs1) # file=sys.stderr
print ("Expected: " + glyphs_expected) # file=sys.stderr
- fails = fails + 1
+ fails += 1
+ else:
+ passes += 1
-if fails != 0:
- if not reference:
- print (str (fails) + " tests failed.") # file=sys.stderr
- sys.exit (1)
+if not reference:
+ print ("%d tests passed; %d failed; %d skipped." % (passes, fails, skips)) # file=sys.stderr
+ if not (fails + passes):
+ print ("No tests ran.")
+ elif not (fails + skips):
+ print ("All tests passed.")
+if fails:
+ sys.exit (1)
+elif passes:
+ sys.exit (0)
else:
- if not reference:
- print ("All tests passed.")
+ sys.exit (77)
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-assamese/utrrs/LICENSE b/test/shaping/texts/in-house/shaper-indic/script-assamese/utrrs/LICENSE
index 2cf8228..2cf8228 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-assamese/utrrs/LICENSE
+++ b/test/shaping/texts/in-house/shaper-indic/script-assamese/utrrs/LICENSE
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-assamese/utrrs/README b/test/shaping/texts/in-house/shaper-indic/script-assamese/utrrs/README
index 8bad337..8bad337 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-assamese/utrrs/README
+++ b/test/shaping/texts/in-house/shaper-indic/script-assamese/utrrs/README
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-assamese/utrrs/SOURCES b/test/shaping/texts/in-house/shaper-indic/script-assamese/utrrs/SOURCES
index 0ed1a89..0ed1a89 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-assamese/utrrs/SOURCES
+++ b/test/shaping/texts/in-house/shaper-indic/script-assamese/utrrs/SOURCES
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-assamese/utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalVowels.txt b/test/shaping/texts/in-house/shaper-indic/script-assamese/utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalVowels.txt
index 2bc4fff..2bc4fff 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-assamese/utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalVowels.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-assamese/utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalVowels.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-assamese/utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt b/test/shaping/texts/in-house/shaper-indic/script-assamese/utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt
index 0f8fa91..0f8fa91 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-assamese/utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-assamese/utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-assamese/utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt b/test/shaping/texts/in-house/shaper-indic/script-assamese/utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt
index ddf03c0..ddf03c0 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-assamese/utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-assamese/utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-assamese/utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt b/test/shaping/texts/in-house/shaper-indic/script-assamese/utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt
index 870ce26..870ce26 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-assamese/utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-assamese/utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-assamese/utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt b/test/shaping/texts/in-house/shaper-indic/script-assamese/utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt
index 821c261..821c261 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-assamese/utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-assamese/utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-assamese/utrrs/codepoint/IndicFontFeatureCodepoint-Reserved.txt b/test/shaping/texts/in-house/shaper-indic/script-assamese/utrrs/codepoint/IndicFontFeatureCodepoint-Reserved.txt
index 66a7ca4..66a7ca4 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-assamese/utrrs/codepoint/IndicFontFeatureCodepoint-Reserved.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-assamese/utrrs/codepoint/IndicFontFeatureCodepoint-Reserved.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-assamese/utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt b/test/shaping/texts/in-house/shaper-indic/script-assamese/utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt
index 0afc191..0afc191 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-assamese/utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-assamese/utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-assamese/utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt b/test/shaping/texts/in-house/shaper-indic/script-assamese/utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt
index ebbc87d..ebbc87d 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-assamese/utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-assamese/utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-assamese/utrrs/gpos/IndicFontFeatureGPOS-BelowBase.txt b/test/shaping/texts/in-house/shaper-indic/script-assamese/utrrs/gpos/IndicFontFeatureGPOS-BelowBase.txt
index accebeb..accebeb 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-assamese/utrrs/gpos/IndicFontFeatureGPOS-BelowBase.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-assamese/utrrs/gpos/IndicFontFeatureGPOS-BelowBase.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-assamese/utrrs/gsub/IndicFontFeatureGSUB.txt b/test/shaping/texts/in-house/shaper-indic/script-assamese/utrrs/gsub/IndicFontFeatureGSUB.txt
index 87e5ea8..87e5ea8 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-assamese/utrrs/gsub/IndicFontFeatureGSUB.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-assamese/utrrs/gsub/IndicFontFeatureGSUB.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/script-bengali/bengali-vowel-letters.txt b/test/shaping/texts/in-house/shaper-indic/script-bengali/bengali-vowel-letters.txt
new file mode 100644
index 0000000..f09dbc8
--- /dev/null
+++ b/test/shaping/texts/in-house/shaper-indic/script-bengali/bengali-vowel-letters.txt
@@ -0,0 +1,3 @@
+আ অা
+ৠ ঋৃ
+ৡ ঌৢ
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-bengali/misc/misc.txt b/test/shaping/texts/in-house/shaper-indic/script-bengali/misc/misc.txt
index aa43590..aa43590 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-bengali/misc/misc.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-bengali/misc/misc.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-bengali/misc/reph.txt b/test/shaping/texts/in-house/shaper-indic/script-bengali/misc/reph.txt
index 9739eaa..9739eaa 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-bengali/misc/reph.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-bengali/misc/reph.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-bengali/utrrs/LICENSE b/test/shaping/texts/in-house/shaper-indic/script-bengali/utrrs/LICENSE
index 2cf8228..2cf8228 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-bengali/utrrs/LICENSE
+++ b/test/shaping/texts/in-house/shaper-indic/script-bengali/utrrs/LICENSE
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-bengali/utrrs/README b/test/shaping/texts/in-house/shaper-indic/script-bengali/utrrs/README
index 8bad337..8bad337 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-bengali/utrrs/README
+++ b/test/shaping/texts/in-house/shaper-indic/script-bengali/utrrs/README
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-bengali/utrrs/SOURCES b/test/shaping/texts/in-house/shaper-indic/script-bengali/utrrs/SOURCES
index 0ed1a89..0ed1a89 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-bengali/utrrs/SOURCES
+++ b/test/shaping/texts/in-house/shaper-indic/script-bengali/utrrs/SOURCES
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-bengali/utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalVowels.txt b/test/shaping/texts/in-house/shaper-indic/script-bengali/utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalVowels.txt
index fd5e6e6..fd5e6e6 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-bengali/utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalVowels.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-bengali/utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalVowels.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-bengali/utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt b/test/shaping/texts/in-house/shaper-indic/script-bengali/utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt
index 7554b36..7554b36 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-bengali/utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-bengali/utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-bengali/utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt b/test/shaping/texts/in-house/shaper-indic/script-bengali/utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt
index ddf03c0..ddf03c0 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-bengali/utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-bengali/utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-bengali/utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt b/test/shaping/texts/in-house/shaper-indic/script-bengali/utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt
index 870ce26..870ce26 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-bengali/utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-bengali/utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-bengali/utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt b/test/shaping/texts/in-house/shaper-indic/script-bengali/utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt
index 169ba5d..169ba5d 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-bengali/utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-bengali/utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-bengali/utrrs/codepoint/IndicFontFeatureCodepoint-Reserved.txt b/test/shaping/texts/in-house/shaper-indic/script-bengali/utrrs/codepoint/IndicFontFeatureCodepoint-Reserved.txt
index 66a7ca4..66a7ca4 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-bengali/utrrs/codepoint/IndicFontFeatureCodepoint-Reserved.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-bengali/utrrs/codepoint/IndicFontFeatureCodepoint-Reserved.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-bengali/utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt b/test/shaping/texts/in-house/shaper-indic/script-bengali/utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt
index 0afc191..0afc191 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-bengali/utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-bengali/utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-bengali/utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt b/test/shaping/texts/in-house/shaper-indic/script-bengali/utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt
index 7c652be..7c652be 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-bengali/utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-bengali/utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-bengali/utrrs/gpos/IndicFontFeatureGPOS-BelowBase.txt b/test/shaping/texts/in-house/shaper-indic/script-bengali/utrrs/gpos/IndicFontFeatureGPOS-BelowBase.txt
index 2fd42e0..2fd42e0 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-bengali/utrrs/gpos/IndicFontFeatureGPOS-BelowBase.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-bengali/utrrs/gpos/IndicFontFeatureGPOS-BelowBase.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-bengali/utrrs/gsub/IndicFontFeatureGSUB.txt b/test/shaping/texts/in-house/shaper-indic/script-bengali/utrrs/gsub/IndicFontFeatureGSUB.txt
index b45b778..b45b778 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-bengali/utrrs/gsub/IndicFontFeatureGSUB.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-bengali/utrrs/gsub/IndicFontFeatureGSUB.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/script-devanagari/devanagari-atomic-consonants.txt b/test/shaping/texts/in-house/shaper-indic/script-devanagari/devanagari-atomic-consonants.txt
new file mode 100644
index 0000000..4265436
--- /dev/null
+++ b/test/shaping/texts/in-house/shaper-indic/script-devanagari/devanagari-atomic-consonants.txt
@@ -0,0 +1,33 @@
+ख ख्ा ख्‍ा
+ग ग्ा ग्‍ा
+घ घ्ा घ्‍ा
+च च्ा च्‍ा
+ज ज्ा ज्‍ा
+झ झ्ा झ्‍ा
+ञ ञ्ा ञ्‍ा
+ण ण्ा ण्‍ा
+त त्ा त्‍ा
+थ थ्ा थ्‍ा
+ध ध्ा ध्‍ा
+न न्ा न्‍ा
+ऩ ऩ्ा ऩ्‍ा ऩ्ा ऩ्‍ा
+प प्ा प्‍ा
+ब ब्ा ब्‍ा
+भ भ्ा भ्‍ा
+म म्ा म्‍ा
+य य्ा य्‍ा
+ल ल्ा ल्‍ा
+व व्ा व्‍ा
+श श्ा श्‍ा
+ष ष्ा ष्‍ा
+स स्ा स्‍ा
+ख़ ख़्ा ख़्‍ा ख़्ा ख़्‍ा
+ग़ ग़्ा ग़्‍ा ग़्ा ग़्‍ा
+ज़ ज़्ा ज़्‍ा ज़्ा ज़्‍ा
+य़ य़्ा य़्‍ा य़्ा य़्‍ा
+ॹ ॹ्ा ॹ्‍ा
+ॺ ॺ्ा ॺ्‍ा
+ज़ ॻ्ा ॻ्‍ा
+ॼ ॼ्ा ॼ्‍ा
+ॾ ॾ्ा ॾ्‍ा
+ॿ ॿ्ा ॿ्‍ा
diff --git a/test/shaping/texts/in-house/shaper-indic/script-devanagari/devanagari-vowel-letters.txt b/test/shaping/texts/in-house/shaper-indic/script-devanagari/devanagari-vowel-letters.txt
new file mode 100644
index 0000000..5a41252
--- /dev/null
+++ b/test/shaping/texts/in-house/shaper-indic/script-devanagari/devanagari-vowel-letters.txt
@@ -0,0 +1,17 @@
+ऄ अॆ
+आ अा
+ई र्इ
+ऊ उु
+ऍ एॅ
+ऎ एॆ
+ऐ एे
+ऑ अॉ आॅ
+ऒ अॊ आॆ
+ओ अो आे
+औ अौ आै
+ॲ अॅ
+ॳ अऺ
+ॴ अऻ आऺ
+ॵ अॏ
+ॶ अॖ
+ॷ अॗ
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-devanagari/misc/dottedcircle.txt b/test/shaping/texts/in-house/shaper-indic/script-devanagari/misc/dottedcircle.txt
index fd0ebdb..fd0ebdb 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-devanagari/misc/dottedcircle.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-devanagari/misc/dottedcircle.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-devanagari/misc/eyelash.txt b/test/shaping/texts/in-house/shaper-indic/script-devanagari/misc/eyelash.txt
index 8e11955..8e11955 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-devanagari/misc/eyelash.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-devanagari/misc/eyelash.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-devanagari/misc/joiners.txt b/test/shaping/texts/in-house/shaper-indic/script-devanagari/misc/joiners.txt
index 75f85cc..75f85cc 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-devanagari/misc/joiners.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-devanagari/misc/joiners.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-devanagari/misc/misc.txt b/test/shaping/texts/in-house/shaper-indic/script-devanagari/misc/misc.txt
index 4a8326c..4a8326c 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-devanagari/misc/misc.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-devanagari/misc/misc.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-devanagari/misc/spec-deviations.txt b/test/shaping/texts/in-house/shaper-indic/script-devanagari/misc/spec-deviations.txt
index 4814019..4814019 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-devanagari/misc/spec-deviations.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-devanagari/misc/spec-deviations.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-devanagari/misc/tricky-reordering.txt b/test/shaping/texts/in-house/shaper-indic/script-devanagari/misc/tricky-reordering.txt
index 1723ced..1723ced 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-devanagari/misc/tricky-reordering.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-devanagari/misc/tricky-reordering.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-devanagari/utrrs/LICENSE b/test/shaping/texts/in-house/shaper-indic/script-devanagari/utrrs/LICENSE
index 2cf8228..2cf8228 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-devanagari/utrrs/LICENSE
+++ b/test/shaping/texts/in-house/shaper-indic/script-devanagari/utrrs/LICENSE
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-devanagari/utrrs/README b/test/shaping/texts/in-house/shaper-indic/script-devanagari/utrrs/README
index 8bad337..8bad337 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-devanagari/utrrs/README
+++ b/test/shaping/texts/in-house/shaper-indic/script-devanagari/utrrs/README
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-devanagari/utrrs/SOURCES b/test/shaping/texts/in-house/shaper-indic/script-devanagari/utrrs/SOURCES
index 0ed1a89..0ed1a89 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-devanagari/utrrs/SOURCES
+++ b/test/shaping/texts/in-house/shaper-indic/script-devanagari/utrrs/SOURCES
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-devanagari/utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalConsonants.txt b/test/shaping/texts/in-house/shaper-indic/script-devanagari/utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalConsonants.txt
index 89cefb6..89cefb6 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-devanagari/utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalConsonants.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-devanagari/utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalConsonants.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-devanagari/utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalVowels.txt b/test/shaping/texts/in-house/shaper-indic/script-devanagari/utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalVowels.txt
index 9f7cda9..9f7cda9 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-devanagari/utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalVowels.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-devanagari/utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalVowels.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-devanagari/utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt b/test/shaping/texts/in-house/shaper-indic/script-devanagari/utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt
index 3aa66ce..3aa66ce 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-devanagari/utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-devanagari/utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-devanagari/utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt b/test/shaping/texts/in-house/shaper-indic/script-devanagari/utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt
index 04cf0a7..04cf0a7 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-devanagari/utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-devanagari/utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-devanagari/utrrs/codepoint/IndicFontFeatureCodepoint-DevnagariSpecificAddition.txt b/test/shaping/texts/in-house/shaper-indic/script-devanagari/utrrs/codepoint/IndicFontFeatureCodepoint-DevnagariSpecificAddition.txt
index 7b0b32c..7b0b32c 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-devanagari/utrrs/codepoint/IndicFontFeatureCodepoint-DevnagariSpecificAddition.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-devanagari/utrrs/codepoint/IndicFontFeatureCodepoint-DevnagariSpecificAddition.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-devanagari/utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt b/test/shaping/texts/in-house/shaper-indic/script-devanagari/utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt
index 1427002..1427002 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-devanagari/utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-devanagari/utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-devanagari/utrrs/codepoint/IndicFontFeatureCodepoint-GenericPunctuation.txt b/test/shaping/texts/in-house/shaper-indic/script-devanagari/utrrs/codepoint/IndicFontFeatureCodepoint-GenericPunctuation.txt
index 66a7ca4..66a7ca4 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-devanagari/utrrs/codepoint/IndicFontFeatureCodepoint-GenericPunctuation.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-devanagari/utrrs/codepoint/IndicFontFeatureCodepoint-GenericPunctuation.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-devanagari/utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt b/test/shaping/texts/in-house/shaper-indic/script-devanagari/utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt
index b336c35..b336c35 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-devanagari/utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-devanagari/utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-devanagari/utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt b/test/shaping/texts/in-house/shaper-indic/script-devanagari/utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt
index 2ff3e87..2ff3e87 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-devanagari/utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-devanagari/utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-devanagari/utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt b/test/shaping/texts/in-house/shaper-indic/script-devanagari/utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt
index 6d57308..6d57308 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-devanagari/utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-devanagari/utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-devanagari/utrrs/gpos/IndicFontFeatureGPOS-BelowBase.txt b/test/shaping/texts/in-house/shaper-indic/script-devanagari/utrrs/gpos/IndicFontFeatureGPOS-BelowBase.txt
index bff1a7b..bff1a7b 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-devanagari/utrrs/gpos/IndicFontFeatureGPOS-BelowBase.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-devanagari/utrrs/gpos/IndicFontFeatureGPOS-BelowBase.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-devanagari/utrrs/gsub/IndicFontFeatureGSUB.txt b/test/shaping/texts/in-house/shaper-indic/script-devanagari/utrrs/gsub/IndicFontFeatureGSUB.txt
index 3b5e620..3b5e620 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-devanagari/utrrs/gsub/IndicFontFeatureGSUB.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-devanagari/utrrs/gsub/IndicFontFeatureGSUB.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/script-gujarati/gujarati-vowel-letters.txt b/test/shaping/texts/in-house/shaper-indic/script-gujarati/gujarati-vowel-letters.txt
new file mode 100644
index 0000000..add4332
--- /dev/null
+++ b/test/shaping/texts/in-house/shaper-indic/script-gujarati/gujarati-vowel-letters.txt
@@ -0,0 +1,8 @@
+આ અા
+ઍ અૅ
+એ અે
+ઐ અૈ
+ઑ અૉ
+ઓ અો અાૅ
+ઔ અૌ અાૈ
+ૉ ૅા
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-gujarati/utrrs/LICENSE b/test/shaping/texts/in-house/shaper-indic/script-gujarati/utrrs/LICENSE
index 2cf8228..2cf8228 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-gujarati/utrrs/LICENSE
+++ b/test/shaping/texts/in-house/shaper-indic/script-gujarati/utrrs/LICENSE
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-gujarati/utrrs/README b/test/shaping/texts/in-house/shaper-indic/script-gujarati/utrrs/README
index 8bad337..8bad337 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-gujarati/utrrs/README
+++ b/test/shaping/texts/in-house/shaper-indic/script-gujarati/utrrs/README
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-gujarati/utrrs/SOURCES b/test/shaping/texts/in-house/shaper-indic/script-gujarati/utrrs/SOURCES
index 0ed1a89..0ed1a89 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-gujarati/utrrs/SOURCES
+++ b/test/shaping/texts/in-house/shaper-indic/script-gujarati/utrrs/SOURCES
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-gujarati/utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalVowels.txt b/test/shaping/texts/in-house/shaper-indic/script-gujarati/utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalVowels.txt
index fd5e6e6..fd5e6e6 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-gujarati/utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalVowels.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-gujarati/utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalVowels.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-gujarati/utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt b/test/shaping/texts/in-house/shaper-indic/script-gujarati/utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt
index e91003a..e91003a 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-gujarati/utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-gujarati/utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-gujarati/utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt b/test/shaping/texts/in-house/shaper-indic/script-gujarati/utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt
index 3650298..3650298 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-gujarati/utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-gujarati/utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-gujarati/utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt b/test/shaping/texts/in-house/shaper-indic/script-gujarati/utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt
index eabae39..eabae39 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-gujarati/utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-gujarati/utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-gujarati/utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt b/test/shaping/texts/in-house/shaper-indic/script-gujarati/utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt
index 116eb60..116eb60 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-gujarati/utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-gujarati/utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-gujarati/utrrs/codepoint/IndicFontFeatureCodepoint-Reserved.txt b/test/shaping/texts/in-house/shaper-indic/script-gujarati/utrrs/codepoint/IndicFontFeatureCodepoint-Reserved.txt
index 66a7ca4..66a7ca4 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-gujarati/utrrs/codepoint/IndicFontFeatureCodepoint-Reserved.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-gujarati/utrrs/codepoint/IndicFontFeatureCodepoint-Reserved.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-gujarati/utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt b/test/shaping/texts/in-house/shaper-indic/script-gujarati/utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt
index 218e507..218e507 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-gujarati/utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-gujarati/utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-gujarati/utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt b/test/shaping/texts/in-house/shaper-indic/script-gujarati/utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt
index f7ff3af..f7ff3af 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-gujarati/utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-gujarati/utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-gujarati/utrrs/gpos/IndicFontFeatureGPOS-BelowBase.txt b/test/shaping/texts/in-house/shaper-indic/script-gujarati/utrrs/gpos/IndicFontFeatureGPOS-BelowBase.txt
index fa658cf..fa658cf 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-gujarati/utrrs/gpos/IndicFontFeatureGPOS-BelowBase.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-gujarati/utrrs/gpos/IndicFontFeatureGPOS-BelowBase.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-gujarati/utrrs/gsub/IndicFontFeatureGSUB.txt b/test/shaping/texts/in-house/shaper-indic/script-gujarati/utrrs/gsub/IndicFontFeatureGSUB.txt
index 6211c9b..6211c9b 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-gujarati/utrrs/gsub/IndicFontFeatureGSUB.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-gujarati/utrrs/gsub/IndicFontFeatureGSUB.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/script-gurmukhi/gurmukhi-vowel-letters.txt b/test/shaping/texts/in-house/shaper-indic/script-gurmukhi/gurmukhi-vowel-letters.txt
new file mode 100644
index 0000000..b2adaab
--- /dev/null
+++ b/test/shaping/texts/in-house/shaper-indic/script-gurmukhi/gurmukhi-vowel-letters.txt
@@ -0,0 +1,9 @@
+ਆ ਅਾ
+ਇ ੲਿ
+ਈ ੲੀ
+ਉ ੳੁ
+ਊ ੳੂ
+ਏ ੲੇ
+ਐ ਅੈ
+ਓ ੳੋ
+ਔ ਅੌ
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-gurmukhi/misc/misc.txt b/test/shaping/texts/in-house/shaper-indic/script-gurmukhi/misc/misc.txt
index 27a39f6..27a39f6 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-gurmukhi/misc/misc.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-gurmukhi/misc/misc.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-gurmukhi/utrrs/LICENSE b/test/shaping/texts/in-house/shaper-indic/script-gurmukhi/utrrs/LICENSE
index 2cf8228..2cf8228 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-gurmukhi/utrrs/LICENSE
+++ b/test/shaping/texts/in-house/shaper-indic/script-gurmukhi/utrrs/LICENSE
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-gurmukhi/utrrs/README b/test/shaping/texts/in-house/shaper-indic/script-gurmukhi/utrrs/README
index 8bad337..8bad337 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-gurmukhi/utrrs/README
+++ b/test/shaping/texts/in-house/shaper-indic/script-gurmukhi/utrrs/README
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-gurmukhi/utrrs/SOURCES b/test/shaping/texts/in-house/shaper-indic/script-gurmukhi/utrrs/SOURCES
index 0ed1a89..0ed1a89 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-gurmukhi/utrrs/SOURCES
+++ b/test/shaping/texts/in-house/shaper-indic/script-gurmukhi/utrrs/SOURCES
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-gurmukhi/utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt b/test/shaping/texts/in-house/shaper-indic/script-gurmukhi/utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt
index ee8b3be..ee8b3be 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-gurmukhi/utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-gurmukhi/utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-gurmukhi/utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt b/test/shaping/texts/in-house/shaper-indic/script-gurmukhi/utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt
index a934caa..a934caa 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-gurmukhi/utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-gurmukhi/utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-gurmukhi/utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt b/test/shaping/texts/in-house/shaper-indic/script-gurmukhi/utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt
index d08b7a8..d08b7a8 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-gurmukhi/utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-gurmukhi/utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-gurmukhi/utrrs/codepoint/IndicFontFeatureCodepoint-GurmukhiSpecific.txt b/test/shaping/texts/in-house/shaper-indic/script-gurmukhi/utrrs/codepoint/IndicFontFeatureCodepoint-GurmukhiSpecific.txt
index 8565c88..8565c88 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-gurmukhi/utrrs/codepoint/IndicFontFeatureCodepoint-GurmukhiSpecific.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-gurmukhi/utrrs/codepoint/IndicFontFeatureCodepoint-GurmukhiSpecific.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-gurmukhi/utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt b/test/shaping/texts/in-house/shaper-indic/script-gurmukhi/utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt
index 05827ca..05827ca 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-gurmukhi/utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-gurmukhi/utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-gurmukhi/utrrs/codepoint/IndicFontFeatureCodepoint-Reserved.txt b/test/shaping/texts/in-house/shaper-indic/script-gurmukhi/utrrs/codepoint/IndicFontFeatureCodepoint-Reserved.txt
index 66a7ca4..66a7ca4 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-gurmukhi/utrrs/codepoint/IndicFontFeatureCodepoint-Reserved.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-gurmukhi/utrrs/codepoint/IndicFontFeatureCodepoint-Reserved.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-gurmukhi/utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt b/test/shaping/texts/in-house/shaper-indic/script-gurmukhi/utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt
index adb725e..adb725e 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-gurmukhi/utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-gurmukhi/utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-gurmukhi/utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt b/test/shaping/texts/in-house/shaper-indic/script-gurmukhi/utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt
index 7fdf6e4..7fdf6e4 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-gurmukhi/utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-gurmukhi/utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-gurmukhi/utrrs/gpos/IndicFontFeatureGPOS-BelowBase.txt b/test/shaping/texts/in-house/shaper-indic/script-gurmukhi/utrrs/gpos/IndicFontFeatureGPOS-BelowBase.txt
index 63d54a5..63d54a5 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-gurmukhi/utrrs/gpos/IndicFontFeatureGPOS-BelowBase.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-gurmukhi/utrrs/gpos/IndicFontFeatureGPOS-BelowBase.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-gurmukhi/utrrs/gsub/IndicFontFeatureGSUB.txt b/test/shaping/texts/in-house/shaper-indic/script-gurmukhi/utrrs/gsub/IndicFontFeatureGSUB.txt
index eb2e8ee..eb2e8ee 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-gurmukhi/utrrs/gsub/IndicFontFeatureGSUB.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-gurmukhi/utrrs/gsub/IndicFontFeatureGSUB.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/script-kannada/kannada-vowel-letters.txt b/test/shaping/texts/in-house/shaper-indic/script-kannada/kannada-vowel-letters.txt
new file mode 100644
index 0000000..cc05db9
--- /dev/null
+++ b/test/shaping/texts/in-house/shaper-indic/script-kannada/kannada-vowel-letters.txt
@@ -0,0 +1,3 @@
+ಊ ಉಾ
+ಔ ಒೌ
+ೠ ಋಾ
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-kannada/misc/misc.txt b/test/shaping/texts/in-house/shaper-indic/script-kannada/misc/misc.txt
index a8a6325..a8a6325 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-kannada/misc/misc.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-kannada/misc/misc.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-kannada/misc/right-matras.txt b/test/shaping/texts/in-house/shaper-indic/script-kannada/misc/right-matras.txt
index 3130f35..3130f35 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-kannada/misc/right-matras.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-kannada/misc/right-matras.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-kannada/utrrs/LICENSE b/test/shaping/texts/in-house/shaper-indic/script-kannada/utrrs/LICENSE
index 2cf8228..2cf8228 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-kannada/utrrs/LICENSE
+++ b/test/shaping/texts/in-house/shaper-indic/script-kannada/utrrs/LICENSE
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-kannada/utrrs/README b/test/shaping/texts/in-house/shaper-indic/script-kannada/utrrs/README
index 8bad337..8bad337 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-kannada/utrrs/README
+++ b/test/shaping/texts/in-house/shaper-indic/script-kannada/utrrs/README
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-kannada/utrrs/SOURCES b/test/shaping/texts/in-house/shaper-indic/script-kannada/utrrs/SOURCES
index 0ed1a89..0ed1a89 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-kannada/utrrs/SOURCES
+++ b/test/shaping/texts/in-house/shaper-indic/script-kannada/utrrs/SOURCES
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-kannada/utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalConsonants.txt b/test/shaping/texts/in-house/shaper-indic/script-kannada/utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalConsonants.txt
index fff748a..fff748a 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-kannada/utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalConsonants.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-kannada/utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalConsonants.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-kannada/utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalVowels.txt b/test/shaping/texts/in-house/shaper-indic/script-kannada/utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalVowels.txt
index f641547..f641547 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-kannada/utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalVowels.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-kannada/utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalVowels.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-kannada/utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt b/test/shaping/texts/in-house/shaper-indic/script-kannada/utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt
index 650cbf7..650cbf7 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-kannada/utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-kannada/utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-kannada/utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt b/test/shaping/texts/in-house/shaper-indic/script-kannada/utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt
index 476f39f..476f39f 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-kannada/utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-kannada/utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-kannada/utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt b/test/shaping/texts/in-house/shaper-indic/script-kannada/utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt
index 57ac088..57ac088 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-kannada/utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-kannada/utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-kannada/utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt b/test/shaping/texts/in-house/shaper-indic/script-kannada/utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt
index 38f1719..38f1719 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-kannada/utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-kannada/utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-kannada/utrrs/codepoint/IndicFontFeatureCodepoint-Reserved.txt b/test/shaping/texts/in-house/shaper-indic/script-kannada/utrrs/codepoint/IndicFontFeatureCodepoint-Reserved.txt
index 66a7ca4..66a7ca4 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-kannada/utrrs/codepoint/IndicFontFeatureCodepoint-Reserved.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-kannada/utrrs/codepoint/IndicFontFeatureCodepoint-Reserved.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-kannada/utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt b/test/shaping/texts/in-house/shaper-indic/script-kannada/utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt
index 6bbf23e..6bbf23e 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-kannada/utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-kannada/utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-kannada/utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt b/test/shaping/texts/in-house/shaper-indic/script-kannada/utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt
index 4cc0f56..4cc0f56 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-kannada/utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-kannada/utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-kannada/utrrs/gsub/IndicFontFeatureGSUB.txt b/test/shaping/texts/in-house/shaper-indic/script-kannada/utrrs/gsub/IndicFontFeatureGSUB.txt
index 583072d..583072d 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-kannada/utrrs/gsub/IndicFontFeatureGSUB.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-kannada/utrrs/gsub/IndicFontFeatureGSUB.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/script-malayalam/malayalam-vowel-letters.txt b/test/shaping/texts/in-house/shaper-indic/script-malayalam/malayalam-vowel-letters.txt
new file mode 100644
index 0000000..061c642
--- /dev/null
+++ b/test/shaping/texts/in-house/shaper-indic/script-malayalam/malayalam-vowel-letters.txt
@@ -0,0 +1,5 @@
+ഈ ഇൗ
+ഊ ഉൗ
+ഐ എെ
+ഓ ഒാ
+ഔ ഒൗ
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-malayalam/misc/cibu.txt b/test/shaping/texts/in-house/shaper-indic/script-malayalam/misc/cibu.txt
index 3d53867..3d53867 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-malayalam/misc/cibu.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-malayalam/misc/cibu.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-malayalam/misc/dot-reph.txt b/test/shaping/texts/in-house/shaper-indic/script-malayalam/misc/dot-reph.txt
index fc74da9..fc74da9 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-malayalam/misc/dot-reph.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-malayalam/misc/dot-reph.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-malayalam/misc/misc.txt b/test/shaping/texts/in-house/shaper-indic/script-malayalam/misc/misc.txt
index 2e732ae..2e732ae 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-malayalam/misc/misc.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-malayalam/misc/misc.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-malayalam/utrrs/LICENSE b/test/shaping/texts/in-house/shaper-indic/script-malayalam/utrrs/LICENSE
index 2cf8228..2cf8228 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-malayalam/utrrs/LICENSE
+++ b/test/shaping/texts/in-house/shaper-indic/script-malayalam/utrrs/LICENSE
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-malayalam/utrrs/README b/test/shaping/texts/in-house/shaper-indic/script-malayalam/utrrs/README
index 8bad337..8bad337 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-malayalam/utrrs/README
+++ b/test/shaping/texts/in-house/shaper-indic/script-malayalam/utrrs/README
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-malayalam/utrrs/SOURCES b/test/shaping/texts/in-house/shaper-indic/script-malayalam/utrrs/SOURCES
index 0ed1a89..0ed1a89 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-malayalam/utrrs/SOURCES
+++ b/test/shaping/texts/in-house/shaper-indic/script-malayalam/utrrs/SOURCES
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-malayalam/utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalVowels.txt b/test/shaping/texts/in-house/shaper-indic/script-malayalam/utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalVowels.txt
index 0d1a19b..0d1a19b 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-malayalam/utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalVowels.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-malayalam/utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalVowels.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-malayalam/utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt b/test/shaping/texts/in-house/shaper-indic/script-malayalam/utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt
index 4924e56..4924e56 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-malayalam/utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-malayalam/utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-malayalam/utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt b/test/shaping/texts/in-house/shaper-indic/script-malayalam/utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt
index dc49691..dc49691 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-malayalam/utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-malayalam/utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-malayalam/utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt b/test/shaping/texts/in-house/shaper-indic/script-malayalam/utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt
index c2a9f06..c2a9f06 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-malayalam/utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-malayalam/utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-malayalam/utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt b/test/shaping/texts/in-house/shaper-indic/script-malayalam/utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt
index d879c3b..d879c3b 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-malayalam/utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-malayalam/utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-malayalam/utrrs/codepoint/IndicFontFeatureCodepoint-Reserved.txt b/test/shaping/texts/in-house/shaper-indic/script-malayalam/utrrs/codepoint/IndicFontFeatureCodepoint-Reserved.txt
index 66a7ca4..66a7ca4 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-malayalam/utrrs/codepoint/IndicFontFeatureCodepoint-Reserved.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-malayalam/utrrs/codepoint/IndicFontFeatureCodepoint-Reserved.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-malayalam/utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt b/test/shaping/texts/in-house/shaper-indic/script-malayalam/utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt
index 2c976a4..2c976a4 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-malayalam/utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-malayalam/utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-malayalam/utrrs/gsub/IndicFontFeatureGSUB.txt b/test/shaping/texts/in-house/shaper-indic/script-malayalam/utrrs/gsub/IndicFontFeatureGSUB.txt
index 1053215..1053215 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-malayalam/utrrs/gsub/IndicFontFeatureGSUB.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-malayalam/utrrs/gsub/IndicFontFeatureGSUB.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-oriya/misc/bindu.txt b/test/shaping/texts/in-house/shaper-indic/script-oriya/misc/bindu.txt
index 13de6ee..13de6ee 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-oriya/misc/bindu.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-oriya/misc/bindu.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-oriya/misc/misc.txt b/test/shaping/texts/in-house/shaper-indic/script-oriya/misc/misc.txt
index 44a53df..44a53df 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-oriya/misc/misc.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-oriya/misc/misc.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/script-oriya/oriya-vowel-letters.txt b/test/shaping/texts/in-house/shaper-indic/script-oriya/oriya-vowel-letters.txt
new file mode 100644
index 0000000..e8d24cb
--- /dev/null
+++ b/test/shaping/texts/in-house/shaper-indic/script-oriya/oriya-vowel-letters.txt
@@ -0,0 +1,3 @@
+ଆ ଅା
+ଐ ଏୗ
+ଔ ଓୗ
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-oriya/utrrs/LICENSE b/test/shaping/texts/in-house/shaper-indic/script-oriya/utrrs/LICENSE
index 2cf8228..2cf8228 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-oriya/utrrs/LICENSE
+++ b/test/shaping/texts/in-house/shaper-indic/script-oriya/utrrs/LICENSE
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-oriya/utrrs/README b/test/shaping/texts/in-house/shaper-indic/script-oriya/utrrs/README
index 8bad337..8bad337 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-oriya/utrrs/README
+++ b/test/shaping/texts/in-house/shaper-indic/script-oriya/utrrs/README
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-oriya/utrrs/SOURCES b/test/shaping/texts/in-house/shaper-indic/script-oriya/utrrs/SOURCES
index 0ed1a89..0ed1a89 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-oriya/utrrs/SOURCES
+++ b/test/shaping/texts/in-house/shaper-indic/script-oriya/utrrs/SOURCES
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-oriya/utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalConsonants.txt b/test/shaping/texts/in-house/shaper-indic/script-oriya/utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalConsonants.txt
index c311f42..c311f42 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-oriya/utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalConsonants.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-oriya/utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalConsonants.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-oriya/utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalVowels.txt b/test/shaping/texts/in-house/shaper-indic/script-oriya/utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalVowels.txt
index c15795c..c15795c 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-oriya/utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalVowels.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-oriya/utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalVowels.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-oriya/utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt b/test/shaping/texts/in-house/shaper-indic/script-oriya/utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt
index 5692fa1..5692fa1 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-oriya/utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-oriya/utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-oriya/utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt b/test/shaping/texts/in-house/shaper-indic/script-oriya/utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt
index d95d909..d95d909 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-oriya/utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-oriya/utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-oriya/utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt b/test/shaping/texts/in-house/shaper-indic/script-oriya/utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt
index ce7af5e..ce7af5e 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-oriya/utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-oriya/utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-oriya/utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt b/test/shaping/texts/in-house/shaper-indic/script-oriya/utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt
index 9d21b9d..9d21b9d 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-oriya/utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-oriya/utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-oriya/utrrs/codepoint/IndicFontFeatureCodepoint-OriyaSpecific.txt b/test/shaping/texts/in-house/shaper-indic/script-oriya/utrrs/codepoint/IndicFontFeatureCodepoint-OriyaSpecific.txt
index 6571b52..6571b52 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-oriya/utrrs/codepoint/IndicFontFeatureCodepoint-OriyaSpecific.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-oriya/utrrs/codepoint/IndicFontFeatureCodepoint-OriyaSpecific.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-oriya/utrrs/codepoint/IndicFontFeatureCodepoint-Reserved.txt b/test/shaping/texts/in-house/shaper-indic/script-oriya/utrrs/codepoint/IndicFontFeatureCodepoint-Reserved.txt
index 66a7ca4..66a7ca4 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-oriya/utrrs/codepoint/IndicFontFeatureCodepoint-Reserved.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-oriya/utrrs/codepoint/IndicFontFeatureCodepoint-Reserved.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-oriya/utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt b/test/shaping/texts/in-house/shaper-indic/script-oriya/utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt
index ce411d2..ce411d2 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-oriya/utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-oriya/utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-oriya/utrrs/gsub/IndicFontFeatureGSUB.txt b/test/shaping/texts/in-house/shaper-indic/script-oriya/utrrs/gsub/IndicFontFeatureGSUB.txt
index fe11060..fe11060 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-oriya/utrrs/gsub/IndicFontFeatureGSUB.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-oriya/utrrs/gsub/IndicFontFeatureGSUB.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-sinhala/misc/extensive.txt b/test/shaping/texts/in-house/shaper-indic/script-sinhala/misc/extensive.txt
index 231a1f7..231a1f7 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-sinhala/misc/extensive.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-sinhala/misc/extensive.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-sinhala/misc/misc.txt b/test/shaping/texts/in-house/shaper-indic/script-sinhala/misc/misc.txt
index c43cb95..c43cb95 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-sinhala/misc/misc.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-sinhala/misc/misc.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-sinhala/misc/reph.txt b/test/shaping/texts/in-house/shaper-indic/script-sinhala/misc/reph.txt
index f5f2f53..f5f2f53 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-sinhala/misc/reph.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-sinhala/misc/reph.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-sinhala/misc/split-matras.txt b/test/shaping/texts/in-house/shaper-indic/script-sinhala/misc/split-matras.txt
index 2a73a40..2a73a40 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-sinhala/misc/split-matras.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-sinhala/misc/split-matras.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-sinhala/utrrs/LICENSE b/test/shaping/texts/in-house/shaper-indic/script-sinhala/utrrs/LICENSE
index 2cf8228..2cf8228 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-sinhala/utrrs/LICENSE
+++ b/test/shaping/texts/in-house/shaper-indic/script-sinhala/utrrs/LICENSE
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-sinhala/utrrs/README b/test/shaping/texts/in-house/shaper-indic/script-sinhala/utrrs/README
index 8bad337..8bad337 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-sinhala/utrrs/README
+++ b/test/shaping/texts/in-house/shaper-indic/script-sinhala/utrrs/README
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-sinhala/utrrs/SOURCES b/test/shaping/texts/in-house/shaper-indic/script-sinhala/utrrs/SOURCES
index 0ed1a89..0ed1a89 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-sinhala/utrrs/SOURCES
+++ b/test/shaping/texts/in-house/shaper-indic/script-sinhala/utrrs/SOURCES
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-sinhala/utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt b/test/shaping/texts/in-house/shaper-indic/script-sinhala/utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt
index 0e8810a..0e8810a 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-sinhala/utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-sinhala/utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-sinhala/utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt b/test/shaping/texts/in-house/shaper-indic/script-sinhala/utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt
index 27911e4..27911e4 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-sinhala/utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-sinhala/utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-sinhala/utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt b/test/shaping/texts/in-house/shaper-indic/script-sinhala/utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt
index 939be04..939be04 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-sinhala/utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-sinhala/utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-sinhala/utrrs/codepoint/IndicFontFeatureCodepoint-Punctuation.txt b/test/shaping/texts/in-house/shaper-indic/script-sinhala/utrrs/codepoint/IndicFontFeatureCodepoint-Punctuation.txt
index d6c6809..d6c6809 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-sinhala/utrrs/codepoint/IndicFontFeatureCodepoint-Punctuation.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-sinhala/utrrs/codepoint/IndicFontFeatureCodepoint-Punctuation.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-sinhala/utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt b/test/shaping/texts/in-house/shaper-indic/script-sinhala/utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt
index a65a9ba..a65a9ba 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-sinhala/utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-sinhala/utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-sinhala/utrrs/gpos/IndicFontFeatureGPOS.txt b/test/shaping/texts/in-house/shaper-indic/script-sinhala/utrrs/gpos/IndicFontFeatureGPOS.txt
index 7cd1eac..7cd1eac 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-sinhala/utrrs/gpos/IndicFontFeatureGPOS.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-sinhala/utrrs/gpos/IndicFontFeatureGPOS.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-sinhala/utrrs/gsub/IndicFontFeatureGSUB-Conjunct.txt b/test/shaping/texts/in-house/shaper-indic/script-sinhala/utrrs/gsub/IndicFontFeatureGSUB-Conjunct.txt
index a100c69..a100c69 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-sinhala/utrrs/gsub/IndicFontFeatureGSUB-Conjunct.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-sinhala/utrrs/gsub/IndicFontFeatureGSUB-Conjunct.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-sinhala/utrrs/gsub/IndicFontFeatureGSUB-Rakaaraansaya.txt b/test/shaping/texts/in-house/shaper-indic/script-sinhala/utrrs/gsub/IndicFontFeatureGSUB-Rakaaraansaya.txt
index bf89a71..bf89a71 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-sinhala/utrrs/gsub/IndicFontFeatureGSUB-Rakaaraansaya.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-sinhala/utrrs/gsub/IndicFontFeatureGSUB-Rakaaraansaya.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-sinhala/utrrs/gsub/IndicFontFeatureGSUB-Repaya.txt b/test/shaping/texts/in-house/shaper-indic/script-sinhala/utrrs/gsub/IndicFontFeatureGSUB-Repaya.txt
index 6f0293d..6f0293d 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-sinhala/utrrs/gsub/IndicFontFeatureGSUB-Repaya.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-sinhala/utrrs/gsub/IndicFontFeatureGSUB-Repaya.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-sinhala/utrrs/gsub/IndicFontFeatureGSUB-Special-Cases.txt b/test/shaping/texts/in-house/shaper-indic/script-sinhala/utrrs/gsub/IndicFontFeatureGSUB-Special-Cases.txt
index 109c873..109c873 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-sinhala/utrrs/gsub/IndicFontFeatureGSUB-Special-Cases.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-sinhala/utrrs/gsub/IndicFontFeatureGSUB-Special-Cases.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-sinhala/utrrs/gsub/IndicFontFeatureGSUB-TouchingLetters.txt b/test/shaping/texts/in-house/shaper-indic/script-sinhala/utrrs/gsub/IndicFontFeatureGSUB-TouchingLetters.txt
index 105b295..105b295 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-sinhala/utrrs/gsub/IndicFontFeatureGSUB-TouchingLetters.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-sinhala/utrrs/gsub/IndicFontFeatureGSUB-TouchingLetters.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-sinhala/utrrs/gsub/IndicFontFeatureGSUB-Yansaya.txt b/test/shaping/texts/in-house/shaper-indic/script-sinhala/utrrs/gsub/IndicFontFeatureGSUB-Yansaya.txt
index 299ca9d..299ca9d 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-sinhala/utrrs/gsub/IndicFontFeatureGSUB-Yansaya.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-sinhala/utrrs/gsub/IndicFontFeatureGSUB-Yansaya.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-sinhala/utrrs/gsub/IndicFontFeatureGSUB.txt b/test/shaping/texts/in-house/shaper-indic/script-sinhala/utrrs/gsub/IndicFontFeatureGSUB.txt
index fd5e6e6..fd5e6e6 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-sinhala/utrrs/gsub/IndicFontFeatureGSUB.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-sinhala/utrrs/gsub/IndicFontFeatureGSUB.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-tamil/misc/misc.txt b/test/shaping/texts/in-house/shaper-indic/script-tamil/misc/misc.txt
index c72be69..c72be69 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-tamil/misc/misc.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-tamil/misc/misc.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-tamil/utrrs/LICENSE b/test/shaping/texts/in-house/shaper-indic/script-tamil/utrrs/LICENSE
index 2cf8228..2cf8228 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-tamil/utrrs/LICENSE
+++ b/test/shaping/texts/in-house/shaper-indic/script-tamil/utrrs/LICENSE
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-tamil/utrrs/README b/test/shaping/texts/in-house/shaper-indic/script-tamil/utrrs/README
index 8bad337..8bad337 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-tamil/utrrs/README
+++ b/test/shaping/texts/in-house/shaper-indic/script-tamil/utrrs/README
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-tamil/utrrs/SOURCES b/test/shaping/texts/in-house/shaper-indic/script-tamil/utrrs/SOURCES
index 0ed1a89..0ed1a89 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-tamil/utrrs/SOURCES
+++ b/test/shaping/texts/in-house/shaper-indic/script-tamil/utrrs/SOURCES
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-tamil/utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt b/test/shaping/texts/in-house/shaper-indic/script-tamil/utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt
index 7a26510..7a26510 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-tamil/utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-tamil/utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-tamil/utrrs/codepoint/IndicFontFeatureCodepoint-CurrencySymbols.txt b/test/shaping/texts/in-house/shaper-indic/script-tamil/utrrs/codepoint/IndicFontFeatureCodepoint-CurrencySymbols.txt
index f70ba6a..f70ba6a 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-tamil/utrrs/codepoint/IndicFontFeatureCodepoint-CurrencySymbols.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-tamil/utrrs/codepoint/IndicFontFeatureCodepoint-CurrencySymbols.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-tamil/utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt b/test/shaping/texts/in-house/shaper-indic/script-tamil/utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt
index f22470c..f22470c 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-tamil/utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-tamil/utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-tamil/utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt b/test/shaping/texts/in-house/shaper-indic/script-tamil/utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt
index 47b1d62..47b1d62 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-tamil/utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-tamil/utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-tamil/utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt b/test/shaping/texts/in-house/shaper-indic/script-tamil/utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt
index 3940ad3..3940ad3 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-tamil/utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-tamil/utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-tamil/utrrs/codepoint/IndicFontFeatureCodepoint-Numerics.txt b/test/shaping/texts/in-house/shaper-indic/script-tamil/utrrs/codepoint/IndicFontFeatureCodepoint-Numerics.txt
index 33f6850..33f6850 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-tamil/utrrs/codepoint/IndicFontFeatureCodepoint-Numerics.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-tamil/utrrs/codepoint/IndicFontFeatureCodepoint-Numerics.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-tamil/utrrs/codepoint/IndicFontFeatureCodepoint-Reserved.txt b/test/shaping/texts/in-house/shaper-indic/script-tamil/utrrs/codepoint/IndicFontFeatureCodepoint-Reserved.txt
index 66a7ca4..66a7ca4 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-tamil/utrrs/codepoint/IndicFontFeatureCodepoint-Reserved.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-tamil/utrrs/codepoint/IndicFontFeatureCodepoint-Reserved.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-tamil/utrrs/codepoint/IndicFontFeatureCodepoint-Symbols.txt b/test/shaping/texts/in-house/shaper-indic/script-tamil/utrrs/codepoint/IndicFontFeatureCodepoint-Symbols.txt
index a7d89e8..a7d89e8 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-tamil/utrrs/codepoint/IndicFontFeatureCodepoint-Symbols.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-tamil/utrrs/codepoint/IndicFontFeatureCodepoint-Symbols.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-tamil/utrrs/codepoint/IndicFontFeatureCodepoint-TamilSymbol.txt b/test/shaping/texts/in-house/shaper-indic/script-tamil/utrrs/codepoint/IndicFontFeatureCodepoint-TamilSymbol.txt
index 2d4bdc1..2d4bdc1 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-tamil/utrrs/codepoint/IndicFontFeatureCodepoint-TamilSymbol.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-tamil/utrrs/codepoint/IndicFontFeatureCodepoint-TamilSymbol.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-tamil/utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt b/test/shaping/texts/in-house/shaper-indic/script-tamil/utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt
index 49c469c..49c469c 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-tamil/utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-tamil/utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-tamil/utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt b/test/shaping/texts/in-house/shaper-indic/script-tamil/utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt
index 40b2b21..40b2b21 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-tamil/utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-tamil/utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-tamil/utrrs/gpos/IndicFontFeatureGPOS-BelowBase.txt b/test/shaping/texts/in-house/shaper-indic/script-tamil/utrrs/gpos/IndicFontFeatureGPOS-BelowBase.txt
index 847495a..847495a 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-tamil/utrrs/gpos/IndicFontFeatureGPOS-BelowBase.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-tamil/utrrs/gpos/IndicFontFeatureGPOS-BelowBase.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-tamil/utrrs/gsub/IndicFontFeatureGSUB.txt b/test/shaping/texts/in-house/shaper-indic/script-tamil/utrrs/gsub/IndicFontFeatureGSUB.txt
index 2ca1df3..2ca1df3 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-tamil/utrrs/gsub/IndicFontFeatureGSUB.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-tamil/utrrs/gsub/IndicFontFeatureGSUB.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-telugu/misc/misc.txt b/test/shaping/texts/in-house/shaper-indic/script-telugu/misc/misc.txt
index ff522d2..ff522d2 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-telugu/misc/misc.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-telugu/misc/misc.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/script-telugu/telugu-vowel-letters.txt b/test/shaping/texts/in-house/shaper-indic/script-telugu/telugu-vowel-letters.txt
new file mode 100644
index 0000000..c3cfc84
--- /dev/null
+++ b/test/shaping/texts/in-house/shaper-indic/script-telugu/telugu-vowel-letters.txt
@@ -0,0 +1,5 @@
+ఓ ఒౕ
+ఔ ఒౌ
+ీ ిౕ
+ే ెౕ
+ో ొౕ
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-telugu/utrrs/LICENSE b/test/shaping/texts/in-house/shaper-indic/script-telugu/utrrs/LICENSE
index 2cf8228..2cf8228 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-telugu/utrrs/LICENSE
+++ b/test/shaping/texts/in-house/shaper-indic/script-telugu/utrrs/LICENSE
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-telugu/utrrs/README b/test/shaping/texts/in-house/shaper-indic/script-telugu/utrrs/README
index 8bad337..8bad337 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-telugu/utrrs/README
+++ b/test/shaping/texts/in-house/shaper-indic/script-telugu/utrrs/README
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-telugu/utrrs/SOURCES b/test/shaping/texts/in-house/shaper-indic/script-telugu/utrrs/SOURCES
index 0ed1a89..0ed1a89 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-telugu/utrrs/SOURCES
+++ b/test/shaping/texts/in-house/shaper-indic/script-telugu/utrrs/SOURCES
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-telugu/utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalVowels.txt b/test/shaping/texts/in-house/shaper-indic/script-telugu/utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalVowels.txt
index a92b179..a92b179 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-telugu/utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalVowels.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-telugu/utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalVowels.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-telugu/utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt b/test/shaping/texts/in-house/shaper-indic/script-telugu/utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt
index 9b8ff69..9b8ff69 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-telugu/utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-telugu/utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-telugu/utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt b/test/shaping/texts/in-house/shaper-indic/script-telugu/utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt
index b48ed5d..b48ed5d 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-telugu/utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-telugu/utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-telugu/utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt b/test/shaping/texts/in-house/shaper-indic/script-telugu/utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt
index 8751b40..8751b40 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-telugu/utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-telugu/utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-telugu/utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt b/test/shaping/texts/in-house/shaper-indic/script-telugu/utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt
index 53c6daf..53c6daf 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-telugu/utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-telugu/utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-telugu/utrrs/codepoint/IndicFontFeatureCodepoint-Reserved.txt b/test/shaping/texts/in-house/shaper-indic/script-telugu/utrrs/codepoint/IndicFontFeatureCodepoint-Reserved.txt
index 66a7ca4..66a7ca4 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-telugu/utrrs/codepoint/IndicFontFeatureCodepoint-Reserved.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-telugu/utrrs/codepoint/IndicFontFeatureCodepoint-Reserved.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-telugu/utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt b/test/shaping/texts/in-house/shaper-indic/script-telugu/utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt
index ebefb52..ebefb52 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-telugu/utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-telugu/utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-telugu/utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt b/test/shaping/texts/in-house/shaper-indic/script-telugu/utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt
index 939e44a..939e44a 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-telugu/utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-telugu/utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/indic/script-telugu/utrrs/gsub/IndicFontFeatureGSUB.txt b/test/shaping/texts/in-house/shaper-indic/script-telugu/utrrs/gsub/IndicFontFeatureGSUB.txt
index 50b630b..50b630b 100644
--- a/test/shaping/texts/in-house/shaper-indic/indic/script-telugu/utrrs/gsub/IndicFontFeatureGSUB.txt
+++ b/test/shaping/texts/in-house/shaper-indic/script-telugu/utrrs/gsub/IndicFontFeatureGSUB.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/south-east-asian/script-khmer/misc/misc.txt b/test/shaping/texts/in-house/shaper-indic/south-east-asian/script-khmer/misc/misc.txt
deleted file mode 100644
index 945dd1d..0000000
--- a/test/shaping/texts/in-house/shaper-indic/south-east-asian/script-khmer/misc/misc.txt
+++ /dev/null
@@ -1,23 +0,0 @@
-ខ្មែ
-ជា
-ថ្ងៃ
-មា
-ម្ពុ
-រ
-រី
-រ៍
-សៅ
-រ្ឥ
-ងឹ្ឈ
-ង្ឈឹ
-ង្គ្រ
-ង្រ្គ
-ម៉្លេះ
-ម‌៉្លេះ
-ប៊័
-នែ៎
-កេ្រ
-កៀ្រ
-កោ្រ
-កៅ្រ
-ព៑ា
diff --git a/test/shaping/texts/in-house/shaper-khmer/misc.txt b/test/shaping/texts/in-house/shaper-khmer/misc.txt
new file mode 100644
index 0000000..3bbffe7
--- /dev/null
+++ b/test/shaping/texts/in-house/shaper-khmer/misc.txt
@@ -0,0 +1,89 @@
+ខ្មែ
+ជា
+ថ្ងៃ
+មា
+ម្ពុ
+រ
+រី
+រ៍
+សៅ
+រ្ឥ
+ងឹ្ឈ
+ង្ឈឹ
+ង្គ្រ
+ង្រ្គ
+ម៉្លេះ
+ម‌៉្លេះ
+ប៊័
+នែ៎
+កេ្រ
+កៀ្រ
+កោ្រ
+កៅ្រ
+ព៑ា
+កន្ត្រាក់
+កន្រ្សិក់
+កន្រ្សីក់
+ក្សាន្ត
+ក្សិន្ត
+ក្សីន្ត
+ក្សឹន្ត
+ក្សឺន្ត
+ក្សុន្ត
+ក្សូន្ត
+ក្សួន្ត
+ក្សឿន្ត
+ឃ្ល្សាំ
+ឃ្ល្សិះ
+ឃ្ល្សុំ
+ឃ្ល្សុះ
+ឃ្ល្សេះ
+ឃ្ល្សោះ
+ឃ្ល្សំ
+ឃ្ល្សះ
+ញូ
+ញ្ញ
+ញ្ញុ
+ញ្ញូ
+ញ្ញួ
+ត្រ្សៀ
+ត្រ្សេ
+ត្រ្សែ
+ត្រ្សៃ
+ត្រ្សោ
+ត្រ្សៅ
+ធ្លុំក់
+ធ្លោក់
+ធ្លៅក់
+ធ្លំក់
+ម្ត្ល៉ា
+ម្ត្ល៉ុ
+ម្ត្ល៉ឿ
+ម្ត្ល៉ៀ
+យ្យើហ្វ្លៃ
+រ្រ
+សាស្ត្រឃ្ឈងា
+សាស្ត្រឃ្ឈងិ
+សាស្ត្រឃ្ឈងី
+ស្ត្រីវ័ខ្ញ្សា
+ស្រ្តា
+ស្រ្តិ
+ស្រ្តី
+ស្រ្តឹ
+ស្រ្តឺ
+ស្រ្តុ
+ស្រ្តូ
+ស្រ្តួ
+ស្រ្តើ
+ស្រ្តឿ
+ស្រ្ត៊ឿ
+ស្រ្ត៊ៀ
+ស្រ្ត៊េ
+ស្រ្ត៊ែ
+ស្រ្ត៊ៃ
+ស្រ្ត៊ំ
+ហ្គ្ស៊ើ
+ហ្គ្ស៊ឿ
+ហ្គ្ស៊ៀ
+ហ្រ្វង្ក
+ហ្រ្វាំង
diff --git a/test/shaping/texts/in-house/shaper-indic/south-east-asian/script-khmer/misc/other-marks-invalid.txt b/test/shaping/texts/in-house/shaper-khmer/other-marks-invalid.txt
index 213cfc2..213cfc2 100644
--- a/test/shaping/texts/in-house/shaper-indic/south-east-asian/script-khmer/misc/other-marks-invalid.txt
+++ b/test/shaping/texts/in-house/shaper-khmer/other-marks-invalid.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/south-east-asian/script-khmer/misc/other-marks.txt b/test/shaping/texts/in-house/shaper-khmer/other-marks.txt
index 1fd350c..1fd350c 100644
--- a/test/shaping/texts/in-house/shaper-indic/south-east-asian/script-khmer/misc/other-marks.txt
+++ b/test/shaping/texts/in-house/shaper-khmer/other-marks.txt
diff --git a/test/shaping/texts/in-house/shaper-indic/south-east-asian/script-javanese/misc.txt b/test/shaping/texts/in-house/shaper-use/script-javanese/misc.txt
index 16c3d9c..16c3d9c 100644
--- a/test/shaping/texts/in-house/shaper-indic/south-east-asian/script-javanese/misc.txt
+++ b/test/shaping/texts/in-house/shaper-use/script-javanese/misc.txt
diff --git a/test/subset/Makefile.am b/test/subset/Makefile.am
index 336d33d..1673cfb 100644
--- a/test/subset/Makefile.am
+++ b/test/subset/Makefile.am
@@ -7,7 +7,7 @@ SUBDIRS = data
# Convenience targets:
lib:
- @$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src lib
+ @$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src libs
EXTRA_DIST += \
CMakeLists.txt \
diff --git a/test/subset/Makefile.in b/test/subset/Makefile.in
index 95ab828..71f7a82 100644
--- a/test/subset/Makefile.in
+++ b/test/subset/Makefile.in
@@ -96,8 +96,7 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/ax_check_link_flag.m4 \
$(top_srcdir)/m4/ax_pthread.m4 $(top_srcdir)/m4/gtk-doc.m4 \
$(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
$(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
- $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/pkg.m4 \
- $(top_srcdir)/configure.ac
+ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
$(ACLOCAL_M4)
DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
@@ -304,6 +303,8 @@ PACKAGE_URL = @PACKAGE_URL@
PACKAGE_VERSION = @PACKAGE_VERSION@
PATH_SEPARATOR = @PATH_SEPARATOR@
PKG_CONFIG = @PKG_CONFIG@
+PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
+PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
PTHREAD_CC = @PTHREAD_CC@
PTHREAD_CFLAGS = @PTHREAD_CFLAGS@
PTHREAD_LIBS = @PTHREAD_LIBS@
@@ -691,7 +692,7 @@ uninstall-am:
# Convenience targets:
lib:
- @$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src lib
+ @$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src libs
-include $(top_srcdir)/git.mk
diff --git a/test/subset/data/Makefile.am b/test/subset/data/Makefile.am
index 0d1b2f0..0677120 100644
--- a/test/subset/data/Makefile.am
+++ b/test/subset/data/Makefile.am
@@ -5,7 +5,7 @@ EXTRA_DIST =
CLEANFILES =
SUBDIRS =
-EXTRA_DIST = \
+EXTRA_DIST += \
$(TESTS) \
expected/basics \
expected/full-font \
diff --git a/test/subset/data/Makefile.in b/test/subset/data/Makefile.in
index 0988d97..957bb34 100644
--- a/test/subset/data/Makefile.in
+++ b/test/subset/data/Makefile.in
@@ -99,8 +99,7 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/ax_check_link_flag.m4 \
$(top_srcdir)/m4/ax_pthread.m4 $(top_srcdir)/m4/gtk-doc.m4 \
$(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
$(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
- $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/pkg.m4 \
- $(top_srcdir)/configure.ac
+ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
$(ACLOCAL_M4)
DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
@@ -509,6 +508,8 @@ PACKAGE_URL = @PACKAGE_URL@
PACKAGE_VERSION = @PACKAGE_VERSION@
PATH_SEPARATOR = @PATH_SEPARATOR@
PKG_CONFIG = @PKG_CONFIG@
+PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
+PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
PTHREAD_CC = @PTHREAD_CC@
PTHREAD_CFLAGS = @PTHREAD_CFLAGS@
PTHREAD_LIBS = @PTHREAD_LIBS@
@@ -578,15 +579,8 @@ top_build_prefix = @top_build_prefix@
top_builddir = @top_builddir@
top_srcdir = @top_srcdir@
NULL =
-EXTRA_DIST = \
- $(TESTS) \
- expected/basics \
- expected/full-font \
- expected/japanese \
- fonts \
- profiles \
- $(NULL)
-
+EXTRA_DIST = $(TESTS) expected/basics expected/full-font \
+ expected/japanese fonts profiles $(NULL)
CLEANFILES =
SUBDIRS =
TEST_EXTENSIONS = .tests
diff --git a/test/subset/data/expected/full-font/SourceSansPro-Regular.default.1FC,21,41,20,62,63.otf b/test/subset/data/expected/full-font/SourceSansPro-Regular.default.1FC,21,41,20,62,63.otf
new file mode 100644
index 0000000..1bd287d
--- /dev/null
+++ b/test/subset/data/expected/full-font/SourceSansPro-Regular.default.1FC,21,41,20,62,63.otf
Binary files differ
diff --git a/test/subset/data/expected/full-font/SourceSansPro-Regular.default.61,62,63.otf b/test/subset/data/expected/full-font/SourceSansPro-Regular.default.61,62,63.otf
new file mode 100644
index 0000000..328c6ee
--- /dev/null
+++ b/test/subset/data/expected/full-font/SourceSansPro-Regular.default.61,62,63.otf
Binary files differ
diff --git a/test/subset/data/expected/full-font/SourceSansPro-Regular.default.D7,D8,D9,DA,DE.otf b/test/subset/data/expected/full-font/SourceSansPro-Regular.default.D7,D8,D9,DA,DE.otf
new file mode 100644
index 0000000..4602847
--- /dev/null
+++ b/test/subset/data/expected/full-font/SourceSansPro-Regular.default.D7,D8,D9,DA,DE.otf
Binary files differ
diff --git a/test/subset/data/expected/full-font/SourceSansPro-Regular.desubroutinize.1FC,21,41,20,62,63.otf b/test/subset/data/expected/full-font/SourceSansPro-Regular.desubroutinize.1FC,21,41,20,62,63.otf
new file mode 100644
index 0000000..18a9bcc
--- /dev/null
+++ b/test/subset/data/expected/full-font/SourceSansPro-Regular.desubroutinize.1FC,21,41,20,62,63.otf
Binary files differ
diff --git a/test/subset/data/expected/full-font/SourceSansPro-Regular.desubroutinize.61,62,63.otf b/test/subset/data/expected/full-font/SourceSansPro-Regular.desubroutinize.61,62,63.otf
new file mode 100644
index 0000000..edd389b
--- /dev/null
+++ b/test/subset/data/expected/full-font/SourceSansPro-Regular.desubroutinize.61,62,63.otf
Binary files differ
diff --git a/test/subset/data/expected/full-font/SourceSansPro-Regular.desubroutinize.D7,D8,D9,DA,DE.otf b/test/subset/data/expected/full-font/SourceSansPro-Regular.desubroutinize.D7,D8,D9,DA,DE.otf
new file mode 100644
index 0000000..65fa1da
--- /dev/null
+++ b/test/subset/data/expected/full-font/SourceSansPro-Regular.desubroutinize.D7,D8,D9,DA,DE.otf
Binary files differ
diff --git a/test/subset/data/expected/full-font/SourceSansPro-Regular.drop-hints.1FC,21,41,20,62,63.otf b/test/subset/data/expected/full-font/SourceSansPro-Regular.drop-hints.1FC,21,41,20,62,63.otf
new file mode 100644
index 0000000..53109e2
--- /dev/null
+++ b/test/subset/data/expected/full-font/SourceSansPro-Regular.drop-hints.1FC,21,41,20,62,63.otf
Binary files differ
diff --git a/test/subset/data/expected/full-font/SourceSansPro-Regular.drop-hints.61,62,63.otf b/test/subset/data/expected/full-font/SourceSansPro-Regular.drop-hints.61,62,63.otf
new file mode 100644
index 0000000..dd908c2
--- /dev/null
+++ b/test/subset/data/expected/full-font/SourceSansPro-Regular.drop-hints.61,62,63.otf
Binary files differ
diff --git a/test/subset/data/expected/full-font/SourceSansPro-Regular.drop-hints.D7,D8,D9,DA,DE.otf b/test/subset/data/expected/full-font/SourceSansPro-Regular.drop-hints.D7,D8,D9,DA,DE.otf
new file mode 100644
index 0000000..5422d32
--- /dev/null
+++ b/test/subset/data/expected/full-font/SourceSansPro-Regular.drop-hints.D7,D8,D9,DA,DE.otf
Binary files differ
diff --git a/test/subset/data/expected/full-font/SourceSansPro-Regular.drop-hints.desubroutinize.1FC,21,41,20,62,63.otf b/test/subset/data/expected/full-font/SourceSansPro-Regular.drop-hints.desubroutinize.1FC,21,41,20,62,63.otf
new file mode 100644
index 0000000..604e140
--- /dev/null
+++ b/test/subset/data/expected/full-font/SourceSansPro-Regular.drop-hints.desubroutinize.1FC,21,41,20,62,63.otf
Binary files differ
diff --git a/test/subset/data/expected/full-font/SourceSansPro-Regular.drop-hints.desubroutinize.61,62,63.otf b/test/subset/data/expected/full-font/SourceSansPro-Regular.drop-hints.desubroutinize.61,62,63.otf
new file mode 100644
index 0000000..a0b2c2f
--- /dev/null
+++ b/test/subset/data/expected/full-font/SourceSansPro-Regular.drop-hints.desubroutinize.61,62,63.otf
Binary files differ
diff --git a/test/subset/data/expected/full-font/SourceSansPro-Regular.drop-hints.desubroutinize.D7,D8,D9,DA,DE.otf b/test/subset/data/expected/full-font/SourceSansPro-Regular.drop-hints.desubroutinize.D7,D8,D9,DA,DE.otf
new file mode 100644
index 0000000..8055328
--- /dev/null
+++ b/test/subset/data/expected/full-font/SourceSansPro-Regular.drop-hints.desubroutinize.D7,D8,D9,DA,DE.otf
Binary files differ
diff --git a/test/subset/data/expected/japanese/SourceHanSans-Regular.default.3042,3044,3046,3048,304A,304B.otf b/test/subset/data/expected/japanese/SourceHanSans-Regular.default.3042,3044,3046,3048,304A,304B.otf
new file mode 100644
index 0000000..8d717cc
--- /dev/null
+++ b/test/subset/data/expected/japanese/SourceHanSans-Regular.default.3042,3044,3046,3048,304A,304B.otf
Binary files differ
diff --git a/test/subset/data/expected/japanese/SourceHanSans-Regular.default.3042,3044,3046,73E0,5EA6,8F38.otf b/test/subset/data/expected/japanese/SourceHanSans-Regular.default.3042,3044,3046,73E0,5EA6,8F38.otf
new file mode 100644
index 0000000..3d570cd
--- /dev/null
+++ b/test/subset/data/expected/japanese/SourceHanSans-Regular.default.3042,3044,3046,73E0,5EA6,8F38.otf
Binary files differ
diff --git a/test/subset/data/expected/japanese/SourceHanSans-Regular.default.61,63,65,6B.otf b/test/subset/data/expected/japanese/SourceHanSans-Regular.default.61,63,65,6B.otf
new file mode 100644
index 0000000..216ed17
--- /dev/null
+++ b/test/subset/data/expected/japanese/SourceHanSans-Regular.default.61,63,65,6B.otf
Binary files differ
diff --git a/test/subset/data/expected/japanese/SourceHanSans-Regular.default.660E,6975,73E0,5EA6,8F38,6E05.otf b/test/subset/data/expected/japanese/SourceHanSans-Regular.default.660E,6975,73E0,5EA6,8F38,6E05.otf
new file mode 100644
index 0000000..f548f48
--- /dev/null
+++ b/test/subset/data/expected/japanese/SourceHanSans-Regular.default.660E,6975,73E0,5EA6,8F38,6E05.otf
Binary files differ
diff --git a/test/subset/data/expected/japanese/SourceHanSans-Regular.default.660E.otf b/test/subset/data/expected/japanese/SourceHanSans-Regular.default.660E.otf
new file mode 100644
index 0000000..6362d21
--- /dev/null
+++ b/test/subset/data/expected/japanese/SourceHanSans-Regular.default.660E.otf
Binary files differ
diff --git a/test/subset/data/expected/japanese/SourceHanSans-Regular.desubroutinize..otf b/test/subset/data/expected/japanese/SourceHanSans-Regular.desubroutinize..otf
new file mode 100644
index 0000000..7c0c5fd
--- /dev/null
+++ b/test/subset/data/expected/japanese/SourceHanSans-Regular.desubroutinize..otf
Binary files differ
diff --git a/test/subset/data/expected/japanese/SourceHanSans-Regular.desubroutinize.3042,3044,3046,3048,304A,304B.otf b/test/subset/data/expected/japanese/SourceHanSans-Regular.desubroutinize.3042,3044,3046,3048,304A,304B.otf
new file mode 100644
index 0000000..e51866a
--- /dev/null
+++ b/test/subset/data/expected/japanese/SourceHanSans-Regular.desubroutinize.3042,3044,3046,3048,304A,304B.otf
Binary files differ
diff --git a/test/subset/data/expected/japanese/SourceHanSans-Regular.desubroutinize.3042,3044,3046,73E0,5EA6,8F38.otf b/test/subset/data/expected/japanese/SourceHanSans-Regular.desubroutinize.3042,3044,3046,73E0,5EA6,8F38.otf
new file mode 100644
index 0000000..c4f6bb2
--- /dev/null
+++ b/test/subset/data/expected/japanese/SourceHanSans-Regular.desubroutinize.3042,3044,3046,73E0,5EA6,8F38.otf
Binary files differ
diff --git a/test/subset/data/expected/japanese/SourceHanSans-Regular.desubroutinize.61,63,65,6B.otf b/test/subset/data/expected/japanese/SourceHanSans-Regular.desubroutinize.61,63,65,6B.otf
new file mode 100644
index 0000000..62ddb60
--- /dev/null
+++ b/test/subset/data/expected/japanese/SourceHanSans-Regular.desubroutinize.61,63,65,6B.otf
Binary files differ
diff --git a/test/subset/data/expected/japanese/SourceHanSans-Regular.desubroutinize.660E,6975,73E0,5EA6,8F38,6E05.otf b/test/subset/data/expected/japanese/SourceHanSans-Regular.desubroutinize.660E,6975,73E0,5EA6,8F38,6E05.otf
new file mode 100644
index 0000000..7ce9d40
--- /dev/null
+++ b/test/subset/data/expected/japanese/SourceHanSans-Regular.desubroutinize.660E,6975,73E0,5EA6,8F38,6E05.otf
Binary files differ
diff --git a/test/subset/data/expected/japanese/SourceHanSans-Regular.desubroutinize.660E.otf b/test/subset/data/expected/japanese/SourceHanSans-Regular.desubroutinize.660E.otf
new file mode 100644
index 0000000..35d9eea
--- /dev/null
+++ b/test/subset/data/expected/japanese/SourceHanSans-Regular.desubroutinize.660E.otf
Binary files differ
diff --git a/test/subset/data/expected/japanese/SourceHanSans-Regular.drop-hints.3042,3044,3046,3048,304A,304B.otf b/test/subset/data/expected/japanese/SourceHanSans-Regular.drop-hints.3042,3044,3046,3048,304A,304B.otf
new file mode 100644
index 0000000..9e1041d
--- /dev/null
+++ b/test/subset/data/expected/japanese/SourceHanSans-Regular.drop-hints.3042,3044,3046,3048,304A,304B.otf
Binary files differ
diff --git a/test/subset/data/expected/japanese/SourceHanSans-Regular.drop-hints.3042,3044,3046,73E0,5EA6,8F38.otf b/test/subset/data/expected/japanese/SourceHanSans-Regular.drop-hints.3042,3044,3046,73E0,5EA6,8F38.otf
new file mode 100644
index 0000000..6a3bff1
--- /dev/null
+++ b/test/subset/data/expected/japanese/SourceHanSans-Regular.drop-hints.3042,3044,3046,73E0,5EA6,8F38.otf
Binary files differ
diff --git a/test/subset/data/expected/japanese/SourceHanSans-Regular.drop-hints.61,63,65,6B.otf b/test/subset/data/expected/japanese/SourceHanSans-Regular.drop-hints.61,63,65,6B.otf
new file mode 100644
index 0000000..06d28b6
--- /dev/null
+++ b/test/subset/data/expected/japanese/SourceHanSans-Regular.drop-hints.61,63,65,6B.otf
Binary files differ
diff --git a/test/subset/data/expected/japanese/SourceHanSans-Regular.drop-hints.660E,6975,73E0,5EA6,8F38,6E05.otf b/test/subset/data/expected/japanese/SourceHanSans-Regular.drop-hints.660E,6975,73E0,5EA6,8F38,6E05.otf
new file mode 100644
index 0000000..ce9d287
--- /dev/null
+++ b/test/subset/data/expected/japanese/SourceHanSans-Regular.drop-hints.660E,6975,73E0,5EA6,8F38,6E05.otf
Binary files differ
diff --git a/test/subset/data/expected/japanese/SourceHanSans-Regular.drop-hints.660E.otf b/test/subset/data/expected/japanese/SourceHanSans-Regular.drop-hints.660E.otf
new file mode 100644
index 0000000..27c4676
--- /dev/null
+++ b/test/subset/data/expected/japanese/SourceHanSans-Regular.drop-hints.660E.otf
Binary files differ
diff --git a/test/subset/data/expected/japanese/SourceHanSans-Regular.drop-hints.desubroutinize..otf b/test/subset/data/expected/japanese/SourceHanSans-Regular.drop-hints.desubroutinize..otf
new file mode 100644
index 0000000..a73617a
--- /dev/null
+++ b/test/subset/data/expected/japanese/SourceHanSans-Regular.drop-hints.desubroutinize..otf
Binary files differ
diff --git a/test/subset/data/expected/japanese/SourceHanSans-Regular.drop-hints.desubroutinize.3042,3044,3046,3048,304A,304B.otf b/test/subset/data/expected/japanese/SourceHanSans-Regular.drop-hints.desubroutinize.3042,3044,3046,3048,304A,304B.otf
new file mode 100644
index 0000000..790b714
--- /dev/null
+++ b/test/subset/data/expected/japanese/SourceHanSans-Regular.drop-hints.desubroutinize.3042,3044,3046,3048,304A,304B.otf
Binary files differ
diff --git a/test/subset/data/expected/japanese/SourceHanSans-Regular.drop-hints.desubroutinize.3042,3044,3046,73E0,5EA6,8F38.otf b/test/subset/data/expected/japanese/SourceHanSans-Regular.drop-hints.desubroutinize.3042,3044,3046,73E0,5EA6,8F38.otf
new file mode 100644
index 0000000..c707bcd
--- /dev/null
+++ b/test/subset/data/expected/japanese/SourceHanSans-Regular.drop-hints.desubroutinize.3042,3044,3046,73E0,5EA6,8F38.otf
Binary files differ
diff --git a/test/subset/data/expected/japanese/SourceHanSans-Regular.drop-hints.desubroutinize.61,63,65,6B.otf b/test/subset/data/expected/japanese/SourceHanSans-Regular.drop-hints.desubroutinize.61,63,65,6B.otf
new file mode 100644
index 0000000..591d139
--- /dev/null
+++ b/test/subset/data/expected/japanese/SourceHanSans-Regular.drop-hints.desubroutinize.61,63,65,6B.otf
Binary files differ
diff --git a/test/subset/data/expected/japanese/SourceHanSans-Regular.drop-hints.desubroutinize.660E,6975,73E0,5EA6,8F38,6E05.otf b/test/subset/data/expected/japanese/SourceHanSans-Regular.drop-hints.desubroutinize.660E,6975,73E0,5EA6,8F38,6E05.otf
new file mode 100644
index 0000000..efc98b6
--- /dev/null
+++ b/test/subset/data/expected/japanese/SourceHanSans-Regular.drop-hints.desubroutinize.660E,6975,73E0,5EA6,8F38,6E05.otf
Binary files differ
diff --git a/test/subset/data/expected/japanese/SourceHanSans-Regular.drop-hints.desubroutinize.660E.otf b/test/subset/data/expected/japanese/SourceHanSans-Regular.drop-hints.desubroutinize.660E.otf
new file mode 100644
index 0000000..27c4676
--- /dev/null
+++ b/test/subset/data/expected/japanese/SourceHanSans-Regular.drop-hints.desubroutinize.660E.otf
Binary files differ
diff --git a/test/subset/data/fonts/SourceHanSans-Regular.otf b/test/subset/data/fonts/SourceHanSans-Regular.otf
new file mode 100755
index 0000000..dd807db
--- /dev/null
+++ b/test/subset/data/fonts/SourceHanSans-Regular.otf
Binary files differ
diff --git a/test/subset/data/fonts/SourceSansPro-Regular.otf b/test/subset/data/fonts/SourceSansPro-Regular.otf
new file mode 100644
index 0000000..279e691
--- /dev/null
+++ b/test/subset/data/fonts/SourceSansPro-Regular.otf
Binary files differ
diff --git a/test/subset/data/profiles/desubroutinize.txt b/test/subset/data/profiles/desubroutinize.txt
new file mode 100644
index 0000000..67f3a84
--- /dev/null
+++ b/test/subset/data/profiles/desubroutinize.txt
@@ -0,0 +1 @@
+--desubroutinize
diff --git a/test/subset/data/profiles/drop-hints-desubroutinize.txt b/test/subset/data/profiles/drop-hints-desubroutinize.txt
new file mode 100644
index 0000000..279d466
--- /dev/null
+++ b/test/subset/data/profiles/drop-hints-desubroutinize.txt
@@ -0,0 +1,2 @@
+--no-hinting
+--desubroutinize
diff --git a/test/subset/data/tests/full-font.tests b/test/subset/data/tests/full-font.tests
index ff195ce..f422ff5 100644
--- a/test/subset/data/tests/full-font.tests
+++ b/test/subset/data/tests/full-font.tests
@@ -1,5 +1,6 @@
FONTS:
Roboto-Regular.ttf
+SourceSansPro-Regular.otf
PROFILES:
default.txt
diff --git a/test/subset/data/tests/japanese.tests b/test/subset/data/tests/japanese.tests
index 5a04380..fc58646 100644
--- a/test/subset/data/tests/japanese.tests
+++ b/test/subset/data/tests/japanese.tests
@@ -1,5 +1,6 @@
FONTS:
Mplus1p-Regular.ttf
+SourceHanSans-Regular.otf
PROFILES:
default.txt
diff --git a/test/subset/run-tests.py b/test/subset/run-tests.py
index 1cd1a19..fb4684c 100755
--- a/test/subset/run-tests.py
+++ b/test/subset/run-tests.py
@@ -15,90 +15,108 @@ import tempfile
from subset_test_suite import SubsetTestSuite
+# https://stackoverflow.com/a/377028
+def which(program):
+ def is_exe(fpath):
+ return os.path.isfile(fpath) and os.access(fpath, os.X_OK)
+
+ fpath, _ = os.path.split(program)
+ if fpath:
+ if is_exe(program):
+ return program
+ else:
+ for path in os.environ["PATH"].split(os.pathsep):
+ exe_file = os.path.join(path, program)
+ if is_exe(exe_file):
+ return exe_file
+
+ return None
+
+ttx = which ("ttx")
+ots_sanitize = which ("ots-sanitize")
+
+if not ttx:
+ print("TTX is not present, skipping test.")
+ sys.exit (77)
def cmd(command):
p = subprocess.Popen (
command, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
- (stdoutdata, stderrdata) = p.communicate()
+ (stdoutdata, stderrdata) = p.communicate ()
print (stderrdata, end="") # file=sys.stderr
return stdoutdata, p.returncode
-def read_binary(file_path):
- with open(file_path, 'rb') as f:
- return f.read()
+def read_binary (file_path):
+ with open (file_path, 'rb') as f:
+ return f.read ()
def fail_test(test, cli_args, message):
print ('ERROR: %s' % message)
print ('Test State:')
- print (' test.font_path %s' % os.path.abspath(test.font_path))
- print (' test.profile_path %s' % os.path.abspath(test.profile_path))
- print (' test.unicodes %s' % test.unicodes())
- expected_file = os.path.join(test_suite.get_output_directory(),
- test.get_font_name())
- print (' expected_file %s' % os.path.abspath(expected_file))
+ print (' test.font_path %s' % os.path.abspath (test.font_path))
+ print (' test.profile_path %s' % os.path.abspath (test.profile_path))
+ print (' test.unicodes %s' % test.unicodes ())
+ expected_file = os.path.join(test_suite.get_output_directory (),
+ test.get_font_name ())
+ print (' expected_file %s' % os.path.abspath (expected_file))
return 1
def run_test(test, should_check_ots):
- out_file = os.path.join(tempfile.mkdtemp(), test.get_font_name() + '-subset.ttf')
+ out_file = os.path.join(tempfile.mkdtemp (), test.get_font_name () + '-subset' + test.get_font_extension ())
cli_args = [hb_subset,
"--font-file=" + test.font_path,
"--output-file=" + out_file,
- "--unicodes=%s" % test.unicodes()]
- cli_args.extend (test.get_profile_flags())
- print (' '.join(cli_args))
- _, return_code = cmd(cli_args)
+ "--unicodes=%s" % test.unicodes ()]
+ cli_args.extend (test.get_profile_flags ())
+ print (' '.join (cli_args))
+ _, return_code = cmd (cli_args)
if return_code:
- return fail_test(test, cli_args, "%s returned %d" % (' '.join(cli_args), return_code))
+ return fail_test (test, cli_args, "%s returned %d" % (' '.join (cli_args), return_code))
- expected_ttx, return_code = run_ttx(os.path.join(test_suite.get_output_directory(),
- test.get_font_name()))
+ expected_ttx, return_code = run_ttx (os.path.join (test_suite.get_output_directory (),
+ test.get_font_name ()))
if return_code:
- return fail_test(test, cli_args, "ttx (expected) returned %d" % (return_code))
+ return fail_test (test, cli_args, "ttx (expected) returned %d" % (return_code))
actual_ttx, return_code = run_ttx(out_file)
if return_code:
- return fail_test(test, cli_args, "ttx (actual) returned %d" % (return_code))
+ return fail_test (test, cli_args, "ttx (actual) returned %d" % (return_code))
print ("stripping checksums.")
expected_ttx = strip_check_sum (expected_ttx)
actual_ttx = strip_check_sum (actual_ttx)
if not actual_ttx == expected_ttx:
- for line in unified_diff(expected_ttx.splitlines(1), actual_ttx.splitlines(1)):
- sys.stdout.write(line)
- sys.stdout.flush()
+ for line in unified_diff (expected_ttx.splitlines (1), actual_ttx.splitlines (1)):
+ sys.stdout.write (line)
+ sys.stdout.flush ()
return fail_test(test, cli_args, 'ttx for expected and actual does not match.')
if should_check_ots:
print ("Checking output with ots-sanitize.")
- if not check_ots(out_file):
- return fail_test(test, cli_args, 'ots for subsetted file fails.')
+ if not check_ots (out_file):
+ return fail_test (test, cli_args, 'ots for subsetted file fails.')
return 0
-def run_ttx(file):
+def run_ttx (file):
print ("ttx %s" % file)
- cli_args = ["ttx",
- "-q",
- "-o-",
- file]
- return cmd(cli_args)
+ return cmd([ttx, "-q", "-o-", file])
def strip_check_sum (ttx_string):
return re.sub ('checkSumAdjustment value=["]0x([0-9a-fA-F])+["]',
'checkSumAdjustment value="0x00000000"',
- ttx_string.decode (), count=1)
+ ttx_string.decode ("utf-8"), count=1)
def has_ots ():
- _, returncode = cmd(["which", "ots-sanitize"])
- if returncode:
+ if not ots_sanitize:
print("OTS is not present, skipping all ots checks.")
return False
return True
def check_ots (path):
- ots_report, returncode = cmd(["ots-sanitize", path])
+ ots_report, returncode = cmd ([ots_sanitize, path])
if returncode:
print("OTS Failure: %s" % ots_report);
return False
@@ -110,24 +128,19 @@ if not args or sys.argv[1].find('hb-subset') == -1 or not os.path.exists (sys.ar
sys.exit (1)
hb_subset, args = args[0], args[1:]
-if not len(args):
+if not len (args):
print ("No tests supplied.")
sys.exit (1)
-_, returncode = cmd(["which", "ttx"])
-if returncode:
- print("TTX is not present, skipping test.")
- sys.exit (77)
-
has_ots = has_ots()
fails = 0
for path in args:
- with io.open(path, mode="r", encoding="utf-8") as f:
+ with io.open (path, mode="r", encoding="utf-8") as f:
print ("Running tests in " + path)
- test_suite = SubsetTestSuite(path, f.read())
- for test in test_suite.tests():
- fails += run_test(test, has_ots)
+ test_suite = SubsetTestSuite (path, f.read())
+ for test in test_suite.tests ():
+ fails += run_test (test, has_ots)
if fails != 0:
print (str (fails) + " test(s) failed.")
diff --git a/test/subset/subset_test_suite.py b/test/subset/subset_test_suite.py
index 3538650..5e3368e 100644
--- a/test/subset/subset_test_suite.py
+++ b/test/subset/subset_test_suite.py
@@ -28,6 +28,14 @@ class Test:
self.unicodes(),
font_base_name_parts[1])
+ def get_font_extension(self):
+ font_base_name = os.path.basename(self.font_path)
+ font_base_name_parts = os.path.splitext(font_base_name)
+ return font_base_name_parts[1]
+
+ def applicable(self):
+ return self.profile_path.find("desubroutinize") < 0 or self.get_font_extension() == "otf"
+
# A group of tests to perform on the subsetter. Each test
# Identifies a font a subsetting profile, and a subset to be cut.
class SubsetTestSuite:
@@ -47,7 +55,7 @@ class SubsetTestSuite:
if not os.path.exists(output_dir):
os.mkdir(output_dir)
if not os.path.isdir(output_dir):
- raise Error("%s is not a directory." % output_dir)
+ raise Exception("%s is not a directory." % output_dir)
return output_dir
@@ -57,7 +65,9 @@ class SubsetTestSuite:
for profile in self.profiles:
profile = os.path.join(self._base_path(), "profiles", profile)
for subset in self.subsets:
- yield Test(font, profile, subset)
+ test = Test(font, profile, subset)
+ if test.applicable():
+ yield test
def _base_path(self):
return os.path.dirname(os.path.dirname(self.test_path))