diff --git a/Cargo.lock b/Cargo.lock index ea49940..5d251b7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,5 +1,7 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. +version = 3 + [[package]] name = "swash" version = "0.1.4" diff --git a/fonts/AdobeVFPrototype-Subset.otf b/fonts/AdobeVFPrototype-Subset.otf new file mode 100644 index 0000000..5cc7279 Binary files /dev/null and b/fonts/AdobeVFPrototype-Subset.otf differ diff --git a/fonts/FDArrayTest257.otf b/fonts/FDArrayTest257.otf new file mode 100644 index 0000000..a97b1f4 Binary files /dev/null and b/fonts/FDArrayTest257.otf differ diff --git a/fonts/FDArrayTest65535.otf b/fonts/FDArrayTest65535.otf new file mode 100644 index 0000000..835beb2 Binary files /dev/null and b/fonts/FDArrayTest65535.otf differ diff --git a/fonts/NotoSansBalinese-Regular.ttf b/fonts/NotoSansBalinese-Regular.ttf new file mode 100644 index 0000000..0b0f58f Binary files /dev/null and b/fonts/NotoSansBalinese-Regular.ttf differ diff --git a/fonts/NotoSansKannada-Regular.ttf b/fonts/NotoSansKannada-Regular.ttf new file mode 100644 index 0000000..7366f37 Binary files /dev/null and b/fonts/NotoSansKannada-Regular.ttf differ diff --git a/fonts/NotoSerifKannada-Regular.ttf b/fonts/NotoSerifKannada-Regular.ttf new file mode 100644 index 0000000..30ca550 Binary files /dev/null and b/fonts/NotoSerifKannada-Regular.ttf differ diff --git a/fonts/Selawik-README.md b/fonts/Selawik-README.md new file mode 100644 index 0000000..9c5a80f --- /dev/null +++ b/fonts/Selawik-README.md @@ -0,0 +1,60 @@ +# Overview +This version of Selawik is a test case and demonstration of OpenType 1.8 Font Variations technology and tables. It also includes some handy debugging characters. + +This version of Selawik is intended for testing only, and is not recommended for shipping in applications, etc. For that, it is better to use the main branch of [Selawik](https://github.com/Microsoft/Selawik). + +# Features + +* Full TrueType hinting with VTT source tables included. See [Hinting](#hinting) for details. +* All tables required for OpenType 1.8 are present (see [Table Status](#table-status), below). This includes cvar (varied CVTs), GPOS/GDEF (kerning varies), and avar (coordinate space warping to match Segoe UI). + + Note: This version of Selawik does not include an MVAR because its vertical metrics do not change anywhere in the design space, thus there is no need for MVAR. A future release will contain an axis that varies vertical metrics as an excuse to have an MVAR. + +* Numerous interesting debugging glyphs (requires liga to be enabled). For example, \axis1 will show the current normalized wght coordinate. See [Debugging Glyphs](#debugging-glyphs) for details. +* 1 axis: weight + +## Table status +The following tables are currently supported: + +- [x] fvar +- [x] gvar +- [x] cvar +- [x] avar (to match Segoe UI weights and metrics) +- [x] STAT +- [x] GPOS/GDEF - kerning +- [x] HVAR + +Not yet complete: + +- [ ] GSUB/GDEF - to change dollar signs in the bold +- [ ] MVAR (future release) + +## To do +* Add a second axis that varies vertical metrics so we need an MVAR table. This axis will not be one of the standard axes listed in the [OpenType 1.8 specification] (https://www.microsoft.com/typography/otspec/fvar.htm), so that it becomes an example of out to do a foundry-defined axis. +* Add Feature Variations (GPOS/GDEF) to switch dollar sign glyphs across weights. + + +# Debugging glyphs +Thanks to Greg Hitchcock's TrueType coding wizardry, this font includes many glyphs that are helpful for debugging implementations of variable fonts. It has a number of substitutions implemented as liga features: + +Feature | Description +-------- | ---------- +\axis1 | Shows the normalized coordinate on the wght axis for the currently selected instance (e.g. 1.0 for bold, -1.0 for light, or something in between). +\axis2 | Shows 0 because this font doesn't yet have a second axis. +\axis1hex | Same as \axis1 but in hex. +\axis2hex | Same as \axis2 but in hex. +\pointsize | Shows the point size passed to the TrueType rasterizer. Note that depending on how the application calls the rasterizer, this may not be what you expect - e.g. on Safari on MacOS, this is always 1024. +\ppem | Shows the pixels per em passed to the TrueType rastersize. Note that depending on how the application calls the rasterizer, this may not be what you expect - e.g. on Safari on MacOS, this is always 1024. +\ttversion | Shows the version of the TrueType rasterizer. +\ttmode | Shows the current TrueType rasterizer mode flags. +\boldtest | A glyph to help you detect artificial emboldening. The glyph has a vertical bar and a circle. The vertical bar's weight varies with the weight of the rest of the font: it gets bolder at bolder weights, lighter at lighter weights. The circle changes weight (and size) in opposition to the rest of the font: lighter at bold weights and vice versa. Thus, if you use this character and see both the circle and bar look bold, you're not looking at a true bold instance, but an algorithmically emboldened one. +\family | Shows the family name of the font. +\version | Shows the version of this font + + + + +# Hinting +This version of Selawik is primarily hinted with the light Latin hinting style Microsoft recommends for variable Latin fonts. The VTT Light Latin autohinter was used to create the first round of hints, which were then reviewed and touched up. + +This hinting style only uses CVTs for vertical metrics anchors (ascender, descender, cap height, x-height, and baseline). While this makes for an easy job hinting a Latin font, it makes for a poor test case because Selawik doesn't vary vertical metrics with weight, thus doesn't vary CVTs, thus doesn't need a cvar. So, to make it more interesting, we added CVT-based stem hints to the lowercase only. This provided the need to vary CVTs and thus require a cvar. Note that this was only done for testing purposes. For variable fonts, Microsoft recommends the light hinting style using the `ResYDist()` command instead of a CVT-based stem hint. diff --git a/fonts/Selawik-variable.ttf b/fonts/Selawik-variable.ttf new file mode 100644 index 0000000..ff347e0 Binary files /dev/null and b/fonts/Selawik-variable.ttf differ diff --git a/fonts/TestAVAR.ttf b/fonts/TestAVAR.ttf new file mode 100644 index 0000000..4a16594 Binary files /dev/null and b/fonts/TestAVAR.ttf differ diff --git a/fonts/TestCMAP14.otf b/fonts/TestCMAP14.otf new file mode 100644 index 0000000..94b5ba9 Binary files /dev/null and b/fonts/TestCMAP14.otf differ diff --git a/fonts/TestCMAPMacTurkish.ttf b/fonts/TestCMAPMacTurkish.ttf new file mode 100644 index 0000000..4f89b09 Binary files /dev/null and b/fonts/TestCMAPMacTurkish.ttf differ diff --git a/fonts/TestCVARGVAROne.ttf b/fonts/TestCVARGVAROne.ttf new file mode 100644 index 0000000..84cd1ea Binary files /dev/null and b/fonts/TestCVARGVAROne.ttf differ diff --git a/fonts/TestCVARGVARTwo.ttf b/fonts/TestCVARGVARTwo.ttf new file mode 100644 index 0000000..f20918a Binary files /dev/null and b/fonts/TestCVARGVARTwo.ttf differ diff --git a/fonts/TestGLYFOne.ttf b/fonts/TestGLYFOne.ttf new file mode 100644 index 0000000..8f634d9 Binary files /dev/null and b/fonts/TestGLYFOne.ttf differ diff --git a/fonts/TestGPOSFour.ttf b/fonts/TestGPOSFour.ttf new file mode 100644 index 0000000..bd929b5 Binary files /dev/null and b/fonts/TestGPOSFour.ttf differ diff --git a/fonts/TestGPOSOne.ttf b/fonts/TestGPOSOne.ttf new file mode 100644 index 0000000..ea74dd0 Binary files /dev/null and b/fonts/TestGPOSOne.ttf differ diff --git a/fonts/TestGPOSThree.ttf b/fonts/TestGPOSThree.ttf new file mode 100644 index 0000000..1ed3df4 Binary files /dev/null and b/fonts/TestGPOSThree.ttf differ diff --git a/fonts/TestGPOSTwo.otf b/fonts/TestGPOSTwo.otf new file mode 100644 index 0000000..55cceb7 Binary files /dev/null and b/fonts/TestGPOSTwo.otf differ diff --git a/fonts/TestGSUBOne.otf b/fonts/TestGSUBOne.otf new file mode 100644 index 0000000..9be638f Binary files /dev/null and b/fonts/TestGSUBOne.otf differ diff --git a/fonts/TestGSUBThree.ttf b/fonts/TestGSUBThree.ttf new file mode 100644 index 0000000..ec27e03 Binary files /dev/null and b/fonts/TestGSUBThree.ttf differ diff --git a/fonts/TestGVAR-Composite-0.ttf b/fonts/TestGVAR-Composite-0.ttf new file mode 100644 index 0000000..07e6882 Binary files /dev/null and b/fonts/TestGVAR-Composite-0.ttf differ diff --git a/fonts/TestGVAR-Composite-Missing.ttf b/fonts/TestGVAR-Composite-Missing.ttf new file mode 100644 index 0000000..58dd961 Binary files /dev/null and b/fonts/TestGVAR-Composite-Missing.ttf differ diff --git a/fonts/TestGVAREight.ttf b/fonts/TestGVAREight.ttf new file mode 100644 index 0000000..271dc4b Binary files /dev/null and b/fonts/TestGVAREight.ttf differ diff --git a/fonts/TestGVARFour.ttf b/fonts/TestGVARFour.ttf new file mode 100644 index 0000000..3524f37 Binary files /dev/null and b/fonts/TestGVARFour.ttf differ diff --git a/fonts/TestGVARNine.ttf b/fonts/TestGVARNine.ttf new file mode 100644 index 0000000..3dddf69 Binary files /dev/null and b/fonts/TestGVARNine.ttf differ diff --git a/fonts/TestGVAROne.ttf b/fonts/TestGVAROne.ttf new file mode 100644 index 0000000..e155d8f Binary files /dev/null and b/fonts/TestGVAROne.ttf differ diff --git a/fonts/TestGVARThree.ttf b/fonts/TestGVARThree.ttf new file mode 100644 index 0000000..ac2d7eb Binary files /dev/null and b/fonts/TestGVARThree.ttf differ diff --git a/fonts/TestGVARTwo.ttf b/fonts/TestGVARTwo.ttf new file mode 100644 index 0000000..bd144c6 Binary files /dev/null and b/fonts/TestGVARTwo.ttf differ diff --git a/fonts/TestHVAROne.otf b/fonts/TestHVAROne.otf new file mode 100644 index 0000000..07a3c54 Binary files /dev/null and b/fonts/TestHVAROne.otf differ diff --git a/fonts/TestHVARTwo.ttf b/fonts/TestHVARTwo.ttf new file mode 100644 index 0000000..2e81f94 Binary files /dev/null and b/fonts/TestHVARTwo.ttf differ diff --git a/fonts/TestKERNOne.otf b/fonts/TestKERNOne.otf new file mode 100644 index 0000000..d3f7c0c Binary files /dev/null and b/fonts/TestKERNOne.otf differ diff --git a/fonts/TestMORXEight.ttf b/fonts/TestMORXEight.ttf new file mode 100644 index 0000000..a53de2e Binary files /dev/null and b/fonts/TestMORXEight.ttf differ diff --git a/fonts/TestMORXEighteen.ttf b/fonts/TestMORXEighteen.ttf new file mode 100644 index 0000000..c6e6343 Binary files /dev/null and b/fonts/TestMORXEighteen.ttf differ diff --git a/fonts/TestMORXEleven.ttf b/fonts/TestMORXEleven.ttf new file mode 100644 index 0000000..b7e0f45 Binary files /dev/null and b/fonts/TestMORXEleven.ttf differ diff --git a/fonts/TestMORXForty.ttf b/fonts/TestMORXForty.ttf new file mode 100644 index 0000000..1d348dd Binary files /dev/null and b/fonts/TestMORXForty.ttf differ diff --git a/fonts/TestMORXFour.ttf b/fonts/TestMORXFour.ttf new file mode 100644 index 0000000..07512ab Binary files /dev/null and b/fonts/TestMORXFour.ttf differ diff --git a/fonts/TestMORXFourteen.ttf b/fonts/TestMORXFourteen.ttf new file mode 100644 index 0000000..fb96112 Binary files /dev/null and b/fonts/TestMORXFourteen.ttf differ diff --git a/fonts/TestMORXFourtyone.ttf b/fonts/TestMORXFourtyone.ttf new file mode 100644 index 0000000..be18c75 Binary files /dev/null and b/fonts/TestMORXFourtyone.ttf differ diff --git a/fonts/TestMORXNine.ttf b/fonts/TestMORXNine.ttf new file mode 100644 index 0000000..edbf4b1 Binary files /dev/null and b/fonts/TestMORXNine.ttf differ diff --git a/fonts/TestMORXOne.ttf b/fonts/TestMORXOne.ttf new file mode 100644 index 0000000..53d6466 Binary files /dev/null and b/fonts/TestMORXOne.ttf differ diff --git a/fonts/TestMORXSeventeen.ttf b/fonts/TestMORXSeventeen.ttf new file mode 100644 index 0000000..4fe4fc2 Binary files /dev/null and b/fonts/TestMORXSeventeen.ttf differ diff --git a/fonts/TestMORXSixteen.ttf b/fonts/TestMORXSixteen.ttf new file mode 100644 index 0000000..7cbc0eb Binary files /dev/null and b/fonts/TestMORXSixteen.ttf differ diff --git a/fonts/TestMORXTen.ttf b/fonts/TestMORXTen.ttf new file mode 100644 index 0000000..1d43897 Binary files /dev/null and b/fonts/TestMORXTen.ttf differ diff --git a/fonts/TestMORXThirteen.ttf b/fonts/TestMORXThirteen.ttf new file mode 100644 index 0000000..48f81d1 Binary files /dev/null and b/fonts/TestMORXThirteen.ttf differ diff --git a/fonts/TestMORXThirtyeight.ttf b/fonts/TestMORXThirtyeight.ttf new file mode 100644 index 0000000..0968544 Binary files /dev/null and b/fonts/TestMORXThirtyeight.ttf differ diff --git a/fonts/TestMORXThirtyfive.ttf b/fonts/TestMORXThirtyfive.ttf new file mode 100644 index 0000000..88d67ef Binary files /dev/null and b/fonts/TestMORXThirtyfive.ttf differ diff --git a/fonts/TestMORXThirtyfour.ttf b/fonts/TestMORXThirtyfour.ttf new file mode 100644 index 0000000..94d064f Binary files /dev/null and b/fonts/TestMORXThirtyfour.ttf differ diff --git a/fonts/TestMORXThirtynine.ttf b/fonts/TestMORXThirtynine.ttf new file mode 100644 index 0000000..189061a Binary files /dev/null and b/fonts/TestMORXThirtynine.ttf differ diff --git a/fonts/TestMORXThirtyone.ttf b/fonts/TestMORXThirtyone.ttf new file mode 100644 index 0000000..39455ea Binary files /dev/null and b/fonts/TestMORXThirtyone.ttf differ diff --git a/fonts/TestMORXThirtyseven.ttf b/fonts/TestMORXThirtyseven.ttf new file mode 100644 index 0000000..9bdea11 Binary files /dev/null and b/fonts/TestMORXThirtyseven.ttf differ diff --git a/fonts/TestMORXThirtysix.ttf b/fonts/TestMORXThirtysix.ttf new file mode 100644 index 0000000..28a522e Binary files /dev/null and b/fonts/TestMORXThirtysix.ttf differ diff --git a/fonts/TestMORXThirtythree.ttf b/fonts/TestMORXThirtythree.ttf new file mode 100644 index 0000000..af887d9 Binary files /dev/null and b/fonts/TestMORXThirtythree.ttf differ diff --git a/fonts/TestMORXThirtytwo.ttf b/fonts/TestMORXThirtytwo.ttf new file mode 100644 index 0000000..e8314c7 Binary files /dev/null and b/fonts/TestMORXThirtytwo.ttf differ diff --git a/fonts/TestMORXThree.ttf b/fonts/TestMORXThree.ttf new file mode 100644 index 0000000..33cc72b Binary files /dev/null and b/fonts/TestMORXThree.ttf differ diff --git a/fonts/TestMORXTwelve.ttf b/fonts/TestMORXTwelve.ttf new file mode 100644 index 0000000..b660833 Binary files /dev/null and b/fonts/TestMORXTwelve.ttf differ diff --git a/fonts/TestMORXTwenty.ttf b/fonts/TestMORXTwenty.ttf new file mode 100644 index 0000000..9d7d9ec Binary files /dev/null and b/fonts/TestMORXTwenty.ttf differ diff --git a/fonts/TestMORXTwentyeight.ttf b/fonts/TestMORXTwentyeight.ttf new file mode 100644 index 0000000..e02d354 Binary files /dev/null and b/fonts/TestMORXTwentyeight.ttf differ diff --git a/fonts/TestMORXTwentyfive.ttf b/fonts/TestMORXTwentyfive.ttf new file mode 100644 index 0000000..88c0866 Binary files /dev/null and b/fonts/TestMORXTwentyfive.ttf differ diff --git a/fonts/TestMORXTwentyfour.ttf b/fonts/TestMORXTwentyfour.ttf new file mode 100644 index 0000000..3706325 Binary files /dev/null and b/fonts/TestMORXTwentyfour.ttf differ diff --git a/fonts/TestMORXTwentynine.ttf b/fonts/TestMORXTwentynine.ttf new file mode 100644 index 0000000..10368bc Binary files /dev/null and b/fonts/TestMORXTwentynine.ttf differ diff --git a/fonts/TestMORXTwentyone.ttf b/fonts/TestMORXTwentyone.ttf new file mode 100644 index 0000000..e9e8413 Binary files /dev/null and b/fonts/TestMORXTwentyone.ttf differ diff --git a/fonts/TestMORXTwentyseven.ttf b/fonts/TestMORXTwentyseven.ttf new file mode 100644 index 0000000..a459cb3 Binary files /dev/null and b/fonts/TestMORXTwentyseven.ttf differ diff --git a/fonts/TestMORXTwentysix.ttf b/fonts/TestMORXTwentysix.ttf new file mode 100644 index 0000000..040fd87 Binary files /dev/null and b/fonts/TestMORXTwentysix.ttf differ diff --git a/fonts/TestMORXTwentythree.ttf b/fonts/TestMORXTwentythree.ttf new file mode 100644 index 0000000..18a90fd Binary files /dev/null and b/fonts/TestMORXTwentythree.ttf differ diff --git a/fonts/TestMORXTwentytwo.ttf b/fonts/TestMORXTwentytwo.ttf new file mode 100644 index 0000000..f2b6f6c Binary files /dev/null and b/fonts/TestMORXTwentytwo.ttf differ diff --git a/fonts/TestMORXTwo.ttf b/fonts/TestMORXTwo.ttf new file mode 100644 index 0000000..365a635 Binary files /dev/null and b/fonts/TestMORXTwo.ttf differ diff --git a/fonts/TestSFNTOne.otf b/fonts/TestSFNTOne.otf new file mode 100644 index 0000000..974e286 Binary files /dev/null and b/fonts/TestSFNTOne.otf differ diff --git a/fonts/TestSFNTTwo.ttf b/fonts/TestSFNTTwo.ttf new file mode 100644 index 0000000..a1d62cf Binary files /dev/null and b/fonts/TestSFNTTwo.ttf differ diff --git a/fonts/TestSVGgradientTransform.otf b/fonts/TestSVGgradientTransform.otf new file mode 100644 index 0000000..59cfc5a Binary files /dev/null and b/fonts/TestSVGgradientTransform.otf differ diff --git a/fonts/TestSVGgzip.otf b/fonts/TestSVGgzip.otf new file mode 100644 index 0000000..69d976f Binary files /dev/null and b/fonts/TestSVGgzip.otf differ diff --git a/fonts/TestSVGmultiGlyphs.otf b/fonts/TestSVGmultiGlyphs.otf new file mode 100644 index 0000000..50fdc19 Binary files /dev/null and b/fonts/TestSVGmultiGlyphs.otf differ diff --git a/fonts/TestShapeAran.ttf b/fonts/TestShapeAran.ttf new file mode 100644 index 0000000..c73f569 Binary files /dev/null and b/fonts/TestShapeAran.ttf differ diff --git a/fonts/TestShapeEthi.ttf b/fonts/TestShapeEthi.ttf new file mode 100644 index 0000000..391dddd Binary files /dev/null and b/fonts/TestShapeEthi.ttf differ diff --git a/fonts/TestShapeKndaV3.ttf b/fonts/TestShapeKndaV3.ttf new file mode 100644 index 0000000..9f632c3 Binary files /dev/null and b/fonts/TestShapeKndaV3.ttf differ diff --git a/fonts/TestShapeLana.ttf b/fonts/TestShapeLana.ttf new file mode 100644 index 0000000..f7c3f81 Binary files /dev/null and b/fonts/TestShapeLana.ttf differ diff --git a/fonts/TestTRAKOne.ttf b/fonts/TestTRAKOne.ttf new file mode 100644 index 0000000..85f1d97 Binary files /dev/null and b/fonts/TestTRAKOne.ttf differ diff --git a/fonts/Zycon.ttf b/fonts/Zycon.ttf new file mode 100644 index 0000000..3a6761b Binary files /dev/null and b/fonts/Zycon.ttf differ diff --git a/fonts/aots/classdef1_font1.otf b/fonts/aots/classdef1_font1.otf new file mode 100644 index 0000000..f0add69 Binary files /dev/null and b/fonts/aots/classdef1_font1.otf differ diff --git a/fonts/aots/classdef1_font2.otf b/fonts/aots/classdef1_font2.otf new file mode 100644 index 0000000..f01876d Binary files /dev/null and b/fonts/aots/classdef1_font2.otf differ diff --git a/fonts/aots/classdef1_font3.otf b/fonts/aots/classdef1_font3.otf new file mode 100644 index 0000000..2a0f9cc Binary files /dev/null and b/fonts/aots/classdef1_font3.otf differ diff --git a/fonts/aots/classdef1_font4.otf b/fonts/aots/classdef1_font4.otf new file mode 100644 index 0000000..9c0f41c Binary files /dev/null and b/fonts/aots/classdef1_font4.otf differ diff --git a/fonts/aots/classdef2_font1.otf b/fonts/aots/classdef2_font1.otf new file mode 100644 index 0000000..2e2faaf Binary files /dev/null and b/fonts/aots/classdef2_font1.otf differ diff --git a/fonts/aots/classdef2_font2.otf b/fonts/aots/classdef2_font2.otf new file mode 100644 index 0000000..2e2a1af Binary files /dev/null and b/fonts/aots/classdef2_font2.otf differ diff --git a/fonts/aots/classdef2_font3.otf b/fonts/aots/classdef2_font3.otf new file mode 100644 index 0000000..14c9119 Binary files /dev/null and b/fonts/aots/classdef2_font3.otf differ diff --git a/fonts/aots/classdef2_font4.otf b/fonts/aots/classdef2_font4.otf new file mode 100644 index 0000000..c75c883 Binary files /dev/null and b/fonts/aots/classdef2_font4.otf differ diff --git a/fonts/aots/cmap0_font1.otf b/fonts/aots/cmap0_font1.otf new file mode 100644 index 0000000..772f9a7 Binary files /dev/null and b/fonts/aots/cmap0_font1.otf differ diff --git a/fonts/aots/cmap10_font1.otf b/fonts/aots/cmap10_font1.otf new file mode 100644 index 0000000..023e945 Binary files /dev/null and b/fonts/aots/cmap10_font1.otf differ diff --git a/fonts/aots/cmap10_font2.otf b/fonts/aots/cmap10_font2.otf new file mode 100644 index 0000000..5202f79 Binary files /dev/null and b/fonts/aots/cmap10_font2.otf differ diff --git a/fonts/aots/cmap12_font1.otf b/fonts/aots/cmap12_font1.otf new file mode 100644 index 0000000..2d74b3a Binary files /dev/null and b/fonts/aots/cmap12_font1.otf differ diff --git a/fonts/aots/cmap14_font1.otf b/fonts/aots/cmap14_font1.otf new file mode 100644 index 0000000..a8e941d Binary files /dev/null and b/fonts/aots/cmap14_font1.otf differ diff --git a/fonts/aots/cmap2_font1.otf b/fonts/aots/cmap2_font1.otf new file mode 100644 index 0000000..a123d9c Binary files /dev/null and b/fonts/aots/cmap2_font1.otf differ diff --git a/fonts/aots/cmap4_font1.otf b/fonts/aots/cmap4_font1.otf new file mode 100644 index 0000000..516ed8e Binary files /dev/null and b/fonts/aots/cmap4_font1.otf differ diff --git a/fonts/aots/cmap4_font2.otf b/fonts/aots/cmap4_font2.otf new file mode 100644 index 0000000..0f678a3 Binary files /dev/null and b/fonts/aots/cmap4_font2.otf differ diff --git a/fonts/aots/cmap4_font3.otf b/fonts/aots/cmap4_font3.otf new file mode 100644 index 0000000..2034ecd Binary files /dev/null and b/fonts/aots/cmap4_font3.otf differ diff --git a/fonts/aots/cmap4_font4.otf b/fonts/aots/cmap4_font4.otf new file mode 100644 index 0000000..450508e Binary files /dev/null and b/fonts/aots/cmap4_font4.otf differ diff --git a/fonts/aots/cmap6_font1.otf b/fonts/aots/cmap6_font1.otf new file mode 100644 index 0000000..10b64a7 Binary files /dev/null and b/fonts/aots/cmap6_font1.otf differ diff --git a/fonts/aots/cmap6_font2.otf b/fonts/aots/cmap6_font2.otf new file mode 100644 index 0000000..2d2957f Binary files /dev/null and b/fonts/aots/cmap6_font2.otf differ diff --git a/fonts/aots/cmap8_font1.otf b/fonts/aots/cmap8_font1.otf new file mode 100644 index 0000000..791b9e3 Binary files /dev/null and b/fonts/aots/cmap8_font1.otf differ diff --git a/fonts/aots/cmap_composition_font1.otf b/fonts/aots/cmap_composition_font1.otf new file mode 100644 index 0000000..c790717 Binary files /dev/null and b/fonts/aots/cmap_composition_font1.otf differ diff --git a/fonts/aots/cmap_subtableselection_font1.otf b/fonts/aots/cmap_subtableselection_font1.otf new file mode 100644 index 0000000..8929f8a Binary files /dev/null and b/fonts/aots/cmap_subtableselection_font1.otf differ diff --git a/fonts/aots/cmap_subtableselection_font2.otf b/fonts/aots/cmap_subtableselection_font2.otf new file mode 100644 index 0000000..2611092 Binary files /dev/null and b/fonts/aots/cmap_subtableselection_font2.otf differ diff --git a/fonts/aots/cmap_subtableselection_font3.otf b/fonts/aots/cmap_subtableselection_font3.otf new file mode 100644 index 0000000..9f39331 Binary files /dev/null and b/fonts/aots/cmap_subtableselection_font3.otf differ diff --git a/fonts/aots/cmap_subtableselection_font4.otf b/fonts/aots/cmap_subtableselection_font4.otf new file mode 100644 index 0000000..83ae88e Binary files /dev/null and b/fonts/aots/cmap_subtableselection_font4.otf differ diff --git a/fonts/aots/cmap_subtableselection_font5.otf b/fonts/aots/cmap_subtableselection_font5.otf new file mode 100644 index 0000000..8b614ad Binary files /dev/null and b/fonts/aots/cmap_subtableselection_font5.otf differ diff --git a/fonts/aots/gpos1_1_lookupflag_f1.otf b/fonts/aots/gpos1_1_lookupflag_f1.otf new file mode 100644 index 0000000..3245425 Binary files /dev/null and b/fonts/aots/gpos1_1_lookupflag_f1.otf differ diff --git a/fonts/aots/gpos1_1_simple_f1.otf b/fonts/aots/gpos1_1_simple_f1.otf new file mode 100644 index 0000000..c5f8888 Binary files /dev/null and b/fonts/aots/gpos1_1_simple_f1.otf differ diff --git a/fonts/aots/gpos1_1_simple_f2.otf b/fonts/aots/gpos1_1_simple_f2.otf new file mode 100644 index 0000000..905d0a3 Binary files /dev/null and b/fonts/aots/gpos1_1_simple_f2.otf differ diff --git a/fonts/aots/gpos1_1_simple_f3.otf b/fonts/aots/gpos1_1_simple_f3.otf new file mode 100644 index 0000000..550be87 Binary files /dev/null and b/fonts/aots/gpos1_1_simple_f3.otf differ diff --git a/fonts/aots/gpos1_1_simple_f4.otf b/fonts/aots/gpos1_1_simple_f4.otf new file mode 100644 index 0000000..448bc8b Binary files /dev/null and b/fonts/aots/gpos1_1_simple_f4.otf differ diff --git a/fonts/aots/gpos1_2_font1.otf b/fonts/aots/gpos1_2_font1.otf new file mode 100644 index 0000000..3e7b7bc Binary files /dev/null and b/fonts/aots/gpos1_2_font1.otf differ diff --git a/fonts/aots/gpos1_2_font2.otf b/fonts/aots/gpos1_2_font2.otf new file mode 100644 index 0000000..ba9d224 Binary files /dev/null and b/fonts/aots/gpos1_2_font2.otf differ diff --git a/fonts/aots/gpos2_1_font6.otf b/fonts/aots/gpos2_1_font6.otf new file mode 100644 index 0000000..cd4ea94 Binary files /dev/null and b/fonts/aots/gpos2_1_font6.otf differ diff --git a/fonts/aots/gpos2_1_font7.otf b/fonts/aots/gpos2_1_font7.otf new file mode 100644 index 0000000..2871acc Binary files /dev/null and b/fonts/aots/gpos2_1_font7.otf differ diff --git a/fonts/aots/gpos2_1_lookupflag_f1.otf b/fonts/aots/gpos2_1_lookupflag_f1.otf new file mode 100644 index 0000000..6003782 Binary files /dev/null and b/fonts/aots/gpos2_1_lookupflag_f1.otf differ diff --git a/fonts/aots/gpos2_1_lookupflag_f2.otf b/fonts/aots/gpos2_1_lookupflag_f2.otf new file mode 100644 index 0000000..9d0a273 Binary files /dev/null and b/fonts/aots/gpos2_1_lookupflag_f2.otf differ diff --git a/fonts/aots/gpos2_1_next_glyph_f1.otf b/fonts/aots/gpos2_1_next_glyph_f1.otf new file mode 100644 index 0000000..64d6c2c Binary files /dev/null and b/fonts/aots/gpos2_1_next_glyph_f1.otf differ diff --git a/fonts/aots/gpos2_1_next_glyph_f2.otf b/fonts/aots/gpos2_1_next_glyph_f2.otf new file mode 100644 index 0000000..3d8c37a Binary files /dev/null and b/fonts/aots/gpos2_1_next_glyph_f2.otf differ diff --git a/fonts/aots/gpos2_1_simple_f1.otf b/fonts/aots/gpos2_1_simple_f1.otf new file mode 100644 index 0000000..c947776 Binary files /dev/null and b/fonts/aots/gpos2_1_simple_f1.otf differ diff --git a/fonts/aots/gpos2_2_font1.otf b/fonts/aots/gpos2_2_font1.otf new file mode 100644 index 0000000..dde370a Binary files /dev/null and b/fonts/aots/gpos2_2_font1.otf differ diff --git a/fonts/aots/gpos2_2_font2.otf b/fonts/aots/gpos2_2_font2.otf new file mode 100644 index 0000000..63d874a Binary files /dev/null and b/fonts/aots/gpos2_2_font2.otf differ diff --git a/fonts/aots/gpos2_2_font3.otf b/fonts/aots/gpos2_2_font3.otf new file mode 100644 index 0000000..b530676 Binary files /dev/null and b/fonts/aots/gpos2_2_font3.otf differ diff --git a/fonts/aots/gpos2_2_font4.otf b/fonts/aots/gpos2_2_font4.otf new file mode 100644 index 0000000..b549e02 Binary files /dev/null and b/fonts/aots/gpos2_2_font4.otf differ diff --git a/fonts/aots/gpos2_2_font5.otf b/fonts/aots/gpos2_2_font5.otf new file mode 100644 index 0000000..64c40bb Binary files /dev/null and b/fonts/aots/gpos2_2_font5.otf differ diff --git a/fonts/aots/gpos3_font1.otf b/fonts/aots/gpos3_font1.otf new file mode 100644 index 0000000..9b6d39a Binary files /dev/null and b/fonts/aots/gpos3_font1.otf differ diff --git a/fonts/aots/gpos3_font2.otf b/fonts/aots/gpos3_font2.otf new file mode 100644 index 0000000..dee5785 Binary files /dev/null and b/fonts/aots/gpos3_font2.otf differ diff --git a/fonts/aots/gpos3_font3.otf b/fonts/aots/gpos3_font3.otf new file mode 100644 index 0000000..7522660 Binary files /dev/null and b/fonts/aots/gpos3_font3.otf differ diff --git a/fonts/aots/gpos4_lookupflag_f1.otf b/fonts/aots/gpos4_lookupflag_f1.otf new file mode 100644 index 0000000..b141116 Binary files /dev/null and b/fonts/aots/gpos4_lookupflag_f1.otf differ diff --git a/fonts/aots/gpos4_lookupflag_f2.otf b/fonts/aots/gpos4_lookupflag_f2.otf new file mode 100644 index 0000000..84e4843 Binary files /dev/null and b/fonts/aots/gpos4_lookupflag_f2.otf differ diff --git a/fonts/aots/gpos4_multiple_anchors_1.otf b/fonts/aots/gpos4_multiple_anchors_1.otf new file mode 100644 index 0000000..025f69b Binary files /dev/null and b/fonts/aots/gpos4_multiple_anchors_1.otf differ diff --git a/fonts/aots/gpos4_simple_1.otf b/fonts/aots/gpos4_simple_1.otf new file mode 100644 index 0000000..da54a1f Binary files /dev/null and b/fonts/aots/gpos4_simple_1.otf differ diff --git a/fonts/aots/gpos5_font1.otf b/fonts/aots/gpos5_font1.otf new file mode 100644 index 0000000..8c48fb6 Binary files /dev/null and b/fonts/aots/gpos5_font1.otf differ diff --git a/fonts/aots/gpos6_font1.otf b/fonts/aots/gpos6_font1.otf new file mode 100644 index 0000000..f7f92cc Binary files /dev/null and b/fonts/aots/gpos6_font1.otf differ diff --git a/fonts/aots/gpos7_1_font1.otf b/fonts/aots/gpos7_1_font1.otf new file mode 100644 index 0000000..ced8907 Binary files /dev/null and b/fonts/aots/gpos7_1_font1.otf differ diff --git a/fonts/aots/gpos9_font1.otf b/fonts/aots/gpos9_font1.otf new file mode 100644 index 0000000..e99c25a Binary files /dev/null and b/fonts/aots/gpos9_font1.otf differ diff --git a/fonts/aots/gpos9_font2.otf b/fonts/aots/gpos9_font2.otf new file mode 100644 index 0000000..9ae824b Binary files /dev/null and b/fonts/aots/gpos9_font2.otf differ diff --git a/fonts/aots/gpos_chaining1_boundary_f1.otf b/fonts/aots/gpos_chaining1_boundary_f1.otf new file mode 100644 index 0000000..44c4117 Binary files /dev/null and b/fonts/aots/gpos_chaining1_boundary_f1.otf differ diff --git a/fonts/aots/gpos_chaining1_boundary_f2.otf b/fonts/aots/gpos_chaining1_boundary_f2.otf new file mode 100644 index 0000000..431b08f Binary files /dev/null and b/fonts/aots/gpos_chaining1_boundary_f2.otf differ diff --git a/fonts/aots/gpos_chaining1_boundary_f3.otf b/fonts/aots/gpos_chaining1_boundary_f3.otf new file mode 100644 index 0000000..1bac49a Binary files /dev/null and b/fonts/aots/gpos_chaining1_boundary_f3.otf differ diff --git a/fonts/aots/gpos_chaining1_boundary_f4.otf b/fonts/aots/gpos_chaining1_boundary_f4.otf new file mode 100644 index 0000000..3d37782 Binary files /dev/null and b/fonts/aots/gpos_chaining1_boundary_f4.otf differ diff --git a/fonts/aots/gpos_chaining1_lookupflag_f1.otf b/fonts/aots/gpos_chaining1_lookupflag_f1.otf new file mode 100644 index 0000000..a83342a Binary files /dev/null and b/fonts/aots/gpos_chaining1_lookupflag_f1.otf differ diff --git a/fonts/aots/gpos_chaining1_multiple_subrules_f1.otf b/fonts/aots/gpos_chaining1_multiple_subrules_f1.otf new file mode 100644 index 0000000..07bf55c Binary files /dev/null and b/fonts/aots/gpos_chaining1_multiple_subrules_f1.otf differ diff --git a/fonts/aots/gpos_chaining1_multiple_subrules_f2.otf b/fonts/aots/gpos_chaining1_multiple_subrules_f2.otf new file mode 100644 index 0000000..dc3754b Binary files /dev/null and b/fonts/aots/gpos_chaining1_multiple_subrules_f2.otf differ diff --git a/fonts/aots/gpos_chaining1_next_glyph_f1.otf b/fonts/aots/gpos_chaining1_next_glyph_f1.otf new file mode 100644 index 0000000..17852c2 Binary files /dev/null and b/fonts/aots/gpos_chaining1_next_glyph_f1.otf differ diff --git a/fonts/aots/gpos_chaining1_simple_f1.otf b/fonts/aots/gpos_chaining1_simple_f1.otf new file mode 100644 index 0000000..31cbe77 Binary files /dev/null and b/fonts/aots/gpos_chaining1_simple_f1.otf differ diff --git a/fonts/aots/gpos_chaining1_simple_f2.otf b/fonts/aots/gpos_chaining1_simple_f2.otf new file mode 100644 index 0000000..3293ad8 Binary files /dev/null and b/fonts/aots/gpos_chaining1_simple_f2.otf differ diff --git a/fonts/aots/gpos_chaining1_successive_f1.otf b/fonts/aots/gpos_chaining1_successive_f1.otf new file mode 100644 index 0000000..4c86663 Binary files /dev/null and b/fonts/aots/gpos_chaining1_successive_f1.otf differ diff --git a/fonts/aots/gpos_chaining2_boundary_f1.otf b/fonts/aots/gpos_chaining2_boundary_f1.otf new file mode 100644 index 0000000..49210fb Binary files /dev/null and b/fonts/aots/gpos_chaining2_boundary_f1.otf differ diff --git a/fonts/aots/gpos_chaining2_boundary_f2.otf b/fonts/aots/gpos_chaining2_boundary_f2.otf new file mode 100644 index 0000000..456fc9b Binary files /dev/null and b/fonts/aots/gpos_chaining2_boundary_f2.otf differ diff --git a/fonts/aots/gpos_chaining2_boundary_f3.otf b/fonts/aots/gpos_chaining2_boundary_f3.otf new file mode 100644 index 0000000..768492a Binary files /dev/null and b/fonts/aots/gpos_chaining2_boundary_f3.otf differ diff --git a/fonts/aots/gpos_chaining2_boundary_f4.otf b/fonts/aots/gpos_chaining2_boundary_f4.otf new file mode 100644 index 0000000..2670da6 Binary files /dev/null and b/fonts/aots/gpos_chaining2_boundary_f4.otf differ diff --git a/fonts/aots/gpos_chaining2_lookupflag_f1.otf b/fonts/aots/gpos_chaining2_lookupflag_f1.otf new file mode 100644 index 0000000..e8cce56 Binary files /dev/null and b/fonts/aots/gpos_chaining2_lookupflag_f1.otf differ diff --git a/fonts/aots/gpos_chaining2_multiple_subrules_f1.otf b/fonts/aots/gpos_chaining2_multiple_subrules_f1.otf new file mode 100644 index 0000000..f182c7f Binary files /dev/null and b/fonts/aots/gpos_chaining2_multiple_subrules_f1.otf differ diff --git a/fonts/aots/gpos_chaining2_multiple_subrules_f2.otf b/fonts/aots/gpos_chaining2_multiple_subrules_f2.otf new file mode 100644 index 0000000..d24896a Binary files /dev/null and b/fonts/aots/gpos_chaining2_multiple_subrules_f2.otf differ diff --git a/fonts/aots/gpos_chaining2_next_glyph_f1.otf b/fonts/aots/gpos_chaining2_next_glyph_f1.otf new file mode 100644 index 0000000..f6bbda4 Binary files /dev/null and b/fonts/aots/gpos_chaining2_next_glyph_f1.otf differ diff --git a/fonts/aots/gpos_chaining2_simple_f1.otf b/fonts/aots/gpos_chaining2_simple_f1.otf new file mode 100644 index 0000000..1805a03 Binary files /dev/null and b/fonts/aots/gpos_chaining2_simple_f1.otf differ diff --git a/fonts/aots/gpos_chaining2_simple_f2.otf b/fonts/aots/gpos_chaining2_simple_f2.otf new file mode 100644 index 0000000..1df12f5 Binary files /dev/null and b/fonts/aots/gpos_chaining2_simple_f2.otf differ diff --git a/fonts/aots/gpos_chaining2_successive_f1.otf b/fonts/aots/gpos_chaining2_successive_f1.otf new file mode 100644 index 0000000..a3aadaf Binary files /dev/null and b/fonts/aots/gpos_chaining2_successive_f1.otf differ diff --git a/fonts/aots/gpos_chaining3_boundary_f1.otf b/fonts/aots/gpos_chaining3_boundary_f1.otf new file mode 100644 index 0000000..4f13bdd Binary files /dev/null and b/fonts/aots/gpos_chaining3_boundary_f1.otf differ diff --git a/fonts/aots/gpos_chaining3_boundary_f2.otf b/fonts/aots/gpos_chaining3_boundary_f2.otf new file mode 100644 index 0000000..48be5dd Binary files /dev/null and b/fonts/aots/gpos_chaining3_boundary_f2.otf differ diff --git a/fonts/aots/gpos_chaining3_boundary_f3.otf b/fonts/aots/gpos_chaining3_boundary_f3.otf new file mode 100644 index 0000000..a10068b Binary files /dev/null and b/fonts/aots/gpos_chaining3_boundary_f3.otf differ diff --git a/fonts/aots/gpos_chaining3_boundary_f4.otf b/fonts/aots/gpos_chaining3_boundary_f4.otf new file mode 100644 index 0000000..8030ac0 Binary files /dev/null and b/fonts/aots/gpos_chaining3_boundary_f4.otf differ diff --git a/fonts/aots/gpos_chaining3_lookupflag_f1.otf b/fonts/aots/gpos_chaining3_lookupflag_f1.otf new file mode 100644 index 0000000..7864ce0 Binary files /dev/null and b/fonts/aots/gpos_chaining3_lookupflag_f1.otf differ diff --git a/fonts/aots/gpos_chaining3_next_glyph_f1.otf b/fonts/aots/gpos_chaining3_next_glyph_f1.otf new file mode 100644 index 0000000..20a7966 Binary files /dev/null and b/fonts/aots/gpos_chaining3_next_glyph_f1.otf differ diff --git a/fonts/aots/gpos_chaining3_simple_f1.otf b/fonts/aots/gpos_chaining3_simple_f1.otf new file mode 100644 index 0000000..2c63328 Binary files /dev/null and b/fonts/aots/gpos_chaining3_simple_f1.otf differ diff --git a/fonts/aots/gpos_chaining3_simple_f2.otf b/fonts/aots/gpos_chaining3_simple_f2.otf new file mode 100644 index 0000000..6ef8fb1 Binary files /dev/null and b/fonts/aots/gpos_chaining3_simple_f2.otf differ diff --git a/fonts/aots/gpos_chaining3_successive_f1.otf b/fonts/aots/gpos_chaining3_successive_f1.otf new file mode 100644 index 0000000..8e8439d Binary files /dev/null and b/fonts/aots/gpos_chaining3_successive_f1.otf differ diff --git a/fonts/aots/gpos_context1_boundary_f1.otf b/fonts/aots/gpos_context1_boundary_f1.otf new file mode 100644 index 0000000..22bb3ea Binary files /dev/null and b/fonts/aots/gpos_context1_boundary_f1.otf differ diff --git a/fonts/aots/gpos_context1_boundary_f2.otf b/fonts/aots/gpos_context1_boundary_f2.otf new file mode 100644 index 0000000..7e4c0e1 Binary files /dev/null and b/fonts/aots/gpos_context1_boundary_f2.otf differ diff --git a/fonts/aots/gpos_context1_expansion_f1.otf b/fonts/aots/gpos_context1_expansion_f1.otf new file mode 100644 index 0000000..f7c60f6 Binary files /dev/null and b/fonts/aots/gpos_context1_expansion_f1.otf differ diff --git a/fonts/aots/gpos_context1_lookupflag_f1.otf b/fonts/aots/gpos_context1_lookupflag_f1.otf new file mode 100644 index 0000000..e9b03ae Binary files /dev/null and b/fonts/aots/gpos_context1_lookupflag_f1.otf differ diff --git a/fonts/aots/gpos_context1_lookupflag_f2.otf b/fonts/aots/gpos_context1_lookupflag_f2.otf new file mode 100644 index 0000000..b9998cd Binary files /dev/null and b/fonts/aots/gpos_context1_lookupflag_f2.otf differ diff --git a/fonts/aots/gpos_context1_multiple_subrules_f1.otf b/fonts/aots/gpos_context1_multiple_subrules_f1.otf new file mode 100644 index 0000000..6f1aafa Binary files /dev/null and b/fonts/aots/gpos_context1_multiple_subrules_f1.otf differ diff --git a/fonts/aots/gpos_context1_multiple_subrules_f2.otf b/fonts/aots/gpos_context1_multiple_subrules_f2.otf new file mode 100644 index 0000000..ed9a387 Binary files /dev/null and b/fonts/aots/gpos_context1_multiple_subrules_f2.otf differ diff --git a/fonts/aots/gpos_context1_next_glyph_f1.otf b/fonts/aots/gpos_context1_next_glyph_f1.otf new file mode 100644 index 0000000..6007d54 Binary files /dev/null and b/fonts/aots/gpos_context1_next_glyph_f1.otf differ diff --git a/fonts/aots/gpos_context1_simple_f1.otf b/fonts/aots/gpos_context1_simple_f1.otf new file mode 100644 index 0000000..5e6cd9e Binary files /dev/null and b/fonts/aots/gpos_context1_simple_f1.otf differ diff --git a/fonts/aots/gpos_context1_simple_f2.otf b/fonts/aots/gpos_context1_simple_f2.otf new file mode 100644 index 0000000..b4fddb3 Binary files /dev/null and b/fonts/aots/gpos_context1_simple_f2.otf differ diff --git a/fonts/aots/gpos_context1_successive_f1.otf b/fonts/aots/gpos_context1_successive_f1.otf new file mode 100644 index 0000000..eb0f962 Binary files /dev/null and b/fonts/aots/gpos_context1_successive_f1.otf differ diff --git a/fonts/aots/gpos_context2_boundary_f1.otf b/fonts/aots/gpos_context2_boundary_f1.otf new file mode 100644 index 0000000..3fce497 Binary files /dev/null and b/fonts/aots/gpos_context2_boundary_f1.otf differ diff --git a/fonts/aots/gpos_context2_boundary_f2.otf b/fonts/aots/gpos_context2_boundary_f2.otf new file mode 100644 index 0000000..5b4e012 Binary files /dev/null and b/fonts/aots/gpos_context2_boundary_f2.otf differ diff --git a/fonts/aots/gpos_context2_classes_f1.otf b/fonts/aots/gpos_context2_classes_f1.otf new file mode 100644 index 0000000..585b511 Binary files /dev/null and b/fonts/aots/gpos_context2_classes_f1.otf differ diff --git a/fonts/aots/gpos_context2_classes_f2.otf b/fonts/aots/gpos_context2_classes_f2.otf new file mode 100644 index 0000000..411d58e Binary files /dev/null and b/fonts/aots/gpos_context2_classes_f2.otf differ diff --git a/fonts/aots/gpos_context2_expansion_f1.otf b/fonts/aots/gpos_context2_expansion_f1.otf new file mode 100644 index 0000000..4b2d36a Binary files /dev/null and b/fonts/aots/gpos_context2_expansion_f1.otf differ diff --git a/fonts/aots/gpos_context2_lookupflag_f1.otf b/fonts/aots/gpos_context2_lookupflag_f1.otf new file mode 100644 index 0000000..1c0c480 Binary files /dev/null and b/fonts/aots/gpos_context2_lookupflag_f1.otf differ diff --git a/fonts/aots/gpos_context2_lookupflag_f2.otf b/fonts/aots/gpos_context2_lookupflag_f2.otf new file mode 100644 index 0000000..bf20d84 Binary files /dev/null and b/fonts/aots/gpos_context2_lookupflag_f2.otf differ diff --git a/fonts/aots/gpos_context2_multiple_subrules_f1.otf b/fonts/aots/gpos_context2_multiple_subrules_f1.otf new file mode 100644 index 0000000..05b6b73 Binary files /dev/null and b/fonts/aots/gpos_context2_multiple_subrules_f1.otf differ diff --git a/fonts/aots/gpos_context2_multiple_subrules_f2.otf b/fonts/aots/gpos_context2_multiple_subrules_f2.otf new file mode 100644 index 0000000..f79712c Binary files /dev/null and b/fonts/aots/gpos_context2_multiple_subrules_f2.otf differ diff --git a/fonts/aots/gpos_context2_next_glyph_f1.otf b/fonts/aots/gpos_context2_next_glyph_f1.otf new file mode 100644 index 0000000..1b5a256 Binary files /dev/null and b/fonts/aots/gpos_context2_next_glyph_f1.otf differ diff --git a/fonts/aots/gpos_context2_simple_f1.otf b/fonts/aots/gpos_context2_simple_f1.otf new file mode 100644 index 0000000..9aaec44 Binary files /dev/null and b/fonts/aots/gpos_context2_simple_f1.otf differ diff --git a/fonts/aots/gpos_context2_simple_f2.otf b/fonts/aots/gpos_context2_simple_f2.otf new file mode 100644 index 0000000..c789b2e Binary files /dev/null and b/fonts/aots/gpos_context2_simple_f2.otf differ diff --git a/fonts/aots/gpos_context2_successive_f1.otf b/fonts/aots/gpos_context2_successive_f1.otf new file mode 100644 index 0000000..b89bfb7 Binary files /dev/null and b/fonts/aots/gpos_context2_successive_f1.otf differ diff --git a/fonts/aots/gpos_context3_boundary_f1.otf b/fonts/aots/gpos_context3_boundary_f1.otf new file mode 100644 index 0000000..f8949d4 Binary files /dev/null and b/fonts/aots/gpos_context3_boundary_f1.otf differ diff --git a/fonts/aots/gpos_context3_boundary_f2.otf b/fonts/aots/gpos_context3_boundary_f2.otf new file mode 100644 index 0000000..ceb7452 Binary files /dev/null and b/fonts/aots/gpos_context3_boundary_f2.otf differ diff --git a/fonts/aots/gpos_context3_lookupflag_f1.otf b/fonts/aots/gpos_context3_lookupflag_f1.otf new file mode 100644 index 0000000..40b55ee Binary files /dev/null and b/fonts/aots/gpos_context3_lookupflag_f1.otf differ diff --git a/fonts/aots/gpos_context3_lookupflag_f2.otf b/fonts/aots/gpos_context3_lookupflag_f2.otf new file mode 100644 index 0000000..bcf4d17 Binary files /dev/null and b/fonts/aots/gpos_context3_lookupflag_f2.otf differ diff --git a/fonts/aots/gpos_context3_next_glyph_f1.otf b/fonts/aots/gpos_context3_next_glyph_f1.otf new file mode 100644 index 0000000..6f9d919 Binary files /dev/null and b/fonts/aots/gpos_context3_next_glyph_f1.otf differ diff --git a/fonts/aots/gpos_context3_simple_f1.otf b/fonts/aots/gpos_context3_simple_f1.otf new file mode 100644 index 0000000..470c2ed Binary files /dev/null and b/fonts/aots/gpos_context3_simple_f1.otf differ diff --git a/fonts/aots/gpos_context3_successive_f1.otf b/fonts/aots/gpos_context3_successive_f1.otf new file mode 100644 index 0000000..aeb9bbd Binary files /dev/null and b/fonts/aots/gpos_context3_successive_f1.otf differ diff --git a/fonts/aots/gsub1_1_lookupflag_f1.otf b/fonts/aots/gsub1_1_lookupflag_f1.otf new file mode 100644 index 0000000..a539b95 Binary files /dev/null and b/fonts/aots/gsub1_1_lookupflag_f1.otf differ diff --git a/fonts/aots/gsub1_1_modulo_f1.otf b/fonts/aots/gsub1_1_modulo_f1.otf new file mode 100644 index 0000000..7ba2379 Binary files /dev/null and b/fonts/aots/gsub1_1_modulo_f1.otf differ diff --git a/fonts/aots/gsub1_1_simple_f1.otf b/fonts/aots/gsub1_1_simple_f1.otf new file mode 100644 index 0000000..c21fcd3 Binary files /dev/null and b/fonts/aots/gsub1_1_simple_f1.otf differ diff --git a/fonts/aots/gsub1_2_lookupflag_f1.otf b/fonts/aots/gsub1_2_lookupflag_f1.otf new file mode 100644 index 0000000..b13af6e Binary files /dev/null and b/fonts/aots/gsub1_2_lookupflag_f1.otf differ diff --git a/fonts/aots/gsub1_2_simple_f1.otf b/fonts/aots/gsub1_2_simple_f1.otf new file mode 100644 index 0000000..d3851b3 Binary files /dev/null and b/fonts/aots/gsub1_2_simple_f1.otf differ diff --git a/fonts/aots/gsub2_1_lookupflag_f1.otf b/fonts/aots/gsub2_1_lookupflag_f1.otf new file mode 100644 index 0000000..8330ad4 Binary files /dev/null and b/fonts/aots/gsub2_1_lookupflag_f1.otf differ diff --git a/fonts/aots/gsub2_1_multiple_sequences_f1.otf b/fonts/aots/gsub2_1_multiple_sequences_f1.otf new file mode 100644 index 0000000..c912937 Binary files /dev/null and b/fonts/aots/gsub2_1_multiple_sequences_f1.otf differ diff --git a/fonts/aots/gsub2_1_simple_f1.otf b/fonts/aots/gsub2_1_simple_f1.otf new file mode 100644 index 0000000..584a7f5 Binary files /dev/null and b/fonts/aots/gsub2_1_simple_f1.otf differ diff --git a/fonts/aots/gsub3_1_lookupflag_f1.otf b/fonts/aots/gsub3_1_lookupflag_f1.otf new file mode 100644 index 0000000..4ccf55f Binary files /dev/null and b/fonts/aots/gsub3_1_lookupflag_f1.otf differ diff --git a/fonts/aots/gsub3_1_multiple_f1.otf b/fonts/aots/gsub3_1_multiple_f1.otf new file mode 100644 index 0000000..075f196 Binary files /dev/null and b/fonts/aots/gsub3_1_multiple_f1.otf differ diff --git a/fonts/aots/gsub3_1_simple_f1.otf b/fonts/aots/gsub3_1_simple_f1.otf new file mode 100644 index 0000000..201f0f2 Binary files /dev/null and b/fonts/aots/gsub3_1_simple_f1.otf differ diff --git a/fonts/aots/gsub4_1_lookupflag_f1.otf b/fonts/aots/gsub4_1_lookupflag_f1.otf new file mode 100644 index 0000000..08ec01a Binary files /dev/null and b/fonts/aots/gsub4_1_lookupflag_f1.otf differ diff --git a/fonts/aots/gsub4_1_multiple_ligatures_f1.otf b/fonts/aots/gsub4_1_multiple_ligatures_f1.otf new file mode 100644 index 0000000..90da331 Binary files /dev/null and b/fonts/aots/gsub4_1_multiple_ligatures_f1.otf differ diff --git a/fonts/aots/gsub4_1_multiple_ligatures_f2.otf b/fonts/aots/gsub4_1_multiple_ligatures_f2.otf new file mode 100644 index 0000000..4383ba9 Binary files /dev/null and b/fonts/aots/gsub4_1_multiple_ligatures_f2.otf differ diff --git a/fonts/aots/gsub4_1_multiple_ligsets_f1.otf b/fonts/aots/gsub4_1_multiple_ligsets_f1.otf new file mode 100644 index 0000000..cea1b1a Binary files /dev/null and b/fonts/aots/gsub4_1_multiple_ligsets_f1.otf differ diff --git a/fonts/aots/gsub4_1_simple_f1.otf b/fonts/aots/gsub4_1_simple_f1.otf new file mode 100644 index 0000000..50c713a Binary files /dev/null and b/fonts/aots/gsub4_1_simple_f1.otf differ diff --git a/fonts/aots/gsub7_font1.otf b/fonts/aots/gsub7_font1.otf new file mode 100644 index 0000000..b920398 Binary files /dev/null and b/fonts/aots/gsub7_font1.otf differ diff --git a/fonts/aots/gsub7_font2.otf b/fonts/aots/gsub7_font2.otf new file mode 100644 index 0000000..c98bafb Binary files /dev/null and b/fonts/aots/gsub7_font2.otf differ diff --git a/fonts/aots/gsub_chaining1_boundary_f1.otf b/fonts/aots/gsub_chaining1_boundary_f1.otf new file mode 100644 index 0000000..444d931 Binary files /dev/null and b/fonts/aots/gsub_chaining1_boundary_f1.otf differ diff --git a/fonts/aots/gsub_chaining1_boundary_f2.otf b/fonts/aots/gsub_chaining1_boundary_f2.otf new file mode 100644 index 0000000..2268647 Binary files /dev/null and b/fonts/aots/gsub_chaining1_boundary_f2.otf differ diff --git a/fonts/aots/gsub_chaining1_boundary_f3.otf b/fonts/aots/gsub_chaining1_boundary_f3.otf new file mode 100644 index 0000000..a592947 Binary files /dev/null and b/fonts/aots/gsub_chaining1_boundary_f3.otf differ diff --git a/fonts/aots/gsub_chaining1_boundary_f4.otf b/fonts/aots/gsub_chaining1_boundary_f4.otf new file mode 100644 index 0000000..f3f6b8c Binary files /dev/null and b/fonts/aots/gsub_chaining1_boundary_f4.otf differ diff --git a/fonts/aots/gsub_chaining1_lookupflag_f1.otf b/fonts/aots/gsub_chaining1_lookupflag_f1.otf new file mode 100644 index 0000000..47e4c64 Binary files /dev/null and b/fonts/aots/gsub_chaining1_lookupflag_f1.otf differ diff --git a/fonts/aots/gsub_chaining1_multiple_subrules_f1.otf b/fonts/aots/gsub_chaining1_multiple_subrules_f1.otf new file mode 100644 index 0000000..741362c Binary files /dev/null and b/fonts/aots/gsub_chaining1_multiple_subrules_f1.otf differ diff --git a/fonts/aots/gsub_chaining1_multiple_subrules_f2.otf b/fonts/aots/gsub_chaining1_multiple_subrules_f2.otf new file mode 100644 index 0000000..67801f2 Binary files /dev/null and b/fonts/aots/gsub_chaining1_multiple_subrules_f2.otf differ diff --git a/fonts/aots/gsub_chaining1_next_glyph_f1.otf b/fonts/aots/gsub_chaining1_next_glyph_f1.otf new file mode 100644 index 0000000..655000a Binary files /dev/null and b/fonts/aots/gsub_chaining1_next_glyph_f1.otf differ diff --git a/fonts/aots/gsub_chaining1_simple_f1.otf b/fonts/aots/gsub_chaining1_simple_f1.otf new file mode 100644 index 0000000..c770965 Binary files /dev/null and b/fonts/aots/gsub_chaining1_simple_f1.otf differ diff --git a/fonts/aots/gsub_chaining1_simple_f2.otf b/fonts/aots/gsub_chaining1_simple_f2.otf new file mode 100644 index 0000000..8999e3f Binary files /dev/null and b/fonts/aots/gsub_chaining1_simple_f2.otf differ diff --git a/fonts/aots/gsub_chaining1_successive_f1.otf b/fonts/aots/gsub_chaining1_successive_f1.otf new file mode 100644 index 0000000..ad472ec Binary files /dev/null and b/fonts/aots/gsub_chaining1_successive_f1.otf differ diff --git a/fonts/aots/gsub_chaining2_boundary_f1.otf b/fonts/aots/gsub_chaining2_boundary_f1.otf new file mode 100644 index 0000000..845c256 Binary files /dev/null and b/fonts/aots/gsub_chaining2_boundary_f1.otf differ diff --git a/fonts/aots/gsub_chaining2_boundary_f2.otf b/fonts/aots/gsub_chaining2_boundary_f2.otf new file mode 100644 index 0000000..af0ad1f Binary files /dev/null and b/fonts/aots/gsub_chaining2_boundary_f2.otf differ diff --git a/fonts/aots/gsub_chaining2_boundary_f3.otf b/fonts/aots/gsub_chaining2_boundary_f3.otf new file mode 100644 index 0000000..28679c8 Binary files /dev/null and b/fonts/aots/gsub_chaining2_boundary_f3.otf differ diff --git a/fonts/aots/gsub_chaining2_boundary_f4.otf b/fonts/aots/gsub_chaining2_boundary_f4.otf new file mode 100644 index 0000000..14746c6 Binary files /dev/null and b/fonts/aots/gsub_chaining2_boundary_f4.otf differ diff --git a/fonts/aots/gsub_chaining2_lookupflag_f1.otf b/fonts/aots/gsub_chaining2_lookupflag_f1.otf new file mode 100644 index 0000000..2f4feed Binary files /dev/null and b/fonts/aots/gsub_chaining2_lookupflag_f1.otf differ diff --git a/fonts/aots/gsub_chaining2_multiple_subrules_f1.otf b/fonts/aots/gsub_chaining2_multiple_subrules_f1.otf new file mode 100644 index 0000000..6edeb6b Binary files /dev/null and b/fonts/aots/gsub_chaining2_multiple_subrules_f1.otf differ diff --git a/fonts/aots/gsub_chaining2_multiple_subrules_f2.otf b/fonts/aots/gsub_chaining2_multiple_subrules_f2.otf new file mode 100644 index 0000000..ae0298f Binary files /dev/null and b/fonts/aots/gsub_chaining2_multiple_subrules_f2.otf differ diff --git a/fonts/aots/gsub_chaining2_next_glyph_f1.otf b/fonts/aots/gsub_chaining2_next_glyph_f1.otf new file mode 100644 index 0000000..878666f Binary files /dev/null and b/fonts/aots/gsub_chaining2_next_glyph_f1.otf differ diff --git a/fonts/aots/gsub_chaining2_simple_f1.otf b/fonts/aots/gsub_chaining2_simple_f1.otf new file mode 100644 index 0000000..e860930 Binary files /dev/null and b/fonts/aots/gsub_chaining2_simple_f1.otf differ diff --git a/fonts/aots/gsub_chaining2_simple_f2.otf b/fonts/aots/gsub_chaining2_simple_f2.otf new file mode 100644 index 0000000..4fdde33 Binary files /dev/null and b/fonts/aots/gsub_chaining2_simple_f2.otf differ diff --git a/fonts/aots/gsub_chaining2_successive_f1.otf b/fonts/aots/gsub_chaining2_successive_f1.otf new file mode 100644 index 0000000..90f9f73 Binary files /dev/null and b/fonts/aots/gsub_chaining2_successive_f1.otf differ diff --git a/fonts/aots/gsub_chaining3_boundary_f1.otf b/fonts/aots/gsub_chaining3_boundary_f1.otf new file mode 100644 index 0000000..1aea8be Binary files /dev/null and b/fonts/aots/gsub_chaining3_boundary_f1.otf differ diff --git a/fonts/aots/gsub_chaining3_boundary_f2.otf b/fonts/aots/gsub_chaining3_boundary_f2.otf new file mode 100644 index 0000000..97c92c3 Binary files /dev/null and b/fonts/aots/gsub_chaining3_boundary_f2.otf differ diff --git a/fonts/aots/gsub_chaining3_boundary_f3.otf b/fonts/aots/gsub_chaining3_boundary_f3.otf new file mode 100644 index 0000000..3b8513e Binary files /dev/null and b/fonts/aots/gsub_chaining3_boundary_f3.otf differ diff --git a/fonts/aots/gsub_chaining3_boundary_f4.otf b/fonts/aots/gsub_chaining3_boundary_f4.otf new file mode 100644 index 0000000..e81d00e Binary files /dev/null and b/fonts/aots/gsub_chaining3_boundary_f4.otf differ diff --git a/fonts/aots/gsub_chaining3_lookupflag_f1.otf b/fonts/aots/gsub_chaining3_lookupflag_f1.otf new file mode 100644 index 0000000..47c1007 Binary files /dev/null and b/fonts/aots/gsub_chaining3_lookupflag_f1.otf differ diff --git a/fonts/aots/gsub_chaining3_next_glyph_f1.otf b/fonts/aots/gsub_chaining3_next_glyph_f1.otf new file mode 100644 index 0000000..9160eda Binary files /dev/null and b/fonts/aots/gsub_chaining3_next_glyph_f1.otf differ diff --git a/fonts/aots/gsub_chaining3_simple_f1.otf b/fonts/aots/gsub_chaining3_simple_f1.otf new file mode 100644 index 0000000..5982eb5 Binary files /dev/null and b/fonts/aots/gsub_chaining3_simple_f1.otf differ diff --git a/fonts/aots/gsub_chaining3_simple_f2.otf b/fonts/aots/gsub_chaining3_simple_f2.otf new file mode 100644 index 0000000..359b126 Binary files /dev/null and b/fonts/aots/gsub_chaining3_simple_f2.otf differ diff --git a/fonts/aots/gsub_chaining3_successive_f1.otf b/fonts/aots/gsub_chaining3_successive_f1.otf new file mode 100644 index 0000000..ae39d92 Binary files /dev/null and b/fonts/aots/gsub_chaining3_successive_f1.otf differ diff --git a/fonts/aots/gsub_context1_boundary_f1.otf b/fonts/aots/gsub_context1_boundary_f1.otf new file mode 100644 index 0000000..0267cab Binary files /dev/null and b/fonts/aots/gsub_context1_boundary_f1.otf differ diff --git a/fonts/aots/gsub_context1_boundary_f2.otf b/fonts/aots/gsub_context1_boundary_f2.otf new file mode 100644 index 0000000..24b1716 Binary files /dev/null and b/fonts/aots/gsub_context1_boundary_f2.otf differ diff --git a/fonts/aots/gsub_context1_expansion_f1.otf b/fonts/aots/gsub_context1_expansion_f1.otf new file mode 100644 index 0000000..c1dda80 Binary files /dev/null and b/fonts/aots/gsub_context1_expansion_f1.otf differ diff --git a/fonts/aots/gsub_context1_lookupflag_f1.otf b/fonts/aots/gsub_context1_lookupflag_f1.otf new file mode 100644 index 0000000..60676ab Binary files /dev/null and b/fonts/aots/gsub_context1_lookupflag_f1.otf differ diff --git a/fonts/aots/gsub_context1_lookupflag_f2.otf b/fonts/aots/gsub_context1_lookupflag_f2.otf new file mode 100644 index 0000000..bcb56e4 Binary files /dev/null and b/fonts/aots/gsub_context1_lookupflag_f2.otf differ diff --git a/fonts/aots/gsub_context1_multiple_subrules_f1.otf b/fonts/aots/gsub_context1_multiple_subrules_f1.otf new file mode 100644 index 0000000..52cd861 Binary files /dev/null and b/fonts/aots/gsub_context1_multiple_subrules_f1.otf differ diff --git a/fonts/aots/gsub_context1_multiple_subrules_f2.otf b/fonts/aots/gsub_context1_multiple_subrules_f2.otf new file mode 100644 index 0000000..891356a Binary files /dev/null and b/fonts/aots/gsub_context1_multiple_subrules_f2.otf differ diff --git a/fonts/aots/gsub_context1_next_glyph_f1.otf b/fonts/aots/gsub_context1_next_glyph_f1.otf new file mode 100644 index 0000000..2786ded Binary files /dev/null and b/fonts/aots/gsub_context1_next_glyph_f1.otf differ diff --git a/fonts/aots/gsub_context1_simple_f1.otf b/fonts/aots/gsub_context1_simple_f1.otf new file mode 100644 index 0000000..ebdaf22 Binary files /dev/null and b/fonts/aots/gsub_context1_simple_f1.otf differ diff --git a/fonts/aots/gsub_context1_simple_f2.otf b/fonts/aots/gsub_context1_simple_f2.otf new file mode 100644 index 0000000..d4a3fbf Binary files /dev/null and b/fonts/aots/gsub_context1_simple_f2.otf differ diff --git a/fonts/aots/gsub_context1_successive_f1.otf b/fonts/aots/gsub_context1_successive_f1.otf new file mode 100644 index 0000000..ce2dce5 Binary files /dev/null and b/fonts/aots/gsub_context1_successive_f1.otf differ diff --git a/fonts/aots/gsub_context2_boundary_f1.otf b/fonts/aots/gsub_context2_boundary_f1.otf new file mode 100644 index 0000000..6f46192 Binary files /dev/null and b/fonts/aots/gsub_context2_boundary_f1.otf differ diff --git a/fonts/aots/gsub_context2_boundary_f2.otf b/fonts/aots/gsub_context2_boundary_f2.otf new file mode 100644 index 0000000..ef19d87 Binary files /dev/null and b/fonts/aots/gsub_context2_boundary_f2.otf differ diff --git a/fonts/aots/gsub_context2_classes_f1.otf b/fonts/aots/gsub_context2_classes_f1.otf new file mode 100644 index 0000000..8507760 Binary files /dev/null and b/fonts/aots/gsub_context2_classes_f1.otf differ diff --git a/fonts/aots/gsub_context2_classes_f2.otf b/fonts/aots/gsub_context2_classes_f2.otf new file mode 100644 index 0000000..ceb74b2 Binary files /dev/null and b/fonts/aots/gsub_context2_classes_f2.otf differ diff --git a/fonts/aots/gsub_context2_expansion_f1.otf b/fonts/aots/gsub_context2_expansion_f1.otf new file mode 100644 index 0000000..c12f0ac Binary files /dev/null and b/fonts/aots/gsub_context2_expansion_f1.otf differ diff --git a/fonts/aots/gsub_context2_lookupflag_f1.otf b/fonts/aots/gsub_context2_lookupflag_f1.otf new file mode 100644 index 0000000..a0fada4 Binary files /dev/null and b/fonts/aots/gsub_context2_lookupflag_f1.otf differ diff --git a/fonts/aots/gsub_context2_lookupflag_f2.otf b/fonts/aots/gsub_context2_lookupflag_f2.otf new file mode 100644 index 0000000..cd40a5d Binary files /dev/null and b/fonts/aots/gsub_context2_lookupflag_f2.otf differ diff --git a/fonts/aots/gsub_context2_multiple_subrules_f1.otf b/fonts/aots/gsub_context2_multiple_subrules_f1.otf new file mode 100644 index 0000000..53be20d Binary files /dev/null and b/fonts/aots/gsub_context2_multiple_subrules_f1.otf differ diff --git a/fonts/aots/gsub_context2_multiple_subrules_f2.otf b/fonts/aots/gsub_context2_multiple_subrules_f2.otf new file mode 100644 index 0000000..6bcc0cb Binary files /dev/null and b/fonts/aots/gsub_context2_multiple_subrules_f2.otf differ diff --git a/fonts/aots/gsub_context2_next_glyph_f1.otf b/fonts/aots/gsub_context2_next_glyph_f1.otf new file mode 100644 index 0000000..4ca4e48 Binary files /dev/null and b/fonts/aots/gsub_context2_next_glyph_f1.otf differ diff --git a/fonts/aots/gsub_context2_simple_f1.otf b/fonts/aots/gsub_context2_simple_f1.otf new file mode 100644 index 0000000..16aae9d Binary files /dev/null and b/fonts/aots/gsub_context2_simple_f1.otf differ diff --git a/fonts/aots/gsub_context2_simple_f2.otf b/fonts/aots/gsub_context2_simple_f2.otf new file mode 100644 index 0000000..fc31262 Binary files /dev/null and b/fonts/aots/gsub_context2_simple_f2.otf differ diff --git a/fonts/aots/gsub_context2_successive_f1.otf b/fonts/aots/gsub_context2_successive_f1.otf new file mode 100644 index 0000000..cf1a89c Binary files /dev/null and b/fonts/aots/gsub_context2_successive_f1.otf differ diff --git a/fonts/aots/gsub_context3_boundary_f1.otf b/fonts/aots/gsub_context3_boundary_f1.otf new file mode 100644 index 0000000..01cd29d Binary files /dev/null and b/fonts/aots/gsub_context3_boundary_f1.otf differ diff --git a/fonts/aots/gsub_context3_boundary_f2.otf b/fonts/aots/gsub_context3_boundary_f2.otf new file mode 100644 index 0000000..6fa5f05 Binary files /dev/null and b/fonts/aots/gsub_context3_boundary_f2.otf differ diff --git a/fonts/aots/gsub_context3_lookupflag_f1.otf b/fonts/aots/gsub_context3_lookupflag_f1.otf new file mode 100644 index 0000000..94371b4 Binary files /dev/null and b/fonts/aots/gsub_context3_lookupflag_f1.otf differ diff --git a/fonts/aots/gsub_context3_lookupflag_f2.otf b/fonts/aots/gsub_context3_lookupflag_f2.otf new file mode 100644 index 0000000..d8150df Binary files /dev/null and b/fonts/aots/gsub_context3_lookupflag_f2.otf differ diff --git a/fonts/aots/gsub_context3_next_glyph_f1.otf b/fonts/aots/gsub_context3_next_glyph_f1.otf new file mode 100644 index 0000000..93533b8 Binary files /dev/null and b/fonts/aots/gsub_context3_next_glyph_f1.otf differ diff --git a/fonts/aots/gsub_context3_simple_f1.otf b/fonts/aots/gsub_context3_simple_f1.otf new file mode 100644 index 0000000..a1cd98c Binary files /dev/null and b/fonts/aots/gsub_context3_simple_f1.otf differ diff --git a/fonts/aots/gsub_context3_successive_f1.otf b/fonts/aots/gsub_context3_successive_f1.otf new file mode 100644 index 0000000..d8b3d5c Binary files /dev/null and b/fonts/aots/gsub_context3_successive_f1.otf differ diff --git a/fonts/aots/lookupflag_ignore_attach_f1.otf b/fonts/aots/lookupflag_ignore_attach_f1.otf new file mode 100644 index 0000000..80651f1 Binary files /dev/null and b/fonts/aots/lookupflag_ignore_attach_f1.otf differ diff --git a/fonts/aots/lookupflag_ignore_base_f1.otf b/fonts/aots/lookupflag_ignore_base_f1.otf new file mode 100644 index 0000000..3c242b0 Binary files /dev/null and b/fonts/aots/lookupflag_ignore_base_f1.otf differ diff --git a/fonts/aots/lookupflag_ignore_combination_f1.otf b/fonts/aots/lookupflag_ignore_combination_f1.otf new file mode 100644 index 0000000..b88359a Binary files /dev/null and b/fonts/aots/lookupflag_ignore_combination_f1.otf differ diff --git a/fonts/aots/lookupflag_ignore_ligatures_f1.otf b/fonts/aots/lookupflag_ignore_ligatures_f1.otf new file mode 100644 index 0000000..1dc0c23 Binary files /dev/null and b/fonts/aots/lookupflag_ignore_ligatures_f1.otf differ diff --git a/fonts/aots/lookupflag_ignore_marks_f1.otf b/fonts/aots/lookupflag_ignore_marks_f1.otf new file mode 100644 index 0000000..aa429de Binary files /dev/null and b/fonts/aots/lookupflag_ignore_marks_f1.otf differ diff --git a/tests/aots.txt b/tests/aots.txt new file mode 100644 index 0000000..449cf0d --- /dev/null +++ b/tests/aots.txt @@ -0,0 +1,1914 @@ +mod harness; +use harness::shape_aot; + +#[test] +fn classdef1_0() { + assert_eq!( + shape_aot("fonts/aots/classdef1_font4.otf", 0, &[], "\u{11}\u{12}\u{13}\u{14}\u{15}"), + "[17|18|19|20|21]" + ) +} + +#[test] +fn classdef1_empty_0() { + assert_eq!( + shape_aot("fonts/aots/classdef1_font2.otf", 0, &[], "\u{11}\u{12}\u{13}\u{14}\u{15}"), + "[17|23|24|25|21]" + ) +} + +#[test] +fn classdef1_multiple_0() { + assert_eq!( + shape_aot("fonts/aots/classdef1_font3.otf", 0, &[], "\u{11}\u{12}\u{13}\u{14}\u{15}\u{16}\u{17}\u{18}\u{19}\u{1a}\u{1b}\u{1c}\u{1d}\u{1e}\u{1f} !\"#$"), + "[20|23|24|25|24|26|27|28|28|29|30|31|34|33|34|35|37|38|38|39]" + ) +} + +#[test] +fn classdef1_single_0() { + assert_eq!( + shape_aot("fonts/aots/classdef2_font1.otf", 0, &[], "\u{11}\u{12}\u{13}\u{14}\u{15}"), + "[17|23|24|25|21]" + ) +} + +#[test] +fn classdef2_0() { + assert_eq!( + shape_aot("fonts/aots/classdef2_font4.otf", 0, &[], "\u{11}\u{12}\u{13}\u{14}\u{15}"), + "[17|18|19|20|21]" + ) +} + +#[test] +fn classdef2_empty_0() { + assert_eq!( + shape_aot("fonts/aots/classdef2_font2.otf", 0, &[], "\u{11}\u{12}\u{13}\u{14}\u{15}"), + "[17|23|24|25|21]" + ) +} + +#[test] +fn classdef2_multiple_0() { + assert_eq!( + shape_aot("fonts/aots/classdef2_font3.otf", 0, &[], "\u{11}\u{12}\u{13}\u{14}\u{15}\u{16}\u{17}\u{18}\u{19}\u{1a}\u{1b}\u{1c}\u{1d}\u{1e}\u{1f} !\"#$"), + "[20|23|24|25|24|26|27|28|28|29|30|31|34|33|34|35|37|38|38|39]" + ) +} + +#[test] +fn classdef2_single_0() { + assert_eq!( + shape_aot("fonts/aots/classdef2_font1.otf", 0, &[], "\u{11}\u{12}\u{13}\u{14}\u{15}"), + "[17|23|24|25|21]" + ) +} + +#[test] +fn gpos1_1_lookupflag_0() { + assert_eq!( + shape_aot("fonts/aots/gpos1_1_lookupflag_f1.otf", 0, &[], "\u{11}\u{12}\u{13}\u{14}\u{15}"), + "[17|18@1500,0|19@3000,0|20@4200,0|21@6000,0]" + ) +} + +#[test] +fn gpos1_1_simple_0() { + assert_eq!( + shape_aot("fonts/aots/gpos1_1_simple_f1.otf", 0, &[], "\u{11}\u{12}\u{13}\u{14}\u{15}"), + "[17|18@1300,0|19@3000,0|20@4300,0|21@6000,0]" + ) +} + +#[test] +fn gpos1_1_simple_1() { + assert_eq!( + shape_aot("fonts/aots/gpos1_1_simple_f2.otf", 0, &[], "\u{11}\u{12}\u{13}\u{14}\u{15}"), + "[17|18@1500,-200|19@3000,0|20@4500,-200|21@6000,0]" + ) +} + +#[test] +fn gpos1_1_simple_2() { + assert_eq!( + shape_aot("fonts/aots/gpos1_1_simple_f3.otf", 0, &[], "\u{11}\u{12}\u{13}\u{14}\u{15}"), + "[17|18@1500,0|19@2800,0|20@4300,0|21@5600,0]" + ) +} + +#[test] +fn gpos1_2_0() { + assert_eq!( + shape_aot("fonts/aots/gpos1_2_font1.otf", 0, &[], "\u{11}\u{12}\u{13}\u{14}\u{15}"), + "[17|18@1300,0|19@3000,0|20@4200,0|21@6000,0]" + ) +} + +#[test] +fn gpos1_2_lookupflag_0() { + assert_eq!( + shape_aot("fonts/aots/gpos1_2_font2.otf", 0, &[], "\u{11}\u{12}\u{13}\u{14}\u{15}"), + "[17|18@1500,0|19@3000,0|20@4200,0|21@6000,0]" + ) +} + +#[test] +fn gpos2_1_0() { + assert_eq!( + shape_aot("fonts/aots/gpos2_1_font6.otf", 0, &[], "\u{11}\u{12}\u{13}\u{11}\u{12}\u{14}\u{11}"), + "[17|18@1300,0|19@3000,-100|17@4500,0|18@5700,0|20@7500,-400|17@9000,0]" + ) +} + +#[test] +fn gpos2_1_1() { + assert_eq!( + shape_aot("fonts/aots/gpos2_1_font7.otf", 0, &[], "\u{11}\u{12}\u{13}\u{11}\u{12}\u{14}\u{11}\u{15}\u{16}\u{11}"), + "[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]" + ) +} + +#[test] +fn gpos2_1_lookupflag_0() { + assert_eq!( + shape_aot("fonts/aots/gpos2_1_lookupflag_f1.otf", 0, &[], "\u{11}\u{13}\u{14}\u{11}\u{13}\u{12}\u{14}\u{11}"), + "[17|19@1300,0|20@3000,-100|17@4500,0|19@5800,0|18@7500,0|20@9000,-100|17@10500,0]" + ) +} + +#[test] +fn gpos2_1_lookupflag_1() { + assert_eq!( + shape_aot("fonts/aots/gpos2_1_lookupflag_f2.otf", 0, &[], "\u{11}\u{13}\u{14}\u{11}\u{13}\u{12}\u{14}\u{11}"), + "[17|19@1500,0|20@2800,-100|17@4300,0|19@5800,0|18@7100,0|20@8600,-100|17@10100,0]" + ) +} + +#[test] +fn gpos2_1_next_glyph_0() { + assert_eq!( + shape_aot("fonts/aots/gpos2_1_next_glyph_f1.otf", 0, &[], "\u{12}\u{12}\u{12}\u{12}"), + "[18@-100,0|18@1500,-100|18@2900,0|18@4500,-100]" + ) +} + +#[test] +fn gpos2_1_next_glyph_1() { + assert_eq!( + shape_aot("fonts/aots/gpos2_1_next_glyph_f2.otf", 0, &[], "\u{12}\u{12}\u{12}\u{12}"), + "[18@-100,0|18@1400,0|18@2900,0|18@4500,0]" + ) +} + +#[test] +fn gpos2_1_simple_0() { + assert_eq!( + shape_aot("fonts/aots/gpos2_1_simple_f1.otf", 0, &[], "\u{11}\u{12}\u{13}\u{11}\u{12}\u{14}"), + "[17|18@1300,0|19@3000,-100|17@4500,0|18@6000,0|20@7500,0]" + ) +} + +#[test] +fn gpos2_1_simple_1() { + assert_eq!( + shape_aot("fonts/aots/gpos2_1_simple_f1.otf", 0, &[], "\u{11}\u{12}"), + "[17|18@1500,0]" + ) +} + +#[test] +fn gpos2_2_0() { + assert_eq!( + shape_aot("fonts/aots/gpos2_2_font1.otf", 0, &[], "\u{11}\u{12}\u{13}\u{11}\u{12}\u{14}"), + "[17|18@1300,0|19@3000,-100|17@4500,0|18@6000,0|20@7500,0]" + ) +} + +#[test] +fn gpos2_2_1() { + assert_eq!( + shape_aot("fonts/aots/gpos2_2_font2.otf", 0, &[], "\u{11}\u{13}\u{14}\u{11}\u{13}\u{12}\u{14}\u{11}"), + "[17|19@1300,0|20@3000,-100|17@4500,0|19@5800,0|18@7500,0|20@9000,-100|17@10500,0]" + ) +} + +#[test] +fn gpos2_2_2() { + assert_eq!( + shape_aot("fonts/aots/gpos2_2_font3.otf", 0, &[], "\u{11}\u{13}\u{14}\u{11}\u{13}\u{12}\u{14}\u{11}"), + "[17|19@1500,0|20@2800,-100|17@4300,0|19@5800,0|18@7100,0|20@8600,-100|17@10100,0]" + ) +} + +#[test] +fn gpos2_2_3() { + assert_eq!( + shape_aot("fonts/aots/gpos2_2_font4.otf", 0, &[], "\u{12}\u{12}\u{12}\u{12}"), + "[18@-100,0|18@1500,-100|18@2900,0|18@4500,-100]" + ) +} + +#[test] +fn gpos2_2_4() { + assert_eq!( + shape_aot("fonts/aots/gpos2_2_font5.otf", 0, &[], "\u{12}\u{12}\u{12}\u{12}"), + "[18@-100,0|18@1400,0|18@2900,0|18@4500,0]" + ) +} + +#[test] +fn gpos3_0() { + assert_eq!( + shape_aot("fonts/aots/gpos3_font1.otf", 0, &[], "\u{11}\u{12}\u{11}\u{13}\u{11}"), + "[17|18@1500,0|17@3000,0|19@4500,0|17@6000,0]" + ) +} + +#[test] +fn gpos3_1() { + assert_eq!( + shape_aot("fonts/aots/gpos3_font3.otf", 0, &[], "\u{11}\u{12}\u{14}\u{11}"), + "[17|18@1500,0|20@3000,0|17@4500,0]" + ) +} + +#[test] +fn gpos3_2() { + assert_eq!( + shape_aot("fonts/aots/gpos3_font3.otf", 0, &[], "\u{11}\u{13}\u{12}\u{11}"), + "[17|19@1500,0|18@3000,0|17@4500,0]" + ) +} + +#[test] +fn gpos3_3() { + assert_eq!( + shape_aot("fonts/aots/gpos3_font3.otf", 0, &[], "\u{11}\u{13}\u{14}\u{11}"), + "[17|19@1500,0|20@3000,0|17@4500,0]" + ) +} + +#[test] +fn gpos3_4() { + assert_eq!( + shape_aot("fonts/aots/gpos3_font3.otf", 0, &[], "\u{11}\u{12}"), + "[17|18@1500,0]" + ) +} + +#[test] +fn gpos3_5() { + assert_eq!( + shape_aot("fonts/aots/gpos3_font3.otf", 0, &[], "\u{11}\u{12}\u{15}\u{15}\u{15}"), + "[17|18@1500,0|21@3000,0|21@4500,0|21@6000,0]" + ) +} + +#[test] +fn gpos7_1_0() { + assert_eq!( + shape_aot("fonts/aots/gpos7_1_font1.otf", 0, &[], "\u{11}\u{12}\u{13}\u{14}\u{15}"), + "[17|18@1600,0|19@3200,0|20@4800,0|21@6000,0]" + ) +} + +#[test] +fn gpos7_1_1() { + assert_eq!( + shape_aot("fonts/aots/gpos7_1_font1.otf", 0, &[], "\u{11}\u{12}\u{11}\u{12}\u{13}\u{11}"), + "[17|18@1500,0|17@3000,0|18@4500,0|19@6000,0|17@7500,0]" + ) +} + +#[test] +fn gpos9_0() { + assert_eq!( + shape_aot("fonts/aots/gpos9_font1.otf", 0, &[], "\u{11}\u{12}\u{13}\u{14}\u{15}"), + "[17|18@1300,0|19@3000,0|20@4300,0|21@6000,0]" + ) +} + +#[test] +fn gpos9_1() { + assert_eq!( + shape_aot("fonts/aots/gpos9_font2.otf", 0, &[], "\u{11}\u{12}\u{13}\u{14}\u{15}\u{11}"), + "[17|18@1300,0|19@2700,0|20@4300,0|21@5700,0|17@7500,0]" + ) +} + +#[test] +fn gpos_chaining1_boundary_0() { + assert_eq!( + shape_aot("fonts/aots/gpos_chaining1_boundary_f1.otf", 0, &[], "\u{0}\u{14}\u{15}\u{16}\u{17}\u{0}"), + "[0|20@1500,0|21@3000,0|22@4500,0|23@6000,0|0@7500,0]" + ) +} + +#[test] +fn gpos_chaining1_boundary_1() { + assert_eq!( + shape_aot("fonts/aots/gpos_chaining1_boundary_f2.otf", 0, &[], "\u{0}\u{14}\u{15}\u{16}\u{17}\u{0}"), + "[0|20@1500,0|21@3020,0|22@4500,0|23@6000,0|0@7500,0]" + ) +} + +#[test] +fn gpos_chaining1_boundary_2() { + assert_eq!( + shape_aot("fonts/aots/gpos_chaining1_boundary_f3.otf", 0, &[], "\u{0}\u{14}\u{15}\u{16}\u{17}\u{0}"), + "[0|20@1500,0|21@3020,0|22@4500,0|23@6000,0|0@7500,0]" + ) +} + +#[test] +fn gpos_chaining1_boundary_3() { + assert_eq!( + shape_aot("fonts/aots/gpos_chaining1_boundary_f4.otf", 0, &[], "\u{0}\u{14}\u{15}\u{16}\u{17}\u{0}"), + "[0|20@1500,0|21@3000,0|22@4520,0|23@6000,0|0@7500,0]" + ) +} + +#[test] +fn gpos_chaining1_multiple_subrules_0() { + assert_eq!( + shape_aot("fonts/aots/gpos_chaining1_multiple_subrules_f1.otf", 0, &[], "\u{0}\u{14}\u{15}\u{16}\u{17}\u{18}\u{0}\u{14}\u{15}\u{16}\u{17}\u{0}"), + "[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]" + ) +} + +#[test] +fn gpos_chaining1_multiple_subrules_1() { + assert_eq!( + shape_aot("fonts/aots/gpos_chaining1_multiple_subrules_f2.otf", 0, &[], "\u{0}\u{14}\u{15}\u{16}\u{17}\u{18}\u{0}\u{14}\u{15}\u{16}\u{17}\u{0}"), + "[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]" + ) +} + +#[test] +fn gpos_chaining1_next_glyph_0() { + assert_eq!( + shape_aot("fonts/aots/gpos_chaining1_next_glyph_f1.otf", 0, &[], "\u{0}\u{14}\u{15}\u{16}\u{17}\u{0}"), + "[0|20@1500,0|21@3020,0|22@4520,0|23@6020,0|0@7500,0]" + ) +} + +#[test] +fn gpos_chaining1_simple_0() { + assert_eq!( + shape_aot("fonts/aots/gpos_chaining1_simple_f1.otf", 0, &[], "\u{0}\u{14}\u{15}\u{16}\u{17}\u{0}"), + "[0|20@1500,0|21@3020,0|22@4520,0|23@6000,0|0@7500,0]" + ) +} + +#[test] +fn gpos_chaining1_simple_1() { + assert_eq!( + shape_aot("fonts/aots/gpos_chaining1_simple_f2.otf", 0, &[], "\u{0}\u{14}\u{15}\u{16}\u{17}\u{18}\u{19}\u{1a}\u{0}"), + "[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]" + ) +} + +#[test] +fn gpos_chaining1_simple_2() { + assert_eq!( + shape_aot("fonts/aots/gpos_chaining1_simple_f2.otf", 0, &[], "\u{0}\u{14}\u{15}\u{16}\u{17}\u{18}\u{19}\u{0}\u{0}"), + "[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]" + ) +} + +#[test] +fn gpos_chaining1_simple_3() { + assert_eq!( + shape_aot("fonts/aots/gpos_chaining1_simple_f2.otf", 0, &[], "\u{0}\u{14}\u{15}\u{16}\u{17}\u{18}\u{19}"), + "[0|20@1500,0|21@3000,0|22@4500,0|23@6000,0|24@7500,0|25@9000,0]" + ) +} + +#[test] +fn gpos_chaining1_simple_4() { + assert_eq!( + shape_aot("fonts/aots/gpos_chaining1_simple_f2.otf", 0, &[], "\u{0}\u{14}\u{15}\u{16}\u{17}\u{18}"), + "[0|20@1500,0|21@3000,0|22@4500,0|23@6000,0|24@7500,0]" + ) +} + +#[test] +fn gpos_chaining1_simple_5() { + assert_eq!( + shape_aot("fonts/aots/gpos_chaining1_simple_f2.otf", 0, &[], "\u{0}\u{0}\u{15}\u{16}\u{17}\u{18}\u{19}\u{1a}\u{0}"), + "[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]" + ) +} + +#[test] +fn gpos_chaining1_simple_6() { + assert_eq!( + shape_aot("fonts/aots/gpos_chaining1_simple_f2.otf", 0, &[], "\u{15}\u{16}\u{17}\u{18}\u{19}\u{1a}\u{0}"), + "[21|22@1500,0|23@3000,0|24@4500,0|25@6000,0|26@7500,0|0@9000,0]" + ) +} + +#[test] +fn gpos_chaining1_simple_7() { + assert_eq!( + shape_aot("fonts/aots/gpos_chaining1_simple_f2.otf", 0, &[], "\u{16}\u{17}\u{18}\u{19}\u{1a}\u{0}"), + "[22|23@1500,0|24@3000,0|25@4500,0|26@6000,0|0@7500,0]" + ) +} + +#[test] +fn gpos_chaining1_simple_8() { + assert_eq!( + shape_aot("fonts/aots/gpos_chaining1_simple_f2.otf", 0, &[], "\u{0}\u{14}\u{15}\u{16}\u{0}\u{18}\u{19}\u{1a}\u{0}"), + "[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]" + ) +} + +#[test] +fn gpos_chaining1_simple_9() { + assert_eq!( + shape_aot("fonts/aots/gpos_chaining1_simple_f2.otf", 0, &[], "\u{0}\u{14}\u{15}\u{16}\u{17}"), + "[0|20@1500,0|21@3000,0|22@4500,0|23@6000,0]" + ) +} + +#[test] +fn gpos_chaining1_simple_10() { + assert_eq!( + shape_aot("fonts/aots/gpos_chaining1_simple_f2.otf", 0, &[], "\u{0}\u{14}\u{15}\u{16}"), + "[0|20@1500,0|21@3000,0|22@4500,0]" + ) +} + +#[test] +fn gpos_chaining1_successive_0() { + assert_eq!( + shape_aot("fonts/aots/gpos_chaining1_successive_f1.otf", 0, &[], "\u{0}\u{19}\u{14}\u{15}\u{16}\u{17}\u{18}\u{0}"), + "[0|25@1500,0|20@3000,0|21@4520,0|22@6020,0|23@7500,0|24@9000,0|0@10500,0]" + ) +} + +#[test] +fn gpos_chaining2_boundary_0() { + assert_eq!( + shape_aot("fonts/aots/gpos_chaining2_boundary_f1.otf", 0, &[], "\u{0}\u{14}\u{15}\u{16}\u{17}\u{0}"), + "[0|20@1500,0|21@3000,0|22@4500,0|23@6000,0|0@7500,0]" + ) +} + +#[test] +fn gpos_chaining2_boundary_1() { + assert_eq!( + shape_aot("fonts/aots/gpos_chaining2_boundary_f2.otf", 0, &[], "\u{0}\u{14}\u{15}\u{16}\u{17}\u{0}"), + "[0|20@1500,0|21@3020,0|22@4500,0|23@6000,0|0@7500,0]" + ) +} + +#[test] +fn gpos_chaining2_boundary_2() { + assert_eq!( + shape_aot("fonts/aots/gpos_chaining2_boundary_f3.otf", 0, &[], "\u{0}\u{14}\u{15}\u{16}\u{17}\u{0}"), + "[0|20@1500,0|21@3020,0|22@4500,0|23@6000,0|0@7500,0]" + ) +} + +#[test] +fn gpos_chaining2_boundary_3() { + assert_eq!( + shape_aot("fonts/aots/gpos_chaining2_boundary_f4.otf", 0, &[], "\u{0}\u{14}\u{15}\u{16}\u{17}\u{0}"), + "[0|20@1500,0|21@3000,0|22@4520,0|23@6000,0|0@7500,0]" + ) +} + +#[test] +fn gpos_chaining2_multiple_subrules_0() { + assert_eq!( + shape_aot("fonts/aots/gpos_chaining2_multiple_subrules_f1.otf", 0, &[], "\u{0}\u{14}\u{15}\u{16}\u{17}\u{18}\u{0}\u{14}\u{15}\u{16}\u{17}\u{0}"), + "[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]" + ) +} + +#[test] +fn gpos_chaining2_multiple_subrules_1() { + assert_eq!( + shape_aot("fonts/aots/gpos_chaining2_multiple_subrules_f2.otf", 0, &[], "\u{0}\u{14}\u{15}\u{16}\u{17}\u{18}\u{0}\u{14}\u{15}\u{16}\u{17}\u{0}"), + "[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]" + ) +} + +#[test] +fn gpos_chaining2_next_glyph_0() { + assert_eq!( + shape_aot("fonts/aots/gpos_chaining2_next_glyph_f1.otf", 0, &[], "\u{0}\u{14}\u{15}\u{16}\u{17}\u{0}"), + "[0|20@1500,0|21@3020,0|22@4520,0|23@6020,0|0@7500,0]" + ) +} + +#[test] +fn gpos_chaining2_simple_0() { + assert_eq!( + shape_aot("fonts/aots/gpos_chaining2_simple_f1.otf", 0, &[], "\u{0}\u{14}\u{15}\u{16}\u{17}\u{0}"), + "[0|20@1500,0|21@3020,0|22@4520,0|23@6000,0|0@7500,0]" + ) +} + +#[test] +fn gpos_chaining2_simple_1() { + assert_eq!( + shape_aot("fonts/aots/gpos_chaining2_simple_f2.otf", 0, &[], "\u{0}\u{14}\u{15}\u{16}\u{17}\u{18}\u{19}\u{1a}\u{0}"), + "[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]" + ) +} + +#[test] +fn gpos_chaining2_simple_2() { + assert_eq!( + shape_aot("fonts/aots/gpos_chaining2_simple_f2.otf", 0, &[], "\u{0}\u{14}\u{15}\u{16}\u{17}\u{18}\u{19}\u{0}\u{0}"), + "[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]" + ) +} + +#[test] +fn gpos_chaining2_simple_3() { + assert_eq!( + shape_aot("fonts/aots/gpos_chaining2_simple_f2.otf", 0, &[], "\u{0}\u{14}\u{15}\u{16}\u{17}\u{18}\u{19}"), + "[0|20@1500,0|21@3000,0|22@4500,0|23@6000,0|24@7500,0|25@9000,0]" + ) +} + +#[test] +fn gpos_chaining2_simple_4() { + assert_eq!( + shape_aot("fonts/aots/gpos_chaining2_simple_f2.otf", 0, &[], "\u{0}\u{14}\u{15}\u{16}\u{17}\u{18}"), + "[0|20@1500,0|21@3000,0|22@4500,0|23@6000,0|24@7500,0]" + ) +} + +#[test] +fn gpos_chaining2_simple_5() { + assert_eq!( + shape_aot("fonts/aots/gpos_chaining2_simple_f2.otf", 0, &[], "\u{0}\u{0}\u{15}\u{16}\u{17}\u{18}\u{19}\u{1a}\u{0}"), + "[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]" + ) +} + +#[test] +fn gpos_chaining2_simple_6() { + assert_eq!( + shape_aot("fonts/aots/gpos_chaining2_simple_f2.otf", 0, &[], "\u{15}\u{16}\u{17}\u{18}\u{19}\u{1a}\u{0}"), + "[21|22@1500,0|23@3000,0|24@4500,0|25@6000,0|26@7500,0|0@9000,0]" + ) +} + +#[test] +fn gpos_chaining2_simple_7() { + assert_eq!( + shape_aot("fonts/aots/gpos_chaining2_simple_f2.otf", 0, &[], "\u{16}\u{17}\u{18}\u{19}\u{1a}\u{0}"), + "[22|23@1500,0|24@3000,0|25@4500,0|26@6000,0|0@7500,0]" + ) +} + +#[test] +fn gpos_chaining2_simple_8() { + assert_eq!( + shape_aot("fonts/aots/gpos_chaining2_simple_f2.otf", 0, &[], "\u{0}\u{14}\u{15}\u{16}\u{0}\u{18}\u{19}\u{1a}\u{0}"), + "[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]" + ) +} + +#[test] +fn gpos_chaining2_simple_9() { + assert_eq!( + shape_aot("fonts/aots/gpos_chaining2_simple_f2.otf", 0, &[], "\u{0}\u{14}\u{15}\u{16}\u{17}"), + "[0|20@1500,0|21@3000,0|22@4500,0|23@6000,0]" + ) +} + +#[test] +fn gpos_chaining2_simple_10() { + assert_eq!( + shape_aot("fonts/aots/gpos_chaining2_simple_f2.otf", 0, &[], "\u{0}\u{14}\u{15}\u{16}"), + "[0|20@1500,0|21@3000,0|22@4500,0]" + ) +} + +#[test] +fn gpos_chaining2_successive_0() { + assert_eq!( + shape_aot("fonts/aots/gpos_chaining2_successive_f1.otf", 0, &[], "\u{0}\u{19}\u{14}\u{15}\u{16}\u{17}\u{18}\u{0}"), + "[0|25@1500,0|20@3000,0|21@4520,0|22@6020,0|23@7500,0|24@9000,0|0@10500,0]" + ) +} + +#[test] +fn gpos_chaining3_boundary_0() { + assert_eq!( + shape_aot("fonts/aots/gpos_chaining3_boundary_f1.otf", 0, &[], "\u{0}\u{14}\u{15}\u{16}\u{17}\u{0}"), + "[0|20@1500,0|21@3000,0|22@4500,0|23@6000,0|0@7500,0]" + ) +} + +#[test] +fn gpos_chaining3_boundary_1() { + assert_eq!( + shape_aot("fonts/aots/gpos_chaining3_boundary_f2.otf", 0, &[], "\u{0}\u{14}\u{15}\u{16}\u{17}\u{0}"), + "[0|20@1500,0|21@3020,0|22@4500,0|23@6000,0|0@7500,0]" + ) +} + +#[test] +fn gpos_chaining3_boundary_2() { + assert_eq!( + shape_aot("fonts/aots/gpos_chaining3_boundary_f3.otf", 0, &[], "\u{0}\u{14}\u{15}\u{16}\u{17}\u{0}"), + "[0|20@1500,0|21@3020,0|22@4500,0|23@6000,0|0@7500,0]" + ) +} + +#[test] +fn gpos_chaining3_boundary_3() { + assert_eq!( + shape_aot("fonts/aots/gpos_chaining3_boundary_f4.otf", 0, &[], "\u{0}\u{14}\u{15}\u{16}\u{17}\u{0}"), + "[0|20@1500,0|21@3000,0|22@4520,0|23@6000,0|0@7500,0]" + ) +} + +#[test] +fn gpos_chaining3_next_glyph_0() { + assert_eq!( + shape_aot("fonts/aots/gpos_chaining3_next_glyph_f1.otf", 0, &[], "\u{0}\u{16}\u{15}\u{16}\u{15}\u{16}\u{15}\u{0}"), + "[0|22@1500,0|21@3020,0|22@4500,0|21@6020,0|22@7500,0|21@9000,0|0@10500,0]" + ) +} + +#[test] +fn gpos_chaining3_simple_0() { + assert_eq!( + shape_aot("fonts/aots/gpos_chaining3_simple_f1.otf", 0, &[], "\u{0}\u{14}\u{15}\u{16}\u{17}\u{0}"), + "[0|20@1500,0|21@3020,0|22@4520,0|23@6000,0|0@7500,0]" + ) +} + +#[test] +fn gpos_chaining3_simple_1() { + assert_eq!( + shape_aot("fonts/aots/gpos_chaining3_simple_f2.otf", 0, &[], "\u{0}\u{14}\u{15}\u{16}\u{17}\u{18}\u{19}\u{1a}\u{0}"), + "[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]" + ) +} + +#[test] +fn gpos_chaining3_simple_2() { + assert_eq!( + shape_aot("fonts/aots/gpos_chaining3_simple_f2.otf", 0, &[], "\u{0}\u{14}\u{15}\u{16}\u{17}\u{18}\u{19}\u{0}\u{0}"), + "[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]" + ) +} + +#[test] +fn gpos_chaining3_simple_3() { + assert_eq!( + shape_aot("fonts/aots/gpos_chaining3_simple_f2.otf", 0, &[], "\u{0}\u{14}\u{15}\u{16}\u{17}\u{18}\u{19}"), + "[0|20@1500,0|21@3000,0|22@4500,0|23@6000,0|24@7500,0|25@9000,0]" + ) +} + +#[test] +fn gpos_chaining3_simple_4() { + assert_eq!( + shape_aot("fonts/aots/gpos_chaining3_simple_f2.otf", 0, &[], "\u{0}\u{14}\u{15}\u{16}\u{17}\u{18}"), + "[0|20@1500,0|21@3000,0|22@4500,0|23@6000,0|24@7500,0]" + ) +} + +#[test] +fn gpos_chaining3_simple_5() { + assert_eq!( + shape_aot("fonts/aots/gpos_chaining3_simple_f2.otf", 0, &[], "\u{0}\u{0}\u{15}\u{16}\u{17}\u{18}\u{19}\u{1a}\u{0}"), + "[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]" + ) +} + +#[test] +fn gpos_chaining3_simple_6() { + assert_eq!( + shape_aot("fonts/aots/gpos_chaining3_simple_f2.otf", 0, &[], "\u{15}\u{16}\u{17}\u{18}\u{19}\u{1a}\u{0}"), + "[21|22@1500,0|23@3000,0|24@4500,0|25@6000,0|26@7500,0|0@9000,0]" + ) +} + +#[test] +fn gpos_chaining3_simple_7() { + assert_eq!( + shape_aot("fonts/aots/gpos_chaining3_simple_f2.otf", 0, &[], "\u{16}\u{17}\u{18}\u{19}\u{1a}\u{0}"), + "[22|23@1500,0|24@3000,0|25@4500,0|26@6000,0|0@7500,0]" + ) +} + +#[test] +fn gpos_chaining3_simple_8() { + assert_eq!( + shape_aot("fonts/aots/gpos_chaining3_simple_f2.otf", 0, &[], "\u{0}\u{14}\u{15}\u{16}\u{0}\u{18}\u{19}\u{1a}\u{0}"), + "[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]" + ) +} + +#[test] +fn gpos_chaining3_simple_9() { + assert_eq!( + shape_aot("fonts/aots/gpos_chaining3_simple_f2.otf", 0, &[], "\u{0}\u{14}\u{15}\u{16}\u{17}"), + "[0|20@1500,0|21@3000,0|22@4500,0|23@6000,0]" + ) +} + +#[test] +fn gpos_chaining3_simple_10() { + assert_eq!( + shape_aot("fonts/aots/gpos_chaining3_simple_f2.otf", 0, &[], "\u{0}\u{14}\u{15}\u{16}"), + "[0|20@1500,0|21@3000,0|22@4500,0]" + ) +} + +#[test] +fn gpos_chaining3_successive_0() { + assert_eq!( + shape_aot("fonts/aots/gpos_chaining3_successive_f1.otf", 0, &[], "\u{0}\u{19}\u{14}\u{15}\u{16}\u{17}\u{18}\u{0}"), + "[0|25@1500,0|20@3000,0|21@4520,0|22@6020,0|23@7500,0|24@9000,0|0@10500,0]" + ) +} + +#[test] +fn gpos_context1_boundary_0() { + assert_eq!( + shape_aot("fonts/aots/gpos_context1_boundary_f1.otf", 0, &[], "\u{0}\u{14}\u{14}\u{14}\u{14}\u{14}\u{0}"), + "[0|20@1500,0|20@3000,0|20@4500,0|20@6000,0|20@7500,0|0@9000,0]" + ) +} + +#[test] +fn gpos_context1_boundary_1() { + assert_eq!( + shape_aot("fonts/aots/gpos_context1_boundary_f2.otf", 0, &[], "\u{0}\u{14}\u{14}\u{14}\u{14}\u{14}\u{0}"), + "[0|20@1520,0|20@3020,0|20@4520,0|20@6020,0|20@7520,0|0@9000,0]" + ) +} + +#[test] +fn gpos_context1_expansion_0() { + assert_eq!( + shape_aot("fonts/aots/gpos_context1_expansion_f1.otf", 0, &[], "\u{0}\u{14}\u{15}\u{16}\u{0}"), + "[0|20@1500,0|21@3000,0|22@4500,0|0@6000,0]" + ) +} + +#[test] +fn gpos_context1_multiple_subrules_0() { + assert_eq!( + shape_aot("fonts/aots/gpos_context1_multiple_subrules_f1.otf", 0, &[], "\u{0}\u{14}\u{15}\u{16}\u{0}\u{14}\u{15}\u{0}"), + "[0|20@1520,0|21@3000,0|22@4500,0|0@6000,0|20@7500,0|21@9020,0|0@10500,0]" + ) +} + +#[test] +fn gpos_context1_multiple_subrules_1() { + assert_eq!( + shape_aot("fonts/aots/gpos_context1_multiple_subrules_f2.otf", 0, &[], "\u{0}\u{14}\u{15}\u{16}\u{0}\u{14}\u{15}\u{0}"), + "[0|20@1500,0|21@3020,0|22@4500,0|0@6000,0|20@7500,0|21@9020,0|0@10500,0]" + ) +} + +#[test] +fn gpos_context1_next_glyph_0() { + assert_eq!( + shape_aot("fonts/aots/gpos_context1_next_glyph_f1.otf", 0, &[], "\u{0}\u{14}\u{14}\u{14}\u{14}\u{14}\u{0}"), + "[0|20@1520,0|20@3000,0|20@4520,0|20@6000,0|20@7500,0|0@9000,0]" + ) +} + +#[test] +fn gpos_context1_simple_0() { + assert_eq!( + shape_aot("fonts/aots/gpos_context1_simple_f1.otf", 0, &[], "\u{0}\u{14}\u{15}\u{16}\u{0}"), + "[0|20@1520,0|21@3020,0|22@4520,0|0@6000,0]" + ) +} + +#[test] +fn gpos_context1_simple_1() { + assert_eq!( + shape_aot("fonts/aots/gpos_context1_simple_f1.otf", 0, &[], "\u{0}\u{14}\u{0}\u{14}\u{15}\u{0}"), + "[0|20@1500,0|0@3000,0|20@4500,0|21@6000,0|0@7500,0]" + ) +} + +#[test] +fn gpos_context1_simple_2() { + assert_eq!( + shape_aot("fonts/aots/gpos_context1_simple_f2.otf", 0, &[], "\u{0}\u{14}\u{14}\u{14}\u{14}\u{14}\u{0}"), + "[0|20@1500,0|20@3020,0|20@4500,0|20@6000,0|20@7500,0|0@9000,0]" + ) +} + +#[test] +fn gpos_context1_successive_0() { + assert_eq!( + shape_aot("fonts/aots/gpos_context1_successive_f1.otf", 0, &[], "\u{0}\u{14}\u{15}\u{16}\u{17}\u{0}"), + "[0|20@1500,0|21@3020,0|22@4520,0|23@6000,0|0@7500,0]" + ) +} + +#[test] +fn gpos_context2_boundary_0() { + assert_eq!( + shape_aot("fonts/aots/gpos_context2_boundary_f1.otf", 0, &[], "\u{0}\u{14}\u{14}\u{14}\u{14}\u{14}\u{0}"), + "[0|20@1500,0|20@3000,0|20@4500,0|20@6000,0|20@7500,0|0@9000,0]" + ) +} + +#[test] +fn gpos_context2_boundary_1() { + assert_eq!( + shape_aot("fonts/aots/gpos_context2_boundary_f2.otf", 0, &[], "\u{0}\u{14}\u{14}\u{14}\u{14}\u{14}\u{0}"), + "[0|20@1520,0|20@3020,0|20@4520,0|20@6020,0|20@7520,0|0@9000,0]" + ) +} + +#[test] +fn gpos_context2_classes_0() { + assert_eq!( + shape_aot("fonts/aots/gpos_context2_classes_f1.otf", 0, &[], "\u{0}\u{14}\u{1a}\u{1c}\u{18}\u{0}\u{15}\u{1b}\u{1a}\u{18}\u{0}\u{16}\u{1b}\u{1a}\u{18}"), + "[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]" + ) +} + +#[test] +fn gpos_context2_classes_1() { + assert_eq!( + shape_aot("fonts/aots/gpos_context2_classes_f2.otf", 0, &[], "\u{0}\u{16}\u{1b}\u{1a}\u{18}\u{0}\u{18}\u{18}\u{1d}\u{16}\u{0}\u{16}\u{1b}\u{1a}\u{18}"), + "[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]" + ) +} + +#[test] +fn gpos_context2_expansion_0() { + assert_eq!( + shape_aot("fonts/aots/gpos_context2_expansion_f1.otf", 0, &[], "\u{0}\u{14}\u{15}\u{16}\u{0}"), + "[0|20@1500,0|21@3000,0|22@4500,0|0@6000,0]" + ) +} + +#[test] +fn gpos_context2_multiple_subrules_0() { + assert_eq!( + shape_aot("fonts/aots/gpos_context2_multiple_subrules_f1.otf", 0, &[], "\u{0}\u{14}\u{15}\u{16}\u{0}\u{14}\u{15}\u{0}"), + "[0|20@1520,0|21@3000,0|22@4500,0|0@6000,0|20@7500,0|21@9020,0|0@10500,0]" + ) +} + +#[test] +fn gpos_context2_multiple_subrules_1() { + assert_eq!( + shape_aot("fonts/aots/gpos_context2_multiple_subrules_f2.otf", 0, &[], "\u{0}\u{14}\u{15}\u{16}\u{0}\u{14}\u{15}\u{0}"), + "[0|20@1500,0|21@3020,0|22@4500,0|0@6000,0|20@7500,0|21@9020,0|0@10500,0]" + ) +} + +#[test] +fn gpos_context2_next_glyph_0() { + assert_eq!( + shape_aot("fonts/aots/gpos_context2_next_glyph_f1.otf", 0, &[], "\u{0}\u{14}\u{14}\u{14}\u{14}\u{14}\u{0}"), + "[0|20@1520,0|20@3000,0|20@4520,0|20@6000,0|20@7500,0|0@9000,0]" + ) +} + +#[test] +fn gpos_context2_simple_0() { + assert_eq!( + shape_aot("fonts/aots/gpos_context2_simple_f1.otf", 0, &[], "\u{0}\u{14}\u{15}\u{16}\u{0}"), + "[0|20@1520,0|21@3020,0|22@4520,0|0@6000,0]" + ) +} + +#[test] +fn gpos_context2_simple_1() { + assert_eq!( + shape_aot("fonts/aots/gpos_context2_simple_f1.otf", 0, &[], "\u{0}\u{14}\u{0}\u{14}\u{15}\u{0}"), + "[0|20@1500,0|0@3000,0|20@4500,0|21@6000,0|0@7500,0]" + ) +} + +#[test] +fn gpos_context2_simple_2() { + assert_eq!( + shape_aot("fonts/aots/gpos_context2_simple_f2.otf", 0, &[], "\u{0}\u{14}\u{14}\u{14}\u{14}\u{14}\u{0}"), + "[0|20@1500,0|20@3020,0|20@4500,0|20@6000,0|20@7500,0|0@9000,0]" + ) +} + +#[test] +fn gpos_context2_successive_0() { + assert_eq!( + shape_aot("fonts/aots/gpos_context2_successive_f1.otf", 0, &[], "\u{0}\u{14}\u{15}\u{16}\u{17}\u{0}"), + "[0|20@1500,0|21@3020,0|22@4520,0|23@6000,0|0@7500,0]" + ) +} + +#[test] +fn gpos_context3_boundary_0() { + assert_eq!( + shape_aot("fonts/aots/gpos_context3_boundary_f1.otf", 0, &[], "\u{0}\u{14}\u{14}\u{14}\u{14}\u{14}\u{0}"), + "[0|20@1500,0|20@3000,0|20@4500,0|20@6000,0|20@7500,0|0@9000,0]" + ) +} + +#[test] +fn gpos_context3_boundary_1() { + assert_eq!( + shape_aot("fonts/aots/gpos_context3_boundary_f2.otf", 0, &[], "\u{0}\u{14}\u{14}\u{14}\u{14}\u{14}\u{0}"), + "[0|20@1520,0|20@3020,0|20@4520,0|20@6020,0|20@7520,0|0@9000,0]" + ) +} + +#[test] +fn gpos_context3_next_glyph_0() { + assert_eq!( + shape_aot("fonts/aots/gpos_context3_next_glyph_f1.otf", 0, &[], "\u{0}\u{14}\u{14}\u{14}\u{14}\u{14}\u{0}"), + "[0|20@1520,0|20@3000,0|20@4520,0|20@6000,0|20@7500,0|0@9000,0]" + ) +} + +#[test] +fn gpos_context3_simple_0() { + assert_eq!( + shape_aot("fonts/aots/gpos_context3_simple_f1.otf", 0, &[], "\u{0}\u{14}\u{15}\u{16}\u{0}"), + "[0|20@1520,0|21@3020,0|22@4520,0|0@6000,0]" + ) +} + +#[test] +fn gpos_context3_simple_1() { + assert_eq!( + shape_aot("fonts/aots/gpos_context3_simple_f1.otf", 0, &[], "\u{0}\u{14}\u{0}\u{14}\u{15}\u{0}\u{14}\u{15}\u{16}\u{0}"), + "[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]" + ) +} + +#[test] +fn gpos_context3_successive_0() { + assert_eq!( + shape_aot("fonts/aots/gpos_context3_successive_f1.otf", 0, &[], "\u{0}\u{14}\u{15}\u{16}\u{17}\u{0}"), + "[0|20@1500,0|21@3020,0|22@4520,0|23@6000,0|0@7500,0]" + ) +} + +#[test] +fn gsub1_1_lookupflag_0() { + assert_eq!( + shape_aot("fonts/aots/gsub1_1_lookupflag_f1.otf", 0, &[], "\u{11}\u{12}\u{13}\u{14}\u{15}"), + "[17|18|24|20|21]" + ) +} + +#[test] +fn gsub1_1_modulo_0() { + assert_eq!( + shape_aot("fonts/aots/gsub1_1_modulo_f1.otf", 0, &[], "\u{11}\u{12}\u{13}\u{14}\u{15}\u{16}\u{17}\u{18}"), + "[17|18|17|24|23|18|23|24]" + ) +} + +#[test] +fn gsub1_1_simple_0() { + assert_eq!( + shape_aot("fonts/aots/gsub1_1_simple_f1.otf", 0, &[], "\u{11}\u{12}\u{13}\u{14}\u{15}"), + "[17|23|24|20|21]" + ) +} + +#[test] +fn gsub1_2_lookupflag_0() { + assert_eq!( + shape_aot("fonts/aots/gsub1_2_lookupflag_f1.otf", 0, &[], "\u{11}\u{12}\u{13}\u{14}\u{15}"), + "[17|18|19|25|21]" + ) +} + +#[test] +fn gsub1_2_simple_0() { + assert_eq!( + shape_aot("fonts/aots/gsub1_2_simple_f1.otf", 0, &[], "\u{11}\u{12}\u{13}\u{14}\u{15}"), + "[17|22|19|25|21]" + ) +} + +#[test] +fn gsub2_1_lookupflag_0() { + assert_eq!( + shape_aot("fonts/aots/gsub2_1_lookupflag_f1.otf", 0, &[], "\u{11}\u{12}\u{13}\u{11}"), + "[17|18|22|23|17]" + ) +} + +#[test] +fn gsub2_1_multiple_sequences_0() { + assert_eq!( + shape_aot("fonts/aots/gsub2_1_multiple_sequences_f1.otf", 0, &[], "\u{11}\u{12}\u{13}\u{11}"), + "[17|20|21|22|23|17]" + ) +} + +#[test] +fn gsub2_1_simple_0() { + assert_eq!( + shape_aot("fonts/aots/gsub2_1_simple_f1.otf", 0, &[], "\u{11}\u{12}\u{13}"), + "[17|20|21|22|19]" + ) +} + +#[test] +fn gsub2_1_simple_1() { + assert_eq!( + shape_aot("fonts/aots/gsub2_1_simple_f1.otf", 0, &[], "\u{11}\u{12}\u{13}\u{12}"), + "[17|20|21|22|19|20|21|22]" + ) +} + +#[test] +fn gsub3_1_lookupflag_0() { + assert_eq!( + shape_aot("fonts/aots/gsub3_1_lookupflag_f1.otf", 0, &[], "\u{11}\u{12}\u{12}\u{12}\u{13}\u{13}\u{13}\u{13}\u{11}"), + "[17|18|18|18|19|22|23|19|17]" + ) +} + +#[test] +fn gsub3_1_multiple_0() { + assert_eq!( + shape_aot("fonts/aots/gsub3_1_multiple_f1.otf", 0, &[], "\u{11}\u{12}\u{12}\u{12}\u{12}\u{13}\u{13}\u{13}\u{13}\u{11}"), + "[17|18|20|21|18|19|22|23|19|17]" + ) +} + +#[test] +fn gsub4_1_lookupflag_0() { + assert_eq!( + shape_aot("fonts/aots/gsub4_1_lookupflag_f1.otf", 0, &[], "\u{11}\u{18}\u{12}\u{18}\u{13}\u{18}\u{18}\u{14}\u{18}\u{11}\u{12}\u{13}\u{16}\u{14}"), + "[17|24|23|24|24|24|24|17|18|19|22|20]" + ) +} + +#[test] +fn gsub4_1_multiple_ligatures_0() { + assert_eq!( + shape_aot("fonts/aots/gsub4_1_multiple_ligatures_f1.otf", 0, &[], "\u{11}\u{12}\u{13}\u{14}\u{11}\u{12}\u{13}\u{16}\u{14}"), + "[17|23|17|24|22|20]" + ) +} + +#[test] +fn gsub4_1_multiple_ligatures_1() { + assert_eq!( + shape_aot("fonts/aots/gsub4_1_multiple_ligatures_f2.otf", 0, &[], "\u{11}\u{12}\u{13}\u{14}\u{11}\u{12}\u{13}\u{16}\u{14}"), + "[17|24|20|17|24|22|20]" + ) +} + +#[test] +fn gsub4_1_multiple_ligsets_0() { + assert_eq!( + shape_aot("fonts/aots/gsub4_1_multiple_ligsets_f1.otf", 0, &[], "\u{11}\u{12}\u{13}\u{15}\u{14}\u{13}\u{16}"), + "[17|23|21|24|22]" + ) +} + +#[test] +fn gsub4_1_simple_0() { + assert_eq!( + shape_aot("fonts/aots/gsub4_1_simple_f1.otf", 0, &[], "\u{11}\u{12}\u{13}\u{14}\u{11}\u{12}\u{13}\u{16}\u{14}"), + "[17|23|17|18|19|22|20]" + ) +} + +#[test] +fn gsub7_0() { + assert_eq!( + shape_aot("fonts/aots/gsub7_font1.otf", 0, &[], "\u{11}\u{12}\u{13}\u{14}\u{15}"), + "[17|23|24|20|21]" + ) +} + +#[test] +fn gsub7_1() { + assert_eq!( + shape_aot("fonts/aots/gsub7_font2.otf", 0, &[], "\u{11}\u{12}\u{13}\u{14}\u{15}"), + "[17|23|29|20|21]" + ) +} + +#[test] +fn gsub_chaining1_boundary_0() { + assert_eq!( + shape_aot("fonts/aots/gsub_chaining1_boundary_f1.otf", 0, &[], "\u{0}\u{14}\u{15}\u{16}\u{17}\u{0}"), + "[0|20|21|22|23|0]" + ) +} + +#[test] +fn gsub_chaining1_boundary_1() { + assert_eq!( + shape_aot("fonts/aots/gsub_chaining1_boundary_f2.otf", 0, &[], "\u{0}\u{14}\u{15}\u{16}\u{17}\u{0}"), + "[0|20|61|22|23|0]" + ) +} + +#[test] +fn gsub_chaining1_boundary_2() { + assert_eq!( + shape_aot("fonts/aots/gsub_chaining1_boundary_f3.otf", 0, &[], "\u{0}\u{14}\u{15}\u{16}\u{17}\u{0}"), + "[0|20|61|22|23|0]" + ) +} + +#[test] +fn gsub_chaining1_boundary_3() { + assert_eq!( + shape_aot("fonts/aots/gsub_chaining1_boundary_f4.otf", 0, &[], "\u{0}\u{14}\u{15}\u{16}\u{17}\u{0}"), + "[0|20|21|62|23|0]" + ) +} + +#[test] +fn gsub_chaining1_lookupflag_0() { + assert_eq!( + shape_aot("fonts/aots/gsub_chaining1_lookupflag_f1.otf", 0, &[], "\u{0}\u{14}Z\u{15}[\u{16}\\\u{17}]^\u{18}Z\u{19}[\u{1a}\u{0}"), + "[0|20|90|21|91|22|92|63|93|94|24|90|25|91|26|0]" + ) +} + +#[test] +fn gsub_chaining1_multiple_subrules_0() { + assert_eq!( + shape_aot("fonts/aots/gsub_chaining1_multiple_subrules_f1.otf", 0, &[], "\u{0}\u{14}\u{15}\u{16}\u{17}\u{18}\u{0}\u{14}\u{15}\u{16}\u{17}\u{0}"), + "[0|20|61|22|23|24|0|20|21|62|23|0]" + ) +} + +#[test] +fn gsub_chaining1_multiple_subrules_1() { + assert_eq!( + shape_aot("fonts/aots/gsub_chaining1_multiple_subrules_f2.otf", 0, &[], "\u{0}\u{14}\u{15}\u{16}\u{17}\u{18}\u{0}\u{14}\u{15}\u{16}\u{17}\u{0}"), + "[0|20|21|62|23|24|0|20|21|62|23|0]" + ) +} + +#[test] +fn gsub_chaining1_next_glyph_0() { + assert_eq!( + shape_aot("fonts/aots/gsub_chaining1_next_glyph_f1.otf", 0, &[], "\u{0}\u{14}\u{15}\u{16}\u{17}\u{0}"), + "[0|20|61|62|63|0]" + ) +} + +#[test] +fn gsub_chaining1_simple_0() { + assert_eq!( + shape_aot("fonts/aots/gsub_chaining1_simple_f1.otf", 0, &[], "\u{0}\u{14}\u{15}\u{16}\u{17}\u{0}"), + "[0|20|61|62|23|0]" + ) +} + +#[test] +fn gsub_chaining1_simple_1() { + assert_eq!( + shape_aot("fonts/aots/gsub_chaining1_simple_f2.otf", 0, &[], "\u{0}\u{14}\u{15}\u{16}\u{17}\u{18}\u{19}\u{1a}\u{0}"), + "[0|20|21|62|23|24|25|26|0]" + ) +} + +#[test] +fn gsub_chaining1_simple_2() { + assert_eq!( + shape_aot("fonts/aots/gsub_chaining1_simple_f2.otf", 0, &[], "\u{0}\u{14}\u{15}\u{16}\u{17}\u{18}\u{19}\u{0}\u{0}"), + "[0|20|21|22|23|24|25|0|0]" + ) +} + +#[test] +fn gsub_chaining1_simple_3() { + assert_eq!( + shape_aot("fonts/aots/gsub_chaining1_simple_f2.otf", 0, &[], "\u{0}\u{14}\u{15}\u{16}\u{17}\u{18}\u{19}"), + "[0|20|21|22|23|24|25]" + ) +} + +#[test] +fn gsub_chaining1_simple_4() { + assert_eq!( + shape_aot("fonts/aots/gsub_chaining1_simple_f2.otf", 0, &[], "\u{0}\u{14}\u{15}\u{16}\u{17}\u{18}"), + "[0|20|21|22|23|24]" + ) +} + +#[test] +fn gsub_chaining1_simple_5() { + assert_eq!( + shape_aot("fonts/aots/gsub_chaining1_simple_f2.otf", 0, &[], "\u{0}\u{0}\u{15}\u{16}\u{17}\u{18}\u{19}\u{1a}\u{0}"), + "[0|0|21|22|23|24|25|26|0]" + ) +} + +#[test] +fn gsub_chaining1_simple_6() { + assert_eq!( + shape_aot("fonts/aots/gsub_chaining1_simple_f2.otf", 0, &[], "\u{15}\u{16}\u{17}\u{18}\u{19}\u{1a}\u{0}"), + "[21|22|23|24|25|26|0]" + ) +} + +#[test] +fn gsub_chaining1_simple_7() { + assert_eq!( + shape_aot("fonts/aots/gsub_chaining1_simple_f2.otf", 0, &[], "\u{16}\u{17}\u{18}\u{19}\u{1a}\u{0}"), + "[22|23|24|25|26|0]" + ) +} + +#[test] +fn gsub_chaining1_simple_8() { + assert_eq!( + shape_aot("fonts/aots/gsub_chaining1_simple_f2.otf", 0, &[], "\u{0}\u{14}\u{15}\u{16}\u{0}\u{18}\u{19}\u{1a}\u{0}"), + "[0|20|21|22|0|24|25|26|0]" + ) +} + +#[test] +fn gsub_chaining1_simple_9() { + assert_eq!( + shape_aot("fonts/aots/gsub_chaining1_simple_f2.otf", 0, &[], "\u{0}\u{14}\u{15}\u{16}\u{17}"), + "[0|20|21|22|23]" + ) +} + +#[test] +fn gsub_chaining1_simple_10() { + assert_eq!( + shape_aot("fonts/aots/gsub_chaining1_simple_f2.otf", 0, &[], "\u{0}\u{14}\u{15}\u{16}"), + "[0|20|21|22]" + ) +} + +#[test] +fn gsub_chaining1_successive_0() { + assert_eq!( + shape_aot("fonts/aots/gsub_chaining1_successive_f1.otf", 0, &[], "\u{0}\u{19}\u{14}\u{15}\u{16}\u{17}\u{18}\u{0}"), + "[0|25|20|61|63|24|0]" + ) +} + +#[test] +fn gsub_chaining2_boundary_0() { + assert_eq!( + shape_aot("fonts/aots/gsub_chaining2_boundary_f1.otf", 0, &[], "\u{0}\u{14}\u{15}\u{16}\u{17}\u{0}"), + "[0|20|21|22|23|0]" + ) +} + +#[test] +fn gsub_chaining2_boundary_1() { + assert_eq!( + shape_aot("fonts/aots/gsub_chaining2_boundary_f2.otf", 0, &[], "\u{0}\u{14}\u{15}\u{16}\u{17}\u{0}"), + "[0|20|61|22|23|0]" + ) +} + +#[test] +fn gsub_chaining2_boundary_2() { + assert_eq!( + shape_aot("fonts/aots/gsub_chaining2_boundary_f3.otf", 0, &[], "\u{0}\u{14}\u{15}\u{16}\u{17}\u{0}"), + "[0|20|61|22|23|0]" + ) +} + +#[test] +fn gsub_chaining2_boundary_3() { + assert_eq!( + shape_aot("fonts/aots/gsub_chaining2_boundary_f4.otf", 0, &[], "\u{0}\u{14}\u{15}\u{16}\u{17}\u{0}"), + "[0|20|21|62|23|0]" + ) +} + +#[test] +fn gsub_chaining2_lookupflag_0() { + assert_eq!( + shape_aot("fonts/aots/gsub_chaining2_lookupflag_f1.otf", 0, &[], "\u{0}\u{14}Z\u{15}[\u{16}\\\u{17}]^\u{18}Z\u{19}[\u{1a}\u{0}"), + "[0|20|90|21|91|22|92|63|93|94|24|90|25|91|26|0]" + ) +} + +#[test] +fn gsub_chaining2_multiple_subrules_0() { + assert_eq!( + shape_aot("fonts/aots/gsub_chaining2_multiple_subrules_f1.otf", 0, &[], "\u{0}\u{14}\u{15}\u{16}\u{17}\u{18}\u{0}\u{14}\u{15}\u{16}\u{17}\u{0}"), + "[0|20|61|22|23|24|0|20|21|62|23|0]" + ) +} + +#[test] +fn gsub_chaining2_multiple_subrules_1() { + assert_eq!( + shape_aot("fonts/aots/gsub_chaining2_multiple_subrules_f2.otf", 0, &[], "\u{0}\u{14}\u{15}\u{16}\u{17}\u{18}\u{0}\u{14}\u{15}\u{16}\u{17}\u{0}"), + "[0|20|21|62|23|24|0|20|21|62|23|0]" + ) +} + +#[test] +fn gsub_chaining2_next_glyph_0() { + assert_eq!( + shape_aot("fonts/aots/gsub_chaining2_next_glyph_f1.otf", 0, &[], "\u{0}\u{14}\u{15}\u{16}\u{17}\u{0}"), + "[0|20|61|62|63|0]" + ) +} + +#[test] +fn gsub_chaining2_simple_0() { + assert_eq!( + shape_aot("fonts/aots/gsub_chaining2_simple_f1.otf", 0, &[], "\u{0}\u{14}\u{15}\u{16}\u{17}\u{0}"), + "[0|20|61|62|23|0]" + ) +} + +#[test] +fn gsub_chaining2_simple_1() { + assert_eq!( + shape_aot("fonts/aots/gsub_chaining2_simple_f2.otf", 0, &[], "\u{0}\u{14}\u{15}\u{16}\u{17}\u{18}\u{19}\u{1a}\u{0}"), + "[0|20|21|62|23|24|25|26|0]" + ) +} + +#[test] +fn gsub_chaining2_simple_2() { + assert_eq!( + shape_aot("fonts/aots/gsub_chaining2_simple_f2.otf", 0, &[], "\u{0}\u{14}\u{15}\u{16}\u{17}\u{18}\u{19}\u{0}\u{0}"), + "[0|20|21|22|23|24|25|0|0]" + ) +} + +#[test] +fn gsub_chaining2_simple_3() { + assert_eq!( + shape_aot("fonts/aots/gsub_chaining2_simple_f2.otf", 0, &[], "\u{0}\u{14}\u{15}\u{16}\u{17}\u{18}\u{19}"), + "[0|20|21|22|23|24|25]" + ) +} + +#[test] +fn gsub_chaining2_simple_4() { + assert_eq!( + shape_aot("fonts/aots/gsub_chaining2_simple_f2.otf", 0, &[], "\u{0}\u{14}\u{15}\u{16}\u{17}\u{18}"), + "[0|20|21|22|23|24]" + ) +} + +#[test] +fn gsub_chaining2_simple_5() { + assert_eq!( + shape_aot("fonts/aots/gsub_chaining2_simple_f2.otf", 0, &[], "\u{0}\u{0}\u{15}\u{16}\u{17}\u{18}\u{19}\u{1a}\u{0}"), + "[0|0|21|22|23|24|25|26|0]" + ) +} + +#[test] +fn gsub_chaining2_simple_6() { + assert_eq!( + shape_aot("fonts/aots/gsub_chaining2_simple_f2.otf", 0, &[], "\u{15}\u{16}\u{17}\u{18}\u{19}\u{1a}\u{0}"), + "[21|22|23|24|25|26|0]" + ) +} + +#[test] +fn gsub_chaining2_simple_7() { + assert_eq!( + shape_aot("fonts/aots/gsub_chaining2_simple_f2.otf", 0, &[], "\u{16}\u{17}\u{18}\u{19}\u{1a}\u{0}"), + "[22|23|24|25|26|0]" + ) +} + +#[test] +fn gsub_chaining2_simple_8() { + assert_eq!( + shape_aot("fonts/aots/gsub_chaining2_simple_f2.otf", 0, &[], "\u{0}\u{14}\u{15}\u{16}\u{0}\u{18}\u{19}\u{1a}\u{0}"), + "[0|20|21|22|0|24|25|26|0]" + ) +} + +#[test] +fn gsub_chaining2_simple_9() { + assert_eq!( + shape_aot("fonts/aots/gsub_chaining2_simple_f2.otf", 0, &[], "\u{0}\u{14}\u{15}\u{16}\u{17}"), + "[0|20|21|22|23]" + ) +} + +#[test] +fn gsub_chaining2_simple_10() { + assert_eq!( + shape_aot("fonts/aots/gsub_chaining2_simple_f2.otf", 0, &[], "\u{0}\u{14}\u{15}\u{16}"), + "[0|20|21|22]" + ) +} + +#[test] +fn gsub_chaining2_successive_0() { + assert_eq!( + shape_aot("fonts/aots/gsub_chaining2_successive_f1.otf", 0, &[], "\u{0}\u{19}\u{14}\u{15}\u{16}\u{17}\u{18}\u{0}"), + "[0|25|20|61|63|24|0]" + ) +} + +#[test] +fn gsub_chaining3_boundary_0() { + assert_eq!( + shape_aot("fonts/aots/gsub_chaining3_boundary_f1.otf", 0, &[], "\u{0}\u{14}\u{15}\u{16}\u{17}\u{0}"), + "[0|20|21|22|23|0]" + ) +} + +#[test] +fn gsub_chaining3_boundary_1() { + assert_eq!( + shape_aot("fonts/aots/gsub_chaining3_boundary_f2.otf", 0, &[], "\u{0}\u{14}\u{15}\u{16}\u{17}\u{0}"), + "[0|20|61|22|23|0]" + ) +} + +#[test] +fn gsub_chaining3_boundary_2() { + assert_eq!( + shape_aot("fonts/aots/gsub_chaining3_boundary_f3.otf", 0, &[], "\u{0}\u{14}\u{15}\u{16}\u{17}\u{0}"), + "[0|20|61|22|23|0]" + ) +} + +#[test] +fn gsub_chaining3_boundary_3() { + assert_eq!( + shape_aot("fonts/aots/gsub_chaining3_boundary_f4.otf", 0, &[], "\u{0}\u{14}\u{15}\u{16}\u{17}\u{0}"), + "[0|20|21|62|23|0]" + ) +} + +#[test] +fn gsub_chaining3_lookupflag_0() { + assert_eq!( + shape_aot("fonts/aots/gsub_chaining3_lookupflag_f1.otf", 0, &[], "\u{0}\u{14}Z\u{15}[\u{16}\\\u{17}]^\u{18}Z\u{19}[\u{1a}\u{0}"), + "[0|20|90|21|91|22|92|63|93|94|24|90|25|91|26|0]" + ) +} + +#[test] +fn gsub_chaining3_next_glyph_0() { + assert_eq!( + shape_aot("fonts/aots/gsub_chaining3_next_glyph_f1.otf", 0, &[], "\u{0}\u{16}\u{15}\u{16}\u{15}\u{16}\u{15}\u{0}"), + "[0|22|61|22|61|22|21|0]" + ) +} + +#[test] +fn gsub_chaining3_simple_0() { + assert_eq!( + shape_aot("fonts/aots/gsub_chaining3_simple_f1.otf", 0, &[], "\u{0}\u{14}\u{15}\u{16}\u{17}\u{0}"), + "[0|20|61|62|23|0]" + ) +} + +#[test] +fn gsub_chaining3_simple_1() { + assert_eq!( + shape_aot("fonts/aots/gsub_chaining3_simple_f2.otf", 0, &[], "\u{0}\u{14}\u{15}\u{16}\u{17}\u{18}\u{19}\u{1a}\u{0}"), + "[0|20|21|62|23|24|25|26|0]" + ) +} + +#[test] +fn gsub_chaining3_simple_2() { + assert_eq!( + shape_aot("fonts/aots/gsub_chaining3_simple_f2.otf", 0, &[], "\u{0}\u{14}\u{15}\u{16}\u{17}\u{18}\u{19}\u{0}\u{0}"), + "[0|20|21|22|23|24|25|0|0]" + ) +} + +#[test] +fn gsub_chaining3_simple_3() { + assert_eq!( + shape_aot("fonts/aots/gsub_chaining3_simple_f2.otf", 0, &[], "\u{0}\u{14}\u{15}\u{16}\u{17}\u{18}\u{19}"), + "[0|20|21|22|23|24|25]" + ) +} + +#[test] +fn gsub_chaining3_simple_4() { + assert_eq!( + shape_aot("fonts/aots/gsub_chaining3_simple_f2.otf", 0, &[], "\u{0}\u{14}\u{15}\u{16}\u{17}\u{18}"), + "[0|20|21|22|23|24]" + ) +} + +#[test] +fn gsub_chaining3_simple_5() { + assert_eq!( + shape_aot("fonts/aots/gsub_chaining3_simple_f2.otf", 0, &[], "\u{0}\u{0}\u{15}\u{16}\u{17}\u{18}\u{19}\u{1a}\u{0}"), + "[0|0|21|22|23|24|25|26|0]" + ) +} + +#[test] +fn gsub_chaining3_simple_6() { + assert_eq!( + shape_aot("fonts/aots/gsub_chaining3_simple_f2.otf", 0, &[], "\u{15}\u{16}\u{17}\u{18}\u{19}\u{1a}\u{0}"), + "[21|22|23|24|25|26|0]" + ) +} + +#[test] +fn gsub_chaining3_simple_7() { + assert_eq!( + shape_aot("fonts/aots/gsub_chaining3_simple_f2.otf", 0, &[], "\u{16}\u{17}\u{18}\u{19}\u{1a}\u{0}"), + "[22|23|24|25|26|0]" + ) +} + +#[test] +fn gsub_chaining3_simple_8() { + assert_eq!( + shape_aot("fonts/aots/gsub_chaining3_simple_f2.otf", 0, &[], "\u{0}\u{14}\u{15}\u{16}\u{0}\u{18}\u{19}\u{1a}\u{0}"), + "[0|20|21|22|0|24|25|26|0]" + ) +} + +#[test] +fn gsub_chaining3_simple_9() { + assert_eq!( + shape_aot("fonts/aots/gsub_chaining3_simple_f2.otf", 0, &[], "\u{0}\u{14}\u{15}\u{16}\u{17}"), + "[0|20|21|22|23]" + ) +} + +#[test] +fn gsub_chaining3_simple_10() { + assert_eq!( + shape_aot("fonts/aots/gsub_chaining3_simple_f2.otf", 0, &[], "\u{0}\u{14}\u{15}\u{16}"), + "[0|20|21|22]" + ) +} + +#[test] +fn gsub_chaining3_successive_0() { + assert_eq!( + shape_aot("fonts/aots/gsub_chaining3_successive_f1.otf", 0, &[], "\u{0}\u{19}\u{14}\u{15}\u{16}\u{17}\u{18}\u{0}"), + "[0|25|20|61|63|24|0]" + ) +} + +#[test] +fn gsub_context1_boundary_0() { + assert_eq!( + shape_aot("fonts/aots/gsub_context1_boundary_f1.otf", 0, &[], "\u{0}\u{14}\u{14}\u{14}\u{14}\u{14}\u{0}"), + "[0|20|20|20|20|20|0]" + ) +} + +#[test] +fn gsub_context1_boundary_1() { + assert_eq!( + shape_aot("fonts/aots/gsub_context1_boundary_f2.otf", 0, &[], "\u{0}\u{14}\u{14}\u{14}\u{14}\u{14}\u{0}"), + "[0|60|60|60|60|60|0]" + ) +} + +#[test] +fn gsub_context1_expansion_0() { + assert_eq!( + shape_aot("fonts/aots/gsub_context1_expansion_f1.otf", 0, &[], "\u{0}\u{14}\u{15}\u{16}\u{0}"), + "[0|20|61|62|63|22|0]" + ) +} + +#[test] +fn gsub_context1_lookupflag_0() { + assert_eq!( + shape_aot("fonts/aots/gsub_context1_lookupflag_f1.otf", 0, &[], "\u{0}\u{14}Z\u{15}[\\\u{16}\u{0}"), + "[0|60|90|61|91|92|62|0]" + ) +} + +#[test] +fn gsub_context1_lookupflag_1() { + assert_eq!( + shape_aot("fonts/aots/gsub_context1_lookupflag_f2.otf", 0, &[], "\u{0}\u{14}Z\u{15}[\\\u{16}\u{0}"), + "[0|20|90|61|91|92|0]" + ) +} + +#[test] +fn gsub_context1_multiple_subrules_0() { + assert_eq!( + shape_aot("fonts/aots/gsub_context1_multiple_subrules_f1.otf", 0, &[], "\u{0}\u{14}\u{15}\u{16}\u{0}\u{14}\u{15}\u{0}"), + "[0|60|21|22|0|20|61|0]" + ) +} + +#[test] +fn gsub_context1_multiple_subrules_1() { + assert_eq!( + shape_aot("fonts/aots/gsub_context1_multiple_subrules_f2.otf", 0, &[], "\u{0}\u{14}\u{15}\u{16}\u{0}\u{14}\u{15}\u{0}"), + "[0|20|61|22|0|20|61|0]" + ) +} + +#[test] +fn gsub_context1_next_glyph_0() { + assert_eq!( + shape_aot("fonts/aots/gsub_context1_next_glyph_f1.otf", 0, &[], "\u{0}\u{14}\u{14}\u{14}\u{14}\u{14}\u{0}"), + "[0|60|20|60|20|20|0]" + ) +} + +#[test] +fn gsub_context1_simple_0() { + assert_eq!( + shape_aot("fonts/aots/gsub_context1_simple_f1.otf", 0, &[], "\u{0}\u{14}\u{15}\u{16}\u{0}"), + "[0|60|61|62|0]" + ) +} + +#[test] +fn gsub_context1_simple_1() { + assert_eq!( + shape_aot("fonts/aots/gsub_context1_simple_f1.otf", 0, &[], "\u{0}\u{14}\u{0}\u{14}\u{15}\u{0}"), + "[0|20|0|20|21|0]" + ) +} + +#[test] +fn gsub_context1_simple_2() { + assert_eq!( + shape_aot("fonts/aots/gsub_context1_simple_f2.otf", 0, &[], "\u{0}\u{14}\u{14}\u{14}\u{14}\u{14}\u{0}"), + "[0|20|60|20|20|20|0]" + ) +} + +#[test] +fn gsub_context1_successive_0() { + assert_eq!( + shape_aot("fonts/aots/gsub_context1_successive_f1.otf", 0, &[], "\u{0}\u{14}\u{15}\u{16}\u{17}\u{0}"), + "[0|20|61|63|0]" + ) +} + +#[test] +fn gsub_context2_boundary_0() { + assert_eq!( + shape_aot("fonts/aots/gsub_context2_boundary_f1.otf", 0, &[], "\u{0}\u{14}\u{14}\u{14}\u{14}\u{14}\u{0}"), + "[0|20|20|20|20|20|0]" + ) +} + +#[test] +fn gsub_context2_boundary_1() { + assert_eq!( + shape_aot("fonts/aots/gsub_context2_boundary_f2.otf", 0, &[], "\u{0}\u{14}\u{14}\u{14}\u{14}\u{14}\u{0}"), + "[0|60|60|60|60|60|0]" + ) +} + +#[test] +fn gsub_context2_classes_0() { + assert_eq!( + shape_aot("fonts/aots/gsub_context2_classes_f1.otf", 0, &[], "\u{0}\u{14}\u{1a}\u{1c}\u{18}\u{0}\u{15}\u{1b}\u{1a}\u{18}\u{0}\u{16}\u{1b}\u{1a}\u{18}"), + "[0|20|66|28|24|0|21|67|26|24|0|22|27|26|24]" + ) +} + +#[test] +fn gsub_context2_classes_1() { + assert_eq!( + shape_aot("fonts/aots/gsub_context2_classes_f2.otf", 0, &[], "\u{0}\u{16}\u{1b}\u{1a}\u{18}\u{0}\u{18}\u{18}\u{1d}\u{16}\u{0}\u{16}\u{1b}\u{1a}\u{18}"), + "[0|22|67|26|24|0|24|24|69|22|0|22|67|26|24]" + ) +} + +#[test] +fn gsub_context2_expansion_0() { + assert_eq!( + shape_aot("fonts/aots/gsub_context2_expansion_f1.otf", 0, &[], "\u{0}\u{14}\u{15}\u{16}\u{0}"), + "[0|20|61|62|63|22|0]" + ) +} + +#[test] +fn gsub_context2_lookupflag_0() { + assert_eq!( + shape_aot("fonts/aots/gsub_context2_lookupflag_f1.otf", 0, &[], "\u{0}\u{14}Z\u{15}[\\\u{16}\u{0}"), + "[0|60|90|61|91|92|62|0]" + ) +} + +#[test] +fn gsub_context2_lookupflag_1() { + assert_eq!( + shape_aot("fonts/aots/gsub_context2_lookupflag_f2.otf", 0, &[], "\u{0}\u{14}Z\u{15}[\\\u{16}\u{0}"), + "[0|20|90|61|91|92|0]" + ) +} + +#[test] +fn gsub_context2_multiple_subrules_0() { + assert_eq!( + shape_aot("fonts/aots/gsub_context2_multiple_subrules_f1.otf", 0, &[], "\u{0}\u{14}\u{15}\u{16}\u{0}\u{14}\u{15}\u{0}"), + "[0|60|21|22|0|20|61|0]" + ) +} + +#[test] +fn gsub_context2_multiple_subrules_1() { + assert_eq!( + shape_aot("fonts/aots/gsub_context2_multiple_subrules_f2.otf", 0, &[], "\u{0}\u{14}\u{15}\u{16}\u{0}\u{14}\u{15}\u{0}"), + "[0|20|61|22|0|20|61|0]" + ) +} + +#[test] +fn gsub_context2_next_glyph_0() { + assert_eq!( + shape_aot("fonts/aots/gsub_context2_next_glyph_f1.otf", 0, &[], "\u{0}\u{14}\u{14}\u{14}\u{14}\u{14}\u{0}"), + "[0|60|20|60|20|20|0]" + ) +} + +#[test] +fn gsub_context2_simple_0() { + assert_eq!( + shape_aot("fonts/aots/gsub_context2_simple_f1.otf", 0, &[], "\u{0}\u{14}\u{15}\u{16}\u{0}"), + "[0|60|61|62|0]" + ) +} + +#[test] +fn gsub_context2_simple_1() { + assert_eq!( + shape_aot("fonts/aots/gsub_context2_simple_f1.otf", 0, &[], "\u{0}\u{14}\u{0}\u{14}\u{15}\u{0}"), + "[0|20|0|20|21|0]" + ) +} + +#[test] +fn gsub_context2_simple_2() { + assert_eq!( + shape_aot("fonts/aots/gsub_context2_simple_f2.otf", 0, &[], "\u{0}\u{14}\u{14}\u{14}\u{14}\u{14}\u{0}"), + "[0|20|60|20|20|20|0]" + ) +} + +#[test] +fn gsub_context2_successive_0() { + assert_eq!( + shape_aot("fonts/aots/gsub_context2_successive_f1.otf", 0, &[], "\u{0}\u{14}\u{15}\u{16}\u{17}\u{0}"), + "[0|20|61|63|0]" + ) +} + +#[test] +fn gsub_context3_boundary_0() { + assert_eq!( + shape_aot("fonts/aots/gsub_context3_boundary_f1.otf", 0, &[], "\u{0}\u{14}\u{14}\u{14}\u{14}\u{14}\u{0}"), + "[0|20|20|20|20|20|0]" + ) +} + +#[test] +fn gsub_context3_boundary_1() { + assert_eq!( + shape_aot("fonts/aots/gsub_context3_boundary_f2.otf", 0, &[], "\u{0}\u{14}\u{14}\u{14}\u{14}\u{14}\u{0}"), + "[0|60|60|60|60|60|0]" + ) +} + +#[test] +fn gsub_context3_lookupflag_0() { + assert_eq!( + shape_aot("fonts/aots/gsub_context3_lookupflag_f1.otf", 0, &[], "\u{0}\u{14}Z\u{15}[\\\u{16}\u{0}"), + "[0|60|90|61|91|92|62|0]" + ) +} + +#[test] +fn gsub_context3_lookupflag_1() { + assert_eq!( + shape_aot("fonts/aots/gsub_context3_lookupflag_f2.otf", 0, &[], "\u{0}\u{14}Z\u{15}[\\\u{16}\u{0}"), + "[0|20|90|61|91|92|0]" + ) +} + +#[test] +fn gsub_context3_next_glyph_0() { + assert_eq!( + shape_aot("fonts/aots/gsub_context3_next_glyph_f1.otf", 0, &[], "\u{0}\u{14}\u{14}\u{14}\u{14}\u{14}\u{0}"), + "[0|60|20|60|20|20|0]" + ) +} + +#[test] +fn gsub_context3_simple_0() { + assert_eq!( + shape_aot("fonts/aots/gsub_context3_simple_f1.otf", 0, &[], "\u{0}\u{14}\u{15}\u{16}\u{0}"), + "[0|60|61|62|0]" + ) +} + +#[test] +fn gsub_context3_simple_1() { + assert_eq!( + shape_aot("fonts/aots/gsub_context3_simple_f1.otf", 0, &[], "\u{0}\u{14}\u{0}\u{14}\u{15}\u{0}\u{14}\u{15}\u{16}\u{0}"), + "[0|20|0|20|21|0|60|61|62|0]" + ) +} + +#[test] +fn gsub_context3_successive_0() { + assert_eq!( + shape_aot("fonts/aots/gsub_context3_successive_f1.otf", 0, &[], "\u{0}\u{14}\u{15}\u{16}\u{17}\u{0}"), + "[0|20|61|63|0]" + ) +} + +#[test] +fn lookupflag_ignore_base_0() { + assert_eq!( + shape_aot("fonts/aots/lookupflag_ignore_base_f1.otf", 0, &[], "\u{11}\u{12}\u{13}\u{14}\u{15}"), + "[17|23|21]" + ) +} + +#[test] +fn lookupflag_ignore_base_1() { + assert_eq!( + shape_aot("fonts/aots/lookupflag_ignore_base_f1.otf", 0, &[], "\u{11}\u{12}\u{18}\u{18}\u{13}\u{19}\u{14}\u{15}"), + "[17|23|24|24|25|21]" + ) +} + +#[test] +fn lookupflag_ignore_combination_0() { + assert_eq!( + shape_aot("fonts/aots/lookupflag_ignore_combination_f1.otf", 0, &[], "\u{11}\u{12}\u{1a}\u{13}\u{14}\u{15}"), + "[17|23|26|21]" + ) +} + +#[test] +fn lookupflag_ignore_combination_1() { + assert_eq!( + shape_aot("fonts/aots/lookupflag_ignore_combination_f1.otf", 0, &[], "\u{11}\u{12}\u{1a}\u{13}\u{18}\u{1e}\u{1f}\u{14}\u{15}"), + "[17|23|26|24|30|31|21]" + ) +} + +#[test] +fn lookupflag_ignore_combination_2() { + assert_eq!( + shape_aot("fonts/aots/lookupflag_ignore_combination_f1.otf", 0, &[], "\u{11}\u{12}\u{1a}\u{13}\u{18}\u{1e} \u{14}\u{15}"), + "[17|18|26|19|24|30|32|20|21]" + ) +} + +#[test] +fn lookupflag_ignore_ligatures_0() { + assert_eq!( + shape_aot("fonts/aots/lookupflag_ignore_ligatures_f1.otf", 0, &[], "\u{11}\u{12}\u{1a}\u{1b}\u{13}\u{1b}\u{14}\u{15}"), + "[17|23|26|27|27|21]" + ) +} + +#[test] +fn lookupflag_ignore_ligatures_1() { + assert_eq!( + shape_aot("fonts/aots/lookupflag_ignore_ligatures_f1.otf", 0, &[], "\u{11}\u{12}\u{1a}\u{18}\u{13}\u{1b}\u{14}\u{15}"), + "[17|18|26|24|19|27|20|21]" + ) +} + +#[test] +fn lookupflag_ignore_ligatures_2() { + assert_eq!( + shape_aot("fonts/aots/lookupflag_ignore_ligatures_f1.otf", 0, &[], "\u{11}\u{12}\u{1a}*\u{13}\u{1b}\u{14}\u{15}"), + "[17|18|26|42|19|27|20|21]" + ) +} + +#[test] +fn lookupflag_ignore_marks_0() { + assert_eq!( + shape_aot("fonts/aots/lookupflag_ignore_marks_f1.otf", 0, &[], "\u{11}\u{12}\u{1c}\u{1d}\u{13}\u{1d}\u{14}\u{15}"), + "[17|23|28|29|29|21]" + ) +} diff --git a/tests/fonts/AdobeVFPrototype-Subset.otf b/tests/fonts/AdobeVFPrototype-Subset.otf new file mode 100644 index 0000000..5cc7279 Binary files /dev/null and b/tests/fonts/AdobeVFPrototype-Subset.otf differ diff --git a/tests/fonts/FDArrayTest257.otf b/tests/fonts/FDArrayTest257.otf new file mode 100644 index 0000000..a97b1f4 Binary files /dev/null and b/tests/fonts/FDArrayTest257.otf differ diff --git a/tests/fonts/FDArrayTest65535.otf b/tests/fonts/FDArrayTest65535.otf new file mode 100644 index 0000000..835beb2 Binary files /dev/null and b/tests/fonts/FDArrayTest65535.otf differ diff --git a/tests/fonts/NotoSansBalinese-Regular.ttf b/tests/fonts/NotoSansBalinese-Regular.ttf new file mode 100644 index 0000000..0b0f58f Binary files /dev/null and b/tests/fonts/NotoSansBalinese-Regular.ttf differ diff --git a/tests/fonts/NotoSansKannada-Regular.ttf b/tests/fonts/NotoSansKannada-Regular.ttf new file mode 100644 index 0000000..7366f37 Binary files /dev/null and b/tests/fonts/NotoSansKannada-Regular.ttf differ diff --git a/tests/fonts/NotoSerifKannada-Regular.ttf b/tests/fonts/NotoSerifKannada-Regular.ttf new file mode 100644 index 0000000..30ca550 Binary files /dev/null and b/tests/fonts/NotoSerifKannada-Regular.ttf differ diff --git a/tests/fonts/Selawik-README.md b/tests/fonts/Selawik-README.md new file mode 100644 index 0000000..9c5a80f --- /dev/null +++ b/tests/fonts/Selawik-README.md @@ -0,0 +1,60 @@ +# Overview +This version of Selawik is a test case and demonstration of OpenType 1.8 Font Variations technology and tables. It also includes some handy debugging characters. + +This version of Selawik is intended for testing only, and is not recommended for shipping in applications, etc. For that, it is better to use the main branch of [Selawik](https://github.com/Microsoft/Selawik). + +# Features + +* Full TrueType hinting with VTT source tables included. See [Hinting](#hinting) for details. +* All tables required for OpenType 1.8 are present (see [Table Status](#table-status), below). This includes cvar (varied CVTs), GPOS/GDEF (kerning varies), and avar (coordinate space warping to match Segoe UI). + + Note: This version of Selawik does not include an MVAR because its vertical metrics do not change anywhere in the design space, thus there is no need for MVAR. A future release will contain an axis that varies vertical metrics as an excuse to have an MVAR. + +* Numerous interesting debugging glyphs (requires liga to be enabled). For example, \axis1 will show the current normalized wght coordinate. See [Debugging Glyphs](#debugging-glyphs) for details. +* 1 axis: weight + +## Table status +The following tables are currently supported: + +- [x] fvar +- [x] gvar +- [x] cvar +- [x] avar (to match Segoe UI weights and metrics) +- [x] STAT +- [x] GPOS/GDEF - kerning +- [x] HVAR + +Not yet complete: + +- [ ] GSUB/GDEF - to change dollar signs in the bold +- [ ] MVAR (future release) + +## To do +* Add a second axis that varies vertical metrics so we need an MVAR table. This axis will not be one of the standard axes listed in the [OpenType 1.8 specification] (https://www.microsoft.com/typography/otspec/fvar.htm), so that it becomes an example of out to do a foundry-defined axis. +* Add Feature Variations (GPOS/GDEF) to switch dollar sign glyphs across weights. + + +# Debugging glyphs +Thanks to Greg Hitchcock's TrueType coding wizardry, this font includes many glyphs that are helpful for debugging implementations of variable fonts. It has a number of substitutions implemented as liga features: + +Feature | Description +-------- | ---------- +\axis1 | Shows the normalized coordinate on the wght axis for the currently selected instance (e.g. 1.0 for bold, -1.0 for light, or something in between). +\axis2 | Shows 0 because this font doesn't yet have a second axis. +\axis1hex | Same as \axis1 but in hex. +\axis2hex | Same as \axis2 but in hex. +\pointsize | Shows the point size passed to the TrueType rasterizer. Note that depending on how the application calls the rasterizer, this may not be what you expect - e.g. on Safari on MacOS, this is always 1024. +\ppem | Shows the pixels per em passed to the TrueType rastersize. Note that depending on how the application calls the rasterizer, this may not be what you expect - e.g. on Safari on MacOS, this is always 1024. +\ttversion | Shows the version of the TrueType rasterizer. +\ttmode | Shows the current TrueType rasterizer mode flags. +\boldtest | A glyph to help you detect artificial emboldening. The glyph has a vertical bar and a circle. The vertical bar's weight varies with the weight of the rest of the font: it gets bolder at bolder weights, lighter at lighter weights. The circle changes weight (and size) in opposition to the rest of the font: lighter at bold weights and vice versa. Thus, if you use this character and see both the circle and bar look bold, you're not looking at a true bold instance, but an algorithmically emboldened one. +\family | Shows the family name of the font. +\version | Shows the version of this font + + + + +# Hinting +This version of Selawik is primarily hinted with the light Latin hinting style Microsoft recommends for variable Latin fonts. The VTT Light Latin autohinter was used to create the first round of hints, which were then reviewed and touched up. + +This hinting style only uses CVTs for vertical metrics anchors (ascender, descender, cap height, x-height, and baseline). While this makes for an easy job hinting a Latin font, it makes for a poor test case because Selawik doesn't vary vertical metrics with weight, thus doesn't vary CVTs, thus doesn't need a cvar. So, to make it more interesting, we added CVT-based stem hints to the lowercase only. This provided the need to vary CVTs and thus require a cvar. Note that this was only done for testing purposes. For variable fonts, Microsoft recommends the light hinting style using the `ResYDist()` command instead of a CVT-based stem hint. diff --git a/tests/fonts/Selawik-variable.ttf b/tests/fonts/Selawik-variable.ttf new file mode 100644 index 0000000..ff347e0 Binary files /dev/null and b/tests/fonts/Selawik-variable.ttf differ diff --git a/tests/fonts/TestAVAR.ttf b/tests/fonts/TestAVAR.ttf new file mode 100644 index 0000000..4a16594 Binary files /dev/null and b/tests/fonts/TestAVAR.ttf differ diff --git a/tests/fonts/TestCMAP14.otf b/tests/fonts/TestCMAP14.otf new file mode 100644 index 0000000..94b5ba9 Binary files /dev/null and b/tests/fonts/TestCMAP14.otf differ diff --git a/tests/fonts/TestCMAPMacTurkish.ttf b/tests/fonts/TestCMAPMacTurkish.ttf new file mode 100644 index 0000000..4f89b09 Binary files /dev/null and b/tests/fonts/TestCMAPMacTurkish.ttf differ diff --git a/tests/fonts/TestCVARGVAROne.ttf b/tests/fonts/TestCVARGVAROne.ttf new file mode 100644 index 0000000..84cd1ea Binary files /dev/null and b/tests/fonts/TestCVARGVAROne.ttf differ diff --git a/tests/fonts/TestCVARGVARTwo.ttf b/tests/fonts/TestCVARGVARTwo.ttf new file mode 100644 index 0000000..f20918a Binary files /dev/null and b/tests/fonts/TestCVARGVARTwo.ttf differ diff --git a/tests/fonts/TestGLYFOne.ttf b/tests/fonts/TestGLYFOne.ttf new file mode 100644 index 0000000..8f634d9 Binary files /dev/null and b/tests/fonts/TestGLYFOne.ttf differ diff --git a/tests/fonts/TestGPOSFour.ttf b/tests/fonts/TestGPOSFour.ttf new file mode 100644 index 0000000..bd929b5 Binary files /dev/null and b/tests/fonts/TestGPOSFour.ttf differ diff --git a/tests/fonts/TestGPOSOne.ttf b/tests/fonts/TestGPOSOne.ttf new file mode 100644 index 0000000..ea74dd0 Binary files /dev/null and b/tests/fonts/TestGPOSOne.ttf differ diff --git a/tests/fonts/TestGPOSThree.ttf b/tests/fonts/TestGPOSThree.ttf new file mode 100644 index 0000000..1ed3df4 Binary files /dev/null and b/tests/fonts/TestGPOSThree.ttf differ diff --git a/tests/fonts/TestGPOSTwo.otf b/tests/fonts/TestGPOSTwo.otf new file mode 100644 index 0000000..55cceb7 Binary files /dev/null and b/tests/fonts/TestGPOSTwo.otf differ diff --git a/tests/fonts/TestGSUBOne.otf b/tests/fonts/TestGSUBOne.otf new file mode 100644 index 0000000..9be638f Binary files /dev/null and b/tests/fonts/TestGSUBOne.otf differ diff --git a/tests/fonts/TestGSUBThree.ttf b/tests/fonts/TestGSUBThree.ttf new file mode 100644 index 0000000..ec27e03 Binary files /dev/null and b/tests/fonts/TestGSUBThree.ttf differ diff --git a/tests/fonts/TestGVAR-Composite-0.ttf b/tests/fonts/TestGVAR-Composite-0.ttf new file mode 100644 index 0000000..07e6882 Binary files /dev/null and b/tests/fonts/TestGVAR-Composite-0.ttf differ diff --git a/tests/fonts/TestGVAR-Composite-Missing.ttf b/tests/fonts/TestGVAR-Composite-Missing.ttf new file mode 100644 index 0000000..58dd961 Binary files /dev/null and b/tests/fonts/TestGVAR-Composite-Missing.ttf differ diff --git a/tests/fonts/TestGVAREight.ttf b/tests/fonts/TestGVAREight.ttf new file mode 100644 index 0000000..271dc4b Binary files /dev/null and b/tests/fonts/TestGVAREight.ttf differ diff --git a/tests/fonts/TestGVARFour.ttf b/tests/fonts/TestGVARFour.ttf new file mode 100644 index 0000000..3524f37 Binary files /dev/null and b/tests/fonts/TestGVARFour.ttf differ diff --git a/tests/fonts/TestGVARNine.ttf b/tests/fonts/TestGVARNine.ttf new file mode 100644 index 0000000..3dddf69 Binary files /dev/null and b/tests/fonts/TestGVARNine.ttf differ diff --git a/tests/fonts/TestGVAROne.ttf b/tests/fonts/TestGVAROne.ttf new file mode 100644 index 0000000..e155d8f Binary files /dev/null and b/tests/fonts/TestGVAROne.ttf differ diff --git a/tests/fonts/TestGVARThree.ttf b/tests/fonts/TestGVARThree.ttf new file mode 100644 index 0000000..ac2d7eb Binary files /dev/null and b/tests/fonts/TestGVARThree.ttf differ diff --git a/tests/fonts/TestGVARTwo.ttf b/tests/fonts/TestGVARTwo.ttf new file mode 100644 index 0000000..bd144c6 Binary files /dev/null and b/tests/fonts/TestGVARTwo.ttf differ diff --git a/tests/fonts/TestHVAROne.otf b/tests/fonts/TestHVAROne.otf new file mode 100644 index 0000000..07a3c54 Binary files /dev/null and b/tests/fonts/TestHVAROne.otf differ diff --git a/tests/fonts/TestHVARTwo.ttf b/tests/fonts/TestHVARTwo.ttf new file mode 100644 index 0000000..2e81f94 Binary files /dev/null and b/tests/fonts/TestHVARTwo.ttf differ diff --git a/tests/fonts/TestKERNOne.otf b/tests/fonts/TestKERNOne.otf new file mode 100644 index 0000000..d3f7c0c Binary files /dev/null and b/tests/fonts/TestKERNOne.otf differ diff --git a/tests/fonts/TestMORXEight.ttf b/tests/fonts/TestMORXEight.ttf new file mode 100644 index 0000000..a53de2e Binary files /dev/null and b/tests/fonts/TestMORXEight.ttf differ diff --git a/tests/fonts/TestMORXEighteen.ttf b/tests/fonts/TestMORXEighteen.ttf new file mode 100644 index 0000000..c6e6343 Binary files /dev/null and b/tests/fonts/TestMORXEighteen.ttf differ diff --git a/tests/fonts/TestMORXEleven.ttf b/tests/fonts/TestMORXEleven.ttf new file mode 100644 index 0000000..b7e0f45 Binary files /dev/null and b/tests/fonts/TestMORXEleven.ttf differ diff --git a/tests/fonts/TestMORXForty.ttf b/tests/fonts/TestMORXForty.ttf new file mode 100644 index 0000000..1d348dd Binary files /dev/null and b/tests/fonts/TestMORXForty.ttf differ diff --git a/tests/fonts/TestMORXFour.ttf b/tests/fonts/TestMORXFour.ttf new file mode 100644 index 0000000..07512ab Binary files /dev/null and b/tests/fonts/TestMORXFour.ttf differ diff --git a/tests/fonts/TestMORXFourteen.ttf b/tests/fonts/TestMORXFourteen.ttf new file mode 100644 index 0000000..fb96112 Binary files /dev/null and b/tests/fonts/TestMORXFourteen.ttf differ diff --git a/tests/fonts/TestMORXFourtyone.ttf b/tests/fonts/TestMORXFourtyone.ttf new file mode 100644 index 0000000..be18c75 Binary files /dev/null and b/tests/fonts/TestMORXFourtyone.ttf differ diff --git a/tests/fonts/TestMORXNine.ttf b/tests/fonts/TestMORXNine.ttf new file mode 100644 index 0000000..edbf4b1 Binary files /dev/null and b/tests/fonts/TestMORXNine.ttf differ diff --git a/tests/fonts/TestMORXOne.ttf b/tests/fonts/TestMORXOne.ttf new file mode 100644 index 0000000..53d6466 Binary files /dev/null and b/tests/fonts/TestMORXOne.ttf differ diff --git a/tests/fonts/TestMORXSeventeen.ttf b/tests/fonts/TestMORXSeventeen.ttf new file mode 100644 index 0000000..4fe4fc2 Binary files /dev/null and b/tests/fonts/TestMORXSeventeen.ttf differ diff --git a/tests/fonts/TestMORXSixteen.ttf b/tests/fonts/TestMORXSixteen.ttf new file mode 100644 index 0000000..7cbc0eb Binary files /dev/null and b/tests/fonts/TestMORXSixteen.ttf differ diff --git a/tests/fonts/TestMORXTen.ttf b/tests/fonts/TestMORXTen.ttf new file mode 100644 index 0000000..1d43897 Binary files /dev/null and b/tests/fonts/TestMORXTen.ttf differ diff --git a/tests/fonts/TestMORXThirteen.ttf b/tests/fonts/TestMORXThirteen.ttf new file mode 100644 index 0000000..48f81d1 Binary files /dev/null and b/tests/fonts/TestMORXThirteen.ttf differ diff --git a/tests/fonts/TestMORXThirtyeight.ttf b/tests/fonts/TestMORXThirtyeight.ttf new file mode 100644 index 0000000..0968544 Binary files /dev/null and b/tests/fonts/TestMORXThirtyeight.ttf differ diff --git a/tests/fonts/TestMORXThirtyfive.ttf b/tests/fonts/TestMORXThirtyfive.ttf new file mode 100644 index 0000000..88d67ef Binary files /dev/null and b/tests/fonts/TestMORXThirtyfive.ttf differ diff --git a/tests/fonts/TestMORXThirtyfour.ttf b/tests/fonts/TestMORXThirtyfour.ttf new file mode 100644 index 0000000..94d064f Binary files /dev/null and b/tests/fonts/TestMORXThirtyfour.ttf differ diff --git a/tests/fonts/TestMORXThirtynine.ttf b/tests/fonts/TestMORXThirtynine.ttf new file mode 100644 index 0000000..189061a Binary files /dev/null and b/tests/fonts/TestMORXThirtynine.ttf differ diff --git a/tests/fonts/TestMORXThirtyone.ttf b/tests/fonts/TestMORXThirtyone.ttf new file mode 100644 index 0000000..39455ea Binary files /dev/null and b/tests/fonts/TestMORXThirtyone.ttf differ diff --git a/tests/fonts/TestMORXThirtyseven.ttf b/tests/fonts/TestMORXThirtyseven.ttf new file mode 100644 index 0000000..9bdea11 Binary files /dev/null and b/tests/fonts/TestMORXThirtyseven.ttf differ diff --git a/tests/fonts/TestMORXThirtysix.ttf b/tests/fonts/TestMORXThirtysix.ttf new file mode 100644 index 0000000..28a522e Binary files /dev/null and b/tests/fonts/TestMORXThirtysix.ttf differ diff --git a/tests/fonts/TestMORXThirtythree.ttf b/tests/fonts/TestMORXThirtythree.ttf new file mode 100644 index 0000000..af887d9 Binary files /dev/null and b/tests/fonts/TestMORXThirtythree.ttf differ diff --git a/tests/fonts/TestMORXThirtytwo.ttf b/tests/fonts/TestMORXThirtytwo.ttf new file mode 100644 index 0000000..e8314c7 Binary files /dev/null and b/tests/fonts/TestMORXThirtytwo.ttf differ diff --git a/tests/fonts/TestMORXThree.ttf b/tests/fonts/TestMORXThree.ttf new file mode 100644 index 0000000..33cc72b Binary files /dev/null and b/tests/fonts/TestMORXThree.ttf differ diff --git a/tests/fonts/TestMORXTwelve.ttf b/tests/fonts/TestMORXTwelve.ttf new file mode 100644 index 0000000..b660833 Binary files /dev/null and b/tests/fonts/TestMORXTwelve.ttf differ diff --git a/tests/fonts/TestMORXTwenty.ttf b/tests/fonts/TestMORXTwenty.ttf new file mode 100644 index 0000000..9d7d9ec Binary files /dev/null and b/tests/fonts/TestMORXTwenty.ttf differ diff --git a/tests/fonts/TestMORXTwentyeight.ttf b/tests/fonts/TestMORXTwentyeight.ttf new file mode 100644 index 0000000..e02d354 Binary files /dev/null and b/tests/fonts/TestMORXTwentyeight.ttf differ diff --git a/tests/fonts/TestMORXTwentyfive.ttf b/tests/fonts/TestMORXTwentyfive.ttf new file mode 100644 index 0000000..88c0866 Binary files /dev/null and b/tests/fonts/TestMORXTwentyfive.ttf differ diff --git a/tests/fonts/TestMORXTwentyfour.ttf b/tests/fonts/TestMORXTwentyfour.ttf new file mode 100644 index 0000000..3706325 Binary files /dev/null and b/tests/fonts/TestMORXTwentyfour.ttf differ diff --git a/tests/fonts/TestMORXTwentynine.ttf b/tests/fonts/TestMORXTwentynine.ttf new file mode 100644 index 0000000..10368bc Binary files /dev/null and b/tests/fonts/TestMORXTwentynine.ttf differ diff --git a/tests/fonts/TestMORXTwentyone.ttf b/tests/fonts/TestMORXTwentyone.ttf new file mode 100644 index 0000000..e9e8413 Binary files /dev/null and b/tests/fonts/TestMORXTwentyone.ttf differ diff --git a/tests/fonts/TestMORXTwentyseven.ttf b/tests/fonts/TestMORXTwentyseven.ttf new file mode 100644 index 0000000..a459cb3 Binary files /dev/null and b/tests/fonts/TestMORXTwentyseven.ttf differ diff --git a/tests/fonts/TestMORXTwentysix.ttf b/tests/fonts/TestMORXTwentysix.ttf new file mode 100644 index 0000000..040fd87 Binary files /dev/null and b/tests/fonts/TestMORXTwentysix.ttf differ diff --git a/tests/fonts/TestMORXTwentythree.ttf b/tests/fonts/TestMORXTwentythree.ttf new file mode 100644 index 0000000..18a90fd Binary files /dev/null and b/tests/fonts/TestMORXTwentythree.ttf differ diff --git a/tests/fonts/TestMORXTwentytwo.ttf b/tests/fonts/TestMORXTwentytwo.ttf new file mode 100644 index 0000000..f2b6f6c Binary files /dev/null and b/tests/fonts/TestMORXTwentytwo.ttf differ diff --git a/tests/fonts/TestMORXTwo.ttf b/tests/fonts/TestMORXTwo.ttf new file mode 100644 index 0000000..365a635 Binary files /dev/null and b/tests/fonts/TestMORXTwo.ttf differ diff --git a/tests/fonts/TestSFNTOne.otf b/tests/fonts/TestSFNTOne.otf new file mode 100644 index 0000000..974e286 Binary files /dev/null and b/tests/fonts/TestSFNTOne.otf differ diff --git a/tests/fonts/TestSFNTTwo.ttf b/tests/fonts/TestSFNTTwo.ttf new file mode 100644 index 0000000..a1d62cf Binary files /dev/null and b/tests/fonts/TestSFNTTwo.ttf differ diff --git a/tests/fonts/TestSVGgradientTransform.otf b/tests/fonts/TestSVGgradientTransform.otf new file mode 100644 index 0000000..59cfc5a Binary files /dev/null and b/tests/fonts/TestSVGgradientTransform.otf differ diff --git a/tests/fonts/TestSVGgzip.otf b/tests/fonts/TestSVGgzip.otf new file mode 100644 index 0000000..69d976f Binary files /dev/null and b/tests/fonts/TestSVGgzip.otf differ diff --git a/tests/fonts/TestSVGmultiGlyphs.otf b/tests/fonts/TestSVGmultiGlyphs.otf new file mode 100644 index 0000000..50fdc19 Binary files /dev/null and b/tests/fonts/TestSVGmultiGlyphs.otf differ diff --git a/tests/fonts/TestShapeAran.ttf b/tests/fonts/TestShapeAran.ttf new file mode 100644 index 0000000..c73f569 Binary files /dev/null and b/tests/fonts/TestShapeAran.ttf differ diff --git a/tests/fonts/TestShapeEthi.ttf b/tests/fonts/TestShapeEthi.ttf new file mode 100644 index 0000000..391dddd Binary files /dev/null and b/tests/fonts/TestShapeEthi.ttf differ diff --git a/tests/fonts/TestShapeKndaV3.ttf b/tests/fonts/TestShapeKndaV3.ttf new file mode 100644 index 0000000..9f632c3 Binary files /dev/null and b/tests/fonts/TestShapeKndaV3.ttf differ diff --git a/tests/fonts/TestShapeLana.ttf b/tests/fonts/TestShapeLana.ttf new file mode 100644 index 0000000..f7c3f81 Binary files /dev/null and b/tests/fonts/TestShapeLana.ttf differ diff --git a/tests/fonts/TestTRAKOne.ttf b/tests/fonts/TestTRAKOne.ttf new file mode 100644 index 0000000..85f1d97 Binary files /dev/null and b/tests/fonts/TestTRAKOne.ttf differ diff --git a/tests/fonts/Zycon.ttf b/tests/fonts/Zycon.ttf new file mode 100644 index 0000000..3a6761b Binary files /dev/null and b/tests/fonts/Zycon.ttf differ diff --git a/tests/harness.rs b/tests/harness.rs new file mode 100644 index 0000000..7c473a9 --- /dev/null +++ b/tests/harness.rs @@ -0,0 +1,157 @@ +use swash::text::{analyze, Codepoint, Script}; + +pub fn shape(font: &str, font_size: usize, variations: &[(&str, f32)], input: &str) -> String { + // Open the font source file and create a `FontRef` from it. + let file = std::fs::read(font).unwrap(); + let font = swash::FontRef::from_offset(&file, 0).unwrap(); + + // Other supplementary information for the `Shaper`. + let script = input + .chars() + .map(|ch| ch.script()) + .find(|&script| { + script != Script::Unknown && script != Script::Inherited && script != Script::Common + }) + .unwrap_or(Script::Latin); + let needs_resolution = analyze(input.chars()).any(|x| x.0.bidi_class().needs_resolution()); + + // Create the shaper. + let mut shaper_context = swash::shape::ShapeContext::new(); + let builder = shaper_context + .builder(font) + .size(font_size as f32) + .variations(variations) + .script(script); + let mut shaper = builder.build(); + shaper.add_str(input); + + // Iterate over `Shaper` output to create an output that matches what HarfBuzz expects. + // `advance` needs to be top level to be retained through all the clusters. + let mut advance = 0.0; + let mut output = Vec::new(); + shaper.shape_with(|cluster| { + // Iterate over each glyph in the cluster, format them. and push them + // to `output`. + for glyph in cluster.glyphs { + let font_name = font + .glyph_name(glyph.id) + .and_then(|name| Some(name.to_string())) + .unwrap_or(format!("gid{}", glyph.id)); + + // HarfBuzz omits the glyph's position (`@{},{}`) if there is no advance. + if advance == 0.0 { + output.push(font_name); + } else { + output.push(format!( + "{}@{},{}", + font_name, + (glyph.x + advance).round() as i64, + glyph.y.round() as i64, + )); + } + advance += glyph.advance; + } + }); + + // If the text is a right-to-left run, it needs to be reversed. + // NOTE: slightly inaccurate due to glyph vs. cluster tracking on `swash`'s part, + // but it will be fixed before this PR is merged. + if needs_resolution { + output.reverse(); + } + + // Finally format everything to match HarfBuzz, e.g. `[A|B@x,y|C@x,y]`. + format!( + "[{}]", + output + .iter() + .enumerate() + .map(|(idx, glyph)| { + if idx == 0 { + glyph.to_string() + } else { + format!("|{}", glyph) + } + }) + .collect::() + ) +} + +// pub fn shape_aot(font: &str, font_size: usize, variations: &[(&str, f32)], input: &str) -> String { +// let font_size = if font_size == 0 { +// 75 +// } else { +// font_size +// }; +// // Open the font source file and create a `FontRef` from it. +// let file = std::fs::read(font).unwrap(); +// let font = swash::FontRef::from_offset(&file, 0).unwrap(); + +// // Other supplementary information for the `Shaper`. +// let script = input +// .chars() +// .map(|ch| ch.script()) +// .find(|&script| { +// script != Script::Unknown && script != Script::Inherited && script != Script::Common +// }) +// .unwrap_or(Script::Latin); +// let needs_resolution = analyze(input.chars()).any(|x| x.0.bidi_class().needs_resolution()); + +// // Create the shaper. +// let mut shaper_context = swash::shape::ShapeContext::new(); +// let builder = shaper_context +// .builder(font) +// .size(font_size as f32) +// .variations(variations) +// .script(script); +// let mut shaper = builder.build(); +// shaper.add_str(input); + +// // Iterate over `Shaper` output to create an output that matches what HarfBuzz expects. +// // `advance` needs to be top level to be retained through all the clusters. +// let mut advance = 0.0; +// let mut output = Vec::new(); +// shaper.shape_with(|cluster| { +// // Iterate over each glyph in the cluster, format them. and push them +// // to `output`. +// for glyph in cluster.glyphs { +// let font_name = glyph.id.to_string(); + +// // HarfBuzz omits the glyph's position (`@{},{}`) if there is no advance. +// if advance == 0.0 { +// output.push(font_name); +// } else { +// output.push(format!( +// "{}@{},{}", +// font_name, +// (glyph.x + advance).round() as i64, +// glyph.y.round() as i64, +// )); +// } +// advance += glyph.advance; +// } +// }); + +// // If the text is a right-to-left run, it needs to be reversed. +// // NOTE: slightly inaccurate due to glyph vs. cluster tracking on `swash`'s part, +// // but it will be fixed before this PR is merged. +// if needs_resolution { +// output.reverse(); +// } +// panic!(output.len().to_string()); +// // Finally format everything to match HarfBuzz, e.g. `[A|B@x,y|C@x,y]`. +// format!( +// "[{}]", +// output +// .iter() +// .enumerate() +// .map(|(idx, glyph)| { +// if idx == 0 { +// glyph.to_string() +// } else { +// format!("|{}", glyph) +// } +// }) +// .collect::() +// ) +// } diff --git a/tests/shaping_impl.rs b/tests/shaping_impl.rs new file mode 100644 index 0000000..8c75a08 --- /dev/null +++ b/tests/shaping_impl.rs @@ -0,0 +1,100 @@ +use swash::text::{analyze, Codepoint, Script}; + +pub fn shape(font: &str, font_size: usize, variations: &[(&str, f32)], input: &str) -> String { + // Open file, open font, get necessary data for `ShaperBuilder` etc. + let file = std::fs::read(font).unwrap(); + let font = swash::FontRef::from_offset(&file, 0).unwrap(); +<<<<<<< HEAD + let mut context = swash::shape::ShapeContext::new(); +======= + let font_size = if font_size == 0 { + 75 + } else { + font_size + }; + + // Other supplementary information for the `Shaper`. +>>>>>>> d799474 (wip) + let script = input + .chars() + .map(|ch| ch.script()) + .find(|&script| { + script != Script::Unknown && script != Script::Inherited && script != Script::Common + }) + .unwrap_or(Script::Latin); + let builder = context + .builder(font) + .size(font_size as f32) + .variations(variations) + .script(script); + let needs_resolution = analyze(input.chars()).any(|x| x.0.bidi_class().needs_resolution()); + + let mut advance = 0.0; + let mut output = Vec::new(); + let mut shaper = builder.build(); + shaper.add_str(input); + shaper.shape_with(|cluster| { + cluster.glyphs.iter().for_each(|glyph| { + // HarfBuzz format doesn't include glyphs with no advance + if advance == 0.0 { + output.push(format!( + "{}", + font.glyph_name(glyph.id) + .map(|x| x.to_string()) + .unwrap_or(format!("gid{}", glyph.id)) + )); + } else { + output.push(format!( + "{}@{},{}", + font.glyph_name(glyph.id) + .map(|x| x.to_string()) + .unwrap_or(format!("gid{}", glyph.id)), + (glyph.x + advance).round() as i64, + glyph.y.round() as i64, + )); + } + advance += glyph.advance; + }); + }); + + // Check if runs need to be reversed. + if needs_resolution { + output.reverse(); + } + +<<<<<<< HEAD + // Format the returned glyphs to match the HarfBuzz format. + let collected: String = output + .iter() + .enumerate() + .map(|(idx, i)| { + if idx == 0 { + i.to_owned() + } else { + format!("|{}", i) + } + }) + .collect(); + format!("[{}]", collected) +======= + // Finally format everything to match HarfBuzz, e.g. `[A|B@x,y|C@x,y]`. + if output.len() == 1 && output.first().unwrap() == "*" { + output.first().unwrap().to_string() + } else { + format!( + "[{}]", + output + .iter() + .enumerate() + .map(|(idx, glyph)| { + if idx == 0 { + glyph.to_string() + } else { + format!("|{}", glyph) + } + }) + .collect::() + ) + } +>>>>>>> d799474 (wip) +} diff --git a/tests/text-rendering-tests.rs b/tests/text-rendering-tests.rs new file mode 100644 index 0000000..8cdbfd5 --- /dev/null +++ b/tests/text-rendering-tests.rs @@ -0,0 +1,4094 @@ +mod shaping_impl; +use shaping_impl::shape; + +#[test] +fn avar_1_0() { + assert_eq!( + shape("fonts/TestAVAR.ttf", 1000, &[("TEST", 100.0)], "⨁"), + "[gid1]" + ) +} + +#[test] +fn avar_1_1() { + assert_eq!( + shape("fonts/TestAVAR.ttf", 1000, &[("TEST", 150.0)], "⨁"), + "[gid1]" + ) +} + +#[test] +fn avar_1_2() { + assert_eq!( + shape("fonts/TestAVAR.ttf", 1000, &[("TEST", 200.0)], "⨁"), + "[gid1]" + ) +} + +#[test] +fn avar_1_3() { + assert_eq!( + shape("fonts/TestAVAR.ttf", 1000, &[("TEST", 250.0)], "⨁"), + "[gid1]" + ) +} + +#[test] +fn avar_1_4() { + assert_eq!( + shape("fonts/TestAVAR.ttf", 1000, &[("TEST", 300.0)], "⨁"), + "[gid1]" + ) +} + +#[test] +fn avar_1_5() { + assert_eq!( + shape("fonts/TestAVAR.ttf", 1000, &[("TEST", 350.0)], "⨁"), + "[gid1]" + ) +} + +#[test] +fn avar_1_6() { + assert_eq!( + shape("fonts/TestAVAR.ttf", 1000, &[("TEST", 400.0)], "⨁"), + "[gid1]" + ) +} + +#[test] +fn avar_1_7() { + assert_eq!( + shape("fonts/TestAVAR.ttf", 1000, &[("TEST", 450.0)], "⨁"), + "[gid1]" + ) +} + +#[test] +fn avar_1_8() { + assert_eq!( + shape("fonts/TestAVAR.ttf", 1000, &[("TEST", 500.0)], "⨁"), + "[gid1]" + ) +} + +#[test] +fn avar_1_9() { + assert_eq!( + shape("fonts/TestAVAR.ttf", 1000, &[("TEST", 550.0)], "⨁"), + "[gid1]" + ) +} + +#[test] +fn avar_1_10() { + assert_eq!( + shape("fonts/TestAVAR.ttf", 1000, &[("TEST", 600.0)], "⨁"), + "[gid1]" + ) +} + +#[test] +fn avar_1_11() { + assert_eq!( + shape("fonts/TestAVAR.ttf", 1000, &[("TEST", 650.0)], "⨁"), + "[gid1]" + ) +} + +#[test] +fn avar_1_12() { + assert_eq!( + shape("fonts/TestAVAR.ttf", 1000, &[("TEST", 700.0)], "⨁"), + "[gid1]" + ) +} + +#[test] +fn avar_1_13() { + assert_eq!( + shape("fonts/TestAVAR.ttf", 1000, &[("TEST", 750.0)], "⨁"), + "[gid1]" + ) +} + +#[test] +fn avar_1_14() { + assert_eq!( + shape("fonts/TestAVAR.ttf", 1000, &[("TEST", 800.0)], "⨁"), + "[gid1]" + ) +} + +#[test] +fn avar_1_15() { + assert_eq!( + shape("fonts/TestAVAR.ttf", 1000, &[("TEST", 850.0)], "⨁"), + "[gid1]" + ) +} + +#[test] +fn avar_1_16() { + assert_eq!( + shape("fonts/TestAVAR.ttf", 1000, &[("TEST", 900.0)], "⨁"), + "[gid1]" + ) +} + +#[test] +fn cff_1_0() { + assert_eq!(shape("fonts/FDArrayTest257.otf", 1000, &[], "A"), "[gid66]") +} + +#[test] +fn cff_1_1() { + assert_eq!(shape("fonts/FDArrayTest257.otf", 1000, &[], "ℝ"), "[gid30]") +} + +#[test] +fn cff_1_2() { + assert_eq!( + shape("fonts/FDArrayTest257.otf", 1000, &[], "⓪"), + "[gid235]" + ) +} + +#[test] +fn cff_1_3() { + assert_eq!(shape("fonts/FDArrayTest257.otf", 1000, &[], "①"), "[gid97]") +} + +#[test] +fn cff_1_4() { + assert_eq!(shape("fonts/FDArrayTest257.otf", 1000, &[], "②"), "[gid98]") +} + +#[test] +fn cff_1_5() { + assert_eq!( + shape("fonts/FDArrayTest257.otf", 1000, &[], "仿"), + "[gid256]" + ) +} + +#[test] +fn cff_1_6() { + assert_eq!( + shape("fonts/FDArrayTest257.otf", 1000, &[], "A"), + "[gid34]" + ) +} + +#[test] +fn cff_1_7() { + assert_eq!(shape("fonts/FDArrayTest257.otf", 1000, &[], "𐄳"), "[gid52]") +} + +#[test] +fn cff_1_8() { + assert_eq!( + shape("fonts/FDArrayTest257.otf", 1000, &[], "𝓐"), + "[gid209]" + ) +} + +#[test] +fn cff_1_9() { + assert_eq!( + shape("fonts/FDArrayTest257.otf", 1000, &[], "🌺"), + "[gid59]" + ) +} + +#[test] +fn cff_1_10() { + assert_eq!( + shape("fonts/FDArrayTest257.otf", 1000, &[], "🌻"), + "[gid60]" + ) +} + +#[test] +fn cff_1_11() { + assert_eq!( + shape("fonts/FDArrayTest257.otf", 1000, &[], "💧"), + "[gid168]" + ) +} + +#[test] +fn cff_1_12() { + assert_eq!( + shape("fonts/FDArrayTest257.otf", 1000, &[], "🥝"), + "[gid94]" + ) +} + +#[test] +fn cff_2_0() { + assert_eq!( + shape("fonts/FDArrayTest65535.otf", 1000, &[], "A"), + "[gid66]" + ) +} + +#[test] +fn cff_2_1() { + assert_eq!( + shape("fonts/FDArrayTest65535.otf", 1000, &[], "ℝ"), + "[gid8478]" + ) +} + +#[test] +fn cff_2_2() { + assert_eq!( + shape("fonts/FDArrayTest65535.otf", 1000, &[], "⓪"), + "[gid9451]" + ) +} + +#[test] +fn cff_2_3() { + assert_eq!( + shape("fonts/FDArrayTest65535.otf", 1000, &[], "①"), + "[gid9313]" + ) +} + +#[test] +fn cff_2_4() { + assert_eq!( + shape("fonts/FDArrayTest65535.otf", 1000, &[], "②"), + "[gid9314]" + ) +} + +#[test] +fn cff_2_5() { + assert_eq!( + shape("fonts/FDArrayTest65535.otf", 1000, &[], "仿"), + "[gid20224]" + ) +} + +#[test] +fn cff_2_6() { + assert_eq!( + shape("fonts/FDArrayTest65535.otf", 1000, &[], "A"), + "[gid65314]" + ) +} + +#[test] +fn cff_2_7() { + assert_eq!( + shape("fonts/FDArrayTest65535.otf", 1000, &[], "𐄳"), + "[gid308]" + ) +} + +#[test] +fn cff_2_8() { + assert_eq!( + shape("fonts/FDArrayTest65535.otf", 1000, &[], "𝓐"), + "[gid54481]" + ) +} + +#[test] +fn cff_2_9() { + assert_eq!( + shape("fonts/FDArrayTest65535.otf", 1000, &[], "🌺"), + "[gid62267]" + ) +} + +#[test] +fn cff_2_10() { + assert_eq!( + shape("fonts/FDArrayTest65535.otf", 1000, &[], "🌻"), + "[gid62268]" + ) +} + +#[test] +fn cff_2_11() { + assert_eq!( + shape("fonts/FDArrayTest65535.otf", 1000, &[], "💧"), + "[gid62632]" + ) +} + +#[test] +fn cff_2_12() { + assert_eq!( + shape("fonts/FDArrayTest65535.otf", 1000, &[], "🥝"), + "[gid63838]" + ) +} + +#[test] +fn cff2_1_0() { + assert_eq!( + shape( + "fonts/AdobeVFPrototype-Subset.otf", + 1000, + &[("wght", 100.0)], + "$" + ), + "[dollar]" + ) +} + +#[test] +fn cff2_1_1() { + assert_eq!( + shape( + "fonts/AdobeVFPrototype-Subset.otf", + 1000, + &[("wght", 200.0)], + "$" + ), + "[dollar]" + ) +} + +#[test] +fn cff2_1_2() { + assert_eq!( + shape( + "fonts/AdobeVFPrototype-Subset.otf", + 1000, + &[("wght", 300.0)], + "$" + ), + "[dollar]" + ) +} + +#[test] +fn cff2_1_3() { + assert_eq!( + shape( + "fonts/AdobeVFPrototype-Subset.otf", + 1000, + &[("wght", 400.0)], + "$" + ), + "[dollar]" + ) +} + +#[test] +fn cff2_1_4() { + assert_eq!( + shape( + "fonts/AdobeVFPrototype-Subset.otf", + 1000, + &[("wght", 500.0)], + "$" + ), + "[dollar]" + ) +} + +#[test] +fn cff2_1_5() { + assert_eq!( + shape( + "fonts/AdobeVFPrototype-Subset.otf", + 1000, + &[("wght", 600.0)], + "$" + ), + "[dollar]" + ) +} + +#[test] +fn cff2_1_6() { + assert_eq!( + shape( + "fonts/AdobeVFPrototype-Subset.otf", + 1000, + &[("wght", 700.0)], + "$" + ), + "[dollar]" + ) +} + +#[test] +fn cff2_1_7() { + assert_eq!( + shape( + "fonts/AdobeVFPrototype-Subset.otf", + 1000, + &[("wght", 800.0)], + "$" + ), + "[dollar.nostroke]" + ) +} + +#[test] +fn cff2_1_8() { + assert_eq!( + shape( + "fonts/AdobeVFPrototype-Subset.otf", + 1000, + &[("wght", 900.0)], + "$" + ), + "[dollar.nostroke]" + ) +} + +#[test] +fn cvar_1_0() { + assert_eq!( + shape( + "fonts/TestCVARGVARTwo.ttf", + 1000, + &[("wght", 28.0), ("wdth", 100.0), ("opsz", 72.0)], + "hon" + ), + "[uni0068|uni006F@595,0|uni006E@1126,0]" + ) +} + +#[test] +fn cvar_1_1() { + assert_eq!( + shape( + "fonts/TestCVARGVARTwo.ttf", + 1000, + &[("wght", 94.0), ("wdth", 100.0), ("opsz", 72.0)], + "hon" + ), + "[uni0068|uni006F@635,0|uni006E@1212,0]" + ) +} + +#[test] +fn cvar_1_2() { + assert_eq!( + shape( + "fonts/TestCVARGVARTwo.ttf", + 1000, + &[("wght", 194.0), ("wdth", 100.0), ("opsz", 72.0)], + "hon" + ), + "[uni0068|uni006F@691,0|uni006E@1331,0]" + ) +} + +#[test] +fn cvar_2_0() { + assert_eq!( + shape( + "fonts/TestCVARGVAROne.ttf", + 1000, + &[("wght", 28.0), ("wdth", 100.0), ("opsz", 72.0)], + "hon" + ), + "[uni0068|uni006F@595,0|uni006E@1126,0]" + ) +} + +#[test] +fn cvar_2_1() { + assert_eq!( + shape( + "fonts/TestCVARGVAROne.ttf", + 1000, + &[("wght", 94.0), ("wdth", 100.0), ("opsz", 72.0)], + "hon" + ), + "[uni0068|uni006F@635,0|uni006E@1212,0]" + ) +} + +#[test] +fn cvar_2_2() { + assert_eq!( + shape( + "fonts/TestCVARGVAROne.ttf", + 1000, + &[("wght", 194.0), ("wdth", 100.0), ("opsz", 72.0)], + "hon" + ), + "[uni0068|uni006F@691,0|uni006E@1331,0]" + ) +} + +#[test] +fn glyf_1_0() { + assert_eq!( + shape("fonts/TestGLYFOne.ttf", 1000, &[], "ģ"), + "[gcommaabove]" + ) +} + +#[test] +fn gpos_1_0() { + assert_eq!( + shape("fonts/TestGPOSOne.ttf", 1000, &[], "ĄJ"), + "[Aogonek|J@732,0]" + ) +} + +#[test] +fn gpos_1_1() { + assert_eq!( + shape("fonts/TestGPOSOne.ttf", 1000, &[], "Ąg"), + "[Aogonek|g@692,0]" + ) +} + +#[test] +fn gpos_1_2() { + assert_eq!( + shape("fonts/TestGPOSOne.ttf", 1000, &[], "Ąģ"), + "[Aogonek|gcommaabove@692,0]" + ) +} + +#[test] +fn gpos_1_3() { + assert_eq!( + shape("fonts/TestGPOSOne.ttf", 1000, &[], "Ąj"), + "[Aogonek|j@752,0]" + ) +} + +#[test] +fn gpos_1_4() { + assert_eq!( + shape("fonts/TestGPOSOne.ttf", 1000, &[], "Ąȷ"), + "[Aogonek|dotlessj@752,0]" + ) +} + +#[test] +fn gpos_1_5() { + assert_eq!( + shape("fonts/TestGPOSOne.ttf", 1000, &[], "Qȷ"), + "[Q|dotlessj@734,0]" + ) +} + +#[test] +fn gpos_1_6() { + assert_eq!( + shape("fonts/TestGPOSOne.ttf", 1000, &[], "ąj"), + "[aogonek|j@588,0]" + ) +} + +#[test] +fn gpos_1_7() { + assert_eq!( + shape("fonts/TestGPOSOne.ttf", 1000, &[], "ąȷ"), + "[aogonek|dotlessj@588,0]" + ) +} + +#[test] +fn gpos_1_8() { + assert_eq!( + shape("fonts/TestGPOSOne.ttf", 1000, &[], "gȷ"), + "[g|dotlessj@563,0]" + ) +} + +#[test] +fn gpos_1_9() { + assert_eq!( + shape("fonts/TestGPOSOne.ttf", 1000, &[], "ģȷ"), + "[gcommaabove|dotlessj@563,0]" + ) +} + +#[test] +fn gpos_1_10() { + assert_eq!( + shape("fonts/TestGPOSOne.ttf", 1000, &[], "ıȷ"), + "[dotlessi|dotlessj@334,0]" + ) +} + +#[test] +fn gpos_1_11() { + assert_eq!( + shape("fonts/TestGPOSOne.ttf", 1000, &[], "ųȷ"), + "[uogonek|dotlessj@656,0]" + ) +} + +#[test] +fn gpos_1_12() { + assert_eq!( + shape("fonts/TestGPOSOne.ttf", 1000, &[], "vȷ"), + "[v|dotlessj@587,0]" + ) +} + +#[test] +fn gpos_1_13() { + assert_eq!( + shape("fonts/TestGPOSOne.ttf", 1000, &[], "Va"), + "[V|a@594,0]" + ) +} + +#[test] +fn gpos_1_14() { + assert_eq!( + shape("fonts/TestGPOSOne.ttf", 1000, &[], "Vá"), + "[V|aacute@594,0]" + ) +} + +#[test] +fn gpos_1_15() { + assert_eq!( + shape("fonts/TestGPOSOne.ttf", 1000, &[], "Vą"), + "[V|aogonek@594,0]" + ) +} + +#[test] +fn gpos_1_16() { + assert_eq!( + shape("fonts/TestGPOSOne.ttf", 1000, &[], "Vf"), + "[V|f@634,0]" + ) +} + +#[test] +fn gpos_1_17() { + assert_eq!( + shape("fonts/TestGPOSOne.ttf", 1000, &[], "Vfl"), + "[V|fl@634,0]" + ) +} + +#[test] +fn gpos_1_18() { + assert_eq!( + shape("fonts/TestGPOSOne.ttf", 1000, &[], "V."), + "[V|period@504,0]" + ) +} + +#[test] +fn gpos_2_0() { + assert_eq!(shape("fonts/TestGPOSTwo.otf", 1000, &[], "◯"), "[uni25EF]") +} + +#[test] +fn gpos_2_1() { + assert_eq!(shape("fonts/TestGPOSTwo.otf", 1000, &[], "☼"), "[sun]") +} + +#[test] +fn gpos_2_2() { + assert_eq!( + shape("fonts/TestGPOSTwo.otf", 1000, &[], "◯☼"), + "[uni25EF|sun]" + ) +} + +#[test] +fn gpos_3_0() { + assert_eq!( + shape("fonts/TestShapeEthi.ttf", 1000, &[], "ለ"), + "[uni1208]" + ) +} + +#[test] +fn gpos_3_1() { + assert_eq!( + shape("fonts/TestShapeEthi.ttf", 1000, &[], "ለ፞"), + "[uni1208|uni135E@303,0]" + ) +} + +#[test] +fn gpos_3_2() { + assert_eq!( + shape("fonts/TestShapeEthi.ttf", 1000, &[], "ለ፟"), + "[uni1208|uni135F@303,0]" + ) +} + +#[test] +fn gpos_3_3() { + assert_eq!( + shape("fonts/TestShapeEthi.ttf", 1000, &[], "ለ፝"), + "[uni1208|uni135D@303,0]" + ) +} + +#[test] +fn gpos_4_0() { + assert_eq!( + shape("fonts/TestGPOSThree.ttf", 1000, &[], "ǘ"), + "[u|uni0308@529,-31|acutecomb@537,138]" + ) +} + +#[test] +fn gpos_4_1() { + assert_eq!( + shape("fonts/TestGPOSThree.ttf", 1000, &[], "ǖ"), + "[u|uni0308@529,-31|uni0304@526,138]" + ) +} + +#[test] +fn gpos_4_2() { + assert_eq!( + shape("fonts/TestGPOSThree.ttf", 1000, &[], "ü̈"), + "[u|uni0308@529,-31|uni0308@529,138]" + ) +} + +#[test] +fn gpos_4_3() { + assert_eq!( + shape("fonts/TestGPOSThree.ttf", 1000, &[], "ü̈̈"), + "[u|uni0308@529,-31|uni0308@529,138|uni0308@529,307]" + ) +} + +#[test] +fn gpos_5_0() { + assert_eq!( + shape("fonts/TestGPOSFour.ttf", 1000, &[("wght", 100.0)], "شْ"), + "[uni0652@663,144|uni0634]" + ) +} + +#[test] +fn gpos_5_1() { + assert_eq!( + shape("fonts/TestGPOSFour.ttf", 1000, &[("wght", 300.0)], "شْ"), + "[uni0652@680,165|uni0634]" + ) +} + +#[test] +fn gpos_5_2() { + assert_eq!( + shape("fonts/TestGPOSFour.ttf", 1000, &[("wght", 600.0)], "شْ"), + "[uni0652@730,246|uni0634]" + ) +} + +#[test] +fn gpos_5_3() { + assert_eq!( + shape("fonts/TestGPOSFour.ttf", 1000, &[("wght", 700.0)], "شْ"), + "[uni0652@750,282|uni0634]" + ) +} + +#[test] +fn gpos_5_4() { + assert_eq!( + shape("fonts/TestGPOSFour.ttf", 1000, &[("wght", 900.0)], "شْ"), + "[uni0652@784,351|uni0634]" + ) +} + +#[test] +fn gsub_1_0() { + assert_eq!( + shape("fonts/TestGSUBOne.otf", 1000, &[], "a a"), + "[a.alt|space@500,0|a@1000,0]" + ) +} + +#[test] +fn gsub_2_0() { + assert_eq!( + shape("fonts/TestShapeEthi.ttf", 1000, &[], "፳"), + "[uni1373]" + ) +} + +#[test] +fn gsub_2_1() { + assert_eq!( + shape("fonts/TestShapeEthi.ttf", 1000, &[], "፫"), + "[uni136B]" + ) +} + +#[test] +fn gsub_2_2() { + assert_eq!( + shape("fonts/TestShapeEthi.ttf", 1000, &[], "፵"), + "[uni1375]" + ) +} + +#[test] +fn gsub_2_3() { + assert_eq!( + shape("fonts/TestShapeEthi.ttf", 1000, &[], "፭"), + "[uni136D]" + ) +} + +#[test] +fn gsub_2_4() { + assert_eq!( + shape("fonts/TestShapeEthi.ttf", 1000, &[], "፳፫"), + "[uni1373.init|uni136B.fina@621,0]" + ) +} + +#[test] +fn gsub_2_5() { + assert_eq!( + shape("fonts/TestShapeEthi.ttf", 1000, &[], "፵፭"), + "[uni1375.init|uni136D.fina@662,0]" + ) +} + +#[test] +fn gsub_2_6() { + assert_eq!( + shape("fonts/TestShapeEthi.ttf", 1000, &[], "፻"), + "[uni137B]" + ) +} + +#[test] +fn gsub_2_7() { + assert_eq!( + shape("fonts/TestShapeEthi.ttf", 1000, &[], "፳፫፻"), + "[uni1373.init|uni136B.medi@621,0|uni137B.fina@1102,0]" + ) +} + +#[test] +fn gsub_2_8() { + assert_eq!( + shape("fonts/TestShapeEthi.ttf", 1000, &[], "፳፫፻፳፫"), + "[uni1373.init|uni136B.medi@621,0|uni137B.medi@1102,0|uni1373.medi@1489,0|uni136B.fina@2110,0]" + ) +} + +#[test] +fn gsub_2_9() { + assert_eq!( + shape("fonts/TestShapeEthi.ttf", 1000, &[], "፳፫፻፵፭"), + "[uni1373.init|uni136B.medi@621,0|uni137B.medi@1102,0|uni1375.medi@1489,0|uni136D.fina@2157,0]" + ) +} + +#[test] +fn gsub_2_10() { + assert_eq!( + shape("fonts/TestShapeEthi.ttf", 1000, &[], "፵፭፻፳፫"), + "[uni1375.init|uni136D.medi@662,0|uni137B.medi@1203,0|uni1373.medi@1590,0|uni136B.fina@2211,0]" + ) +} + +#[test] +fn gsub_3_0() { + assert_eq!(shape("fonts/TestGSUBThree.ttf", 0, &[], "lol"), "*") +} + +#[test] +fn gvar_1_0() { + assert_eq!( + shape("fonts/TestGVAROne.ttf", 1000, &[("wght", 300.0)], "彌"), + "[gid2]" + ) +} + +#[test] +fn gvar_1_1() { + assert_eq!( + shape("fonts/TestGVAROne.ttf", 1000, &[("wght", 350.0)], "彌"), + "[gid2]" + ) +} + +#[test] +fn gvar_1_2() { + assert_eq!( + shape("fonts/TestGVAROne.ttf", 1000, &[("wght", 400.0)], "彌"), + "[gid2]" + ) +} + +#[test] +fn gvar_1_3() { + assert_eq!( + shape("fonts/TestGVAROne.ttf", 1000, &[("wght", 450.0)], "彌"), + "[gid2]" + ) +} + +#[test] +fn gvar_1_4() { + assert_eq!( + shape("fonts/TestGVAROne.ttf", 1000, &[("wght", 500.0)], "彌"), + "[gid2]" + ) +} + +#[test] +fn gvar_1_5() { + assert_eq!( + shape("fonts/TestGVAROne.ttf", 1000, &[("wght", 550.0)], "彌"), + "[gid2]" + ) +} + +#[test] +fn gvar_1_6() { + assert_eq!( + shape("fonts/TestGVAROne.ttf", 1000, &[("wght", 600.0)], "彌"), + "[gid2]" + ) +} + +#[test] +fn gvar_1_7() { + assert_eq!( + shape("fonts/TestGVAROne.ttf", 1000, &[("wght", 650.0)], "彌"), + "[gid2]" + ) +} + +#[test] +fn gvar_1_8() { + assert_eq!( + shape("fonts/TestGVAROne.ttf", 1000, &[("wght", 700.0)], "彌"), + "[gid2]" + ) +} + +#[test] +fn gvar_2_0() { + assert_eq!( + shape("fonts/TestGVARTwo.ttf", 1000, &[("wght", 300.0)], "彌"), + "[gid2]" + ) +} + +#[test] +fn gvar_2_1() { + assert_eq!( + shape("fonts/TestGVARTwo.ttf", 1000, &[("wght", 350.0)], "彌"), + "[gid2]" + ) +} + +#[test] +fn gvar_2_2() { + assert_eq!( + shape("fonts/TestGVARTwo.ttf", 1000, &[("wght", 400.0)], "彌"), + "[gid2]" + ) +} + +#[test] +fn gvar_2_3() { + assert_eq!( + shape("fonts/TestGVARTwo.ttf", 1000, &[("wght", 450.0)], "彌"), + "[gid2]" + ) +} + +#[test] +fn gvar_2_4() { + assert_eq!( + shape("fonts/TestGVARTwo.ttf", 1000, &[("wght", 500.0)], "彌"), + "[gid2]" + ) +} + +#[test] +fn gvar_2_5() { + assert_eq!( + shape("fonts/TestGVARTwo.ttf", 1000, &[("wght", 550.0)], "彌"), + "[gid2]" + ) +} + +#[test] +fn gvar_2_6() { + assert_eq!( + shape("fonts/TestGVARTwo.ttf", 1000, &[("wght", 600.0)], "彌"), + "[gid2]" + ) +} + +#[test] +fn gvar_2_7() { + assert_eq!( + shape("fonts/TestGVARTwo.ttf", 1000, &[("wght", 650.0)], "彌"), + "[gid2]" + ) +} + +#[test] +fn gvar_2_8() { + assert_eq!( + shape("fonts/TestGVARTwo.ttf", 1000, &[("wght", 700.0)], "彌"), + "[gid2]" + ) +} + +#[test] +fn gvar_3_0() { + assert_eq!( + shape("fonts/TestGVARThree.ttf", 1000, &[("wght", 300.0)], "彌"), + "[gid2]" + ) +} + +#[test] +fn gvar_3_1() { + assert_eq!( + shape("fonts/TestGVARThree.ttf", 1000, &[("wght", 350.0)], "彌"), + "[gid2]" + ) +} + +#[test] +fn gvar_3_2() { + assert_eq!( + shape("fonts/TestGVARThree.ttf", 1000, &[("wght", 400.0)], "彌"), + "[gid2]" + ) +} + +#[test] +fn gvar_3_3() { + assert_eq!( + shape("fonts/TestGVARThree.ttf", 1000, &[("wght", 450.0)], "彌"), + "[gid2]" + ) +} + +#[test] +fn gvar_3_4() { + assert_eq!( + shape("fonts/TestGVARThree.ttf", 1000, &[("wght", 500.0)], "彌"), + "[gid2]" + ) +} + +#[test] +fn gvar_3_5() { + assert_eq!( + shape("fonts/TestGVARThree.ttf", 1000, &[("wght", 550.0)], "彌"), + "[gid2]" + ) +} + +#[test] +fn gvar_3_6() { + assert_eq!( + shape("fonts/TestGVARThree.ttf", 1000, &[("wght", 600.0)], "彌"), + "[gid2]" + ) +} + +#[test] +fn gvar_3_7() { + assert_eq!( + shape("fonts/TestGVARThree.ttf", 1000, &[("wght", 650.0)], "彌"), + "[gid2]" + ) +} + +#[test] +fn gvar_3_8() { + assert_eq!( + shape("fonts/TestGVARThree.ttf", 1000, &[("wght", 700.0)], "彌"), + "[gid2]" + ) +} + +#[test] +fn gvar_4_0() { + assert_eq!( + shape("fonts/Zycon.ttf", 1000, &[("M1", -1.0), ("T1", 0.0)], "🦎"), + "[gid5]" + ) +} + +#[test] +fn gvar_4_1() { + assert_eq!( + shape("fonts/Zycon.ttf", 1000, &[("M1", -0.8), ("T1", 0.1)], "🦎"), + "[gid5]" + ) +} + +#[test] +fn gvar_4_2() { + assert_eq!( + shape("fonts/Zycon.ttf", 1000, &[("M1", -0.6), ("T1", 0.2)], "🦎"), + "[gid5]" + ) +} + +#[test] +fn gvar_4_3() { + assert_eq!( + shape("fonts/Zycon.ttf", 1000, &[("M1", -0.4), ("T1", 0.3)], "🦎"), + "[gid5]" + ) +} + +#[test] +fn gvar_4_4() { + assert_eq!( + shape("fonts/Zycon.ttf", 1000, &[("M1", -0.2), ("T1", 0.4)], "🦎"), + "[gid5]" + ) +} + +#[test] +fn gvar_4_5() { + assert_eq!( + shape("fonts/Zycon.ttf", 1000, &[("M1", 0.0), ("T1", 0.5)], "🦎"), + "[gid5]" + ) +} + +#[test] +fn gvar_4_6() { + assert_eq!( + shape("fonts/Zycon.ttf", 1000, &[("M1", 0.2), ("T1", 0.6)], "🦎"), + "[gid5]" + ) +} + +#[test] +fn gvar_4_7() { + assert_eq!( + shape("fonts/Zycon.ttf", 1000, &[("M1", 0.4), ("T1", 0.7)], "🦎"), + "[gid5]" + ) +} + +#[test] +fn gvar_4_8() { + assert_eq!( + shape("fonts/Zycon.ttf", 1000, &[("M1", 0.6), ("T1", 0.8)], "🦎"), + "[gid5]" + ) +} + +#[test] +fn gvar_4_9() { + assert_eq!( + shape("fonts/Zycon.ttf", 1000, &[("M1", 0.8), ("T1", 0.9)], "🦎"), + "[gid5]" + ) +} + +#[test] +fn gvar_4_10() { + assert_eq!( + shape("fonts/Zycon.ttf", 1000, &[("M1", 1.0), ("T1", 1.0)], "🦎"), + "[gid5]" + ) +} + +#[test] +fn gvar_5_0() { + assert_eq!( + shape("fonts/Zycon.ttf", 1000, &[("M1", -1.0)], "🌝"), + "[gid15]" + ) +} + +#[test] +fn gvar_5_1() { + assert_eq!( + shape("fonts/Zycon.ttf", 1000, &[("M1", -0.8)], "🌝"), + "[gid15]" + ) +} + +#[test] +fn gvar_5_2() { + assert_eq!( + shape("fonts/Zycon.ttf", 1000, &[("M1", -0.6)], "🌝"), + "[gid15]" + ) +} + +#[test] +fn gvar_5_3() { + assert_eq!( + shape("fonts/Zycon.ttf", 1000, &[("M1", -0.4)], "🌝"), + "[gid15]" + ) +} + +#[test] +fn gvar_5_4() { + assert_eq!( + shape("fonts/Zycon.ttf", 1000, &[("M1", -0.2)], "🌝"), + "[gid15]" + ) +} + +#[test] +fn gvar_5_5() { + assert_eq!( + shape("fonts/Zycon.ttf", 1000, &[("M1", 0.0)], "🌝"), + "[gid15]" + ) +} + +#[test] +fn gvar_5_6() { + assert_eq!( + shape("fonts/Zycon.ttf", 1000, &[("M1", 0.2)], "🌝"), + "[gid15]" + ) +} + +#[test] +fn gvar_5_7() { + assert_eq!( + shape("fonts/Zycon.ttf", 1000, &[("M1", 0.4)], "🌝"), + "[gid15]" + ) +} + +#[test] +fn gvar_5_8() { + assert_eq!( + shape("fonts/Zycon.ttf", 1000, &[("M1", 0.6)], "🌝"), + "[gid15]" + ) +} + +#[test] +fn gvar_5_9() { + assert_eq!( + shape("fonts/Zycon.ttf", 1000, &[("M1", 0.8)], "🌝"), + "[gid15]" + ) +} + +#[test] +fn gvar_5_10() { + assert_eq!( + shape("fonts/Zycon.ttf", 1000, &[("M1", 1.0)], "🌝"), + "[gid15]" + ) +} + +#[test] +fn gvar_6_0() { + assert_eq!( + shape("fonts/Zycon.ttf", 1000, &[("T1", 0.0)], "🐢"), + "[gid12]" + ) +} + +#[test] +fn gvar_6_1() { + assert_eq!( + shape("fonts/Zycon.ttf", 1000, &[("T1", 0.1)], "🐢"), + "[gid12]" + ) +} + +#[test] +fn gvar_6_2() { + assert_eq!( + shape("fonts/Zycon.ttf", 1000, &[("T1", 0.2)], "🐢"), + "[gid12]" + ) +} + +#[test] +fn gvar_6_3() { + assert_eq!( + shape("fonts/Zycon.ttf", 1000, &[("T1", 0.3)], "🐢"), + "[gid12]" + ) +} + +#[test] +fn gvar_6_4() { + assert_eq!( + shape("fonts/Zycon.ttf", 1000, &[("T1", 0.4)], "🐢"), + "[gid12]" + ) +} + +#[test] +fn gvar_6_5() { + assert_eq!( + shape("fonts/Zycon.ttf", 1000, &[("T1", 0.5)], "🐢"), + "[gid12]" + ) +} + +#[test] +fn gvar_6_6() { + assert_eq!( + shape("fonts/Zycon.ttf", 1000, &[("T1", 0.6)], "🐢"), + "[gid12]" + ) +} + +#[test] +fn gvar_6_7() { + assert_eq!( + shape("fonts/Zycon.ttf", 1000, &[("T1", 0.7)], "🐢"), + "[gid12]" + ) +} + +#[test] +fn gvar_6_8() { + assert_eq!( + shape("fonts/Zycon.ttf", 1000, &[("T1", 0.8)], "🐢"), + "[gid12]" + ) +} + +#[test] +fn gvar_6_9() { + assert_eq!( + shape("fonts/Zycon.ttf", 1000, &[("T1", 0.9)], "🐢"), + "[gid12]" + ) +} + +#[test] +fn gvar_6_10() { + assert_eq!( + shape("fonts/Zycon.ttf", 1000, &[("T1", 1.0)], "🐢"), + "[gid12]" + ) +} + +#[test] +fn gvar_7_0() { + assert_eq!( + shape("fonts/TestGVARFour.ttf", 1000, &[("wght", 150.0)], "OIO"), + "[uni004F|uni0049@706,0|uni004F@1072,0]" + ) +} + +#[test] +fn gvar_7_1() { + assert_eq!( + shape("fonts/TestGVARFour.ttf", 1000, &[("wght", 200.0)], "OIO"), + "[uni004F|uni0049@707,0|uni004F@1074,0]" + ) +} + +#[test] +fn gvar_7_2() { + assert_eq!( + shape("fonts/TestGVARFour.ttf", 1000, &[("wght", 250.0)], "OIO"), + "[uni004F|uni0049@707,0|uni004F@1075,0]" + ) +} + +#[test] +fn gvar_7_3() { + assert_eq!( + shape("fonts/TestGVARFour.ttf", 1000, &[("wght", 300.0)], "OIO"), + "[uni004F|uni0049@707,0|uni004F@1076,0]" + ) +} + +#[test] +fn gvar_7_4() { + assert_eq!( + shape("fonts/TestGVARFour.ttf", 1000, &[("wght", 350.0)], "OIO"), + "[uni004F|uni0049@707,0|uni004F@1077,0]" + ) +} + +#[test] +fn gvar_7_5() { + assert_eq!( + shape("fonts/TestGVARFour.ttf", 1000, &[("wght", 400.0)], "OIO"), + "[uni004F|uni0049@707,0|uni004F@1078,0]" + ) +} + +#[test] +fn gvar_7_6() { + assert_eq!( + shape("fonts/TestGVARFour.ttf", 1000, &[("wght", 450.0)], "OIO"), + "[uni004F|uni0049@706,0|uni004F@1079,0]" + ) +} + +#[test] +fn gvar_8_0() { + assert_eq!( + shape("fonts/TestGVAREight.ttf", 1000, &[("HV", 0.0)], "H"), + "[H]" + ) +} + +#[test] +fn gvar_8_1() { + assert_eq!( + shape("fonts/TestGVAREight.ttf", 1000, &[("HV", -0.2)], "H"), + "[H]" + ) +} + +#[test] +fn gvar_8_2() { + assert_eq!( + shape("fonts/TestGVAREight.ttf", 1000, &[("HV", -0.4)], "H"), + "[H]" + ) +} + +#[test] +fn gvar_8_3() { + assert_eq!( + shape("fonts/TestGVAREight.ttf", 1000, &[("HV", -0.6)], "H"), + "[H]" + ) +} + +#[test] +fn gvar_8_4() { + assert_eq!( + shape("fonts/TestGVAREight.ttf", 1000, &[("HV", -0.8)], "H"), + "[H]" + ) +} + +#[test] +fn gvar_8_5() { + assert_eq!( + shape("fonts/TestGVAREight.ttf", 1000, &[("HV", -1.0)], "H"), + "[H]" + ) +} + +#[test] +fn gvar_9_0() { + assert_eq!( + shape("fonts/TestGVARNine.ttf", 1000, &[("TEST", -1.0)], "A"), + "[A]" + ) +} + +#[test] +fn gvar_9_1() { + assert_eq!( + shape("fonts/TestGVARNine.ttf", 1000, &[("TEST", -0.5)], "A"), + "[A]" + ) +} + +#[test] +fn gvar_9_2() { + assert_eq!( + shape("fonts/TestGVARNine.ttf", 1000, &[("TEST", 0.0)], "A"), + "[A]" + ) +} + +#[test] +fn gvar_9_3() { + assert_eq!( + shape("fonts/TestGVARNine.ttf", 1000, &[("TEST", 0.5)], "A"), + "[A]" + ) +} + +#[test] +fn gvar_9_4() { + assert_eq!( + shape("fonts/TestGVARNine.ttf", 1000, &[("TEST", 0.6)], "A"), + "[A]" + ) +} + +#[test] +fn gvar_9_5() { + assert_eq!( + shape("fonts/TestGVARNine.ttf", 1000, &[("TEST", 0.7)], "A"), + "[A]" + ) +} + +#[test] +fn gvar_9_6() { + assert_eq!( + shape("fonts/TestGVARNine.ttf", 1000, &[("TEST", 0.8)], "A"), + "[A]" + ) +} + +#[test] +fn gvar_9_7() { + assert_eq!( + shape("fonts/TestGVARNine.ttf", 1000, &[("TEST", 0.9)], "A"), + "[A]" + ) +} + +#[test] +fn gvar_9_8() { + assert_eq!( + shape("fonts/TestGVARNine.ttf", 1000, &[("TEST", 0.944444)], "A"), + "[A]" + ) +} + +#[test] +fn gvar_9_9() { + assert_eq!( + shape("fonts/TestGVARNine.ttf", 1000, &[("TEST", 1.0)], "A"), + "[A]" + ) +} + +#[test] +fn hvar_1_0() { + assert_eq!( + shape("fonts/TestHVAROne.otf", 1000, &[("wght", 0.0)], "ABC"), + "[A|B@520,0|C@1094,0]" + ) +} + +#[test] +fn hvar_1_1() { + assert_eq!( + shape("fonts/TestHVAROne.otf", 1000, &[("wght", 200.0)], "ABC"), + "[A|B@533,0|C@1115,0]" + ) +} + +#[test] +fn hvar_1_2() { + assert_eq!( + shape("fonts/TestHVAROne.otf", 1000, &[("wght", 400.0)], "ABC"), + "[A|B@546,0|C@1135,0]" + ) +} + +#[test] +fn hvar_1_3() { + assert_eq!( + shape("fonts/TestHVAROne.otf", 1000, &[("wght", 600.0)], "ABC"), + "[A|B@558,0|C@1155,0]" + ) +} + +#[test] +fn hvar_1_4() { + assert_eq!( + shape("fonts/TestHVAROne.otf", 1000, &[("wght", 800.0)], "ABC"), + "[A|B@571,0|C@1175,0]" + ) +} + +#[test] +fn hvar_1_5() { + assert_eq!( + shape("fonts/TestHVAROne.otf", 1000, &[("wght", 1000.0)], "ABC"), + "[A|B@584,0|C@1196,0]" + ) +} + +#[test] +fn hvar_2_0() { + assert_eq!( + shape("fonts/TestHVARTwo.ttf", 1000, &[("wght", 0.0)], "AB"), + "[uni0041|uni0042@450,0]" + ) +} + +#[test] +fn hvar_2_1() { + assert_eq!( + shape("fonts/TestHVARTwo.ttf", 1000, &[("wght", 200.0)], "AB"), + "[uni0041|uni0042@515,0]" + ) +} + +#[test] +fn hvar_2_2() { + assert_eq!( + shape("fonts/TestHVARTwo.ttf", 1000, &[("wght", 400.0)], "AB"), + "[uni0041|uni0042@584,0]" + ) +} + +#[test] +fn hvar_2_3() { + assert_eq!( + shape("fonts/TestHVARTwo.ttf", 1000, &[("wght", 600.0)], "AB"), + "[uni0041|uni0042@673,0]" + ) +} + +#[test] +fn hvar_2_4() { + assert_eq!( + shape("fonts/TestHVARTwo.ttf", 1000, &[("wght", 800.0)], "AB"), + "[uni0041|uni0042@761,0]" + ) +} + +#[test] +fn hvar_2_5() { + assert_eq!( + shape("fonts/TestHVARTwo.ttf", 1000, &[("wght", 1000.0)], "AB"), + "[uni0041|uni0042@850,0]" + ) +} + +#[test] +fn kern_1_0() { + assert_eq!( + shape("fonts/TestKERNOne.otf", 1000, &[], "ıTuTuTı"), + "[dotlessi|T|u@400,0|T@600,0|u@1000,0|T@1200,0|dotlessi@1600,0]" + ) +} + +#[test] +fn kern_2_0() { + assert_eq!( + shape("fonts/TestKERNOne.otf", 1000, &[], "uııTııTııu"), + "[u|dotlessi@400,0|dotlessi@1100,0|T@1100,0|dotlessi@1500,0|dotlessi@2200,0|T@2200,0|dotlessi@2600,0|dotlessi@3300,0|u@3500,0]" + ) +} + +#[test] +fn morx_1_0() { + assert_eq!( + shape("fonts/TestMORXOne.ttf", 1000, &[], "ABC"), + "[A.alt|B@1000,0|C.alt@2000,0]" + ) +} + +#[test] +fn morx_10_0() { + assert_eq!( + shape("fonts/TestMORXTen.ttf", 1000, &[], "ABABAB"), + "[A|B@638,0|A@1288,0|B@1926,0|B@2576,0|A@3226,0]" + ) +} + +#[test] +fn morx_11_0() { + assert_eq!( + shape("fonts/TestMORXEleven.ttf", 1000, &[], "BABBAABX"), + "[B|A@650,0|B@1288,0|B@1938,0|A@2588,0|X@3226,0|A@3812,0|B@4450,0]" + ) +} + +#[test] +fn morx_12_0() { + assert_eq!( + shape("fonts/TestMORXTwelve.ttf", 1000, &[], "XABCX1"), + "[X|C@598,0|A@1230,0|B@1868,0|X@2518,0|one@3116,0]" + ) +} + +#[test] +fn morx_12_1() { + assert_eq!( + shape("fonts/TestMORXTwelve.ttf", 1000, &[], "XABCX2"), + "[X|C@598,0|A@1230,0|B@1868,0|X@2518,0|two@3116,0]" + ) +} + +#[test] +fn morx_12_2() { + assert_eq!( + shape("fonts/TestMORXTwelve.ttf", 1000, &[], "XABCX3"), + "[X|B@598,0|C@1248,0|A@1880,0|X@2518,0|three@3116,0]" + ) +} + +#[test] +fn morx_13_0() { + assert_eq!( + shape("fonts/TestMORXThirteen.ttf", 1000, &[], "ABCDE"), + "[B|C@626,0|D@1222,0|E@1896,0|A@2452,0]" + ) +} + +#[test] +fn morx_14_0() { + assert_eq!( + shape("fonts/TestMORXFourteen.ttf", 1000, &[], "ABCDE"), + "[B|C@626,0|D@1222,0|E@1896,0|A@2452,0]" + ) +} + +#[test] +fn morx_14_1() { + assert_eq!( + shape("fonts/TestMORXFourteen.ttf", 0, &[], "ABBBCCCDDDBCDCE"), + "*" + ) +} + +#[test] +fn morx_16_0() { + assert_eq!( + shape("fonts/TestMORXSixteen.ttf", 1000, &[], "ABCDE"), + "[B|C@626,0|D@1222,0|E@1896,0|A@2452,0]" + ) +} + +#[test] +fn morx_17_0() { + assert_eq!( + shape("fonts/TestMORXSeventeen.ttf", 1000, &[], "AB"), + "[B|A@626,0]" + ) +} + +#[test] +fn morx_18_0() { + assert_eq!( + shape("fonts/TestMORXEighteen.ttf", 1000, &[], "ABCDE"), + "[A|B.alt@639,0|C@1639,0|D.alt1@2235,0|E@3235,0]" + ) +} + +#[test] +fn morx_18_1() { + assert_eq!( + shape("fonts/TestMORXEighteen.ttf", 1000, &[], "ABBBDE"), + "[A|B@639,0|B@1265,0|B.alt@1891,0|D.alt1@2891,0|E@3891,0]" + ) +} + +#[test] +fn morx_18_2() { + assert_eq!( + shape("fonts/TestMORXEighteen.ttf", 1000, &[], "ABDE"), + "[A|B.alt@639,0|D.alt1@1639,0|E@2639,0]" + ) +} + +#[test] +fn morx_18_3() { + assert_eq!( + shape("fonts/TestMORXEighteen.ttf", 1000, &[], "ABE"), + "[A|B@639,0|E@1265,0]" + ) +} + +#[test] +fn morx_19_0() { + assert_eq!( + shape("fonts/TestMORXEighteen.ttf", 1000, &[], "ACDE"), + "[A.alt|C@1000,0|D.alt1@1596,0|E@2596,0]" + ) +} + +#[test] +fn morx_19_1() { + assert_eq!( + shape("fonts/TestMORXEighteen.ttf", 1000, &[], "D"), + "[D.alt]" + ) +} + +#[test] +fn morx_2_0() { + assert_eq!( + shape("fonts/TestMORXTwo.ttf", 1000, &[], "OOOABXYZCDOOO⓿"), + "[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]" + ) +} + +#[test] +fn morx_2_1() { + assert_eq!( + shape("fonts/TestMORXTwo.ttf", 1000, &[], "OOOABXYZCDOOO➊"), + "[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]" + ) +} + +#[test] +fn morx_2_2() { + assert_eq!( + shape("fonts/TestMORXTwo.ttf", 1000, &[], "OOOABXYZCDOOO➋"), + "[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]" + ) +} + +#[test] +fn morx_2_3() { + assert_eq!( + shape("fonts/TestMORXTwo.ttf", 1000, &[], "OOOABXYZCDOOO3"), + "[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]" + ) +} + +#[test] +fn morx_2_4() { + assert_eq!( + shape("fonts/TestMORXTwo.ttf", 1000, &[], "OOOABXYZCDOOO4"), + "[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]" + ) +} + +#[test] +fn morx_2_5() { + assert_eq!( + shape("fonts/TestMORXTwo.ttf", 1000, &[], "OOOABXYZCDOOO5"), + "[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]" + ) +} + +#[test] +fn morx_2_6() { + assert_eq!( + shape("fonts/TestMORXTwo.ttf", 1000, &[], "OOOABXYZCDOOO6"), + "[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]" + ) +} + +#[test] +fn morx_2_7() { + assert_eq!( + shape("fonts/TestMORXTwo.ttf", 1000, &[], "OOOABXYZCDOOO7"), + "[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]" + ) +} + +#[test] +fn morx_2_8() { + assert_eq!( + shape("fonts/TestMORXTwo.ttf", 1000, &[], "OOOABXYZCDOOO8"), + "[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]" + ) +} + +#[test] +fn morx_2_9() { + assert_eq!( + shape("fonts/TestMORXTwo.ttf", 1000, &[], "OOOABXYZCDOOO9"), + "[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]" + ) +} + +#[test] +fn morx_2_10() { + assert_eq!( + shape("fonts/TestMORXTwo.ttf", 1000, &[], "OOOABXYZCDOOO➓"), + "[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]" + ) +} + +#[test] +fn morx_2_11() { + assert_eq!( + shape("fonts/TestMORXTwo.ttf", 1000, &[], "OOOABXYZCDOOO⓫"), + "[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]" + ) +} + +#[test] +fn morx_2_12() { + assert_eq!( + shape("fonts/TestMORXTwo.ttf", 1000, &[], "OOOABXYZCDOOO⓬"), + "[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]" + ) +} + +#[test] +fn morx_2_13() { + assert_eq!( + shape("fonts/TestMORXTwo.ttf", 1000, &[], "OOOABXYZCDOOO⓭"), + "[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]" + ) +} + +#[test] +fn morx_2_14() { + assert_eq!( + shape("fonts/TestMORXTwo.ttf", 1000, &[], "OOOABXYZCDOOO⓮"), + "[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]" + ) +} + +#[test] +fn morx_2_15() { + assert_eq!( + shape("fonts/TestMORXTwo.ttf", 1000, &[], "OOOABXYZCDOOO⓯"), + "[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]" + ) +} + +#[test] +fn morx_20_0() { + assert_eq!( + shape("fonts/TestMORXTwenty.ttf", 1000, &[], "ABCDE"), + "[A|B@639,0|C.alt@1265,0|D@2265,0|E.alt1@2939,0]" + ) +} + +#[test] +fn morx_20_1() { + assert_eq!( + shape("fonts/TestMORXTwenty.ttf", 1000, &[], "ABC"), + "[A|B@639,0|C.alt@1265,0]" + ) +} + +#[test] +fn morx_20_2() { + assert_eq!( + shape("fonts/TestMORXTwenty.ttf", 1000, &[], "ABE"), + "[A|B.alt@639,0|E.alt1@1639,0]" + ) +} + +#[test] +fn morx_20_3() { + assert_eq!( + shape("fonts/TestMORXTwenty.ttf", 1000, &[], "AE"), + "[A.alt|E.alt1@1000,0]" + ) +} + +#[test] +fn morx_20_4() { + assert_eq!( + shape("fonts/TestMORXTwenty.ttf", 1000, &[], "EE"), + "[E|E@556,0]" + ) +} + +#[test] +fn morx_20_5() { + assert_eq!(shape("fonts/TestMORXTwenty.ttf", 1000, &[], "A"), "[A.alt]") +} + +#[test] +fn morx_20_6() { + assert_eq!(shape("fonts/TestMORXTwenty.ttf", 1000, &[], "E"), "[E]") +} + +#[test] +fn morx_21_0() { + assert_eq!( + shape("fonts/TestMORXTwentyone.ttf", 1000, &[], "ABCDE"), + "[A|B.alt@639,0|C@1639,0|D@2235,0|E@2909,0]" + ) +} + +#[test] +fn morx_22_0() { + assert_eq!(shape("fonts/TestMORXTwentytwo.ttf", 1000, &[], "A"), "[C]") +} + +#[test] +fn morx_23_0() { + assert_eq!( + shape("fonts/TestMORXTwentythree.ttf", 1000, &[], "ABCDE"), + "[E|E@556,0|E@1112,0|E@1668,0|E@2224,0]" + ) +} + +#[test] +fn morx_24_0() { + assert_eq!( + shape("fonts/TestMORXTwentyfour.ttf", 0, &[], "ABCDE"), + "*" + ) +} + +#[test] +fn morx_25_0() { + assert_eq!( + shape("fonts/TestMORXTwentyfive.ttf", 1000, &[], "ABCDE"), + "[A.alt|B.alt@1000,0|C.alt@2000,0|D.alt@3000,0|E.alt@4000,0]" + ) +} + +#[test] +fn morx_25_1() { + assert_eq!( + shape("fonts/TestMORXTwentyfive.ttf", 1000, &[], "EBCDA"), + "[E|B@556,0|C@1182,0|D@1778,0|A@2452,0]" + ) +} + +#[test] +fn morx_25_2() { + assert_eq!( + shape("fonts/TestMORXTwentyfive.ttf", 1000, &[], "CBABC"), + "[C|B@596,0|A.alt@1222,0|B.alt@2222,0|C.alt@3222,0]" + ) +} + +#[test] +fn morx_25_3() { + assert_eq!( + shape("fonts/TestMORXTwentyfive.ttf", 1000, &[], "ABC"), + "[A.alt|B.alt@1000,0|C.alt@2000,0]" + ) +} + +#[test] +fn morx_25_4() { + assert_eq!( + shape("fonts/TestMORXTwentyfive.ttf", 1000, &[], "CBA"), + "[C|B@596,0|A@1222,0]" + ) +} + +#[test] +fn morx_25_5() { + assert_eq!( + shape("fonts/TestMORXTwentyfive.ttf", 1000, &[], "AB"), + "[A.alt|B.alt@1000,0]" + ) +} + +#[test] +fn morx_25_6() { + assert_eq!( + shape("fonts/TestMORXTwentyfive.ttf", 1000, &[], "BA"), + "[B|A@626,0]" + ) +} + +#[test] +fn morx_25_7() { + assert_eq!(shape("fonts/TestMORXTwentyfive.ttf", 1000, &[], "A"), "[A]") +} + +#[test] +fn morx_25_8() { + assert_eq!(shape("fonts/TestMORXTwentyfive.ttf", 1000, &[], "B"), "[B]") +} + +#[test] +fn morx_26_0() { + assert_eq!( + shape("fonts/TestMORXTwentysix.ttf", 1000, &[], "AB"), + "[A|B@639,0]" + ) +} + +#[test] +fn morx_26_1() { + assert_eq!( + shape("fonts/TestMORXTwentysix.ttf", 1000, &[], "B"), + "[B.alt]" + ) +} + +#[test] +fn morx_27_0() { + assert_eq!( + shape("fonts/TestMORXTwentyseven.ttf", 1000, &[], "AEB"), + "[A_E_B]" + ) +} + +#[test] +fn morx_27_1() { + assert_eq!( + shape("fonts/TestMORXTwentyseven.ttf", 1000, &[], "AEC"), + "[A_E_C]" + ) +} + +#[test] +fn morx_27_2() { + assert_eq!( + shape("fonts/TestMORXTwentyseven.ttf", 1000, &[], "AED"), + "[A_E_D]" + ) +} + +#[test] +fn morx_28_0() { + assert_eq!( + shape("fonts/TestMORXTwentyeight.ttf", 1000, &[], "AED"), + "[A_E_D]" + ) +} + +#[test] +fn morx_28_1() { + assert_eq!( + shape("fonts/TestMORXTwentyeight.ttf", 1000, &[], "AxED"), + "[A_E_D|x@1394,0]" + ) +} + +#[test] +fn morx_28_2() { + assert_eq!( + shape("fonts/TestMORXTwentyeight.ttf", 1000, &[], "AEyD"), + "[A_E_D|y@1394,0]" + ) +} + +#[test] +fn morx_28_3() { + assert_eq!( + shape("fonts/TestMORXTwentyeight.ttf", 1000, &[], "AxEyD"), + "[A_E_D|x@1394,0|y@1923,0]" + ) +} + +#[test] +fn morx_28_4() { + assert_eq!( + shape("fonts/TestMORXTwentyeight.ttf", 1000, &[], "AxxxEyyyD"), + "[A_E_D|x@1394,0|x@1923,0|x@2452,0|y@2981,0|y@3491,0|y@4001,0]" + ) +} + +#[test] +fn morx_29_0() { + assert_eq!( + shape("fonts/TestMORXTwentynine.ttf", 1000, &[], "PQRMMXXMMYYAZZ"), + "[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]" + ) +} + +#[test] +fn morx_29_1() { + assert_eq!( + shape("fonts/TestMORXTwentynine.ttf", 1000, &[], "PQRMMXXMMYYBZZ"), + "[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]" + ) +} + +#[test] +fn morx_29_2() { + assert_eq!( + shape("fonts/TestMORXTwentynine.ttf", 1000, &[], "PQRMMXXMMYYCZZ"), + "[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]" + ) +} + +#[test] +fn morx_29_3() { + assert_eq!( + shape("fonts/TestMORXTwentynine.ttf", 1000, &[], "PQRMMXXMMYYDZZ"), + "[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]" + ) +} + +#[test] +fn morx_3_0() { + assert_eq!( + shape("fonts/TestMORXThree.ttf", 1000, &[], "ABXCD0"), + "[A|B@363,0|X@722,0|C@1086,0|D@1402,0|zero@1793,0]" + ) +} + +#[test] +fn morx_3_1() { + assert_eq!( + shape("fonts/TestMORXThree.ttf", 1000, &[], "ABXCD1"), + "[A|B@363,0|X@722,0|C@1086,0|D@1402,0|one@1793,0]" + ) +} + +#[test] +fn morx_3_2() { + assert_eq!( + shape("fonts/TestMORXThree.ttf", 1000, &[], "ABXCD2"), + "[A|B@363,0|X@722,0|C@1086,0|D@1402,0|two@1793,0]" + ) +} + +#[test] +fn morx_3_3() { + assert_eq!( + shape("fonts/TestMORXThree.ttf", 1000, &[], "ABXCD3"), + "[A|B@363,0|X@722,0|C@1086,0|D@1402,0|three@1793,0]" + ) +} + +#[test] +fn morx_3_4() { + assert_eq!( + shape("fonts/TestMORXThree.ttf", 1000, &[], "ABXCD4"), + "[A|B@363,0|X@722,0|C@1086,0|D@1402,0|four@1793,0]" + ) +} + +#[test] +fn morx_3_5() { + assert_eq!( + shape("fonts/TestMORXThree.ttf", 1000, &[], "ABXCD5"), + "[A|B@363,0|X@722,0|C@1086,0|D@1402,0|five@1793,0]" + ) +} + +#[test] +fn morx_3_6() { + assert_eq!( + shape("fonts/TestMORXThree.ttf", 1000, &[], "ABXCD6"), + "[A|B@363,0|X@722,0|C@1086,0|D@1402,0|six@1793,0]" + ) +} + +#[test] +fn morx_3_7() { + assert_eq!( + shape("fonts/TestMORXThree.ttf", 1000, &[], "ABXCD7"), + "[A|B@363,0|X@722,0|C@1086,0|D@1402,0|seven@1793,0]" + ) +} + +#[test] +fn morx_3_8() { + assert_eq!( + shape("fonts/TestMORXThree.ttf", 1000, &[], "ABXCD8"), + "[A|B@363,0|X@722,0|C@1086,0|D@1402,0|eight@1793,0]" + ) +} + +#[test] +fn morx_3_9() { + assert_eq!( + shape("fonts/TestMORXThree.ttf", 1000, &[], "ABXCD9"), + "[A|B@363,0|X@722,0|C@1086,0|D@1402,0|nine@1793,0]" + ) +} + +#[test] +fn morx_3_10() { + assert_eq!( + shape("fonts/TestMORXThree.ttf", 1000, &[], "ABXCD➓"), + "[A|B@363,0|X@722,0|C@1086,0|D@1402,0|one_zero@1793,0]" + ) +} + +#[test] +fn morx_3_11() { + assert_eq!( + shape("fonts/TestMORXThree.ttf", 1000, &[], "ABXCD⓫"), + "[A|B@363,0|X@722,0|C@1086,0|D@1402,0|one_one@1793,0]" + ) +} + +#[test] +fn morx_3_12() { + assert_eq!( + shape("fonts/TestMORXThree.ttf", 1000, &[], "ABXCD⓬"), + "[A|B@363,0|X@722,0|C@1086,0|D@1402,0|one_two@1793,0]" + ) +} + +#[test] +fn morx_3_13() { + assert_eq!( + shape("fonts/TestMORXThree.ttf", 1000, &[], "ABXCD⓭"), + "[A|B@363,0|X@722,0|C@1086,0|D@1402,0|one_three@1793,0]" + ) +} + +#[test] +fn morx_3_14() { + assert_eq!( + shape("fonts/TestMORXThree.ttf", 1000, &[], "ABXCD⓮"), + "[A|B@363,0|X@722,0|C@1086,0|D@1402,0|one_four@1793,0]" + ) +} + +#[test] +fn morx_3_15() { + assert_eq!( + shape("fonts/TestMORXThree.ttf", 1000, &[], "ABXCD⓯"), + "[A|B@363,0|X@722,0|C@1086,0|D@1402,0|one_five@1793,0]" + ) +} + +#[test] +fn morx_30_0() { + assert_eq!( + shape("fonts/TestMORXTwentynine.ttf", 1000, &[], "PQRMMXXXAYYAZZ"), + "[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]" + ) +} + +#[test] +fn morx_30_1() { + assert_eq!( + shape("fonts/TestMORXTwentynine.ttf", 1000, &[], "PQRMMXXXAYYBZZ"), + "[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]" + ) +} + +#[test] +fn morx_30_2() { + assert_eq!( + shape("fonts/TestMORXTwentynine.ttf", 1000, &[], "PQRMMXXXBYYAZZ"), + "[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]" + ) +} + +#[test] +fn morx_30_3() { + assert_eq!( + shape("fonts/TestMORXTwentynine.ttf", 1000, &[], "PQRMMXXXBYYBZZ"), + "[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]" + ) +} + +#[test] +fn morx_31_0() { + assert_eq!( + shape("fonts/TestMORXThirtyone.ttf", 1000, &[], "XXAYYAZZ"), + "[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]" + ) +} + +#[test] +fn morx_31_1() { + assert_eq!( + shape("fonts/TestMORXThirtyone.ttf", 1000, &[], "XXAYYBYY"), + "[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]" + ) +} + +#[test] +fn morx_31_2() { + assert_eq!( + shape("fonts/TestMORXThirtyone.ttf", 1000, &[], "XXBYYAZZ"), + "[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]" + ) +} + +#[test] +fn morx_31_3() { + assert_eq!( + shape("fonts/TestMORXThirtyone.ttf", 1000, &[], "XXBYYBZZ"), + "[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]" + ) +} + +#[test] +fn morx_31_4() { + assert_eq!( + shape("fonts/TestMORXThirtyone.ttf", 1000, &[], "MPQRAXYZA"), + "[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]" + ) +} + +#[test] +fn morx_31_5() { + assert_eq!( + shape("fonts/TestMORXThirtyone.ttf", 1000, &[], "MPQRAXYZB"), + "[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]" + ) +} + +#[test] +fn morx_31_6() { + assert_eq!( + shape("fonts/TestMORXThirtyone.ttf", 1000, &[], "MPQRBXYZA"), + "[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]" + ) +} + +#[test] +fn morx_31_7() { + assert_eq!( + shape("fonts/TestMORXThirtyone.ttf", 1000, &[], "MPQRBXYZB"), + "[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]" + ) +} + +#[test] +fn morx_32_0() { + assert_eq!( + shape("fonts/TestMORXThirtytwo.ttf", 1000, &[], "A"), + "[I|N@830,0|S@1660,0|A@2490,0]" + ) +} + +#[test] +fn morx_32_1() { + assert_eq!( + shape("fonts/TestMORXThirtytwo.ttf", 1000, &[], "XAY"), + "[I|N@830,0|S@1660,0|X@2490,0|A@2854,0|Y@3684,0]" + ) +} + +#[test] +fn morx_32_2() { + assert_eq!( + shape("fonts/TestMORXThirtytwo.ttf", 1000, &[], "B"), + "[B|I@830,0|N@1660,0|S@2490,0]" + ) +} + +#[test] +fn morx_32_3() { + assert_eq!( + shape("fonts/TestMORXThirtytwo.ttf", 1000, &[], "XBY"), + "[X|I@364,0|N@1194,0|S@2024,0|B@2854,0|Y@3684,0]" + ) +} + +#[test] +fn morx_33_0() { + assert_eq!( + shape("fonts/TestMORXThirtythree.ttf", 1000, &[], "ha"), + "[h|a@618,0|h@1179,0|a@1797,0]" + ) +} + +#[test] +fn morx_33_1() { + assert_eq!( + shape("fonts/TestMORXThirtythree.ttf", 1000, &[], "haha"), + "[h|a@618,0|h@1179,0|a@1797,0|h@2358,0|a@2976,0|h@3537,0|a@4155,0]" + ) +} + +#[test] +fn morx_33_2() { + assert_eq!( + shape("fonts/TestMORXThirtythree.ttf", 1000, &[], "ah"), + "[a|h@561,0]" + ) +} + +#[test] +fn morx_34_0() { + assert_eq!(shape("fonts/TestMORXThirtyfour.ttf", 0, &[], "ha"), "*") +} + +#[test] +fn morx_35_0() { + assert_eq!( + shape("fonts/TestMORXThirtyfive.ttf", 1000, &[], "A"), + "[A|B@639,0|C@1265,0|E@1861,0]" + ) +} + +#[test] +fn morx_35_1() { + assert_eq!( + shape("fonts/TestMORXThirtyfive.ttf", 1000, &[], "XAY"), + "[X|A@586,0|B@1225,0|C@1851,0|E@2447,0|Y@3003,0]" + ) +} + +#[test] +fn morx_36_0() { + assert_eq!(shape("fonts/TestMORXThirtysix.ttf", 0, &[], "A"), "*") +} + +#[test] +fn morx_37_0() { + assert_eq!( + shape("fonts/TestMORXThirtyseven.ttf", 1000, &[], "AB"), + "[A.alt|B.alt@1000,0]" + ) +} + +#[test] +fn morx_37_1() { + assert_eq!( + shape("fonts/TestMORXThirtyseven.ttf", 1000, &[], "BA"), + "[B|A@650,0]" + ) +} + +#[test] +fn morx_37_2() { + assert_eq!( + shape("fonts/TestMORXThirtyseven.ttf", 1000, &[], "אב"), + "[uni05D1|uni05D0@542,0]" + ) +} + +#[test] +fn morx_37_3() { + assert_eq!( + shape("fonts/TestMORXThirtyseven.ttf", 1000, &[], "בא"), + "[uni05D0.alt|uni05D1.alt@1000,0]" + ) +} + +#[test] +fn morx_38_0() { + assert_eq!( + shape("fonts/TestMORXThirtyeight.ttf", 1000, &[], "AB"), + "[A.alt|B.alt@1000,0]" + ) +} + +#[test] +fn morx_38_1() { + assert_eq!( + shape("fonts/TestMORXThirtyeight.ttf", 1000, &[], "BA"), + "[B|A@650,0]" + ) +} + +#[test] +fn morx_38_2() { + assert_eq!( + shape("fonts/TestMORXThirtyeight.ttf", 1000, &[], "אב"), + "[uni05D1.alt|uni05D0.alt@1000,0]" + ) +} + +#[test] +fn morx_38_3() { + assert_eq!( + shape("fonts/TestMORXThirtyeight.ttf", 1000, &[], "בא"), + "[uni05D0|uni05D1@606,0]" + ) +} + +#[test] +fn morx_39_0() { + assert_eq!( + shape("fonts/TestMORXThirtynine.ttf", 1000, &[], "AB"), + "[A|B@639,0]" + ) +} + +#[test] +fn morx_39_1() { + assert_eq!( + shape("fonts/TestMORXThirtynine.ttf", 1000, &[], "BA"), + "[B.alt|A.alt@1000,0]" + ) +} + +#[test] +fn morx_39_2() { + assert_eq!( + shape("fonts/TestMORXThirtynine.ttf", 1000, &[], "אב"), + "[uni05D1.alt|uni05D0.alt@1000,0]" + ) +} + +#[test] +fn morx_39_3() { + assert_eq!( + shape("fonts/TestMORXThirtynine.ttf", 1000, &[], "בא"), + "[uni05D0|uni05D1@606,0]" + ) +} + +#[test] +fn morx_4_0() { + assert_eq!( + shape("fonts/TestMORXFour.ttf", 1000, &[], "PQRAXYZ1"), + "[P|Q@333,0|R@699,0|A@1050,0|X@1880,0|Y@2244,0|Z@2576,0|one@2898,0]" + ) +} + +#[test] +fn morx_4_1() { + assert_eq!( + shape("fonts/TestMORXFour.ttf", 1000, &[], "PQRAXYZ2"), + "[P|Q@333,0|R@699,0|A@1050,0|X@1880,0|Y@2244,0|Z@2576,0|two@2898,0]" + ) +} + +#[test] +fn morx_4_2() { + assert_eq!( + shape("fonts/TestMORXFour.ttf", 1000, &[], "PQRADXYZ3"), + "[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]" + ) +} + +#[test] +fn morx_4_3() { + assert_eq!( + shape("fonts/TestMORXFour.ttf", 1000, &[], "PQRABXYZ4"), + "[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]" + ) +} + +#[test] +fn morx_4_4() { + assert_eq!( + shape("fonts/TestMORXFour.ttf", 1000, &[], "PQRABXYZ5"), + "[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]" + ) +} + +#[test] +fn morx_4_5() { + assert_eq!( + shape("fonts/TestMORXFour.ttf", 1000, &[], "PQRABXYZ6"), + "[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]" + ) +} + +#[test] +fn morx_4_6() { + assert_eq!( + shape("fonts/TestMORXFour.ttf", 1000, &[], "PQRABXYZ7"), + "[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]" + ) +} + +#[test] +fn morx_4_7() { + assert_eq!( + shape("fonts/TestMORXFour.ttf", 1000, &[], "PQRACDXYZ8"), + "[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]" + ) +} + +#[test] +fn morx_4_8() { + assert_eq!( + shape("fonts/TestMORXFour.ttf", 1000, &[], "PQRACDXYZ9"), + "[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]" + ) +} + +#[test] +fn morx_4_9() { + assert_eq!( + shape("fonts/TestMORXFour.ttf", 1000, &[], "PQRABDXYZ➓"), + "[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]" + ) +} + +#[test] +fn morx_4_10() { + assert_eq!( + shape("fonts/TestMORXFour.ttf", 1000, &[], "PQRABDXYZ⓫"), + "[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]" + ) +} + +#[test] +fn morx_4_11() { + assert_eq!( + shape("fonts/TestMORXFour.ttf", 1000, &[], "PQRABCDXYZ⓬"), + "[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]" + ) +} + +#[test] +fn morx_4_12() { + assert_eq!( + shape("fonts/TestMORXFour.ttf", 1000, &[], "PQRABCDXYZ⓭"), + "[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]" + ) +} + +#[test] +fn morx_4_13() { + assert_eq!( + shape("fonts/TestMORXFour.ttf", 1000, &[], "PQRABCDXYZ⓮"), + "[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]" + ) +} + +#[test] +fn morx_4_14() { + assert_eq!( + shape("fonts/TestMORXFour.ttf", 1000, &[], "PQRABCDXYZ⓯"), + "[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]" + ) +} + +#[test] +fn morx_40_0() { + assert_eq!( + shape("fonts/TestMORXForty.ttf", 1000, &[], "AB"), + "[A|B@639,0]" + ) +} + +#[test] +fn morx_40_1() { + assert_eq!( + shape("fonts/TestMORXForty.ttf", 1000, &[], "BA"), + "[B.alt|A.alt@1000,0]" + ) +} + +#[test] +fn morx_40_2() { + assert_eq!( + shape("fonts/TestMORXForty.ttf", 1000, &[], "אב"), + "[uni05D1|uni05D0@542,0]" + ) +} + +#[test] +fn morx_40_3() { + assert_eq!( + shape("fonts/TestMORXForty.ttf", 1000, &[], "בא"), + "[uni05D0.alt|uni05D1.alt@1000,0]" + ) +} + +#[test] +fn morx_41_0() { + assert_eq!( + shape("fonts/TestMORXFourtyone.ttf", 1000, &[], "ac"), + "[a_c]" + ) +} + +#[test] +fn morx_41_1() { + assert_eq!( + shape("fonts/TestMORXFourtyone.ttf", 1000, &[], "bc"), + "[b_c]" + ) +} + +#[test] +fn morx_41_2() { + assert_eq!(shape("fonts/TestMORXFourtyone.ttf", 0, &[], "cc"), "*") +} + +#[test] +fn morx_41_3() { + assert_eq!(shape("fonts/TestMORXFourtyone.ttf", 0, &[], "abcc"), "*") +} + +#[test] +fn morx_5_0() { + assert_eq!( + shape("fonts/TestMORXFour.ttf", 1000, &[], "PQRAXYZ3"), + "[P|Q@333,0|R@699,0|A@1050,0|X@1880,0|Y@2244,0|Z@2576,0|three@2898,0]" + ) +} + +#[test] +fn morx_5_1() { + assert_eq!( + shape("fonts/TestMORXFour.ttf", 1000, &[], "PQRAXYZ4"), + "[P|Q@333,0|R@699,0|A@1050,0|X@1880,0|Y@2244,0|Z@2576,0|four@2898,0]" + ) +} + +#[test] +fn morx_5_2() { + assert_eq!( + shape("fonts/TestMORXFour.ttf", 1000, &[], "PQRAXYZ5"), + "[P|Q@333,0|R@699,0|A@1050,0|X@1880,0|Y@2244,0|Z@2576,0|five@2898,0]" + ) +} + +#[test] +fn morx_5_3() { + assert_eq!( + shape("fonts/TestMORXFour.ttf", 1000, &[], "PQRAXYZ6"), + "[P|Q@333,0|R@699,0|A@1050,0|X@1880,0|Y@2244,0|Z@2576,0|six@2898,0]" + ) +} + +#[test] +fn morx_5_4() { + assert_eq!( + shape("fonts/TestMORXFour.ttf", 1000, &[], "PQRAXYZ7"), + "[P|Q@333,0|R@699,0|A@1050,0|X@1880,0|Y@2244,0|Z@2576,0|seven@2898,0]" + ) +} + +#[test] +fn morx_5_5() { + assert_eq!( + shape("fonts/TestMORXFour.ttf", 1000, &[], "PQRAXYZ8"), + "[P|Q@333,0|R@699,0|A@1050,0|X@1880,0|Y@2244,0|Z@2576,0|eight@2898,0]" + ) +} + +#[test] +fn morx_5_6() { + assert_eq!( + shape("fonts/TestMORXFour.ttf", 1000, &[], "PQRABXYZ8"), + "[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]" + ) +} + +#[test] +fn morx_5_7() { + assert_eq!( + shape("fonts/TestMORXFour.ttf", 1000, &[], "PQRAXYZ9"), + "[P|Q@333,0|R@699,0|A@1050,0|X@1880,0|Y@2244,0|Z@2576,0|nine@2898,0]" + ) +} + +#[test] +fn morx_5_8() { + assert_eq!( + shape("fonts/TestMORXFour.ttf", 1000, &[], "PQRABXYZ9"), + "[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]" + ) +} + +#[test] +fn morx_5_9() { + assert_eq!( + shape("fonts/TestMORXFour.ttf", 1000, &[], "PQRAXYZ➓"), + "[P|Q@333,0|R@699,0|A@1050,0|X@1880,0|Y@2244,0|Z@2576,0|one_zero@2898,0]" + ) +} + +#[test] +fn morx_5_10() { + assert_eq!( + shape("fonts/TestMORXFour.ttf", 1000, &[], "PQRABXYZ➓"), + "[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]" + ) +} + +#[test] +fn morx_5_11() { + assert_eq!( + shape("fonts/TestMORXFour.ttf", 1000, &[], "PQRAXYZ⓫"), + "[P|Q@333,0|R@699,0|A@1050,0|X@1880,0|Y@2244,0|Z@2576,0|one_one@2898,0]" + ) +} + +#[test] +fn morx_5_12() { + assert_eq!( + shape("fonts/TestMORXFour.ttf", 1000, &[], "PQRABXYZ⓫"), + "[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]" + ) +} + +#[test] +fn morx_5_13() { + assert_eq!( + shape("fonts/TestMORXFour.ttf", 1000, &[], "PQRAXYZ⓬"), + "[P|Q@333,0|R@699,0|A@1050,0|X@1880,0|Y@2244,0|Z@2576,0|one_two@2898,0]" + ) +} + +#[test] +fn morx_5_14() { + assert_eq!( + shape("fonts/TestMORXFour.ttf", 1000, &[], "PQRABXYZ⓬"), + "[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]" + ) +} + +#[test] +fn morx_5_15() { + assert_eq!( + shape("fonts/TestMORXFour.ttf", 1000, &[], "PQRABCXYZ⓬"), + "[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]" + ) +} + +#[test] +fn morx_5_16() { + assert_eq!( + shape("fonts/TestMORXFour.ttf", 1000, &[], "PQRAXYZ⓭"), + "[P|Q@333,0|R@699,0|A@1050,0|X@1880,0|Y@2244,0|Z@2576,0|one_three@2898,0]" + ) +} + +#[test] +fn morx_5_17() { + assert_eq!( + shape("fonts/TestMORXFour.ttf", 1000, &[], "PQRABXYZ⓭"), + "[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]" + ) +} + +#[test] +fn morx_5_18() { + assert_eq!( + shape("fonts/TestMORXFour.ttf", 1000, &[], "PQRABCXYZ⓭"), + "[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]" + ) +} + +#[test] +fn morx_5_19() { + assert_eq!( + shape("fonts/TestMORXFour.ttf", 1000, &[], "PQRAXYZ⓮"), + "[P|Q@333,0|R@699,0|A@1050,0|X@1880,0|Y@2244,0|Z@2576,0|one_four@2898,0]" + ) +} + +#[test] +fn morx_5_20() { + assert_eq!( + shape("fonts/TestMORXFour.ttf", 1000, &[], "PQRABXYZ⓮"), + "[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]" + ) +} + +#[test] +fn morx_5_21() { + assert_eq!( + shape("fonts/TestMORXFour.ttf", 1000, &[], "PQRABCXYZ⓮"), + "[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]" + ) +} + +#[test] +fn morx_5_22() { + assert_eq!( + shape("fonts/TestMORXFour.ttf", 1000, &[], "PQRAXYZ⓯"), + "[P|Q@333,0|R@699,0|A@1050,0|X@1880,0|Y@2244,0|Z@2576,0|one_five@2898,0]" + ) +} + +#[test] +fn morx_5_23() { + assert_eq!( + shape("fonts/TestMORXFour.ttf", 1000, &[], "PQRABXYZ⓯"), + "[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]" + ) +} + +#[test] +fn morx_5_24() { + assert_eq!( + shape("fonts/TestMORXFour.ttf", 1000, &[], "PQRABCXYZ⓯"), + "[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]" + ) +} + +#[test] +fn morx_6_0() { + assert_eq!( + shape("fonts/TestMORXTwo.ttf", 1000, &[], "OOOABCDEFGOOO3141"), + "[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]" + ) +} + +#[test] +fn morx_7_0() { + assert_eq!( + shape("fonts/TestMORXTwo.ttf", 1000, &[], "OBCD1"), + "[B|C@830,0|D@1660,0|O@2490,0|one@2908,0]" + ) +} + +#[test] +fn morx_8_0() { + assert_eq!( + shape("fonts/TestMORXEight.ttf", 1000, &[], "0ABC"), + "[zero|A@914,0|B@1552,0|C@2202,0]" + ) +} + +#[test] +fn morx_8_1() { + assert_eq!( + shape("fonts/TestMORXEight.ttf", 1000, &[], "1ABC"), + "[one|B@914,0|C@1564,0|A@2196,0]" + ) +} + +#[test] +fn morx_8_2() { + assert_eq!( + shape("fonts/TestMORXEight.ttf", 1000, &[], "2ABC"), + "[two|C@914,0|A@1546,0|B@2184,0]" + ) +} + +#[test] +fn morx_9_0() { + assert_eq!( + shape("fonts/TestMORXNine.ttf", 1000, &[], "ABXAB"), + "[B|A@650,0|X@1288,0|A@1874,0|B@2512,0]" + ) +} + +#[test] +fn sfnt_1_0() { + assert_eq!(shape("fonts/TestSFNTOne.otf", 1000, &[], "A"), "[A]") +} + +#[test] +fn sfnt_1_1() { + assert_eq!(shape("fonts/TestSFNTOne.otf", 1000, &[], "B"), "[B]") +} + +#[test] +fn sfnt_2_0() { + assert_eq!(shape("fonts/TestSFNTTwo.ttf", 1000, &[], "A"), "[A]") +} + +#[test] +fn sfnt_2_1() { + assert_eq!(shape("fonts/TestSFNTTwo.ttf", 1000, &[], "B"), "[B]") +} + +#[test] +fn sharan_1_0() { + assert_eq!( + shape("fonts/TestShapeAran.ttf", 1000, &[], "لسان"), + "[OneDotEnclNS@398,-1|NoonxSep|AlefFin@861,0|SeenMed.inT2outT1@1125,0|sp0@1664,0|LamIni.outT2@1664,223]" + ) +} + +#[test] +fn sharan_1_1() { + assert_eq!( + shape("fonts/TestShapeAran.ttf", 1000, &[], "یونیکوڈ"), + "[TahSmallNS@118,-213|DalSep|WawFin.cut@300,0|KafMed.outT3@573,206|TwoDotsBelowNS@1115,220|BehxMed.inT2outT1@903,304|OneDotAboveNS@1271,-71|sp1@1170,0|BehxIni.outT2@1170,449|WawFin.inD2@1387,0|TwoDotsBelowNS@1867,1|sp0@1758,0|BehxIni.outD2WQ@1758,323]" + ) +} + +#[test] +fn sharan_1_2() { + assert_eq!( + shape("fonts/TestShapeAran.ttf", 1000, &[], "فونٹ"), + "[TahSmallNS@595,-331|BehxFin.soft|OneDotAboveNS@1163,-182|sp0@1184,0|BehxIni.outT2B@1184,300|WawFin.inD2alt@1340,0|OneDotAboveNS@1784,108|sp0@1599,0|FehxIni.outD2WQ@1599,237]" + ) +} + +#[test] +fn sharan_1_3() { + assert_eq!( + shape("fonts/TestShapeAran.ttf", 1000, &[], "ٹائپ فیس"), + "[SeenFin|TwoDotsBelowNS@1216,269|BehxMed.inT1outT2SeenWide@1041,455|OneDotAboveNS@1454,224|sp0@1271,0|FehxIni@1271,490|space@1584,0|ThreeDotsDownBelowNS@2290,-159|BehxFin.soft@1715,0|HamzaAboveNS@2878,-201|sp0@2899,0|BehxIni.outT2B@2899,300|AlefFin.narrow@3056,0|TahSmallNS@3442,-420|sp0@3295,0|BehxIni.A@3295,0]" + ) +} + +#[test] +fn sharan_1_4() { + assert_eq!( + shape("fonts/TestShapeAran.ttf", 1000, &[], "فن خطاطی"), + "[YehxFin|sp0@521,0|TahIni.outD2@521,380|AlefFin@1119,0|TahMed.inD1outT1@1382,0|OneDotAboveNS@2081,-47|sp0@1451,0|HahIni.outD1@1451,36|space@2326,0|OneDotEnclNS@2855,-2|NoonxFin@2458,0|OneDotAboveNS@3361,188|sp0@3208,0|FehxIni.outT2N@3208,336]" + ) +} + +#[test] +fn sharan_1_5() { + assert_eq!( + shape("fonts/TestShapeAran.ttf", 1000, &[], "نستعلیق"), + "[TwoDotsAboveNS@519,-199|QafxFin.cut|TwoDotsBelowNS@977,141|BehxMed.inT2outD2WQ@692,272|LamMed.outT2@1023,434|AinMed.inT3outT1@1301,507|TwoDotsAboveNS@1785,209|BehxMed.inT2outT3@1563,603|SeenMed.inT2outT2@1865,735|OneDotAboveNS@2574,670|sp0@2434,0|BehxIni.outT2tall@2434,952]" + ) +} + +#[test] +fn shbali_1_0() { + assert_eq!( + shape("fonts/NotoSansBalinese-Regular.ttf", 1000, &[], "ᬓᬸᬀ"), + "[gid23|gid60@1113,0|gid4@1064,0]" + ) +} + +#[test] +fn shbali_1_1() { + assert_eq!( + shape("fonts/NotoSansBalinese-Regular.ttf", 1000, &[], "ᬕ᭄ᬖᬂ"), + "[gid25|gid132@1092,0|gid6@942,0]" + ) +} + +#[test] +fn shbali_1_2() { + assert_eq!( + shape("fonts/NotoSansBalinese-Regular.ttf", 1000, &[], "ᬘᬻ"), + "[gid28|gid62@796,0|gid57@794,0]" + ) +} + +#[test] +fn shbali_1_3() { + assert_eq!( + shape("fonts/NotoSansBalinese-Regular.ttf", 1000, &[], "ᬙᭀ"), + "[gid66|gid29@483,0|gid57@1536,0]" + ) +} + +#[test] +fn shbali_1_4() { + assert_eq!( + shape("fonts/NotoSansBalinese-Regular.ttf", 1000, &[], "ᬚᬿ"), + "[gid67|gid30@483,0]" + ) +} + +#[test] +fn shbali_1_5() { + assert_eq!( + shape("fonts/NotoSansBalinese-Regular.ttf", 1000, &[], "ᬔᬶ"), + "[gid24|gid58@828,0]" + ) +} + +#[test] +fn shbali_1_6() { + assert_eq!( + shape("fonts/NotoSansBalinese-Regular.ttf", 1000, &[], "ᬓ᭄ᬓᬁ"), + "[gid23|gid129@1111,0|gid5@1064,0]" + ) +} + +#[test] +fn shbali_1_7() { + assert_eq!( + shape("fonts/NotoSansBalinese-Regular.ttf", 1000, &[], "ᬓ᭄ᬛᬁ"), + "[gid23|gid137@1111,0|gid5@1379,181]" + ) +} + +#[test] +fn shbali_1_8() { + assert_eq!( + shape("fonts/NotoSansBalinese-Regular.ttf", 1000, &[], "ᬓ᭄ᬦᬃ"), + "[gid23|gid148@1111,0|gid7@991,0]" + ) +} + +#[test] +fn shbali_1_9() { + assert_eq!( + shape("fonts/NotoSansBalinese-Regular.ttf", 1000, &[], "ᬓ᭄ᬓᬸ"), + "[gid23|gid129@1111,0|gid60@1111,-488]" + ) +} + +#[test] +fn shbali_1_10() { + assert_eq!( + shape("fonts/NotoSansBalinese-Regular.ttf", 1000, &[], "ᬓ᭄ᬓᬼ"), + "[gid23|gid129@1111,0|gid70@1128,0|gid170@1113,0]" + ) +} + +#[test] +fn shbali_1_11() { + assert_eq!( + shape("fonts/NotoSansBalinese-Regular.ttf", 1000, &[], "ᬓ᭄ᬓᬽ"), + "[gid23|gid129@1111,0|gid70@1128,0|gid170@1113,0|gid57@1111,0]" + ) +} + +#[test] +fn shbali_1_12() { + assert_eq!( + shape("fonts/NotoSansBalinese-Regular.ttf", 1000, &[], "ᬓᬾ"), + "[gid66|gid23@483,0]" + ) +} + +#[test] +fn shbali_1_13() { + assert_eq!( + shape("fonts/NotoSansBalinese-Regular.ttf", 1000, &[], "ᬓᬶᬾ"), + "[gid23|gid58@1064,0|gid66@1111,0|gid128@1594,0]" + ) +} + +#[test] +fn shbali_1_14() { + assert_eq!( + shape("fonts/NotoSansBalinese-Regular.ttf", 1000, &[], "ᬓᬸᬾ"), + "[gid23|gid60@1113,0|gid66@1111,0|gid128@1594,0]" + ) +} + +#[test] +fn shbali_1_15() { + assert_eq!( + shape("fonts/NotoSansBalinese-Regular.ttf", 1000, &[], "ᬓ᭄ᬕᬾ"), + "[gid66|gid23@483,0|gid131@1594,0]" + ) +} + +#[test] +fn shbali_1_16() { + assert_eq!( + shape("fonts/NotoSansBalinese-Regular.ttf", 1000, &[], "ᬓᭀ"), + "[gid66|gid23@483,0|gid57@1594,0]" + ) +} + +#[test] +fn shbali_1_17() { + assert_eq!( + shape("fonts/NotoSansBalinese-Regular.ttf", 1000, &[], "ᬓᬾ"), + "[gid66|gid23@483,0]" + ) +} + +#[test] +fn shbali_1_18() { + assert_eq!( + shape("fonts/NotoSansBalinese-Regular.ttf", 1000, &[], "ᬓᬾᬶ"), + "[gid66|gid23@483,0|gid58@1548,0]" + ) +} + +#[test] +fn shbali_1_19() { + assert_eq!( + shape("fonts/NotoSansBalinese-Regular.ttf", 1000, &[], "ᬓᬾᬸ"), + "[gid66|gid23@483,0|gid60@1597,0]" + ) +} + +#[test] +fn shbali_1_20() { + assert_eq!( + shape("fonts/NotoSansBalinese-Regular.ttf", 1000, &[], "ᬓ᭄ᬕᬾ"), + "[gid66|gid23@483,0|gid131@1594,0]" + ) +} + +#[test] +fn shbali_1_21() { + assert_eq!( + shape("fonts/NotoSansBalinese-Regular.ttf", 1000, &[], "ᬓᭀ"), + "[gid66|gid23@483,0|gid57@1594,0]" + ) +} + +#[test] +fn shbali_2_0() { + assert_eq!( + shape("fonts/NotoSansBalinese-Regular.ttf", 1000, &[], "ᬓ᭄ᬧᬾ"), + "[gid66|gid23@483,0|gid149@1594,0]" + ) +} + +#[test] +fn shbali_2_1() { + assert_eq!( + shape("fonts/NotoSansBalinese-Regular.ttf", 1000, &[], "ᬓ᭄ᬨᬿ"), + "[gid67|gid23@483,0|gid150@1594,0]" + ) +} + +#[test] +fn shbali_2_2() { + assert_eq!( + shape("fonts/NotoSansBalinese-Regular.ttf", 1000, &[], "ᬓ᭄ᬱᬾ"), + "[gid66|gid23@483,0|gid159@1594,0]" + ) +} + +#[test] +fn shbali_2_3() { + assert_eq!( + shape("fonts/NotoSansBalinese-Regular.ttf", 1000, &[], "ᬓ᭄ᬲᬾ"), + "[gid66|gid23@483,0|gid60@1597,0|gid149@1594,0]" + ) +} + +#[test] +fn shbali_2_4() { + assert_eq!( + shape("fonts/NotoSansBalinese-Regular.ttf", 1000, &[], "ᬓ᭄ᭊᬾ"), + "[gid66|gid23@483,0|gid60@1597,0|gid165@1594,0]" + ) +} + +#[test] +fn shbali_2_5() { + assert_eq!( + shape("fonts/NotoSansBalinese-Regular.ttf", 1000, &[], "ᬛ᭄ᬓ"), + "[gid181|gid129@1064,-195]" + ) +} + +#[test] +fn shbali_2_6() { + assert_eq!( + shape("fonts/NotoSansBalinese-Regular.ttf", 1000, &[], "ᬛ᭄ᬓᬾ"), + "[gid66|gid181@483,0|gid129@1548,-195]" + ) +} + +#[test] +fn shbali_2_7() { + assert_eq!( + shape("fonts/NotoSansBalinese-Regular.ttf", 1000, &[], "ᬛ᭄ᬓᬸᬀ"), + "[gid181|gid129@1064,-195|gid60@1064,-684|gid4@855,0]" + ) +} + +#[test] +fn shbali_2_8() { + assert_eq!( + shape("fonts/NotoSansBalinese-Regular.ttf", 1000, &[], "ᬓ᭄ᬓᬸ"), + "[gid23|gid129@1111,0|gid60@1111,-488]" + ) +} + +#[test] +fn shbali_2_9() { + assert_eq!( + shape("fonts/NotoSansBalinese-Regular.ttf", 1000, &[], "ᬓ᭄ᬛᬹ"), + "[gid23|gid137@1111,0|gid61@1261,-488]" + ) +} + +#[test] +fn shbali_2_10() { + assert_eq!( + shape("fonts/NotoSansBalinese-Regular.ttf", 1000, &[], "ᬓ᭄ᬱᬺ"), + "[gid23|gid159@1111,0|gid62@1753,0]" + ) +} + +#[test] +fn shbali_2_11() { + assert_eq!( + shape("fonts/NotoSansBalinese-Regular.ttf", 1000, &[], "ᬓ᭄ᭅᬸ"), + "[gid23|gid162@1111,0|gid60@1111,-488]" + ) +} + +#[test] +fn shbali_3_0() { + assert_eq!( + shape("fonts/NotoSansBalinese-Regular.ttf", 1000, &[], "᭦᭫"), + "[gid102|gid107@560,-10]" + ) +} + +#[test] +fn shbali_3_1() { + assert_eq!( + shape("fonts/NotoSansBalinese-Regular.ttf", 1000, &[], "᭦᭬"), + "[gid102|gid108@573,49]" + ) +} + +#[test] +fn shbali_3_2() { + assert_eq!( + shape("fonts/NotoSansBalinese-Regular.ttf", 1000, &[], "᭦᭭"), + "[gid102|gid109@652,-10]" + ) +} + +#[test] +fn shbali_3_3() { + assert_eq!( + shape("fonts/NotoSansBalinese-Regular.ttf", 1000, &[], "᭦᭮"), + "[gid102|gid110@652,-98]" + ) +} + +#[test] +fn shbali_3_4() { + assert_eq!( + shape("fonts/NotoSansBalinese-Regular.ttf", 1000, &[], "᭦᭯"), + "[gid102|gid111@667,-10]" + ) +} + +#[test] +fn shbali_3_5() { + assert_eq!( + shape("fonts/NotoSansBalinese-Regular.ttf", 1000, &[], "᭦᭰"), + "[gid102|gid112@667,-10]" + ) +} + +#[test] +fn shbali_3_6() { + assert_eq!( + shape("fonts/NotoSansBalinese-Regular.ttf", 1000, &[], "᭦᭱"), + "[gid102|gid113@667,-10]" + ) +} + +#[test] +fn shbali_3_7() { + assert_eq!( + shape("fonts/NotoSansBalinese-Regular.ttf", 1000, &[], "᭦᭲"), + "[gid102|gid114@667,-10]" + ) +} + +#[test] +fn shbali_3_8() { + assert_eq!( + shape("fonts/NotoSansBalinese-Regular.ttf", 1000, &[], "᭦᭳"), + "[gid102|gid115@599,-10]" + ) +} + +#[test] +fn shknda_1_0() { + assert_eq!( + shape("fonts/NotoSerifKannada-Regular.ttf", 1000, &[], "ಲ್ಲಿ"), + "[knLI|knLAc2@757,0]" + ) +} + +#[test] +fn shknda_1_1() { + assert_eq!( + shape("fonts/NotoSerifKannada-Regular.ttf", 1000, &[], "ಟ್ಸ್"), + "[knTT|knSAc2@1021,0]" + ) +} + +#[test] +fn shknda_1_2() { + assert_eq!( + shape("fonts/NotoSerifKannada-Regular.ttf", 1000, &[], "ಳಿ"), + "[knLLI]" + ) +} + +#[test] +fn shknda_1_3() { + assert_eq!( + shape("fonts/NotoSerifKannada-Regular.ttf", 1000, &[], "ಡಿ"), + "[knDDI]" + ) +} + +#[test] +fn shknda_1_4() { + assert_eq!( + shape("fonts/NotoSerifKannada-Regular.ttf", 1000, &[], "ಮೆ"), + "[knME]" + ) +} + +#[test] +fn shknda_1_5() { + assert_eq!( + shape("fonts/NotoSerifKannada-Regular.ttf", 1000, &[], "ರಿ"), + "[knRI]" + ) +} + +#[test] +fn shknda_1_6() { + assert_eq!( + shape("fonts/NotoSerifKannada-Regular.ttf", 1000, &[], "ಖ್ಯೆ"), + "[knKHE|knYAc2@846,0]" + ) +} + +#[test] +fn shknda_1_7() { + assert_eq!( + shape("fonts/NotoSerifKannada-Regular.ttf", 1000, &[], "ಫ್ರಿ"), + "[knPHI|knRAc2@735,0]" + ) +} + +#[test] +fn shknda_1_8() { + assert_eq!( + shape("fonts/NotoSerifKannada-Regular.ttf", 1000, &[], "ನೆ"), + "[knNE]" + ) +} + +#[test] +fn shknda_1_9() { + assert_eq!( + shape("fonts/NotoSerifKannada-Regular.ttf", 1000, &[], "ಗಿ"), + "[knGI]" + ) +} + +#[test] +fn shknda_1_10() { + assert_eq!( + shape("fonts/NotoSerifKannada-Regular.ttf", 1000, &[], "ಷ್ಟಿ"), + "[knSSI|knTTAc2@746,0]" + ) +} + +#[test] +fn shknda_1_11() { + assert_eq!( + shape("fonts/NotoSerifKannada-Regular.ttf", 1000, &[], "ಯಿಂ"), + "[knYI|knAnusvara@1252,0]" + ) +} + +#[test] +fn shknda_1_12() { + assert_eq!( + shape("fonts/NotoSerifKannada-Regular.ttf", 1000, &[], "ಚೀ"), + "[knCI|knLengthmark@766,0]" + ) +} + +#[test] +fn shknda_1_13() { + assert_eq!( + shape("fonts/NotoSerifKannada-Regular.ttf", 1000, &[], "ನಿ"), + "[knNI]" + ) +} + +#[test] +fn shknda_1_14() { + assert_eq!( + shape("fonts/NotoSerifKannada-Regular.ttf", 1000, &[], "ಗ್ಲಿ"), + "[knGI|knLAc2@621,0]" + ) +} + +#[test] +fn shknda_1_15() { + assert_eq!( + shape("fonts/NotoSerifKannada-Regular.ttf", 1000, &[], "ಷಿ"), + "[knSSI]" + ) +} + +#[test] +fn shknda_1_16() { + assert_eq!( + shape("fonts/NotoSerifKannada-Regular.ttf", 1000, &[], "ಗೆ"), + "[knGE]" + ) +} + +#[test] +fn shknda_1_17() { + assert_eq!( + shape("fonts/NotoSerifKannada-Regular.ttf", 1000, &[], "ದ್ವಿ"), + "[knDI|knVAc2@740,0]" + ) +} + +#[test] +fn shknda_1_18() { + assert_eq!( + shape("fonts/NotoSerifKannada-Regular.ttf", 1000, &[], "ತೀ"), + "[knTI|knLengthmark@613,0]" + ) +} + +#[test] +fn shknda_1_19() { + assert_eq!( + shape("fonts/NotoSerifKannada-Regular.ttf", 1000, &[], "ಮಿ"), + "[knMI]" + ) +} + +#[test] +fn shknda_1_20() { + assert_eq!( + shape("fonts/NotoSerifKannada-Regular.ttf", 1000, &[], "ಲಿ"), + "[knLI]" + ) +} + +#[test] +fn shknda_1_21() { + assert_eq!( + shape("fonts/NotoSerifKannada-Regular.ttf", 1000, &[], "ಗಿ"), + "[knGI]" + ) +} + +#[test] +fn shknda_1_22() { + assert_eq!( + shape("fonts/NotoSerifKannada-Regular.ttf", 1000, &[], "ನ್"), + "[knN]" + ) +} + +#[test] +fn shknda_1_23() { + assert_eq!( + shape("fonts/NotoSerifKannada-Regular.ttf", 1000, &[], "ಬಿ"), + "[knBI]" + ) +} + +#[test] +fn shknda_1_24() { + assert_eq!( + shape("fonts/NotoSerifKannada-Regular.ttf", 1000, &[], "ಲಿ"), + "[knLI]" + ) +} + +#[test] +fn shknda_1_25() { + assert_eq!( + shape("fonts/NotoSerifKannada-Regular.ttf", 1000, &[], "ನ್ನಿಂ"), + "[knNI|knNAc2@678,0|knAnusvara@755,0]" + ) +} + +#[test] +fn shknda_1_26() { + assert_eq!( + shape("fonts/NotoSerifKannada-Regular.ttf", 1000, &[], "ಲ್ಲಿ"), + "[knLI|knLAc2@757,0]" + ) +} + +#[test] +fn shknda_1_27() { + assert_eq!( + shape("fonts/NotoSerifKannada-Regular.ttf", 1000, &[], "ಧಿ"), + "[knDHI]" + ) +} + +#[test] +fn shknda_1_28() { + assert_eq!( + shape("fonts/NotoSerifKannada-Regular.ttf", 1000, &[], "ಪೌ"), + "[knPA.base|knmAU@739,0]" + ) +} + +#[test] +fn shknda_1_29() { + assert_eq!( + shape("fonts/NotoSerifKannada-Regular.ttf", 1000, &[], "ವಿಂ"), + "[knVI|knAnusvara@749,0]" + ) +} + +#[test] +fn shknda_1_30() { + assert_eq!( + shape("fonts/NotoSerifKannada-Regular.ttf", 1000, &[], "ಡಿ"), + "[knDDI]" + ) +} + +#[test] +fn shknda_1_31() { + assert_eq!( + shape("fonts/NotoSerifKannada-Regular.ttf", 1000, &[], "ಟಿ"), + "[knTTI]" + ) +} + +#[test] +fn shknda_1_32() { + assert_eq!( + shape("fonts/NotoSerifKannada-Regular.ttf", 1000, &[], "ನಿ"), + "[knNI]" + ) +} + +#[test] +fn shknda_1_33() { + assert_eq!( + shape("fonts/NotoSerifKannada-Regular.ttf", 1000, &[], "ಧಿ"), + "[knDHI]" + ) +} + +#[test] +fn shknda_2_0() { + assert_eq!( + shape("fonts/NotoSansKannada-Regular.ttf", 1000, &[], "ನ್ನಾ"), + "[gid150|gid57@711,0|gid116@1160,0]" + ) +} + +#[test] +fn shknda_2_1() { + assert_eq!( + shape("fonts/NotoSansKannada-Regular.ttf", 1000, &[], "ನ್ನಾ"), + "[gid150|gid57@711,0|gid116@1160,0]" + ) +} + +#[test] +fn shknda_2_2() { + assert_eq!( + shape("fonts/NotoSansKannada-Regular.ttf", 1000, &[], "ತ್ತಾ"), + "[gid146|gid57@623,0|gid112@1071,0]" + ) +} + +#[test] +fn shknda_2_3() { + assert_eq!( + shape("fonts/NotoSansKannada-Regular.ttf", 1000, &[], "ಟ್ಟಾ"), + "[gid141|gid57@815,0|gid107@1264,0]" + ) +} + +#[test] +fn shknda_2_4() { + assert_eq!( + shape("fonts/NotoSansKannada-Regular.ttf", 1000, &[], "ಡೋಂಗಿ"), + "[gid249|gid61@768,0|gid71@1513,0|gid4@1925,0|gid207@2475,0]" + ) +} + +#[test] +fn shknda_2_5() { + assert_eq!( + shape("fonts/NotoSansKannada-Regular.ttf", 1000, &[], "ಜಿ಼ೕಬೆನ್"), + "[gid211|gid55@652,0|gid71@776,0|gid259@1188,0|gid186@1994,0]" + ) +} + +#[test] +fn shknda_2_6() { + assert_eq!( + shape("fonts/NotoSansKannada-Regular.ttf", 1000, &[], "ಜಾ಼ಕಿರ್"), + "[gid139|gid57@776,0|gid55@652,0|gid205@1225,0|gid193@1799,0]" + ) +} + +#[test] +fn shknda_2_7() { + assert_eq!( + shape("fonts/NotoSansKannada-Regular.ttf", 1000, &[], "ಇನ್ಫ್ಲೆಕ್ಷನಲ್"), + "[gid8|gid256@711,0|gid118@1422,0|gid335@1591,0|gid282@1978,0|gid39@2552,0|gid195@3263,0]" + ) +} + +#[test] +fn shknda_2_8() { + assert_eq!( + shape("fonts/NotoSansKannada-Regular.ttf", 1000, &[], "ಇನ್ಫ್ಲೆಕ್ಷನ್"), + "[gid8|gid256@711,0|gid118@1422,0|gid335@1591,0|gid282@1978,0|gid186@2552,0]" + ) +} + +#[test] +fn shknda_2_9() { + assert_eq!( + shape("fonts/NotoSansKannada-Regular.ttf", 1000, &[], "ದಟ್ಸ್"), + "[gid37|gid177@765,0|gid130@1814,0]" + ) +} + +#[test] +fn shknda_2_10() { + assert_eq!( + shape("fonts/NotoSansKannada-Regular.ttf", 1000, &[], "ಎಕ್ಸ್"), + "[gid14|gid167@787,0|gid130@1596,0]" + ) +} + +#[test] +fn shknda_2_11() { + assert_eq!( + shape("fonts/NotoSansKannada-Regular.ttf", 1000, &[], "ಮಾರ್ಚ್"), + "[gid155|gid57@1156,0|gid172@1605,0|gid94@2718,0]" + ) +} + +#[test] +fn shknda_2_12() { + assert_eq!( + shape("fonts/NotoSansKannada-Regular.ttf", 1000, &[], "ಟೆಕ್ಸ್ಟ್"), + "[gid247|gid167@815,0|gid130@1624,0|gid317@1792,0]" + ) +} + +#[test] +fn shknda_2_13() { + assert_eq!( + shape("fonts/NotoSansKannada-Regular.ttf", 1000, &[], "ಬುಕ್ಸ್"), + "[gid42|gid60@801,0|gid167@1165,0|gid130@1974,0]" + ) +} + +#[test] +fn shknda_2_14() { + assert_eq!( + shape("fonts/NotoSansKannada-Regular.ttf", 1000, &[], "ಸಾಫ್ಟ್"), + "[gid163|gid57@709,0|gid188@1158,0|gid107@2184,0]" + ) +} + +#[test] +fn shknda_2_15() { + assert_eq!( + shape("fonts/NotoSansKannada-Regular.ttf", 1000, &[], "ಜಸ್ಟ್"), + "[gid27|gid200@776,0|gid107@1720,0]" + ) +} + +#[test] +fn shknda_3_0() { + assert_eq!( + shape("fonts/NotoSansKannada-Regular.ttf", 1000, &[], "ಕೋಂ"), + "[gid239|gid61@574,0|gid71@1319,0|gid4@1731,0]" + ) +} + +#[test] +fn shknda_3_1() { + assert_eq!( + shape("fonts/NotoSansKannada-Regular.ttf", 1000, &[], "ಖೋಂ"), + "[gid240|gid61@865,0|gid71@1610,0|gid4@2022,0]" + ) +} + +#[test] +fn shknda_3_2() { + assert_eq!( + shape("fonts/NotoSansKannada-Regular.ttf", 1000, &[], "ಗೋಂ"), + "[gid241|gid61@648,0|gid71@1393,0|gid4@1805,0]" + ) +} + +#[test] +fn shknda_3_3() { + assert_eq!( + shape("fonts/NotoSansKannada-Regular.ttf", 1000, &[], "ಘೋಂ"), + "[gid242|gid279@997,0|gid71@1742,0|gid4@2153,0]" + ) +} + +#[test] +fn shknda_3_4() { + assert_eq!( + shape("fonts/NotoSansKannada-Regular.ttf", 1000, &[], "ಙೋಂ"), + "[gid24|gid67@737,0|gid71@1718,0|gid4@2130,0]" + ) +} + +#[test] +fn shknda_3_5() { + assert_eq!( + shape("fonts/NotoSansKannada-Regular.ttf", 1000, &[], "ಚೋಂ"), + "[gid243|gid61@795,0|gid71@1540,0|gid4@1952,0]" + ) +} + +#[test] +fn shknda_3_6() { + assert_eq!( + shape("fonts/NotoSansKannada-Regular.ttf", 1000, &[], "ಛೋಂ"), + "[gid244|gid61@843,0|gid71@1588,0|gid4@2000,0]" + ) +} + +#[test] +fn shknda_3_7() { + assert_eq!( + shape("fonts/NotoSansKannada-Regular.ttf", 1000, &[], "ಜೋಂ"), + "[gid245|gid61@776,0|gid71@1522,0|gid4@1933,0]" + ) +} + +#[test] +fn shknda_3_8() { + assert_eq!( + shape("fonts/NotoSansKannada-Regular.ttf", 1000, &[], "ಝೋಂ"), + "[gid246|gid61@1379,0|gid71@2124,0|gid4@2536,0]" + ) +} + +#[test] +fn shknda_3_9() { + assert_eq!( + shape("fonts/NotoSansKannada-Regular.ttf", 1000, &[], "ಞೋಂ"), + "[gid29|gid67@968,0|gid71@1949,0|gid4@2360,0]" + ) +} + +#[test] +fn shknda_3_10() { + assert_eq!( + shape("fonts/NotoSansKannada-Regular.ttf", 1000, &[], "ಟೋಂ"), + "[gid247|gid61@815,0|gid71@1560,0|gid4@1972,0]" + ) +} + +#[test] +fn shknda_3_11() { + assert_eq!( + shape("fonts/NotoSansKannada-Regular.ttf", 1000, &[], "ಠೋಂ"), + "[gid248|gid61@651,0|gid71@1397,0|gid4@1808,0]" + ) +} + +#[test] +fn shknda_3_12() { + assert_eq!( + shape("fonts/NotoSansKannada-Regular.ttf", 1000, &[], "ಡೋಂ"), + "[gid249|gid61@768,0|gid71@1513,0|gid4@1925,0]" + ) +} + +#[test] +fn shknda_3_13() { + assert_eq!( + shape("fonts/NotoSansKannada-Regular.ttf", 1000, &[], "ಢೋಂ"), + "[gid250|gid61@768,0|gid71@1513,0|gid4@1925,0]" + ) +} + +#[test] +fn shknda_3_14() { + assert_eq!( + shape("fonts/NotoSansKannada-Regular.ttf", 1000, &[], "ಣೋಂ"), + "[gid251|gid61@867,0|gid71@1612,0|gid4@2023,0]" + ) +} + +#[test] +fn shknda_3_15() { + assert_eq!( + shape("fonts/NotoSansKannada-Regular.ttf", 1000, &[], "ತೋಂ"), + "[gid252|gid61@623,0|gid71@1368,0|gid4@1779,0]" + ) +} + +#[test] +fn shknda_3_16() { + assert_eq!( + shape("fonts/NotoSansKannada-Regular.ttf", 1000, &[], "ಥೋಂ"), + "[gid253|gid61@765,0|gid71@1510,0|gid4@1921,0]" + ) +} + +#[test] +fn shknda_3_17() { + assert_eq!( + shape("fonts/NotoSansKannada-Regular.ttf", 1000, &[], "ದೋಂ"), + "[gid254|gid61@765,0|gid71@1510,0|gid4@1921,0]" + ) +} + +#[test] +fn shknda_3_18() { + assert_eq!( + shape("fonts/NotoSansKannada-Regular.ttf", 1000, &[], "ಧೋಂ "), + "[gid255|gid61@765,0|gid71@1510,0|gid4@1921,0|gid3@2472,0]" + ) +} + +#[test] +fn shknda_3_19() { + assert_eq!( + shape("fonts/NotoSansKannada-Regular.ttf", 1000, &[], "ನೋಂ"), + "[gid256|gid61@711,0|gid71@1456,0|gid4@1868,0]" + ) +} + +#[test] +fn shknda_3_20() { + assert_eq!( + shape("fonts/NotoSansKannada-Regular.ttf", 1000, &[], "ಪೋಂ"), + "[gid257|gid275@792,0|gid71@1434,0|gid4@1846,0]" + ) +} + +#[test] +fn shknda_3_21() { + assert_eq!( + shape("fonts/NotoSansKannada-Regular.ttf", 1000, &[], "ಫೋಂ"), + "[gid258|gid277@792,0|gid71@1434,0|gid4@1846,0]" + ) +} + +#[test] +fn shknda_3_22() { + assert_eq!( + shape("fonts/NotoSansKannada-Regular.ttf", 1000, &[], "ಬೋಂ"), + "[gid259|gid61@806,0|gid71@1551,0|gid4@1963,0]" + ) +} + +#[test] +fn shknda_3_23() { + assert_eq!( + shape("fonts/NotoSansKannada-Regular.ttf", 1000, &[], "ಭೋಂ"), + "[gid260|gid61@806,0|gid71@1551,0|gid4@1963,0]" + ) +} + +#[test] +fn shknda_3_24() { + assert_eq!( + shape("fonts/NotoSansKannada-Regular.ttf", 1000, &[], "ಮೋಂ"), + "[gid280|gid71@1539,0|gid4@1951,0]" + ) +} + +#[test] +fn shknda_3_25() { + assert_eq!( + shape("fonts/NotoSansKannada-Regular.ttf", 1000, &[], "ಯೋಂ"), + "[gid281|gid71@1712,0|gid4@2124,0]" + ) +} + +#[test] +fn shknda_3_26() { + assert_eq!( + shape("fonts/NotoSansKannada-Regular.ttf", 1000, &[], "ರೋಂ"), + "[gid263|gid61@651,0|gid71@1397,0|gid4@1808,0]" + ) +} + +#[test] +fn shknda_3_27() { + assert_eq!( + shape("fonts/NotoSansKannada-Regular.ttf", 1000, &[], "ಱೋಂ"), + "[gid47|gid67@831,0|gid71@1812,0|gid4@2223,0]" + ) +} + +#[test] +fn shknda_3_28() { + assert_eq!( + shape("fonts/NotoSansKannada-Regular.ttf", 1000, &[], "ಲೋಂ"), + "[gid264|gid61@769,0|gid71@1514,0|gid4@1925,0]" + ) +} + +#[test] +fn shknda_3_29() { + assert_eq!( + shape("fonts/NotoSansKannada-Regular.ttf", 1000, &[], "ವೋಂ"), + "[gid266|gid275@794,0|gid71@1437,0|gid4@1848,0]" + ) +} + +#[test] +fn shknda_3_30() { + assert_eq!( + shape("fonts/NotoSansKannada-Regular.ttf", 1000, &[], "ಆ್ಯಕ್ಷಿಸ್‌"), + "[gid7|gid122@838,0|gid285@1098,0|gid200@1672,0|gid3@2694,0]" + ) +}