From 568b95c955dadb8eff6f96c8a78841b695e3ef43 Mon Sep 17 00:00:00 2001 From: Jake Jackson Date: Thu, 17 Sep 2026 10:03:48 +1000 Subject: [PATCH 1/4] Choose an Indic run's shaper on the script chosen for it, as HarfBuzz does (#199) Otl::applyOTL() sent a run whose script has a shaper of its own to that shaper under any GSUB script, DFLT and latn included, and skipped a run the font offered no script for entirely. HarfBuzz decides the other way round in hb_ot_shaper_categorize(): under DFLT, or latn picked as the last fallback, the default shaper lays the run out with the font's features alone, and with no script chosen the script's shaper still runs. shaperForScriptTag() now makes that choice once the tags are known, per shaper as HarfBuzz 14.3.1 has it: - Indic, Sinhala and the South East Asian scripts (Indic and USE in HarfBuzz), and N'Ko and Mandaic: the default shaper under DFLT or latn - Myanmar: also under mymr, which replaces the mym2-only check - Syriac: the default shaper under DFLT only - Arabic, Khmer, Thai and Lao: their own shaper whatever was chosen A run with no script reaches its shaper as long as the document opened the script to OpenType layout (useOTL 0x80, which covers every script with a shaper). It is shaped with no lookups: loadGsubData() reads no GSUB table for it, which the font need not have, and the GSUB rule walks read the font's features for a script and language through gsubFeatures(), which has none to give. Measured with Noto Sans Bengali subsets whose GSUB has one 'locl' lookup, KA + I and KA + VIRAMA + SSA + I: DFLT and deva 09BF 0997 / 0997 09CD 09BF 09B7 -> 0997 09BF / 0997 09CD 09B7 09BF guru only 0995 09BF / 0995 09CD 09B7 09BF -> 09BF 0995 / 0995 09CD 09BF 09B7 which is what hb-shape draws. 288 lines of the shaping golden master move over 31 fonts, all of them now what hb-shape draws on the same font and text, 18 of them before as well: those 18 are an Arabic run gaining a kashida point on its tatweel in fonts with no Arabic script, and draw the same. The rest are the Devanagari, Bengali and Gurmukhi runs, reordered in the 8 fonts with no script for them and no longer in the fonts laying them out under DFLT or latn, and the Khmer run reordered in the 8 fonts with no Khmer script. The South East Asian shaper is now reached only under a Tai Tham tag, and Lanna Alif offers latn, so SeaTest and the Tai Tham snapshot, which pin a cluster reaching its reorderer through a 'ccmp' ligature, move to NotoSansTaiTham-LanaScript-Synthetic. The snapshot's broken cluster loses the dotted circle Lanna Alif drew; the new font has none. Test fonts: NotoSansBengali-GuruScript-Synthetic (Noto Sans Bengali 3.011, OFL 1.1) and NotoSansTaiTham-LanaScript-Synthetic (Noto Sans Tai Tham 2.002, OFL 1.1, script retagged lana, its Sakot ligatures moved from liga to ccmp), built in fontTools 4.59.2. Co-Authored-By: Claude Opus 5 (1M context) --- src/Otl.php | 80 +++++++++--- tests/Mpdf/Shaper/SeaTest.php | 36 ++--- tests/Mpdf/ShaperChoiceTest.php | 95 ++++++++++++++ tests/Snapshots/TaiThamSakotSnapshotTest.php | 44 ++++--- .../NotoSansBengali-GuruScript-Synthetic.json | 70 ++++++++++ .../NotoSansTaiTham-LanaScript-Synthetic.json | 72 ++++++++++ .../NotoSansBengali-GuruScript-Synthetic.txt | 34 +++++ .../NotoSansTaiTham-LanaScript-Synthetic.txt | 19 +++ .../Carlito-MarkAttachmentType-Subset.txt | 18 +-- tests/data/shaping/Manjari-Regular.txt | 18 +-- .../shaping/Molengo-GSUB52Class0-Subset.txt | 18 +-- .../data/shaping/NotoMusic-GSUB52-Subset.txt | 12 +- .../data/shaping/NotoSans-GPOS3-Synthetic.txt | 30 ++--- .../shaping/NotoSans-GPOS72-Synthetic.txt | 12 +- .../shaping/NotoSans-GPOS73-Synthetic.txt | 12 +- .../NotoSans-GPOS83-Guard-Synthetic.txt | 12 +- .../NotoSans-GSUB2-BigSubtable-Synthetic.txt | 18 +-- ...otoSans-GSUB53-NestedAdvance-Synthetic.txt | 18 +-- .../NotoSans-GSUBClassZero-Synthetic.txt | 18 +-- tests/data/shaping/NotoSans-Regular.txt | 12 +- .../NotoSansArabic-GSUB11Wrap-Synthetic.txt | 18 +-- .../shaping/NotoSansArabic-Joining-Subset.txt | 12 +- .../NotoSansArabic-MultipleFinal-Subset.txt | 24 ++-- .../NotoSansArabic-MultipleForm-Subset.txt | 24 ++-- .../NotoSansBengali-DevaScript-Synthetic.txt | 18 +-- .../NotoSansBengali-GuruScript-Synthetic.txt | 92 +++++++++++++ .../shaping/NotoSansCoptic-GSUB81-Subset.txt | 12 +- ...toSansDevanagari-ContextualLocl-Subset.txt | 30 ++--- ...NotoSansGurmukhi-NestedCoverage-Subset.txt | 30 ++--- .../NotoSansGurmukhiUI-GPOS71-Subset.txt | 24 ++-- .../shaping/NotoSansMono-GDEF13-Subset.txt | 18 +-- .../NotoSansSaurashtra-GSUB53-Subset.txt | 18 +-- tests/data/shaping/NotoSansSinhala-Subset.txt | 18 +-- .../shaping/NotoSansSyriac-Joining-Subset.txt | 18 +-- .../NotoSansTC-RegionLangSys-Synthetic.txt | 30 ++--- .../NotoSansTaiTham-LanaScript-Synthetic.txt | 92 +++++++++++++ .../shaping/NotoSansTakri-GPOS81-Subset.txt | 12 +- .../shaping/NotoSansTakri-GSUB53-Subset.txt | 12 +- .../NotoSansWancho-ScriptTag-Subset.txt | 30 ++--- tests/data/shaping/Poppins-Regular.txt | 12 +- .../shaping/SedanSC-EmptyFeature-Subset.txt | 18 +-- tests/data/snapshots/tai-tham-sakot.pdf | Bin 42227 -> 34257 bytes .../NotoSansBengali-GuruScript-Synthetic.json | 123 ++++++++++++++++++ .../NotoSansTaiTham-LanaScript-Synthetic.json | 123 ++++++++++++++++++ .../NotoSansBengali-GuruScript-Synthetic.ttf | Bin 0 -> 2400 bytes .../NotoSansTaiTham-LanaScript-Synthetic.ttf | Bin 0 -> 2236 bytes 46 files changed, 1121 insertions(+), 335 deletions(-) create mode 100644 tests/Mpdf/ShaperChoiceTest.php create mode 100644 tests/data/fontcache/NotoSansBengali-GuruScript-Synthetic.json create mode 100644 tests/data/fontcache/NotoSansTaiTham-LanaScript-Synthetic.json create mode 100644 tests/data/otldump/NotoSansBengali-GuruScript-Synthetic.txt create mode 100644 tests/data/otldump/NotoSansTaiTham-LanaScript-Synthetic.txt create mode 100644 tests/data/shaping/NotoSansBengali-GuruScript-Synthetic.txt create mode 100644 tests/data/shaping/NotoSansTaiTham-LanaScript-Synthetic.txt create mode 100644 tests/data/subset/NotoSansBengali-GuruScript-Synthetic.json create mode 100644 tests/data/subset/NotoSansTaiTham-LanaScript-Synthetic.json create mode 100644 tests/data/ttf/NotoSansBengali-GuruScript-Synthetic.ttf create mode 100644 tests/data/ttf/NotoSansTaiTham-LanaScript-Synthetic.ttf diff --git a/src/Otl.php b/src/Otl.php index b93ca3255..d0052ec9f 100644 --- a/src/Otl.php +++ b/src/Otl.php @@ -206,19 +206,21 @@ function applyOTL($str, $useOTL) list($GSUBscriptTag, $GSUBlangsys, $GPOSscriptTag, $GPOSlangsys, $is_old_spec) = $this->selectScriptAndLanguage($scriptblock, $useOTL); - if (!$GSUBscriptTag && !$GSUBlangsys && !$GPOSscriptTag && !$GPOSlangsys) { + $this->shaper = $this->shaperForScriptTag($scriptblock, $GSUBscriptTag); + + // A run the font offers no script for still goes to its shaper, which reorders it with + // no lookups to apply. Every script with a shaper is one useOTL opens with 0x80, and a + // document that has not opened it gets nothing. + $shapeWithoutTables = $this->shaper && ($useOTL & 0x80); + + if (!$GSUBscriptTag && !$GSUBlangsys && !$GPOSscriptTag && !$GPOSlangsys && !$shapeWithoutTables) { $this->removeJoinControls(false); $this->schOTLdata[$sch] = $this->OTLdata; $this->OTLdata = []; continue; } - // Don't use MYANMAR shaper unless using v2 scripttag - if ($this->shaper == 'M' && $GSUBscriptTag != 'mym2') { - $this->shaper = ''; - } - - $GSUBFeatures = (isset($this->mpdf->CurrentFont['GSUBFeatures'][$GSUBscriptTag][$GSUBlangsys]) ? $this->mpdf->CurrentFont['GSUBFeatures'][$GSUBscriptTag][$GSUBlangsys] : false); + $GSUBFeatures = $this->gsubFeatures($GSUBscriptTag, $GSUBlangsys); $GPOSFeatures = (isset($this->mpdf->CurrentFont['GPOSFeatures'][$GPOSscriptTag][$GPOSlangsys]) ? $this->mpdf->CurrentFont['GPOSFeatures'][$GPOSscriptTag][$GPOSlangsys] : false); $this->assocLigs = []; // Ligatures[$posarr lpos] => nc @@ -475,11 +477,11 @@ private function insertWordBoundaries($scriptblock) */ private function applyGSUB($GSUBscriptTag, $GSUBlangsys, $GSUBFeatures, $scriptblock, $is_old_spec) { - if (!$GSUBscriptTag || !$GSUBlangsys || !$GSUBFeatures) { + if (!$GSUBFeatures && !$this->shaper) { return ''; } - $this->loadGsubData($GSUBscriptTag, $GSUBlangsys); + $this->loadGsubData($GSUBscriptTag, $GSUBlangsys, (bool) $GSUBFeatures); // 5. GSUB - Shaper if ($this->shaper == 'A') { @@ -515,9 +517,8 @@ private function applyGSUB($GSUBscriptTag, $GSUBlangsys, $GSUBFeatures, $scriptb * and language; the coverage of every lookup, which is how a lookup is passed over without being * read; and the lookup list itself. */ - private function loadGsubData($GSUBscriptTag, $GSUBlangsys) + private function loadGsubData($GSUBscriptTag, $GSUBlangsys, $hasFeatures) { - $this->readTable('GSUB'); $this->GSUBfont = $this->fontkey . '.GSUB.' . $GSUBscriptTag . '.' . $GSUBlangsys; if (!isset($this->GSUBdata[$this->GSUBfont])) { @@ -541,6 +542,14 @@ private function loadGsubData($GSUBscriptTag, $GSUBlangsys) } } + // Nothing past this is read for a run with no lookups, and its font need not have a GSUB + // table at all + if (!$hasFeatures) { + return; + } + + $this->readTable('GSUB'); + $fontCacheFilename = $this->fontkey . '.GSUBdata.json'; if (!isset($this->GSUBdata[$this->fontkey]) && $this->fontCache->jsonHas($fontCacheFilename)) { $this->GSLuCoverage = $this->GSUBdata[$this->fontkey]['GSLuCoverage'] = $this->fontCache->jsonLoad($fontCacheFilename); @@ -1330,6 +1339,47 @@ private function selectShaper($scriptblock) } } + /** + * Which shaper a run gets once the font's GSUB script for it is known. + * + * As HarfBuzz's hb_ot_shaper_categorize(): a font designed for DFLT, or one where the choice fell + * through to latn, is laid out by its features alone, and no script at all is not a reason to + * skip the shaper. Khmer, Thai and Lao keep theirs whatever was chosen, Arabic too, and Syriac + * everywhere but under DFLT. Myanmar also gives the pre-specification mymr to the default shaper. + * + * @param int $scriptblock The run's Unicode script, as Ucdn::SCRIPT_* + * @param string $GSUBscriptTag The GSUB script chosen for it, or '' for none + * + * @return string The shaper, as selectShaper() names it + */ + private function shaperForScriptTag($scriptblock, $GSUBscriptTag) + { + if ($this->shaper == 'K' || $this->shaper == 'T' || $this->shaper == 'L' || $scriptblock == Ucdn::SCRIPT_ARABIC) { + return $this->shaper; + } + + if ($scriptblock == Ucdn::SCRIPT_SYRIAC) { + return $GSUBscriptTag == 'DFLT' ? '' : $this->shaper; + } + + if ($GSUBscriptTag == 'DFLT' || $GSUBscriptTag == 'latn' || ($this->shaper == 'M' && $GSUBscriptTag == 'mymr')) { + return ''; + } + + return $this->shaper; + } + + /** + * @return array The GSUB features the font offers under a script and language system, by tag, + * or none where it offers neither + */ + private function gsubFeatures($scriptTag, $langsys) + { + return isset($this->mpdf->CurrentFont['GSUBFeatures'][$scriptTag][$langsys]) + ? $this->mpdf->CurrentFont['GSUBFeatures'][$scriptTag][$langsys] + : []; + } + /** * Phase 3: which script and language system of the font to lay this run out with. * @@ -1531,7 +1581,7 @@ function _applyGSUBrules($usetags, $scriptTag, $langsys) // - Implemented in functions checkContextMatch and checkContextMatchMultiple by failing to match if outside scope of current 'syllable' // if $this->restrictToSyllable is true - $GSUBFeatures = $this->mpdf->CurrentFont['GSUBFeatures'][$scriptTag][$langsys]; + $GSUBFeatures = $this->gsubFeatures($scriptTag, $langsys); $LookupList = []; foreach ($GSUBFeatures as $tag => $arr) { if (strpos($usetags, $tag) !== false) { @@ -1592,7 +1642,7 @@ function _applyGSUBrulesSingly($usetags, $scriptTag, $langsys) { // Features are applied one at a time, working through each codepoint - $GSUBFeatures = $this->mpdf->CurrentFont['GSUBFeatures'][$scriptTag][$langsys]; + $GSUBFeatures = $this->gsubFeatures($scriptTag, $langsys); // A reverse Lookup runs the other way down the glyphs, so it cannot share the cursor the rest // of the list walks forward. Taking each over the whole run up front costs nothing here: this @@ -1680,7 +1730,7 @@ function _applyGSUBrulesMyanmar($usetags, $scriptTag, $langsys) // $usetags = locl ccmp rphf pref blwf pstf'; // applied to all characters - $GSUBFeatures = $this->mpdf->CurrentFont['GSUBFeatures'][$scriptTag][$langsys]; + $GSUBFeatures = $this->gsubFeatures($scriptTag, $langsys); // ALL should be applied one syllable at a time // Implemented in functions checkContextMatch and checkContextMatchMultiple by failing to match if outside scope of current 'syllable' @@ -1753,7 +1803,7 @@ function _applyGSUBrulesIndic($usetags, $scriptTag, $langsys, $is_old_spec) // rphf, pref, blwf, half, abvf, pstf, and init are only applied where ['mask'] indicates: Indic::FLAG(Indic::RPHF); // The rest are applied to all characters - $GSUBFeatures = $this->mpdf->CurrentFont['GSUBFeatures'][$scriptTag][$langsys]; + $GSUBFeatures = $this->gsubFeatures($scriptTag, $langsys); // ALL should be applied one syllable at a time // Implemented in functions checkContextMatch and checkContextMatchMultiple by failing to match if outside scope of current 'syllable' diff --git a/tests/Mpdf/Shaper/SeaTest.php b/tests/Mpdf/Shaper/SeaTest.php index 535ba7415..80d4736a0 100644 --- a/tests/Mpdf/Shaper/SeaTest.php +++ b/tests/Mpdf/Shaper/SeaTest.php @@ -10,14 +10,16 @@ * pass makes glyphs the categorising pass never saw, and Otl handed them on without a * ['sea_category'] of their own - which the reorderer reads on the last glyph of a broken cluster. * - * Lanna Alif is the font throughout. Its 'ccmp' ligates a Sakot with the consonant after it into a - * subscript form, and the glyph that comes out has no codepoint of its own, so it is mapped into the - * Private Use Area as the subset is built. + * The shaper is only reached under a Tai Tham script tag, and no Tai Tham font in reach offers one: + * Lanna Alif has latn, and Noto Sans Tai Tham DFLT and latn, under which HarfBuzz and mPDF both use + * the default shaper. NotoSansTaiTham-LanaScript-Synthetic is a subset of Noto Sans Tai Tham 2.002 + * (OFL 1.1) with its script retagged lana and its Sakot ligatures moved from 'liga' to 'ccmp'. The + * ligature has no codepoint of its own, so it is mapped into the Private Use Area as the subset is + * built. `hb-shape` draws what each test below expects. * * What the read turns on is that the last glyph of the cluster came out of that pass, not how long - * the cluster is. Lanna Alif carries U+25CC, so a dotted circle is inserted ahead of the ligature - * and the cluster is two elements; Noto Sans Tai Tham carries none, and the same cluster is one. - * Both raised the warning. + * the cluster is. The font has no dotted circle to put in front of the ligature, so the cluster is + * one glyph; Lanna Alif, which has one, warned on a cluster of two. */ class SeaTest extends \Yoast\PHPUnitPolyfills\TestCases\TestCase { @@ -28,11 +30,8 @@ class SeaTest extends \Yoast\PHPUnitPolyfills\TestCases\TestCase /** U+1A60 TAI THAM SIGN SAKOT, which subscripts the consonant after it */ const SAKOT = 0x1A60; - /** U+25CC DOTTED CIRCLE, inserted in front of a cluster with no base consonant */ - const DOTTED_CIRCLE = 0x25CC; - - /** The subscript High Ka that Lanna Alif's 'ccmp' substitutes for Sakot + High Ka */ - const SAKOT_HIGH_KA = 0xF001; + /** The subscript High Ka that the font's 'ccmp' substitutes for Sakot + High Ka */ + const SAKOT_HIGH_KA = 0xE002; /** * A Sakot with no consonant in front of it is a broken cluster, and the reorderer reads the @@ -57,13 +56,12 @@ public function testAGlyphSubstitutedBeforeTheReorderingCarriesACategoryIntoIt() restore_error_handler(); $this->assertSame([], $raised); - $this->assertSame([self::DOTTED_CIRCLE, self::SAKOT_HIGH_KA], $drawn); + $this->assertSame([self::SAKOT_HIGH_KA], $drawn); } /** * The same Sakot inside a well-formed cluster, which is what the rule is for: the consonant in - * front of it is the base, no dotted circle is needed, and the pair after it is subscripted under - * it. + * front of it is the base, and the pair after it is subscripted under it. */ public function testASakotInsideAClusterSubscriptsTheConsonantAfterIt() { @@ -94,8 +92,14 @@ private function drawn($codepoints) $html .= sprintf('&#x%04X;', $codepoint); } - $mpdf = new TextRecordingMpdf(); - $mpdf->WriteHTML('

' . $html . '

'); + $mpdf = new TextRecordingMpdf([ + 'fontDir' => [__DIR__ . '/../../data/ttf'], + 'fontdata' => ['notosanstaithamlanascriptsynthetic' => [ + 'R' => 'NotoSansTaiTham-LanaScript-Synthetic.ttf', + 'useOTL' => 0xFF, + ]], + ]); + $mpdf->WriteHTML('

' . $html . '

'); return array_values(unpack('N*', mb_convert_encoding($mpdf->drawnText[0], 'UTF-32BE', 'UTF-8'))); } diff --git a/tests/Mpdf/ShaperChoiceTest.php b/tests/Mpdf/ShaperChoiceTest.php new file mode 100644 index 000000000..7d3e78f56 --- /dev/null +++ b/tests/Mpdf/ShaperChoiceTest.php @@ -0,0 +1,95 @@ +assertSame([self::GA, self::I], $this->drawn('NotoSansBengali-DevaScript-Synthetic', [self::KA, self::I])); + } + + public function testAnIndicRunTheFontOffersNoScriptForIsReorderedWithNothingSubstituted() + { + $this->assertSame([self::I, self::KA], $this->drawn('NotoSansBengali-GuruScript-Synthetic', [self::KA, self::I])); + } + + /** + * The original specification puts the matra before the base consonant, SSA, and after the KA and + * virama in front of it. The v2 specification would put it before the whole conjunct. + */ + public function testAnIndicRunWithNoScriptIsReorderedToTheOriginalSpecification() + { + $this->assertSame( + [self::KA, self::VIRAMA, self::I, self::SSA], + $this->drawn('NotoSansBengali-GuruScript-Synthetic', [self::KA, self::VIRAMA, self::SSA, self::I]) + ); + } + + public function testARunInAScriptTheDocumentHasNotOpenedToOpenTypeLayoutIsNotShaped() + { + $this->assertSame([self::KA, self::I], $this->drawn('NotoSansBengali-GuruScript-Synthetic', [self::KA, self::I], 0x01)); + } + + /** + * Lanna Alif offers only latn. Its 'ccmp' ligates a Sakot with the High Ka after it, and with no + * South East Asian shaper the broken cluster gets no dotted circle in front of it. + */ + public function testATaiThamRunUnderLatnIsLaidOutByTheFontsFeaturesAlone() + { + $mpdf = new TextRecordingMpdf(); + $mpdf->WriteHTML('

᩠ᨠ

'); + + // The ligature has no codepoint of its own, and is mapped into the Private Use Area + $this->assertSame([0xF001], $this->codepoints($mpdf->drawnText[0])); + } + + private function drawn($font, array $codepoints, $useOTL = 0xFF) + { + $key = strtolower(str_replace('-', '', $font)); + + $mpdf = new TextRecordingMpdf([ + 'mode' => 'utf-8', + 'fontDir' => [__DIR__ . '/../data/ttf'], + 'fontdata' => [$key => ['R' => $font . '.ttf', 'useOTL' => $useOTL]], + 'default_font' => $key, + ]); + + $html = ''; + foreach ($codepoints as $codepoint) { + $html .= sprintf('&#x%04X;', $codepoint); + } + $mpdf->WriteHTML('

' . $html . '

'); + + return $this->codepoints($mpdf->drawnText[0]); + } + + private function codepoints($text) + { + return array_values(unpack('N*', mb_convert_encoding($text, 'UTF-32BE', 'UTF-8'))); + } + +} diff --git a/tests/Snapshots/TaiThamSakotSnapshotTest.php b/tests/Snapshots/TaiThamSakotSnapshotTest.php index 4bc222f52..74cbcf986 100644 --- a/tests/Snapshots/TaiThamSakotSnapshotTest.php +++ b/tests/Snapshots/TaiThamSakotSnapshotTest.php @@ -14,15 +14,16 @@ * Myanmar categories onto them and carried nothing onto these, so a Sakot ligated with the consonant * after it reached the reorderer with no category, and reading it was a warning per run. * - * Lanna Alif is the font throughout. Its 'ccmp' ligates a Sakot with the consonant after it into a - * subscript form whose glyph has no codepoint of its own, so it is mapped into the Private Use Area - * as the subset is built and the samples are read off the page and compared with each other rather - * than named. + * The font throughout is NotoSansTaiTham-LanaScript-Synthetic, a subset of Noto Sans Tai Tham whose + * script is retagged lana: the shaper is only reached under a Tai Tham tag, and Lanna Alif, which + * offers latn, is laid out by the default shaper as HarfBuzz lays it out. Its 'ccmp' ligates a Sakot + * with the consonant after it into a subscript form whose glyph has no codepoint of its own, so it is + * mapped into the Private Use Area as the subset is built and the samples are read off the page and + * compared with each other rather than named. * * Nothing here is drawn differently: a missing category read as null matched nothing at the one test - * that reads it, and the fixture is byte-identical to the one the code before the fix writes. What it - * pins is a cluster that reaches the reorderer through a substitution, so moving where the category - * comes from has to move a page to get through. + * that reads it. What it pins is a cluster that reaches the reorderer through a substitution, so + * moving where the category comes from has to move a page to get through. * * @group snapshot */ @@ -57,10 +58,22 @@ public function getId() */ public function generatePdf() { - $this->mpdf = $this->createMpdf(['mode' => 'utf-8']); + $this->mpdf = $this->createMpdf(self::config()); $this->mpdf->WriteHTML($this->style() . $this->samples()); } + private static function config() + { + return [ + 'mode' => 'utf-8', + 'fontDir' => [__DIR__ . '/../data/ttf'], + 'fontdata' => ['taithamlana' => [ + 'R' => 'NotoSansTaiTham-LanaScript-Synthetic.ttf', + 'useOTL' => 0xFF, + ]], + ]; + } + private function style() { ob_start(); @@ -69,14 +82,14 @@ private function style() h2 { font-size: 12pt; margin-bottom: 1mm; } p.note { font-size: 9pt; color: #606060; margin-top: 0; } p.label { font-size: 9pt; color: #606060; margin-bottom: 0; } - p.sample { font-family: lannaalif; font-size: 28pt; margin-top: 0; margin-bottom: 3mm; } + p.sample { font-family: taithamlana; font-size: 28pt; margin-top: 0; margin-bottom: 3mm; }

mPDF

Tai Tham clusters joined by a Sakot

A Sakot subscripts the consonant after it, and the two are drawn as one glyph the font substitutes for the pair. Written with no consonant in front of them they are a - broken cluster, and a dotted circle is inserted to stand in for the consonant that is + broken cluster, and the font has no dotted circle to stand in for the consonant that is missing. Read the subscript form under each: the broken cluster draws the same one the well-formed cluster does.

sample('Sakot, High Ka - no base, so a dotted circle carries the pair', self::SAKOT . self::HIGH_KA) + return $this->sample('Sakot, High Ka - no base, so nothing carries the pair', self::SAKOT . self::HIGH_KA) . $this->sample('High Ka, Sakot, High Ka - the same pair under a base, the form to match', self::HIGH_KA . self::SAKOT . self::HIGH_KA) . $this->sample('High Ka alone - the base by itself', self::HIGH_KA) . $this->sample('Sakot alone - nothing to subscript, drawn as it was written', self::SAKOT) @@ -110,24 +123,23 @@ private function sample($label, $text) */ private function glyphsOf($text) { - $mpdf = new TextRecordingMpdf(['mode' => 'utf-8']); + $mpdf = new TextRecordingMpdf(self::config()); $mpdf->WriteHTML($this->style() . '

' . $text . '

'); return array_values(unpack('N*', mb_convert_encoding(end($mpdf->drawnText), 'UTF-32BE', 'UTF-8'))); } /** - * The Sakot and the consonant after it become one glyph either way. In the broken cluster a dotted - * circle stands where the base would be, and the subscript form is the same one the base takes. + * The Sakot and the consonant after it become one glyph either way, and the subscript form the + * broken cluster draws is the same one the base takes. */ public function testTheBrokenClusterDrawsTheSubscriptFormTheWellFormedClusterDraws() { $broken = $this->glyphsOf(self::SAKOT . self::HIGH_KA); $wellFormed = $this->glyphsOf(self::HIGH_KA . self::SAKOT . self::HIGH_KA); - $this->assertCount(2, $broken, 'the broken cluster draws something other than a stand-in and one subscript form'); + $this->assertCount(1, $broken, 'the broken cluster draws something other than one subscript form'); $this->assertSame(end($wellFormed), end($broken), 'the broken cluster draws a subscript form the well-formed one does not'); - $this->assertNotSame($this->glyphsOf(self::HIGH_KA)[0], $broken[0], 'the stand-in is the consonant rather than a dotted circle'); } /** diff --git a/tests/data/fontcache/NotoSansBengali-GuruScript-Synthetic.json b/tests/data/fontcache/NotoSansBengali-GuruScript-Synthetic.json new file mode 100644 index 000000000..fe189750d --- /dev/null +++ b/tests/data/fontcache/NotoSansBengali-GuruScript-Synthetic.json @@ -0,0 +1,70 @@ +{ + "_": "Generated by composer fontcache:update. See tests/Mpdf/Fonts/ParserGoldenMaster.php.", + "fullName": "NotoSansBengali-GuruScript-Synthetic", + "mtx": { + "GSUBScriptLang": { + "guru": "DFLT " + }, + "GSUBFeatures": { + "guru": { + "DFLT": { + "locl": [ + 0 + ] + } + } + }, + "GSUBLookups": [ + { + "Type": 1, + "Flag": 0, + "SubtableCount": 1, + "Subtables": [ + 56 + ], + "MarkFilteringSet": "" + } + ], + "GPOSScriptLang": [], + "GPOSFeatures": [], + "GPOSLookups": [], + "MarkGlyphSets": [ + " 009CD", + " 009CD", + " 009CD", + " 009CD", + " 009CD", + " 009CD", + " 009CD" + ], + "rtlPUAstr": "", + "haskernGPOS": false, + "hassmallcapsGSUB": false + }, + "cache": { + "GDEFdata.json": { + "GlyphClassBases": " 00995| 00996| 00997| 009B7| 009BF| 025CC", + "GlyphClassMarks": " 009CD", + "GlyphClassLigatures": "", + "GlyphClassComponents": "", + "MarkGlyphSets": [ + " 009CD", + " 009CD", + " 009CD", + " 009CD", + " 009CD", + " 009CD", + " 009CD" + ], + "MarkAttachmentType": [] + }, + "GSUB.dat": "68 bytes, sha256 70783ab0e3f3e6d03df78c824bc1cb733550af9c202ae2b88ff0d2a22948c5b1", + "GSUBdata.json": [ + [ + { + "2453": 0 + } + ] + ] + } +} diff --git a/tests/data/fontcache/NotoSansTaiTham-LanaScript-Synthetic.json b/tests/data/fontcache/NotoSansTaiTham-LanaScript-Synthetic.json new file mode 100644 index 000000000..c522fd33a --- /dev/null +++ b/tests/data/fontcache/NotoSansTaiTham-LanaScript-Synthetic.json @@ -0,0 +1,72 @@ +{ + "_": "Generated by composer fontcache:update. See tests/Mpdf/Fonts/ParserGoldenMaster.php.", + "fullName": "NotoSansTaiTham-LanaScript-Synthetic", + "mtx": { + "GSUBScriptLang": { + "lana": "DFLT " + }, + "GSUBFeatures": { + "lana": { + "DFLT": { + "ccmp": [ + 1 + ] + } + } + }, + "GSUBLookups": [ + { + "Type": 4, + "Flag": 0, + "SubtableCount": 1, + "Subtables": [ + 58 + ], + "MarkFilteringSet": "" + }, + { + "Type": 6, + "Flag": 0, + "SubtableCount": 2, + "Subtables": [ + 94, + 118 + ], + "MarkFilteringSet": "" + } + ], + "GPOSScriptLang": [], + "GPOSFeatures": [], + "GPOSLookups": [], + "MarkGlyphSets": [], + "rtlPUAstr": "", + "haskernGPOS": false, + "hassmallcapsGSUB": false + }, + "cache": { + "GDEFdata.json": { + "GlyphClassBases": " 00020| 01A20| 01A21| 01A63| 0E000| 0E001| 0E002", + "GlyphClassMarks": " 01A60", + "GlyphClassLigatures": "", + "GlyphClassComponents": "", + "MarkGlyphSets": [], + "MarkAttachmentType": [] + }, + "GSUB.dat": "148 bytes, sha256 e3e5d6c3ea5a2b4d5a5f7145427e1da577e58e9eb6d32eaa8acfc19bdf1859bb", + "GSUBdata.json": [ + [ + { + "6752": 0 + } + ], + [ + { + "6752": 0 + }, + { + "6752": 0 + } + ] + ] + } +} diff --git a/tests/data/otldump/NotoSansBengali-GuruScript-Synthetic.txt b/tests/data/otldump/NotoSansBengali-GuruScript-Synthetic.txt new file mode 100644 index 000000000..15a78c82c --- /dev/null +++ b/tests/data/otldump/NotoSansBengali-GuruScript-Synthetic.txt @@ -0,0 +1,34 @@ +

GDEF table

+

Glyph classes

+

Glyph class 1

+
Base glyph (single character, spacing glyph)
+
ক খ গ ষ ি ◌
+

Glyph class 3

+
Mark glyph (non-spacing combining glyph)
+
◌্
+

Mark Glyph Sets

+

Mark Glyph Set class: 0

+
◌্
+

Mark Glyph Set class: 1

+
◌্
+

Mark Glyph Set class: 2

+
◌্
+

Mark Glyph Set class: 3

+
◌্
+

Mark Glyph Set class: 4

+
◌্
+

Mark Glyph Set class: 5

+
◌্
+

Mark Glyph Set class: 6

+
◌্
+

GSUB Tables

+

GSUB Scripts & Languages

+
+
guru
DFLT: locl
+
+
GPOS table not defined
+ +=== detail: script guru language DFLT === +

GSUB Tables

+
Lookup #0 [tag: locl]
Subtable #0
LookupType 1: Single Substitution Subtable
U+0995   ক  » »   খ  U+0996
+
GPOS table not defined
diff --git a/tests/data/otldump/NotoSansTaiTham-LanaScript-Synthetic.txt b/tests/data/otldump/NotoSansTaiTham-LanaScript-Synthetic.txt new file mode 100644 index 000000000..3ea0e5150 --- /dev/null +++ b/tests/data/otldump/NotoSansTaiTham-LanaScript-Synthetic.txt @@ -0,0 +1,19 @@ +

GDEF table

+

Glyph classes

+

Glyph class 1

+
Base glyph (single character, spacing glyph)
+
ᨠ ᨡ ᩣ   
+

Glyph class 3

+
Mark glyph (non-spacing combining glyph)
+
◌᩠
+

GSUB Tables

+

GSUB Scripts & Languages

+
+
lana
DFLT: ccmp
+
+
GPOS table not defined
+ +=== detail: script lana language DFLT === +

GSUB Tables

+
Lookup #1 [tag: ccmp]
Subtable #0
LookupType 6: Chaining Contextual Substitution Subtable
Format 3: Coverage-based Chaining Context Glyph Substitution
CONTEXT:
Input #0:  ◌᩠ 
Input #1:  ᨠ 
Substitution Position: 0
Lookup #0 [tag: ccmp]
Subtable #0
LookupType 4: Ligature Substitution Subtable
U+1A60, U+1A20   ◌᩠ ᨠ‍ᨠ  » »   ‍ᨠ  M+E002
U+1A60, U+1A21   ◌᩠ ᨡ‍ᨠ  » »   ‍ᨠ  M+E001
Subtable #1
LookupType 6: Chaining Contextual Substitution Subtable
Format 3: Coverage-based Chaining Context Glyph Substitution
CONTEXT:
Input #0:  ◌᩠ 
Input #1:  ᨡ 
Substitution Position: 0
Lookup #0 [tag: ccmp]
Subtable #0
LookupType 4: Ligature Substitution Subtable
U+1A60, U+1A20   ◌᩠ ᨠ‍ᨡ  » »   ‍ᨡ  M+E002
U+1A60, U+1A21   ◌᩠ ᨡ‍ᨡ  » »   ‍ᨡ  M+E001
+
GPOS table not defined
diff --git a/tests/data/shaping/Carlito-MarkAttachmentType-Subset.txt b/tests/data/shaping/Carlito-MarkAttachmentType-Subset.txt index 086b38621..534d2e30f 100644 --- a/tests/data/shaping/Carlito-MarkAttachmentType-Subset.txt +++ b/tests/data/shaping/Carlito-MarkAttachmentType-Subset.txt @@ -27,17 +27,17 @@ 0x80 07CA 07CB 07CC => 07CA 07CB 07CC group=CCC 0xFF +kern -liga 07CA 07CB 07CC => 07CA 07CB 07CC group=CCC === devanagari === -0xFF 0915 094D 0937 093F => 0915 094D 093F 0937 group=CCCC -0x80 0915 094D 0937 093F => 0915 094D 093F 0937 group=CCCC -0xFF +kern -liga 0915 094D 0937 093F => 0915 094D 093F 0937 group=CCCC +0xFF 0915 094D 0937 093F => 0915 094D 0937 093F group=CCCC +0x80 0915 094D 0937 093F => 0915 094D 0937 093F group=CCCC +0xFF +kern -liga 0915 094D 0937 093F => 0915 094D 0937 093F group=CCCC === bengali === -0xFF 0995 09CD 09B7 09BF => 0995 09CD 09BF 09B7 group=CCCC -0x80 0995 09CD 09B7 09BF => 0995 09CD 09BF 09B7 group=CCCC -0xFF +kern -liga 0995 09CD 09B7 09BF => 0995 09CD 09BF 09B7 group=CCCC +0xFF 0995 09CD 09B7 09BF => 0995 09CD 09B7 09BF group=CCCC +0x80 0995 09CD 09B7 09BF => 0995 09CD 09B7 09BF group=CCCC +0xFF +kern -liga 0995 09CD 09B7 09BF => 0995 09CD 09B7 09BF group=CCCC === gurmukhi === -0xFF 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A3F 0A38 group=CCCC -0x80 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A3F 0A38 group=CCCC -0xFF +kern -liga 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A3F 0A38 group=CCCC +0xFF 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A38 0A3F group=CCCC +0x80 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A38 0A3F group=CCCC +0xFF +kern -liga 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A38 0A3F group=CCCC === tamil === 0xFF 0B95 0BCD 0BB7 0BBF => 0B95 0BCD 0BB7 0BBF group=CCCC 0x80 0B95 0BCD 0BB7 0BBF => 0B95 0BCD 0BB7 0BBF group=CCCC diff --git a/tests/data/shaping/Manjari-Regular.txt b/tests/data/shaping/Manjari-Regular.txt index d2327c9b7..f1b3ee19e 100644 --- a/tests/data/shaping/Manjari-Regular.txt +++ b/tests/data/shaping/Manjari-Regular.txt @@ -27,17 +27,17 @@ 0x80 07CA 07CB 07CC => 07CA 07CB 07CC group=CCC 0xFF +kern -liga 07CA 07CB 07CC => 07CA 07CB 07CC group=CCC === devanagari === -0xFF 0915 094D 0937 093F => 0915 094D 093F 0937 group=CCCC -0x80 0915 094D 0937 093F => 0915 094D 093F 0937 group=CCCC -0xFF +kern -liga 0915 094D 0937 093F => 0915 094D 093F 0937 group=CCCC +0xFF 0915 094D 0937 093F => 0915 094D 0937 093F group=CCCC +0x80 0915 094D 0937 093F => 0915 094D 0937 093F group=CCCC +0xFF +kern -liga 0915 094D 0937 093F => 0915 094D 0937 093F group=CCCC === bengali === -0xFF 0995 09CD 09B7 09BF => 0995 09CD 09BF 09B7 group=CCCC -0x80 0995 09CD 09B7 09BF => 0995 09CD 09BF 09B7 group=CCCC -0xFF +kern -liga 0995 09CD 09B7 09BF => 0995 09CD 09BF 09B7 group=CCCC +0xFF 0995 09CD 09B7 09BF => 0995 09CD 09B7 09BF group=CCCC +0x80 0995 09CD 09B7 09BF => 0995 09CD 09B7 09BF group=CCCC +0xFF +kern -liga 0995 09CD 09B7 09BF => 0995 09CD 09B7 09BF group=CCCC === gurmukhi === -0xFF 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A3F 0A38 group=CCCC -0x80 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A3F 0A38 group=CCCC -0xFF +kern -liga 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A3F 0A38 group=CCCC +0xFF 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A38 0A3F group=CCCC +0x80 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A38 0A3F group=CCCC +0xFF +kern -liga 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A38 0A3F group=CCCC === tamil === 0xFF 0B95 0BCD 0BB7 0BBF => 0B95 0BCD 0BB7 0BBF group=CCCC 0x80 0B95 0BCD 0BB7 0BBF => 0B95 0BCD 0BB7 0BBF group=CCCC diff --git a/tests/data/shaping/Molengo-GSUB52Class0-Subset.txt b/tests/data/shaping/Molengo-GSUB52Class0-Subset.txt index c0cedf1f6..4f11dff58 100644 --- a/tests/data/shaping/Molengo-GSUB52Class0-Subset.txt +++ b/tests/data/shaping/Molengo-GSUB52Class0-Subset.txt @@ -27,17 +27,17 @@ 0x80 07CA 07CB 07CC => 07CA 07CB 07CC group=CCC 0xFF +kern -liga 07CA 07CB 07CC => 07CA 07CB 07CC group=CCC === devanagari === -0xFF 0915 094D 0937 093F => 0915 094D 093F 0937 group=CCCC -0x80 0915 094D 0937 093F => 0915 094D 093F 0937 group=CCCC -0xFF +kern -liga 0915 094D 0937 093F => 0915 094D 093F 0937 group=CCCC +0xFF 0915 094D 0937 093F => 0915 094D 0937 093F group=CCCC +0x80 0915 094D 0937 093F => 0915 094D 0937 093F group=CCCC +0xFF +kern -liga 0915 094D 0937 093F => 0915 094D 0937 093F group=CCCC === bengali === -0xFF 0995 09CD 09B7 09BF => 0995 09CD 09BF 09B7 group=CCCC -0x80 0995 09CD 09B7 09BF => 0995 09CD 09BF 09B7 group=CCCC -0xFF +kern -liga 0995 09CD 09B7 09BF => 0995 09CD 09BF 09B7 group=CCCC +0xFF 0995 09CD 09B7 09BF => 0995 09CD 09B7 09BF group=CCCC +0x80 0995 09CD 09B7 09BF => 0995 09CD 09B7 09BF group=CCCC +0xFF +kern -liga 0995 09CD 09B7 09BF => 0995 09CD 09B7 09BF group=CCCC === gurmukhi === -0xFF 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A3F 0A38 group=CCCC -0x80 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A3F 0A38 group=CCCC -0xFF +kern -liga 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A3F 0A38 group=CCCC +0xFF 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A38 0A3F group=CCCC +0x80 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A38 0A3F group=CCCC +0xFF +kern -liga 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A38 0A3F group=CCCC === tamil === 0xFF 0B95 0BCD 0BB7 0BBF => 0B95 0BCD 0BB7 0BBF group=CCCC 0x80 0B95 0BCD 0BB7 0BBF => 0B95 0BCD 0BB7 0BBF group=CCCC diff --git a/tests/data/shaping/NotoMusic-GSUB52-Subset.txt b/tests/data/shaping/NotoMusic-GSUB52-Subset.txt index 108f135e3..b7bf6bac3 100644 --- a/tests/data/shaping/NotoMusic-GSUB52-Subset.txt +++ b/tests/data/shaping/NotoMusic-GSUB52-Subset.txt @@ -31,13 +31,13 @@ 0x80 0915 094D 0937 093F => 0915 094D 093F 0937 group=CCCC 0xFF +kern -liga 0915 094D 0937 093F => 0915 094D 093F 0937 group=CCCC === bengali === -0xFF 0995 09CD 09B7 09BF => 0995 09CD 09BF 09B7 group=CCCC -0x80 0995 09CD 09B7 09BF => 0995 09CD 09BF 09B7 group=CCCC -0xFF +kern -liga 0995 09CD 09B7 09BF => 0995 09CD 09BF 09B7 group=CCCC +0xFF 0995 09CD 09B7 09BF => 0995 09CD 09B7 09BF group=CCCC +0x80 0995 09CD 09B7 09BF => 0995 09CD 09B7 09BF group=CCCC +0xFF +kern -liga 0995 09CD 09B7 09BF => 0995 09CD 09B7 09BF group=CCCC === gurmukhi === -0xFF 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A3F 0A38 group=CCCC -0x80 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A3F 0A38 group=CCCC -0xFF +kern -liga 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A3F 0A38 group=CCCC +0xFF 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A38 0A3F group=CCCC +0x80 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A38 0A3F group=CCCC +0xFF +kern -liga 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A38 0A3F group=CCCC === tamil === 0xFF 0B95 0BCD 0BB7 0BBF => 0B95 0BCD 0BB7 0BBF group=CCCC 0x80 0B95 0BCD 0BB7 0BBF => 0B95 0BCD 0BB7 0BBF group=CCCC diff --git a/tests/data/shaping/NotoSans-GPOS3-Synthetic.txt b/tests/data/shaping/NotoSans-GPOS3-Synthetic.txt index 38685b72f..fbacbc1c3 100644 --- a/tests/data/shaping/NotoSans-GPOS3-Synthetic.txt +++ b/tests/data/shaping/NotoSans-GPOS3-Synthetic.txt @@ -15,9 +15,9 @@ 0x80 3042 3043 3044 => 3042 3043 3044 group=CCC 0xFF +kern -liga 3042 3043 3044 => 3042 3043 3044 group=CCC === arabic === -0xFF 0628 0640 0645 0644 0627 => 0628 0640 0645 0644 0627 group=CCCCC -0x80 0628 0640 0645 0644 0627 => 0628 0640 0645 0644 0627 group=CCCCC -0xFF +kern -liga 0628 0640 0645 0644 0627 => 0628 0640 0645 0644 0627 group=CCCCC +0xFF 0628 0640 0645 0644 0627 => 0628 0640 0645 0644 0627 group=CCCCC gpos={"1":{"kashida":8}} +0x80 0628 0640 0645 0644 0627 => 0628 0640 0645 0644 0627 group=CCCCC gpos={"1":{"kashida":8}} +0xFF +kern -liga 0628 0640 0645 0644 0627 => 0628 0640 0645 0644 0627 group=CCCCC gpos={"1":{"kashida":8}} === syriac === 0xFF 0710 0712 0713 0715 => 0710 0712 0713 0715 group=CCCC 0x80 0710 0712 0713 0715 => 0710 0712 0713 0715 group=CCCC @@ -27,17 +27,17 @@ 0x80 07CA 07CB 07CC => 07CA 07CB 07CC group=CCC 0xFF +kern -liga 07CA 07CB 07CC => 07CA 07CB 07CC group=CCC === devanagari === -0xFF 0915 094D 0937 093F => 0915 094D 0937 093F group=CCCC -0x80 0915 094D 0937 093F => 0915 094D 0937 093F group=CCCC -0xFF +kern -liga 0915 094D 0937 093F => 0915 094D 0937 093F group=CCCC +0xFF 0915 094D 0937 093F => 0915 094D 093F 0937 group=CCCC +0x80 0915 094D 0937 093F => 0915 094D 093F 0937 group=CCCC +0xFF +kern -liga 0915 094D 0937 093F => 0915 094D 093F 0937 group=CCCC === bengali === -0xFF 0995 09CD 09B7 09BF => 0995 09CD 09B7 09BF group=CCCC -0x80 0995 09CD 09B7 09BF => 0995 09CD 09B7 09BF group=CCCC -0xFF +kern -liga 0995 09CD 09B7 09BF => 0995 09CD 09B7 09BF group=CCCC +0xFF 0995 09CD 09B7 09BF => 0995 09CD 09BF 09B7 group=CCCC +0x80 0995 09CD 09B7 09BF => 0995 09CD 09BF 09B7 group=CCCC +0xFF +kern -liga 0995 09CD 09B7 09BF => 0995 09CD 09BF 09B7 group=CCCC === gurmukhi === -0xFF 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A38 0A3F group=CCCC -0x80 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A38 0A3F group=CCCC -0xFF +kern -liga 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A38 0A3F group=CCCC +0xFF 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A3F 0A38 group=CCCC +0x80 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A3F 0A38 group=CCCC +0xFF +kern -liga 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A3F 0A38 group=CCCC === tamil === 0xFF 0B95 0BCD 0BB7 0BBF => 0B95 0BCD 0BB7 0BBF group=CCCC 0x80 0B95 0BCD 0BB7 0BBF => 0B95 0BCD 0BB7 0BBF group=CCCC @@ -51,9 +51,9 @@ 0x80 0D9A 0DCA 0DBB 0DBB => 0D9A 0DCA 0DBB 0DBB group=CCCC 0xFF +kern -liga 0D9A 0DCA 0DBB 0DBB => 0D9A 0DCA 0DBB 0DBB group=CCCC === khmer === -0xFF 1780 17D2 1781 17C1 => 1780 17D2 1781 17C1 group=CCCC -0x80 1780 17D2 1781 17C1 => 1780 17D2 1781 17C1 group=CCCC -0xFF +kern -liga 1780 17D2 1781 17C1 => 1780 17D2 1781 17C1 group=CCCC +0xFF 1780 17D2 1781 17C1 => 17C1 1780 17D2 1781 group=CCCC +0x80 1780 17D2 1781 17C1 => 17C1 1780 17D2 1781 group=CCCC +0xFF +kern -liga 1780 17D2 1781 17C1 => 17C1 1780 17D2 1781 group=CCCC === thai === 0xFF 0E01 0E34 0E48 0E23 => 0E01 0E34 0E48 0E23 group=CCCC 0x80 0E01 0E34 0E48 0E23 => 0E01 0E34 0E48 0E23 group=CCCC diff --git a/tests/data/shaping/NotoSans-GPOS72-Synthetic.txt b/tests/data/shaping/NotoSans-GPOS72-Synthetic.txt index 9ace39da1..2b3ba3a75 100644 --- a/tests/data/shaping/NotoSans-GPOS72-Synthetic.txt +++ b/tests/data/shaping/NotoSans-GPOS72-Synthetic.txt @@ -31,13 +31,13 @@ 0x80 0915 094D 0937 093F => 0915 094D 093F 0937 group=CCCC 0xFF +kern -liga 0915 094D 0937 093F => 0915 094D 093F 0937 group=CCCC === bengali === -0xFF 0995 09CD 09B7 09BF => 0995 09CD 09BF 09B7 group=CCCC -0x80 0995 09CD 09B7 09BF => 0995 09CD 09BF 09B7 group=CCCC -0xFF +kern -liga 0995 09CD 09B7 09BF => 0995 09CD 09BF 09B7 group=CCCC +0xFF 0995 09CD 09B7 09BF => 0995 09CD 09B7 09BF group=CCCC +0x80 0995 09CD 09B7 09BF => 0995 09CD 09B7 09BF group=CCCC +0xFF +kern -liga 0995 09CD 09B7 09BF => 0995 09CD 09B7 09BF group=CCCC === gurmukhi === -0xFF 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A3F 0A38 group=CCCC -0x80 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A3F 0A38 group=CCCC -0xFF +kern -liga 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A3F 0A38 group=CCCC +0xFF 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A38 0A3F group=CCCC +0x80 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A38 0A3F group=CCCC +0xFF +kern -liga 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A38 0A3F group=CCCC === tamil === 0xFF 0B95 0BCD 0BB7 0BBF => 0B95 0BCD 0BB7 0BBF group=CCCC 0x80 0B95 0BCD 0BB7 0BBF => 0B95 0BCD 0BB7 0BBF group=CCCC diff --git a/tests/data/shaping/NotoSans-GPOS73-Synthetic.txt b/tests/data/shaping/NotoSans-GPOS73-Synthetic.txt index 9ace39da1..2b3ba3a75 100644 --- a/tests/data/shaping/NotoSans-GPOS73-Synthetic.txt +++ b/tests/data/shaping/NotoSans-GPOS73-Synthetic.txt @@ -31,13 +31,13 @@ 0x80 0915 094D 0937 093F => 0915 094D 093F 0937 group=CCCC 0xFF +kern -liga 0915 094D 0937 093F => 0915 094D 093F 0937 group=CCCC === bengali === -0xFF 0995 09CD 09B7 09BF => 0995 09CD 09BF 09B7 group=CCCC -0x80 0995 09CD 09B7 09BF => 0995 09CD 09BF 09B7 group=CCCC -0xFF +kern -liga 0995 09CD 09B7 09BF => 0995 09CD 09BF 09B7 group=CCCC +0xFF 0995 09CD 09B7 09BF => 0995 09CD 09B7 09BF group=CCCC +0x80 0995 09CD 09B7 09BF => 0995 09CD 09B7 09BF group=CCCC +0xFF +kern -liga 0995 09CD 09B7 09BF => 0995 09CD 09B7 09BF group=CCCC === gurmukhi === -0xFF 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A3F 0A38 group=CCCC -0x80 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A3F 0A38 group=CCCC -0xFF +kern -liga 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A3F 0A38 group=CCCC +0xFF 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A38 0A3F group=CCCC +0x80 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A38 0A3F group=CCCC +0xFF +kern -liga 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A38 0A3F group=CCCC === tamil === 0xFF 0B95 0BCD 0BB7 0BBF => 0B95 0BCD 0BB7 0BBF group=CCCC 0x80 0B95 0BCD 0BB7 0BBF => 0B95 0BCD 0BB7 0BBF group=CCCC diff --git a/tests/data/shaping/NotoSans-GPOS83-Guard-Synthetic.txt b/tests/data/shaping/NotoSans-GPOS83-Guard-Synthetic.txt index a51361715..de4738988 100644 --- a/tests/data/shaping/NotoSans-GPOS83-Guard-Synthetic.txt +++ b/tests/data/shaping/NotoSans-GPOS83-Guard-Synthetic.txt @@ -31,13 +31,13 @@ 0x80 0915 094D 0937 093F => 0915 094D 093F 0937 group=CCCC 0xFF +kern -liga 0915 094D 0937 093F => 0915 094D 093F 0937 group=CCCC === bengali === -0xFF 0995 09CD 09B7 09BF => 0995 09CD 09BF 09B7 group=CCCC -0x80 0995 09CD 09B7 09BF => 0995 09CD 09BF 09B7 group=CCCC -0xFF +kern -liga 0995 09CD 09B7 09BF => 0995 09CD 09BF 09B7 group=CCCC +0xFF 0995 09CD 09B7 09BF => 0995 09CD 09B7 09BF group=CCCC +0x80 0995 09CD 09B7 09BF => 0995 09CD 09B7 09BF group=CCCC +0xFF +kern -liga 0995 09CD 09B7 09BF => 0995 09CD 09B7 09BF group=CCCC === gurmukhi === -0xFF 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A3F 0A38 group=CCCC -0x80 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A3F 0A38 group=CCCC -0xFF +kern -liga 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A3F 0A38 group=CCCC +0xFF 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A38 0A3F group=CCCC +0x80 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A38 0A3F group=CCCC +0xFF +kern -liga 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A38 0A3F group=CCCC === tamil === 0xFF 0B95 0BCD 0BB7 0BBF => 0B95 0BCD 0BB7 0BBF group=CCCC 0x80 0B95 0BCD 0BB7 0BBF => 0B95 0BCD 0BB7 0BBF group=CCCC diff --git a/tests/data/shaping/NotoSans-GSUB2-BigSubtable-Synthetic.txt b/tests/data/shaping/NotoSans-GSUB2-BigSubtable-Synthetic.txt index 411ff40af..28f422bc3 100644 --- a/tests/data/shaping/NotoSans-GSUB2-BigSubtable-Synthetic.txt +++ b/tests/data/shaping/NotoSans-GSUB2-BigSubtable-Synthetic.txt @@ -27,17 +27,17 @@ 0x80 07CA 07CB 07CC => 07CA 07CB 07CC group=CCC 0xFF +kern -liga 07CA 07CB 07CC => 07CA 07CB 07CC group=CCC === devanagari === -0xFF 0915 094D 0937 093F => 0915 094D 093F 0937 group=CCCC -0x80 0915 094D 0937 093F => 0915 094D 093F 0937 group=CCCC -0xFF +kern -liga 0915 094D 0937 093F => 0915 094D 093F 0937 group=CCCC +0xFF 0915 094D 0937 093F => 0915 094D 0937 093F group=CCCC +0x80 0915 094D 0937 093F => 0915 094D 0937 093F group=CCCC +0xFF +kern -liga 0915 094D 0937 093F => 0915 094D 0937 093F group=CCCC === bengali === -0xFF 0995 09CD 09B7 09BF => 0995 09CD 09BF 09B7 group=CCCC -0x80 0995 09CD 09B7 09BF => 0995 09CD 09BF 09B7 group=CCCC -0xFF +kern -liga 0995 09CD 09B7 09BF => 0995 09CD 09BF 09B7 group=CCCC +0xFF 0995 09CD 09B7 09BF => 0995 09CD 09B7 09BF group=CCCC +0x80 0995 09CD 09B7 09BF => 0995 09CD 09B7 09BF group=CCCC +0xFF +kern -liga 0995 09CD 09B7 09BF => 0995 09CD 09B7 09BF group=CCCC === gurmukhi === -0xFF 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A3F 0A38 group=CCCC -0x80 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A3F 0A38 group=CCCC -0xFF +kern -liga 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A3F 0A38 group=CCCC +0xFF 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A38 0A3F group=CCCC +0x80 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A38 0A3F group=CCCC +0xFF +kern -liga 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A38 0A3F group=CCCC === tamil === 0xFF 0B95 0BCD 0BB7 0BBF => 0B95 0BCD 0BB7 0BBF group=CCCC 0x80 0B95 0BCD 0BB7 0BBF => 0B95 0BCD 0BB7 0BBF group=CCCC diff --git a/tests/data/shaping/NotoSans-GSUB53-NestedAdvance-Synthetic.txt b/tests/data/shaping/NotoSans-GSUB53-NestedAdvance-Synthetic.txt index f734637e2..1cfb2a2c8 100644 --- a/tests/data/shaping/NotoSans-GSUB53-NestedAdvance-Synthetic.txt +++ b/tests/data/shaping/NotoSans-GSUB53-NestedAdvance-Synthetic.txt @@ -27,17 +27,17 @@ 0x80 07CA 07CB 07CC => 07CA 07CB 07CC group=CCC 0xFF +kern -liga 07CA 07CB 07CC => 07CA 07CB 07CC group=CCC === devanagari === -0xFF 0915 094D 0937 093F => 0915 094D 093F 0937 group=CCCC -0x80 0915 094D 0937 093F => 0915 094D 093F 0937 group=CCCC -0xFF +kern -liga 0915 094D 0937 093F => 0915 094D 093F 0937 group=CCCC +0xFF 0915 094D 0937 093F => 0915 094D 0937 093F group=CCCC +0x80 0915 094D 0937 093F => 0915 094D 0937 093F group=CCCC +0xFF +kern -liga 0915 094D 0937 093F => 0915 094D 0937 093F group=CCCC === bengali === -0xFF 0995 09CD 09B7 09BF => 0995 09CD 09BF 09B7 group=CCCC -0x80 0995 09CD 09B7 09BF => 0995 09CD 09BF 09B7 group=CCCC -0xFF +kern -liga 0995 09CD 09B7 09BF => 0995 09CD 09BF 09B7 group=CCCC +0xFF 0995 09CD 09B7 09BF => 0995 09CD 09B7 09BF group=CCCC +0x80 0995 09CD 09B7 09BF => 0995 09CD 09B7 09BF group=CCCC +0xFF +kern -liga 0995 09CD 09B7 09BF => 0995 09CD 09B7 09BF group=CCCC === gurmukhi === -0xFF 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A3F 0A38 group=CCCC -0x80 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A3F 0A38 group=CCCC -0xFF +kern -liga 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A3F 0A38 group=CCCC +0xFF 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A38 0A3F group=CCCC +0x80 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A38 0A3F group=CCCC +0xFF +kern -liga 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A38 0A3F group=CCCC === tamil === 0xFF 0B95 0BCD 0BB7 0BBF => 0B95 0BCD 0BB7 0BBF group=CCCC 0x80 0B95 0BCD 0BB7 0BBF => 0B95 0BCD 0BB7 0BBF group=CCCC diff --git a/tests/data/shaping/NotoSans-GSUBClassZero-Synthetic.txt b/tests/data/shaping/NotoSans-GSUBClassZero-Synthetic.txt index 44f21332e..857030c23 100644 --- a/tests/data/shaping/NotoSans-GSUBClassZero-Synthetic.txt +++ b/tests/data/shaping/NotoSans-GSUBClassZero-Synthetic.txt @@ -27,17 +27,17 @@ 0x80 07CA 07CB 07CC => 07CA 07CB 07CC group=CCC 0xFF +kern -liga 07CA 07CB 07CC => 07CA 07CB 07CC group=CCC === devanagari === -0xFF 0915 094D 0937 093F => 0915 094D 093F 0937 group=CCCC -0x80 0915 094D 0937 093F => 0915 094D 093F 0937 group=CCCC -0xFF +kern -liga 0915 094D 0937 093F => 0915 094D 093F 0937 group=CCCC +0xFF 0915 094D 0937 093F => 0915 094D 0937 093F group=CCCC +0x80 0915 094D 0937 093F => 0915 094D 0937 093F group=CCCC +0xFF +kern -liga 0915 094D 0937 093F => 0915 094D 0937 093F group=CCCC === bengali === -0xFF 0995 09CD 09B7 09BF => 0995 09CD 09BF 09B7 group=CCCC -0x80 0995 09CD 09B7 09BF => 0995 09CD 09BF 09B7 group=CCCC -0xFF +kern -liga 0995 09CD 09B7 09BF => 0995 09CD 09BF 09B7 group=CCCC +0xFF 0995 09CD 09B7 09BF => 0995 09CD 09B7 09BF group=CCCC +0x80 0995 09CD 09B7 09BF => 0995 09CD 09B7 09BF group=CCCC +0xFF +kern -liga 0995 09CD 09B7 09BF => 0995 09CD 09B7 09BF group=CCCC === gurmukhi === -0xFF 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A3F 0A38 group=CCCC -0x80 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A3F 0A38 group=CCCC -0xFF +kern -liga 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A3F 0A38 group=CCCC +0xFF 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A38 0A3F group=CCCC +0x80 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A38 0A3F group=CCCC +0xFF +kern -liga 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A38 0A3F group=CCCC === tamil === 0xFF 0B95 0BCD 0BB7 0BBF => 0B95 0BCD 0BB7 0BBF group=CCCC 0x80 0B95 0BCD 0BB7 0BBF => 0B95 0BCD 0BB7 0BBF group=CCCC diff --git a/tests/data/shaping/NotoSans-Regular.txt b/tests/data/shaping/NotoSans-Regular.txt index 5be89e56f..06d10fb64 100644 --- a/tests/data/shaping/NotoSans-Regular.txt +++ b/tests/data/shaping/NotoSans-Regular.txt @@ -31,13 +31,13 @@ 0x80 0915 094D 0937 093F => E562 E3B3 group=CC 0xFF +kern -liga 0915 094D 0937 093F => E562 E3B3 group=CC === bengali === -0xFF 0995 09CD 09B7 09BF => 0995 09CD 09BF 09B7 group=CCCC -0x80 0995 09CD 09B7 09BF => 0995 09CD 09BF 09B7 group=CCCC -0xFF +kern -liga 0995 09CD 09B7 09BF => 0995 09CD 09BF 09B7 group=CCCC +0xFF 0995 09CD 09B7 09BF => 0995 09CD 09B7 09BF group=CCCC +0x80 0995 09CD 09B7 09BF => 0995 09CD 09B7 09BF group=CCCC +0xFF +kern -liga 0995 09CD 09B7 09BF => 0995 09CD 09B7 09BF group=CCCC === gurmukhi === -0xFF 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A3F 0A38 group=CCCC -0x80 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A3F 0A38 group=CCCC -0xFF +kern -liga 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A3F 0A38 group=CCCC +0xFF 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A38 0A3F group=CCCC +0x80 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A38 0A3F group=CCCC +0xFF +kern -liga 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A38 0A3F group=CCCC === tamil === 0xFF 0B95 0BCD 0BB7 0BBF => 0B95 0BCD 0BB7 0BBF group=CCCC 0x80 0B95 0BCD 0BB7 0BBF => 0B95 0BCD 0BB7 0BBF group=CCCC diff --git a/tests/data/shaping/NotoSansArabic-GSUB11Wrap-Synthetic.txt b/tests/data/shaping/NotoSansArabic-GSUB11Wrap-Synthetic.txt index fc0233178..f8789871a 100644 --- a/tests/data/shaping/NotoSansArabic-GSUB11Wrap-Synthetic.txt +++ b/tests/data/shaping/NotoSansArabic-GSUB11Wrap-Synthetic.txt @@ -27,17 +27,17 @@ 0x80 07CA 07CB 07CC => 07CA 07CB 07CC group=CCC 0xFF +kern -liga 07CA 07CB 07CC => 07CA 07CB 07CC group=CCC === devanagari === -0xFF 0915 094D 0937 093F => 0915 094D 093F 0937 group=CCCC -0x80 0915 094D 0937 093F => 0915 094D 093F 0937 group=CCCC -0xFF +kern -liga 0915 094D 0937 093F => 0915 094D 093F 0937 group=CCCC +0xFF 0915 094D 0937 093F => 0915 094D 0937 093F group=CCCC +0x80 0915 094D 0937 093F => 0915 094D 0937 093F group=CCCC +0xFF +kern -liga 0915 094D 0937 093F => 0915 094D 0937 093F group=CCCC === bengali === -0xFF 0995 09CD 09B7 09BF => 0995 09CD 09BF 09B7 group=CCCC -0x80 0995 09CD 09B7 09BF => 0995 09CD 09BF 09B7 group=CCCC -0xFF +kern -liga 0995 09CD 09B7 09BF => 0995 09CD 09BF 09B7 group=CCCC +0xFF 0995 09CD 09B7 09BF => 0995 09CD 09B7 09BF group=CCCC +0x80 0995 09CD 09B7 09BF => 0995 09CD 09B7 09BF group=CCCC +0xFF +kern -liga 0995 09CD 09B7 09BF => 0995 09CD 09B7 09BF group=CCCC === gurmukhi === -0xFF 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A3F 0A38 group=CCCC -0x80 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A3F 0A38 group=CCCC -0xFF +kern -liga 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A3F 0A38 group=CCCC +0xFF 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A38 0A3F group=CCCC +0x80 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A38 0A3F group=CCCC +0xFF +kern -liga 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A38 0A3F group=CCCC === tamil === 0xFF 0B95 0BCD 0BB7 0BBF => 0B95 0BCD 0BB7 0BBF group=CCCC 0x80 0B95 0BCD 0BB7 0BBF => 0B95 0BCD 0BB7 0BBF group=CCCC diff --git a/tests/data/shaping/NotoSansArabic-Joining-Subset.txt b/tests/data/shaping/NotoSansArabic-Joining-Subset.txt index d5bd0d353..5ba47f8a1 100644 --- a/tests/data/shaping/NotoSansArabic-Joining-Subset.txt +++ b/tests/data/shaping/NotoSansArabic-Joining-Subset.txt @@ -31,13 +31,13 @@ 0x80 0915 094D 0937 093F => 0915 094D 093F 0937 group=CCCC 0xFF +kern -liga 0915 094D 0937 093F => 0915 094D 093F 0937 group=CCCC === bengali === -0xFF 0995 09CD 09B7 09BF => 0995 09CD 09BF 09B7 group=CCCC -0x80 0995 09CD 09B7 09BF => 0995 09CD 09BF 09B7 group=CCCC -0xFF +kern -liga 0995 09CD 09B7 09BF => 0995 09CD 09BF 09B7 group=CCCC +0xFF 0995 09CD 09B7 09BF => 0995 09CD 09B7 09BF group=CCCC +0x80 0995 09CD 09B7 09BF => 0995 09CD 09B7 09BF group=CCCC +0xFF +kern -liga 0995 09CD 09B7 09BF => 0995 09CD 09B7 09BF group=CCCC === gurmukhi === -0xFF 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A3F 0A38 group=CCCC -0x80 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A3F 0A38 group=CCCC -0xFF +kern -liga 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A3F 0A38 group=CCCC +0xFF 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A38 0A3F group=CCCC +0x80 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A38 0A3F group=CCCC +0xFF +kern -liga 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A38 0A3F group=CCCC === tamil === 0xFF 0B95 0BCD 0BB7 0BBF => 0B95 0BCD 0BB7 0BBF group=CCCC 0x80 0B95 0BCD 0BB7 0BBF => 0B95 0BCD 0BB7 0BBF group=CCCC diff --git a/tests/data/shaping/NotoSansArabic-MultipleFinal-Subset.txt b/tests/data/shaping/NotoSansArabic-MultipleFinal-Subset.txt index 237a49a18..6badfee89 100644 --- a/tests/data/shaping/NotoSansArabic-MultipleFinal-Subset.txt +++ b/tests/data/shaping/NotoSansArabic-MultipleFinal-Subset.txt @@ -27,17 +27,17 @@ 0x80 07CA 07CB 07CC => 07CA 07CB 07CC group=CCC 0xFF +kern -liga 07CA 07CB 07CC => 07CA 07CB 07CC group=CCC === devanagari === -0xFF 0915 094D 0937 093F => 0915 094D 0937 093F group=CCCC -0x80 0915 094D 0937 093F => 0915 094D 0937 093F group=CCCC -0xFF +kern -liga 0915 094D 0937 093F => 0915 094D 0937 093F group=CCCC +0xFF 0915 094D 0937 093F => 0915 094D 093F 0937 group=CCCC +0x80 0915 094D 0937 093F => 0915 094D 093F 0937 group=CCCC +0xFF +kern -liga 0915 094D 0937 093F => 0915 094D 093F 0937 group=CCCC === bengali === -0xFF 0995 09CD 09B7 09BF => 0995 09CD 09B7 09BF group=CCCC -0x80 0995 09CD 09B7 09BF => 0995 09CD 09B7 09BF group=CCCC -0xFF +kern -liga 0995 09CD 09B7 09BF => 0995 09CD 09B7 09BF group=CCCC +0xFF 0995 09CD 09B7 09BF => 0995 09CD 09BF 09B7 group=CCCC +0x80 0995 09CD 09B7 09BF => 0995 09CD 09BF 09B7 group=CCCC +0xFF +kern -liga 0995 09CD 09B7 09BF => 0995 09CD 09BF 09B7 group=CCCC === gurmukhi === -0xFF 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A38 0A3F group=CCCC -0x80 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A38 0A3F group=CCCC -0xFF +kern -liga 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A38 0A3F group=CCCC +0xFF 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A3F 0A38 group=CCCC +0x80 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A3F 0A38 group=CCCC +0xFF +kern -liga 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A3F 0A38 group=CCCC === tamil === 0xFF 0B95 0BCD 0BB7 0BBF => 0B95 0BCD 0BB7 0BBF group=CCCC 0x80 0B95 0BCD 0BB7 0BBF => 0B95 0BCD 0BB7 0BBF group=CCCC @@ -51,9 +51,9 @@ 0x80 0D9A 0DCA 0DBB 0DBB => 0D9A 0DCA 0DBB 0DBB group=CCCC 0xFF +kern -liga 0D9A 0DCA 0DBB 0DBB => 0D9A 0DCA 0DBB 0DBB group=CCCC === khmer === -0xFF 1780 17D2 1781 17C1 => 1780 17D2 1781 17C1 group=CCCC -0x80 1780 17D2 1781 17C1 => 1780 17D2 1781 17C1 group=CCCC -0xFF +kern -liga 1780 17D2 1781 17C1 => 1780 17D2 1781 17C1 group=CCCC +0xFF 1780 17D2 1781 17C1 => 17C1 1780 17D2 1781 group=CCCC +0x80 1780 17D2 1781 17C1 => 17C1 1780 17D2 1781 group=CCCC +0xFF +kern -liga 1780 17D2 1781 17C1 => 17C1 1780 17D2 1781 group=CCCC === thai === 0xFF 0E01 0E34 0E48 0E23 => 0E01 0E34 0E48 0E23 group=CCCC 0x80 0E01 0E34 0E48 0E23 => 0E01 0E34 0E48 0E23 group=CCCC diff --git a/tests/data/shaping/NotoSansArabic-MultipleForm-Subset.txt b/tests/data/shaping/NotoSansArabic-MultipleForm-Subset.txt index 3288884f4..265c0950d 100644 --- a/tests/data/shaping/NotoSansArabic-MultipleForm-Subset.txt +++ b/tests/data/shaping/NotoSansArabic-MultipleForm-Subset.txt @@ -27,17 +27,17 @@ 0x80 07CA 07CB 07CC => 07CA 07CB 07CC group=CCC 0xFF +kern -liga 07CA 07CB 07CC => 07CA 07CB 07CC group=CCC === devanagari === -0xFF 0915 094D 0937 093F => 0915 094D 0937 093F group=CCCC -0x80 0915 094D 0937 093F => 0915 094D 0937 093F group=CCCC -0xFF +kern -liga 0915 094D 0937 093F => 0915 094D 0937 093F group=CCCC +0xFF 0915 094D 0937 093F => 0915 094D 093F 0937 group=CCCC +0x80 0915 094D 0937 093F => 0915 094D 093F 0937 group=CCCC +0xFF +kern -liga 0915 094D 0937 093F => 0915 094D 093F 0937 group=CCCC === bengali === -0xFF 0995 09CD 09B7 09BF => 0995 09CD 09B7 09BF group=CCCC -0x80 0995 09CD 09B7 09BF => 0995 09CD 09B7 09BF group=CCCC -0xFF +kern -liga 0995 09CD 09B7 09BF => 0995 09CD 09B7 09BF group=CCCC +0xFF 0995 09CD 09B7 09BF => 0995 09CD 09BF 09B7 group=CCCC +0x80 0995 09CD 09B7 09BF => 0995 09CD 09BF 09B7 group=CCCC +0xFF +kern -liga 0995 09CD 09B7 09BF => 0995 09CD 09BF 09B7 group=CCCC === gurmukhi === -0xFF 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A38 0A3F group=CCCC -0x80 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A38 0A3F group=CCCC -0xFF +kern -liga 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A38 0A3F group=CCCC +0xFF 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A3F 0A38 group=CCCC +0x80 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A3F 0A38 group=CCCC +0xFF +kern -liga 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A3F 0A38 group=CCCC === tamil === 0xFF 0B95 0BCD 0BB7 0BBF => 0B95 0BCD 0BB7 0BBF group=CCCC 0x80 0B95 0BCD 0BB7 0BBF => 0B95 0BCD 0BB7 0BBF group=CCCC @@ -51,9 +51,9 @@ 0x80 0D9A 0DCA 0DBB 0DBB => 0D9A 0DCA 0DBB 0DBB group=CCCC 0xFF +kern -liga 0D9A 0DCA 0DBB 0DBB => 0D9A 0DCA 0DBB 0DBB group=CCCC === khmer === -0xFF 1780 17D2 1781 17C1 => 1780 17D2 1781 17C1 group=CCCC -0x80 1780 17D2 1781 17C1 => 1780 17D2 1781 17C1 group=CCCC -0xFF +kern -liga 1780 17D2 1781 17C1 => 1780 17D2 1781 17C1 group=CCCC +0xFF 1780 17D2 1781 17C1 => 17C1 1780 17D2 1781 group=CCCC +0x80 1780 17D2 1781 17C1 => 17C1 1780 17D2 1781 group=CCCC +0xFF +kern -liga 1780 17D2 1781 17C1 => 17C1 1780 17D2 1781 group=CCCC === thai === 0xFF 0E01 0E34 0E48 0E23 => 0E01 0E34 0E48 0E23 group=CCCC 0x80 0E01 0E34 0E48 0E23 => 0E01 0E34 0E48 0E23 group=CCCC diff --git a/tests/data/shaping/NotoSansBengali-DevaScript-Synthetic.txt b/tests/data/shaping/NotoSansBengali-DevaScript-Synthetic.txt index 2cf00a3c5..4a07587b4 100644 --- a/tests/data/shaping/NotoSansBengali-DevaScript-Synthetic.txt +++ b/tests/data/shaping/NotoSansBengali-DevaScript-Synthetic.txt @@ -31,13 +31,13 @@ 0x80 0915 094D 0937 093F => 0915 094D 093F 0937 group=CCCC 0xFF +kern -liga 0915 094D 0937 093F => 0915 094D 093F 0937 group=CCCC === bengali === -0xFF 0995 09CD 09B7 09BF => 0997 09CD 09BF 09B7 group=CMCC -0x80 0995 09CD 09B7 09BF => 0997 09CD 09BF 09B7 group=CMCC -0xFF +kern -liga 0995 09CD 09B7 09BF => 0997 09CD 09BF 09B7 group=CMCC +0xFF 0995 09CD 09B7 09BF => 0997 09CD 09B7 09BF group=CMCC +0x80 0995 09CD 09B7 09BF => 0997 09CD 09B7 09BF group=CMCC +0xFF +kern -liga 0995 09CD 09B7 09BF => 0997 09CD 09B7 09BF group=CMCC === gurmukhi === -0xFF 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A3F 0A38 group=CCCC -0x80 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A3F 0A38 group=CCCC -0xFF +kern -liga 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A3F 0A38 group=CCCC +0xFF 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A38 0A3F group=CCCC +0x80 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A38 0A3F group=CCCC +0xFF +kern -liga 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A38 0A3F group=CCCC === tamil === 0xFF 0B95 0BCD 0BB7 0BBF => 0B95 0BCD 0BB7 0BBF group=CCCC 0x80 0B95 0BCD 0BB7 0BBF => 0B95 0BCD 0BB7 0BBF group=CCCC @@ -87,6 +87,6 @@ 0x80 0041 0020 0628 0020 0042 => 0041 0020 0628 0020 0042 group=CSCSC 0xFF +kern -liga 0041 0020 0628 0020 0042 => 0041 0020 0628 0020 0042 group=CSCSC === font characters 0 === -0xFF 0020 0995 0996 0997 09B7 09BF 09CD 25CC => 0020 0997 0996 0997 09BF 09B7 09CD 25CC group=SCCCCCMC -0x80 0020 0995 0996 0997 09B7 09BF 09CD 25CC => 0020 0997 0996 0997 09BF 09B7 09CD 25CC group=SCCCCCMC -0xFF +kern -liga 0020 0995 0996 0997 09B7 09BF 09CD 25CC => 0020 0997 0996 0997 09BF 09B7 09CD 25CC group=SCCCCCMC +0xFF 0020 0995 0996 0997 09B7 09BF 09CD 25CC => 0020 0997 0996 0997 09B7 09BF 09CD 25CC group=SCCCCCMC +0x80 0020 0995 0996 0997 09B7 09BF 09CD 25CC => 0020 0997 0996 0997 09B7 09BF 09CD 25CC group=SCCCCCMC +0xFF +kern -liga 0020 0995 0996 0997 09B7 09BF 09CD 25CC => 0020 0997 0996 0997 09B7 09BF 09CD 25CC group=SCCCCCMC diff --git a/tests/data/shaping/NotoSansBengali-GuruScript-Synthetic.txt b/tests/data/shaping/NotoSansBengali-GuruScript-Synthetic.txt new file mode 100644 index 000000000..27bbe3efa --- /dev/null +++ b/tests/data/shaping/NotoSansBengali-GuruScript-Synthetic.txt @@ -0,0 +1,92 @@ +=== latin === +0xFF 0041 0056 0041 0054 0061 0072 => 0041 0056 0041 0054 0061 0072 group=CCCCCC +0x80 0041 0056 0041 0054 0061 0072 => 0041 0056 0041 0054 0061 0072 group=CCCCCC +0xFF +kern -liga 0041 0056 0041 0054 0061 0072 => 0041 0056 0041 0054 0061 0072 group=CCCCCC +=== cyrillic === +0xFF 0416 0430 0439 => 0416 0430 0439 group=CCC +0x80 0416 0430 0439 => 0416 0430 0439 group=CCC +0xFF +kern -liga 0416 0430 0439 => 0416 0430 0439 group=CCC +=== greek === +0xFF 03B1 03B2 03C2 => 03B1 03B2 03C2 group=CCC +0x80 03B1 03B2 03C2 => 03B1 03B2 03C2 group=CCC +0xFF +kern -liga 03B1 03B2 03C2 => 03B1 03B2 03C2 group=CCC +=== hiragana === +0xFF 3042 3043 3044 => 3042 3043 3044 group=CCC +0x80 3042 3043 3044 => 3042 3043 3044 group=CCC +0xFF +kern -liga 3042 3043 3044 => 3042 3043 3044 group=CCC +=== arabic === +0xFF 0628 0640 0645 0644 0627 => 0628 0640 0645 0644 0627 group=CCCCC gpos={"1":{"kashida":8}} +0x80 0628 0640 0645 0644 0627 => 0628 0640 0645 0644 0627 group=CCCCC gpos={"1":{"kashida":8}} +0xFF +kern -liga 0628 0640 0645 0644 0627 => 0628 0640 0645 0644 0627 group=CCCCC gpos={"1":{"kashida":8}} +=== syriac === +0xFF 0710 0712 0713 0715 => 0710 0712 0713 0715 group=CCCC +0x80 0710 0712 0713 0715 => 0710 0712 0713 0715 group=CCCC +0xFF +kern -liga 0710 0712 0713 0715 => 0710 0712 0713 0715 group=CCCC +=== nko === +0xFF 07CA 07CB 07CC => 07CA 07CB 07CC group=CCC +0x80 07CA 07CB 07CC => 07CA 07CB 07CC group=CCC +0xFF +kern -liga 07CA 07CB 07CC => 07CA 07CB 07CC group=CCC +=== devanagari === +0xFF 0915 094D 0937 093F => 0915 094D 093F 0937 group=CCCC +0x80 0915 094D 0937 093F => 0915 094D 093F 0937 group=CCCC +0xFF +kern -liga 0915 094D 0937 093F => 0915 094D 093F 0937 group=CCCC +=== bengali === +0xFF 0995 09CD 09B7 09BF => 0995 09CD 09BF 09B7 group=CMCC +0x80 0995 09CD 09B7 09BF => 0995 09CD 09BF 09B7 group=CMCC +0xFF +kern -liga 0995 09CD 09B7 09BF => 0995 09CD 09BF 09B7 group=CMCC +=== gurmukhi === +0xFF 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A3F 0A38 group=CCCC +0x80 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A3F 0A38 group=CCCC +0xFF +kern -liga 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A3F 0A38 group=CCCC +=== tamil === +0xFF 0B95 0BCD 0BB7 0BBF => 0B95 0BCD 0BB7 0BBF group=CCCC +0x80 0B95 0BCD 0BB7 0BBF => 0B95 0BCD 0BB7 0BBF group=CCCC +0xFF +kern -liga 0B95 0BCD 0BB7 0BBF => 0B95 0BCD 0BB7 0BBF group=CCCC +=== malayalam === +0xFF 0D15 0D4D 0D37 0D3F => 0D15 0D4D 0D37 0D3F group=CCCC +0x80 0D15 0D4D 0D37 0D3F => 0D15 0D4D 0D37 0D3F group=CCCC +0xFF +kern -liga 0D15 0D4D 0D37 0D3F => 0D15 0D4D 0D37 0D3F group=CCCC +=== sinhala === +0xFF 0D9A 0DCA 0DBB 0DBB => 0D9A 0DCA 0DBB 0DBB group=CCCC +0x80 0D9A 0DCA 0DBB 0DBB => 0D9A 0DCA 0DBB 0DBB group=CCCC +0xFF +kern -liga 0D9A 0DCA 0DBB 0DBB => 0D9A 0DCA 0DBB 0DBB group=CCCC +=== khmer === +0xFF 1780 17D2 1781 17C1 => 17C1 1780 17D2 1781 group=CCCC +0x80 1780 17D2 1781 17C1 => 17C1 1780 17D2 1781 group=CCCC +0xFF +kern -liga 1780 17D2 1781 17C1 => 17C1 1780 17D2 1781 group=CCCC +=== thai === +0xFF 0E01 0E34 0E48 0E23 => 0E01 0E34 0E48 0E23 group=CCCC +0x80 0E01 0E34 0E48 0E23 => 0E01 0E34 0E48 0E23 group=CCCC +0xFF +kern -liga 0E01 0E34 0E48 0E23 => 0E01 0E34 0E48 0E23 group=CCCC +=== lao === +0xFF 0E81 0EB4 0E8D => 0E81 0EB4 0E8D group=CCC +0x80 0E81 0EB4 0E8D => 0E81 0EB4 0E8D group=CCC +0xFF +kern -liga 0E81 0EB4 0E8D => 0E81 0EB4 0E8D group=CCC +=== myanmar === +0xFF 1000 103A 1039 1001 => 1000 103A 25CC 1039 1001 group=CCCCC +0x80 1000 103A 1039 1001 => 1000 103A 25CC 1039 1001 group=CCCCC +0xFF +kern -liga 1000 103A 1039 1001 => 1000 103A 25CC 1039 1001 group=CCCCC +=== new tai lue === +0xFF 1980 19B0 1981 => 1980 19B0 1981 group=CCC +0x80 1980 19B0 1981 => 1980 19B0 1981 group=CCC +0xFF +kern -liga 1980 19B0 1981 => 1980 19B0 1981 group=CCC +=== cham === +0xFF AA00 AA33 AA01 => AA00 AA33 AA01 group=CCC +0x80 AA00 AA33 AA01 => AA00 AA33 AA01 group=CCC +0xFF +kern -liga AA00 AA33 AA01 => AA00 AA33 AA01 group=CCC +=== tai tham === +0xFF 1A20 1A60 1A21 => 1A20 1A60 1A21 group=CCC +0x80 1A20 1A60 1A21 => 1A20 1A60 1A21 group=CCC +0xFF +kern -liga 1A20 1A60 1A21 => 1A20 1A60 1A21 group=CCC +=== mixed scripts === +0xFF 0041 0628 0915 0042 => 0041 0628 0915 0042 group=CCCC +0x80 0041 0628 0915 0042 => 0041 0628 0915 0042 group=CCCC +0xFF +kern -liga 0041 0628 0915 0042 => 0041 0628 0915 0042 group=CCCC +=== spaced === +0xFF 0041 0020 0628 0020 0042 => 0041 0020 0628 0020 0042 group=CSCSC +0x80 0041 0020 0628 0020 0042 => 0041 0020 0628 0020 0042 group=CSCSC +0xFF +kern -liga 0041 0020 0628 0020 0042 => 0041 0020 0628 0020 0042 group=CSCSC +=== font characters 0 === +0xFF 0020 0995 0996 0997 09B7 09BF 09CD 25CC => 0020 0995 0996 0997 09BF 09B7 09CD 25CC group=SCCCCCMC +0x80 0020 0995 0996 0997 09B7 09BF 09CD 25CC => 0020 0995 0996 0997 09BF 09B7 09CD 25CC group=SCCCCCMC +0xFF +kern -liga 0020 0995 0996 0997 09B7 09BF 09CD 25CC => 0020 0995 0996 0997 09BF 09B7 09CD 25CC group=SCCCCCMC diff --git a/tests/data/shaping/NotoSansCoptic-GSUB81-Subset.txt b/tests/data/shaping/NotoSansCoptic-GSUB81-Subset.txt index 4abb2bd60..327333bfa 100644 --- a/tests/data/shaping/NotoSansCoptic-GSUB81-Subset.txt +++ b/tests/data/shaping/NotoSansCoptic-GSUB81-Subset.txt @@ -31,13 +31,13 @@ 0x80 0915 094D 0937 093F => 0915 094D 093F 0937 group=CCCC 0xFF +kern -liga 0915 094D 0937 093F => 0915 094D 093F 0937 group=CCCC === bengali === -0xFF 0995 09CD 09B7 09BF => 0995 09CD 09BF 09B7 group=CCCC -0x80 0995 09CD 09B7 09BF => 0995 09CD 09BF 09B7 group=CCCC -0xFF +kern -liga 0995 09CD 09B7 09BF => 0995 09CD 09BF 09B7 group=CCCC +0xFF 0995 09CD 09B7 09BF => 0995 09CD 09B7 09BF group=CCCC +0x80 0995 09CD 09B7 09BF => 0995 09CD 09B7 09BF group=CCCC +0xFF +kern -liga 0995 09CD 09B7 09BF => 0995 09CD 09B7 09BF group=CCCC === gurmukhi === -0xFF 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A3F 0A38 group=CCCC -0x80 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A3F 0A38 group=CCCC -0xFF +kern -liga 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A3F 0A38 group=CCCC +0xFF 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A38 0A3F group=CCCC +0x80 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A38 0A3F group=CCCC +0xFF +kern -liga 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A38 0A3F group=CCCC === tamil === 0xFF 0B95 0BCD 0BB7 0BBF => 0B95 0BCD 0BB7 0BBF group=CCCC 0x80 0B95 0BCD 0BB7 0BBF => 0B95 0BCD 0BB7 0BBF group=CCCC diff --git a/tests/data/shaping/NotoSansDevanagari-ContextualLocl-Subset.txt b/tests/data/shaping/NotoSansDevanagari-ContextualLocl-Subset.txt index b7d6be7db..22f354c70 100644 --- a/tests/data/shaping/NotoSansDevanagari-ContextualLocl-Subset.txt +++ b/tests/data/shaping/NotoSansDevanagari-ContextualLocl-Subset.txt @@ -15,9 +15,9 @@ 0x80 3042 3043 3044 => 3042 3043 3044 group=CCC 0xFF +kern -liga 3042 3043 3044 => 3042 3043 3044 group=CCC === arabic === -0xFF 0628 0640 0645 0644 0627 => 0628 0640 0645 0644 0627 group=CCCCC -0x80 0628 0640 0645 0644 0627 => 0628 0640 0645 0644 0627 group=CCCCC -0xFF +kern -liga 0628 0640 0645 0644 0627 => 0628 0640 0645 0644 0627 group=CCCCC +0xFF 0628 0640 0645 0644 0627 => 0628 0640 0645 0644 0627 group=CCCCC gpos={"1":{"kashida":8}} +0x80 0628 0640 0645 0644 0627 => 0628 0640 0645 0644 0627 group=CCCCC gpos={"1":{"kashida":8}} +0xFF +kern -liga 0628 0640 0645 0644 0627 => 0628 0640 0645 0644 0627 group=CCCCC gpos={"1":{"kashida":8}} === syriac === 0xFF 0710 0712 0713 0715 => 0710 0712 0713 0715 group=CCCC 0x80 0710 0712 0713 0715 => 0710 0712 0713 0715 group=CCCC @@ -27,17 +27,17 @@ 0x80 07CA 07CB 07CC => 07CA 07CB 07CC group=CCC 0xFF +kern -liga 07CA 07CB 07CC => 07CA 07CB 07CC group=CCC === devanagari === -0xFF 0915 094D 0937 093F => 0915 094D 0937 093F group=CCCC -0x80 0915 094D 0937 093F => 0915 094D 0937 093F group=CCCC -0xFF +kern -liga 0915 094D 0937 093F => 0915 094D 0937 093F group=CCCC +0xFF 0915 094D 0937 093F => 0915 094D 093F 0937 group=CCCC +0x80 0915 094D 0937 093F => 0915 094D 093F 0937 group=CCCC +0xFF +kern -liga 0915 094D 0937 093F => 0915 094D 093F 0937 group=CCCC === bengali === -0xFF 0995 09CD 09B7 09BF => 0995 09CD 09B7 09BF group=CCCC -0x80 0995 09CD 09B7 09BF => 0995 09CD 09B7 09BF group=CCCC -0xFF +kern -liga 0995 09CD 09B7 09BF => 0995 09CD 09B7 09BF group=CCCC +0xFF 0995 09CD 09B7 09BF => 0995 09CD 09BF 09B7 group=CCCC +0x80 0995 09CD 09B7 09BF => 0995 09CD 09BF 09B7 group=CCCC +0xFF +kern -liga 0995 09CD 09B7 09BF => 0995 09CD 09BF 09B7 group=CCCC === gurmukhi === -0xFF 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A38 0A3F group=CCCC -0x80 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A38 0A3F group=CCCC -0xFF +kern -liga 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A38 0A3F group=CCCC +0xFF 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A3F 0A38 group=CCCC +0x80 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A3F 0A38 group=CCCC +0xFF +kern -liga 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A3F 0A38 group=CCCC === tamil === 0xFF 0B95 0BCD 0BB7 0BBF => 0B95 0BCD 0BB7 0BBF group=CCCC 0x80 0B95 0BCD 0BB7 0BBF => 0B95 0BCD 0BB7 0BBF group=CCCC @@ -51,9 +51,9 @@ 0x80 0D9A 0DCA 0DBB 0DBB => 0D9A 0DCA 0DBB 0DBB group=CCCC 0xFF +kern -liga 0D9A 0DCA 0DBB 0DBB => 0D9A 0DCA 0DBB 0DBB group=CCCC === khmer === -0xFF 1780 17D2 1781 17C1 => 1780 17D2 1781 17C1 group=CCCC -0x80 1780 17D2 1781 17C1 => 1780 17D2 1781 17C1 group=CCCC -0xFF +kern -liga 1780 17D2 1781 17C1 => 1780 17D2 1781 17C1 group=CCCC +0xFF 1780 17D2 1781 17C1 => 17C1 1780 17D2 1781 group=CCCC +0x80 1780 17D2 1781 17C1 => 17C1 1780 17D2 1781 group=CCCC +0xFF +kern -liga 1780 17D2 1781 17C1 => 17C1 1780 17D2 1781 group=CCCC === thai === 0xFF 0E01 0E34 0E48 0E23 => 0E01 0E34 0E48 0E23 group=CCCC 0x80 0E01 0E34 0E48 0E23 => 0E01 0E34 0E48 0E23 group=CCCC diff --git a/tests/data/shaping/NotoSansGurmukhi-NestedCoverage-Subset.txt b/tests/data/shaping/NotoSansGurmukhi-NestedCoverage-Subset.txt index 09420c36d..814c8bcf7 100644 --- a/tests/data/shaping/NotoSansGurmukhi-NestedCoverage-Subset.txt +++ b/tests/data/shaping/NotoSansGurmukhi-NestedCoverage-Subset.txt @@ -15,9 +15,9 @@ 0x80 3042 3043 3044 => 3042 3043 3044 group=CCC 0xFF +kern -liga 3042 3043 3044 => 3042 3043 3044 group=CCC === arabic === -0xFF 0628 0640 0645 0644 0627 => 0628 0640 0645 0644 0627 group=CCCCC -0x80 0628 0640 0645 0644 0627 => 0628 0640 0645 0644 0627 group=CCCCC -0xFF +kern -liga 0628 0640 0645 0644 0627 => 0628 0640 0645 0644 0627 group=CCCCC +0xFF 0628 0640 0645 0644 0627 => 0628 0640 0645 0644 0627 group=CCCCC gpos={"1":{"kashida":8}} +0x80 0628 0640 0645 0644 0627 => 0628 0640 0645 0644 0627 group=CCCCC gpos={"1":{"kashida":8}} +0xFF +kern -liga 0628 0640 0645 0644 0627 => 0628 0640 0645 0644 0627 group=CCCCC gpos={"1":{"kashida":8}} === syriac === 0xFF 0710 0712 0713 0715 => 0710 0712 0713 0715 group=CCCC 0x80 0710 0712 0713 0715 => 0710 0712 0713 0715 group=CCCC @@ -27,17 +27,17 @@ 0x80 07CA 07CB 07CC => 07CA 07CB 07CC group=CCC 0xFF +kern -liga 07CA 07CB 07CC => 07CA 07CB 07CC group=CCC === devanagari === -0xFF 0915 094D 0937 093F => 0915 094D 0937 093F group=CCCC -0x80 0915 094D 0937 093F => 0915 094D 0937 093F group=CCCC -0xFF +kern -liga 0915 094D 0937 093F => 0915 094D 0937 093F group=CCCC +0xFF 0915 094D 0937 093F => 0915 094D 093F 0937 group=CCCC +0x80 0915 094D 0937 093F => 0915 094D 093F 0937 group=CCCC +0xFF +kern -liga 0915 094D 0937 093F => 0915 094D 093F 0937 group=CCCC === bengali === -0xFF 0995 09CD 09B7 09BF => 0995 09CD 09B7 09BF group=CCCC -0x80 0995 09CD 09B7 09BF => 0995 09CD 09B7 09BF group=CCCC -0xFF +kern -liga 0995 09CD 09B7 09BF => 0995 09CD 09B7 09BF group=CCCC +0xFF 0995 09CD 09B7 09BF => 0995 09CD 09BF 09B7 group=CCCC +0x80 0995 09CD 09B7 09BF => 0995 09CD 09BF 09B7 group=CCCC +0xFF +kern -liga 0995 09CD 09B7 09BF => 0995 09CD 09BF 09B7 group=CCCC === gurmukhi === -0xFF 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A38 0A3F group=CCCC -0x80 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A38 0A3F group=CCCC -0xFF +kern -liga 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A38 0A3F group=CCCC +0xFF 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A3F 0A38 group=CCCC +0x80 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A3F 0A38 group=CCCC +0xFF +kern -liga 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A3F 0A38 group=CCCC === tamil === 0xFF 0B95 0BCD 0BB7 0BBF => 0B95 0BCD 0BB7 0BBF group=CCCC 0x80 0B95 0BCD 0BB7 0BBF => 0B95 0BCD 0BB7 0BBF group=CCCC @@ -51,9 +51,9 @@ 0x80 0D9A 0DCA 0DBB 0DBB => 0D9A 0DCA 0DBB 0DBB group=CCCC 0xFF +kern -liga 0D9A 0DCA 0DBB 0DBB => 0D9A 0DCA 0DBB 0DBB group=CCCC === khmer === -0xFF 1780 17D2 1781 17C1 => 1780 17D2 1781 17C1 group=CCCC -0x80 1780 17D2 1781 17C1 => 1780 17D2 1781 17C1 group=CCCC -0xFF +kern -liga 1780 17D2 1781 17C1 => 1780 17D2 1781 17C1 group=CCCC +0xFF 1780 17D2 1781 17C1 => 17C1 1780 17D2 1781 group=CCCC +0x80 1780 17D2 1781 17C1 => 17C1 1780 17D2 1781 group=CCCC +0xFF +kern -liga 1780 17D2 1781 17C1 => 17C1 1780 17D2 1781 group=CCCC === thai === 0xFF 0E01 0E34 0E48 0E23 => 0E01 0E34 0E48 0E23 group=CCCC 0x80 0E01 0E34 0E48 0E23 => 0E01 0E34 0E48 0E23 group=CCCC diff --git a/tests/data/shaping/NotoSansGurmukhiUI-GPOS71-Subset.txt b/tests/data/shaping/NotoSansGurmukhiUI-GPOS71-Subset.txt index 582d0fed0..c099a5e36 100644 --- a/tests/data/shaping/NotoSansGurmukhiUI-GPOS71-Subset.txt +++ b/tests/data/shaping/NotoSansGurmukhiUI-GPOS71-Subset.txt @@ -15,9 +15,9 @@ 0x80 3042 3043 3044 => 3042 3043 3044 group=CCC 0xFF +kern -liga 3042 3043 3044 => 3042 3043 3044 group=CCC === arabic === -0xFF 0628 0640 0645 0644 0627 => 0628 0640 0645 0644 0627 group=CCCCC -0x80 0628 0640 0645 0644 0627 => 0628 0640 0645 0644 0627 group=CCCCC -0xFF +kern -liga 0628 0640 0645 0644 0627 => 0628 0640 0645 0644 0627 group=CCCCC +0xFF 0628 0640 0645 0644 0627 => 0628 0640 0645 0644 0627 group=CCCCC gpos={"1":{"kashida":8}} +0x80 0628 0640 0645 0644 0627 => 0628 0640 0645 0644 0627 group=CCCCC gpos={"1":{"kashida":8}} +0xFF +kern -liga 0628 0640 0645 0644 0627 => 0628 0640 0645 0644 0627 group=CCCCC gpos={"1":{"kashida":8}} === syriac === 0xFF 0710 0712 0713 0715 => 0710 0712 0713 0715 group=CCCC 0x80 0710 0712 0713 0715 => 0710 0712 0713 0715 group=CCCC @@ -27,13 +27,13 @@ 0x80 07CA 07CB 07CC => 07CA 07CB 07CC group=CCC 0xFF +kern -liga 07CA 07CB 07CC => 07CA 07CB 07CC group=CCC === devanagari === -0xFF 0915 094D 0937 093F => 0915 094D 0937 093F group=CCCC -0x80 0915 094D 0937 093F => 0915 094D 0937 093F group=CCCC -0xFF +kern -liga 0915 094D 0937 093F => 0915 094D 0937 093F group=CCCC +0xFF 0915 094D 0937 093F => 0915 094D 093F 0937 group=CCCC +0x80 0915 094D 0937 093F => 0915 094D 093F 0937 group=CCCC +0xFF +kern -liga 0915 094D 0937 093F => 0915 094D 093F 0937 group=CCCC === bengali === -0xFF 0995 09CD 09B7 09BF => 0995 09CD 09B7 09BF group=CCCC -0x80 0995 09CD 09B7 09BF => 0995 09CD 09B7 09BF group=CCCC -0xFF +kern -liga 0995 09CD 09B7 09BF => 0995 09CD 09B7 09BF group=CCCC +0xFF 0995 09CD 09B7 09BF => 0995 09CD 09BF 09B7 group=CCCC +0x80 0995 09CD 09B7 09BF => 0995 09CD 09BF 09B7 group=CCCC +0xFF +kern -liga 0995 09CD 09B7 09BF => 0995 09CD 09BF 09B7 group=CCCC === gurmukhi === 0xFF 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A3F 0A38 group=CCCC 0x80 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A3F 0A38 group=CCCC @@ -51,9 +51,9 @@ 0x80 0D9A 0DCA 0DBB 0DBB => 0D9A 0DCA 0DBB 0DBB group=CCCC 0xFF +kern -liga 0D9A 0DCA 0DBB 0DBB => 0D9A 0DCA 0DBB 0DBB group=CCCC === khmer === -0xFF 1780 17D2 1781 17C1 => 1780 17D2 1781 17C1 group=CCCC -0x80 1780 17D2 1781 17C1 => 1780 17D2 1781 17C1 group=CCCC -0xFF +kern -liga 1780 17D2 1781 17C1 => 1780 17D2 1781 17C1 group=CCCC +0xFF 1780 17D2 1781 17C1 => 17C1 1780 17D2 1781 group=CCCC +0x80 1780 17D2 1781 17C1 => 17C1 1780 17D2 1781 group=CCCC +0xFF +kern -liga 1780 17D2 1781 17C1 => 17C1 1780 17D2 1781 group=CCCC === thai === 0xFF 0E01 0E34 0E48 0E23 => 0E01 0E34 0E48 0E23 group=CCCC 0x80 0E01 0E34 0E48 0E23 => 0E01 0E34 0E48 0E23 group=CCCC diff --git a/tests/data/shaping/NotoSansMono-GDEF13-Subset.txt b/tests/data/shaping/NotoSansMono-GDEF13-Subset.txt index 612aaa725..972554502 100644 --- a/tests/data/shaping/NotoSansMono-GDEF13-Subset.txt +++ b/tests/data/shaping/NotoSansMono-GDEF13-Subset.txt @@ -27,17 +27,17 @@ 0x80 07CA 07CB 07CC => 07CA 07CB 07CC group=CCC 0xFF +kern -liga 07CA 07CB 07CC => 07CA 07CB 07CC group=CCC === devanagari === -0xFF 0915 094D 0937 093F => 0915 094D 093F 0937 group=CCCC -0x80 0915 094D 0937 093F => 0915 094D 093F 0937 group=CCCC -0xFF +kern -liga 0915 094D 0937 093F => 0915 094D 093F 0937 group=CCCC +0xFF 0915 094D 0937 093F => 0915 094D 0937 093F group=CCCC +0x80 0915 094D 0937 093F => 0915 094D 0937 093F group=CCCC +0xFF +kern -liga 0915 094D 0937 093F => 0915 094D 0937 093F group=CCCC === bengali === -0xFF 0995 09CD 09B7 09BF => 0995 09CD 09BF 09B7 group=CCCC -0x80 0995 09CD 09B7 09BF => 0995 09CD 09BF 09B7 group=CCCC -0xFF +kern -liga 0995 09CD 09B7 09BF => 0995 09CD 09BF 09B7 group=CCCC +0xFF 0995 09CD 09B7 09BF => 0995 09CD 09B7 09BF group=CCCC +0x80 0995 09CD 09B7 09BF => 0995 09CD 09B7 09BF group=CCCC +0xFF +kern -liga 0995 09CD 09B7 09BF => 0995 09CD 09B7 09BF group=CCCC === gurmukhi === -0xFF 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A3F 0A38 group=CCCC -0x80 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A3F 0A38 group=CCCC -0xFF +kern -liga 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A3F 0A38 group=CCCC +0xFF 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A38 0A3F group=CCCC +0x80 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A38 0A3F group=CCCC +0xFF +kern -liga 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A38 0A3F group=CCCC === tamil === 0xFF 0B95 0BCD 0BB7 0BBF => 0B95 0BCD 0BB7 0BBF group=CCCC 0x80 0B95 0BCD 0BB7 0BBF => 0B95 0BCD 0BB7 0BBF group=CCCC diff --git a/tests/data/shaping/NotoSansSaurashtra-GSUB53-Subset.txt b/tests/data/shaping/NotoSansSaurashtra-GSUB53-Subset.txt index 08a21a318..12d4e1c15 100644 --- a/tests/data/shaping/NotoSansSaurashtra-GSUB53-Subset.txt +++ b/tests/data/shaping/NotoSansSaurashtra-GSUB53-Subset.txt @@ -27,17 +27,17 @@ 0x80 07CA 07CB 07CC => 07CA 07CB 07CC group=CCC 0xFF +kern -liga 07CA 07CB 07CC => 07CA 07CB 07CC group=CCC === devanagari === -0xFF 0915 094D 0937 093F => 0915 094D 093F 0937 group=CCCC -0x80 0915 094D 0937 093F => 0915 094D 093F 0937 group=CCCC -0xFF +kern -liga 0915 094D 0937 093F => 0915 094D 093F 0937 group=CCCC +0xFF 0915 094D 0937 093F => 0915 094D 0937 093F group=CCCC +0x80 0915 094D 0937 093F => 0915 094D 0937 093F group=CCCC +0xFF +kern -liga 0915 094D 0937 093F => 0915 094D 0937 093F group=CCCC === bengali === -0xFF 0995 09CD 09B7 09BF => 0995 09CD 09BF 09B7 group=CCCC -0x80 0995 09CD 09B7 09BF => 0995 09CD 09BF 09B7 group=CCCC -0xFF +kern -liga 0995 09CD 09B7 09BF => 0995 09CD 09BF 09B7 group=CCCC +0xFF 0995 09CD 09B7 09BF => 0995 09CD 09B7 09BF group=CCCC +0x80 0995 09CD 09B7 09BF => 0995 09CD 09B7 09BF group=CCCC +0xFF +kern -liga 0995 09CD 09B7 09BF => 0995 09CD 09B7 09BF group=CCCC === gurmukhi === -0xFF 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A3F 0A38 group=CCCC -0x80 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A3F 0A38 group=CCCC -0xFF +kern -liga 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A3F 0A38 group=CCCC +0xFF 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A38 0A3F group=CCCC +0x80 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A38 0A3F group=CCCC +0xFF +kern -liga 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A38 0A3F group=CCCC === tamil === 0xFF 0B95 0BCD 0BB7 0BBF => 0B95 0BCD 0BB7 0BBF group=CCCC 0x80 0B95 0BCD 0BB7 0BBF => 0B95 0BCD 0BB7 0BBF group=CCCC diff --git a/tests/data/shaping/NotoSansSinhala-Subset.txt b/tests/data/shaping/NotoSansSinhala-Subset.txt index 2d3e54d84..c4213c368 100644 --- a/tests/data/shaping/NotoSansSinhala-Subset.txt +++ b/tests/data/shaping/NotoSansSinhala-Subset.txt @@ -27,17 +27,17 @@ 0x80 07CA 07CB 07CC => 07CA 07CB 07CC group=CCC 0xFF +kern -liga 07CA 07CB 07CC => 07CA 07CB 07CC group=CCC === devanagari === -0xFF 0915 094D 0937 093F => 0915 094D 093F 0937 group=CCCC -0x80 0915 094D 0937 093F => 0915 094D 093F 0937 group=CCCC -0xFF +kern -liga 0915 094D 0937 093F => 0915 094D 093F 0937 group=CCCC +0xFF 0915 094D 0937 093F => 0915 094D 0937 093F group=CCCC +0x80 0915 094D 0937 093F => 0915 094D 0937 093F group=CCCC +0xFF +kern -liga 0915 094D 0937 093F => 0915 094D 0937 093F group=CCCC === bengali === -0xFF 0995 09CD 09B7 09BF => 0995 09CD 09BF 09B7 group=CCCC -0x80 0995 09CD 09B7 09BF => 0995 09CD 09BF 09B7 group=CCCC -0xFF +kern -liga 0995 09CD 09B7 09BF => 0995 09CD 09BF 09B7 group=CCCC +0xFF 0995 09CD 09B7 09BF => 0995 09CD 09B7 09BF group=CCCC +0x80 0995 09CD 09B7 09BF => 0995 09CD 09B7 09BF group=CCCC +0xFF +kern -liga 0995 09CD 09B7 09BF => 0995 09CD 09B7 09BF group=CCCC === gurmukhi === -0xFF 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A3F 0A38 group=CCCC -0x80 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A3F 0A38 group=CCCC -0xFF +kern -liga 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A3F 0A38 group=CCCC +0xFF 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A38 0A3F group=CCCC +0x80 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A38 0A3F group=CCCC +0xFF +kern -liga 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A38 0A3F group=CCCC === tamil === 0xFF 0B95 0BCD 0BB7 0BBF => 0B95 0BCD 0BB7 0BBF group=CCCC 0x80 0B95 0BCD 0BB7 0BBF => 0B95 0BCD 0BB7 0BBF group=CCCC diff --git a/tests/data/shaping/NotoSansSyriac-Joining-Subset.txt b/tests/data/shaping/NotoSansSyriac-Joining-Subset.txt index 94b657ecc..e95bfa5b6 100644 --- a/tests/data/shaping/NotoSansSyriac-Joining-Subset.txt +++ b/tests/data/shaping/NotoSansSyriac-Joining-Subset.txt @@ -27,17 +27,17 @@ 0x80 07CA 07CB 07CC => 07CA 07CB 07CC group=CCC 0xFF +kern -liga 07CA 07CB 07CC => 07CA 07CB 07CC group=CCC === devanagari === -0xFF 0915 094D 0937 093F => 0915 094D 093F 0937 group=CCCC -0x80 0915 094D 0937 093F => 0915 094D 093F 0937 group=CCCC -0xFF +kern -liga 0915 094D 0937 093F => 0915 094D 093F 0937 group=CCCC +0xFF 0915 094D 0937 093F => 0915 094D 0937 093F group=CCCC +0x80 0915 094D 0937 093F => 0915 094D 0937 093F group=CCCC +0xFF +kern -liga 0915 094D 0937 093F => 0915 094D 0937 093F group=CCCC === bengali === -0xFF 0995 09CD 09B7 09BF => 0995 09CD 09BF 09B7 group=CCCC -0x80 0995 09CD 09B7 09BF => 0995 09CD 09BF 09B7 group=CCCC -0xFF +kern -liga 0995 09CD 09B7 09BF => 0995 09CD 09BF 09B7 group=CCCC +0xFF 0995 09CD 09B7 09BF => 0995 09CD 09B7 09BF group=CCCC +0x80 0995 09CD 09B7 09BF => 0995 09CD 09B7 09BF group=CCCC +0xFF +kern -liga 0995 09CD 09B7 09BF => 0995 09CD 09B7 09BF group=CCCC === gurmukhi === -0xFF 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A3F 0A38 group=CCCC -0x80 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A3F 0A38 group=CCCC -0xFF +kern -liga 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A3F 0A38 group=CCCC +0xFF 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A38 0A3F group=CCCC +0x80 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A38 0A3F group=CCCC +0xFF +kern -liga 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A38 0A3F group=CCCC === tamil === 0xFF 0B95 0BCD 0BB7 0BBF => 0B95 0BCD 0BB7 0BBF group=CCCC 0x80 0B95 0BCD 0BB7 0BBF => 0B95 0BCD 0BB7 0BBF group=CCCC diff --git a/tests/data/shaping/NotoSansTC-RegionLangSys-Synthetic.txt b/tests/data/shaping/NotoSansTC-RegionLangSys-Synthetic.txt index ad76bec74..1949581c7 100644 --- a/tests/data/shaping/NotoSansTC-RegionLangSys-Synthetic.txt +++ b/tests/data/shaping/NotoSansTC-RegionLangSys-Synthetic.txt @@ -15,9 +15,9 @@ 0x80 3042 3043 3044 => 3042 3043 3044 group=CCC 0xFF +kern -liga 3042 3043 3044 => 3042 3043 3044 group=CCC === arabic === -0xFF 0628 0640 0645 0644 0627 => 0628 0640 0645 0644 0627 group=CCCCC -0x80 0628 0640 0645 0644 0627 => 0628 0640 0645 0644 0627 group=CCCCC -0xFF +kern -liga 0628 0640 0645 0644 0627 => 0628 0640 0645 0644 0627 group=CCCCC +0xFF 0628 0640 0645 0644 0627 => 0628 0640 0645 0644 0627 group=CCCCC gpos={"1":{"kashida":8}} +0x80 0628 0640 0645 0644 0627 => 0628 0640 0645 0644 0627 group=CCCCC gpos={"1":{"kashida":8}} +0xFF +kern -liga 0628 0640 0645 0644 0627 => 0628 0640 0645 0644 0627 group=CCCCC gpos={"1":{"kashida":8}} === syriac === 0xFF 0710 0712 0713 0715 => 0710 0712 0713 0715 group=CCCC 0x80 0710 0712 0713 0715 => 0710 0712 0713 0715 group=CCCC @@ -27,17 +27,17 @@ 0x80 07CA 07CB 07CC => 07CA 07CB 07CC group=CCC 0xFF +kern -liga 07CA 07CB 07CC => 07CA 07CB 07CC group=CCC === devanagari === -0xFF 0915 094D 0937 093F => 0915 094D 0937 093F group=CCCC -0x80 0915 094D 0937 093F => 0915 094D 0937 093F group=CCCC -0xFF +kern -liga 0915 094D 0937 093F => 0915 094D 0937 093F group=CCCC +0xFF 0915 094D 0937 093F => 0915 094D 093F 0937 group=CCCC +0x80 0915 094D 0937 093F => 0915 094D 093F 0937 group=CCCC +0xFF +kern -liga 0915 094D 0937 093F => 0915 094D 093F 0937 group=CCCC === bengali === -0xFF 0995 09CD 09B7 09BF => 0995 09CD 09B7 09BF group=CCCC -0x80 0995 09CD 09B7 09BF => 0995 09CD 09B7 09BF group=CCCC -0xFF +kern -liga 0995 09CD 09B7 09BF => 0995 09CD 09B7 09BF group=CCCC +0xFF 0995 09CD 09B7 09BF => 0995 09CD 09BF 09B7 group=CCCC +0x80 0995 09CD 09B7 09BF => 0995 09CD 09BF 09B7 group=CCCC +0xFF +kern -liga 0995 09CD 09B7 09BF => 0995 09CD 09BF 09B7 group=CCCC === gurmukhi === -0xFF 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A38 0A3F group=CCCC -0x80 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A38 0A3F group=CCCC -0xFF +kern -liga 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A38 0A3F group=CCCC +0xFF 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A3F 0A38 group=CCCC +0x80 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A3F 0A38 group=CCCC +0xFF +kern -liga 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A3F 0A38 group=CCCC === tamil === 0xFF 0B95 0BCD 0BB7 0BBF => 0B95 0BCD 0BB7 0BBF group=CCCC 0x80 0B95 0BCD 0BB7 0BBF => 0B95 0BCD 0BB7 0BBF group=CCCC @@ -51,9 +51,9 @@ 0x80 0D9A 0DCA 0DBB 0DBB => 0D9A 0DCA 0DBB 0DBB group=CCCC 0xFF +kern -liga 0D9A 0DCA 0DBB 0DBB => 0D9A 0DCA 0DBB 0DBB group=CCCC === khmer === -0xFF 1780 17D2 1781 17C1 => 1780 17D2 1781 17C1 group=CCCC -0x80 1780 17D2 1781 17C1 => 1780 17D2 1781 17C1 group=CCCC -0xFF +kern -liga 1780 17D2 1781 17C1 => 1780 17D2 1781 17C1 group=CCCC +0xFF 1780 17D2 1781 17C1 => 17C1 1780 17D2 1781 group=CCCC +0x80 1780 17D2 1781 17C1 => 17C1 1780 17D2 1781 group=CCCC +0xFF +kern -liga 1780 17D2 1781 17C1 => 17C1 1780 17D2 1781 group=CCCC === thai === 0xFF 0E01 0E34 0E48 0E23 => 0E01 0E34 0E48 0E23 group=CCCC 0x80 0E01 0E34 0E48 0E23 => 0E01 0E34 0E48 0E23 group=CCCC diff --git a/tests/data/shaping/NotoSansTaiTham-LanaScript-Synthetic.txt b/tests/data/shaping/NotoSansTaiTham-LanaScript-Synthetic.txt new file mode 100644 index 000000000..f6a009923 --- /dev/null +++ b/tests/data/shaping/NotoSansTaiTham-LanaScript-Synthetic.txt @@ -0,0 +1,92 @@ +=== latin === +0xFF 0041 0056 0041 0054 0061 0072 => 0041 0056 0041 0054 0061 0072 group=CCCCCC +0x80 0041 0056 0041 0054 0061 0072 => 0041 0056 0041 0054 0061 0072 group=CCCCCC +0xFF +kern -liga 0041 0056 0041 0054 0061 0072 => 0041 0056 0041 0054 0061 0072 group=CCCCCC +=== cyrillic === +0xFF 0416 0430 0439 => 0416 0430 0439 group=CCC +0x80 0416 0430 0439 => 0416 0430 0439 group=CCC +0xFF +kern -liga 0416 0430 0439 => 0416 0430 0439 group=CCC +=== greek === +0xFF 03B1 03B2 03C2 => 03B1 03B2 03C2 group=CCC +0x80 03B1 03B2 03C2 => 03B1 03B2 03C2 group=CCC +0xFF +kern -liga 03B1 03B2 03C2 => 03B1 03B2 03C2 group=CCC +=== hiragana === +0xFF 3042 3043 3044 => 3042 3043 3044 group=CCC +0x80 3042 3043 3044 => 3042 3043 3044 group=CCC +0xFF +kern -liga 3042 3043 3044 => 3042 3043 3044 group=CCC +=== arabic === +0xFF 0628 0640 0645 0644 0627 => 0628 0640 0645 0644 0627 group=CCCCC gpos={"1":{"kashida":8}} +0x80 0628 0640 0645 0644 0627 => 0628 0640 0645 0644 0627 group=CCCCC gpos={"1":{"kashida":8}} +0xFF +kern -liga 0628 0640 0645 0644 0627 => 0628 0640 0645 0644 0627 group=CCCCC gpos={"1":{"kashida":8}} +=== syriac === +0xFF 0710 0712 0713 0715 => 0710 0712 0713 0715 group=CCCC +0x80 0710 0712 0713 0715 => 0710 0712 0713 0715 group=CCCC +0xFF +kern -liga 0710 0712 0713 0715 => 0710 0712 0713 0715 group=CCCC +=== nko === +0xFF 07CA 07CB 07CC => 07CA 07CB 07CC group=CCC +0x80 07CA 07CB 07CC => 07CA 07CB 07CC group=CCC +0xFF +kern -liga 07CA 07CB 07CC => 07CA 07CB 07CC group=CCC +=== devanagari === +0xFF 0915 094D 0937 093F => 0915 094D 093F 0937 group=CCCC +0x80 0915 094D 0937 093F => 0915 094D 093F 0937 group=CCCC +0xFF +kern -liga 0915 094D 0937 093F => 0915 094D 093F 0937 group=CCCC +=== bengali === +0xFF 0995 09CD 09B7 09BF => 0995 09CD 09BF 09B7 group=CCCC +0x80 0995 09CD 09B7 09BF => 0995 09CD 09BF 09B7 group=CCCC +0xFF +kern -liga 0995 09CD 09B7 09BF => 0995 09CD 09BF 09B7 group=CCCC +=== gurmukhi === +0xFF 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A3F 0A38 group=CCCC +0x80 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A3F 0A38 group=CCCC +0xFF +kern -liga 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A3F 0A38 group=CCCC +=== tamil === +0xFF 0B95 0BCD 0BB7 0BBF => 0B95 0BCD 0BB7 0BBF group=CCCC +0x80 0B95 0BCD 0BB7 0BBF => 0B95 0BCD 0BB7 0BBF group=CCCC +0xFF +kern -liga 0B95 0BCD 0BB7 0BBF => 0B95 0BCD 0BB7 0BBF group=CCCC +=== malayalam === +0xFF 0D15 0D4D 0D37 0D3F => 0D15 0D4D 0D37 0D3F group=CCCC +0x80 0D15 0D4D 0D37 0D3F => 0D15 0D4D 0D37 0D3F group=CCCC +0xFF +kern -liga 0D15 0D4D 0D37 0D3F => 0D15 0D4D 0D37 0D3F group=CCCC +=== sinhala === +0xFF 0D9A 0DCA 0DBB 0DBB => 0D9A 0DCA 0DBB 0DBB group=CCCC +0x80 0D9A 0DCA 0DBB 0DBB => 0D9A 0DCA 0DBB 0DBB group=CCCC +0xFF +kern -liga 0D9A 0DCA 0DBB 0DBB => 0D9A 0DCA 0DBB 0DBB group=CCCC +=== khmer === +0xFF 1780 17D2 1781 17C1 => 17C1 1780 17D2 1781 group=CCCC +0x80 1780 17D2 1781 17C1 => 17C1 1780 17D2 1781 group=CCCC +0xFF +kern -liga 1780 17D2 1781 17C1 => 17C1 1780 17D2 1781 group=CCCC +=== thai === +0xFF 0E01 0E34 0E48 0E23 => 0E01 0E34 0E48 0E23 group=CCCC +0x80 0E01 0E34 0E48 0E23 => 0E01 0E34 0E48 0E23 group=CCCC +0xFF +kern -liga 0E01 0E34 0E48 0E23 => 0E01 0E34 0E48 0E23 group=CCCC +=== lao === +0xFF 0E81 0EB4 0E8D => 0E81 0EB4 0E8D group=CCC +0x80 0E81 0EB4 0E8D => 0E81 0EB4 0E8D group=CCC +0xFF +kern -liga 0E81 0EB4 0E8D => 0E81 0EB4 0E8D group=CCC +=== myanmar === +0xFF 1000 103A 1039 1001 => 1000 103A 1039 1001 group=CCCC +0x80 1000 103A 1039 1001 => 1000 103A 1039 1001 group=CCCC +0xFF +kern -liga 1000 103A 1039 1001 => 1000 103A 1039 1001 group=CCCC +=== new tai lue === +0xFF 1980 19B0 1981 => 1980 19B0 1981 group=CCC +0x80 1980 19B0 1981 => 1980 19B0 1981 group=CCC +0xFF +kern -liga 1980 19B0 1981 => 1980 19B0 1981 group=CCC +=== cham === +0xFF AA00 AA33 AA01 => AA00 AA33 AA01 group=CCC +0x80 AA00 AA33 AA01 => AA00 AA33 AA01 group=CCC +0xFF +kern -liga AA00 AA33 AA01 => AA00 AA33 AA01 group=CCC +=== tai tham === +0xFF 1A20 1A60 1A21 => 1A20 E001 group=CC +0x80 1A20 1A60 1A21 => 1A20 E001 group=CC +0xFF +kern -liga 1A20 1A60 1A21 => 1A20 E001 group=CC +=== mixed scripts === +0xFF 0041 0628 0915 0042 => 0041 0628 0915 0042 group=CCCC +0x80 0041 0628 0915 0042 => 0041 0628 0915 0042 group=CCCC +0xFF +kern -liga 0041 0628 0915 0042 => 0041 0628 0915 0042 group=CCCC +=== spaced === +0xFF 0041 0020 0628 0020 0042 => 0041 0020 0628 0020 0042 group=CSCSC +0x80 0041 0020 0628 0020 0042 => 0041 0020 0628 0020 0042 group=CSCSC +0xFF +kern -liga 0041 0020 0628 0020 0042 => 0041 0020 0628 0020 0042 group=CSCSC +=== font characters 0 === +0xFF 0020 1A20 1A21 1A60 1A63 E000 E001 E002 => 0020 1A20 1A21 1A60 1A63 E000 E001 E002 group=SCCMCCCC +0x80 0020 1A20 1A21 1A60 1A63 E000 E001 E002 => 0020 1A20 1A21 1A60 1A63 E000 E001 E002 group=SCCMCCCC +0xFF +kern -liga 0020 1A20 1A21 1A60 1A63 E000 E001 E002 => 0020 1A20 1A21 1A60 1A63 E000 E001 E002 group=SCCMCCCC diff --git a/tests/data/shaping/NotoSansTakri-GPOS81-Subset.txt b/tests/data/shaping/NotoSansTakri-GPOS81-Subset.txt index 2d00a7ca6..bdea46b74 100644 --- a/tests/data/shaping/NotoSansTakri-GPOS81-Subset.txt +++ b/tests/data/shaping/NotoSansTakri-GPOS81-Subset.txt @@ -31,13 +31,13 @@ 0x80 0915 094D 0937 093F => 0915 094D 093F 0937 group=CCCC 0xFF +kern -liga 0915 094D 0937 093F => 0915 094D 093F 0937 group=CCCC === bengali === -0xFF 0995 09CD 09B7 09BF => 0995 09CD 09BF 09B7 group=CCCC -0x80 0995 09CD 09B7 09BF => 0995 09CD 09BF 09B7 group=CCCC -0xFF +kern -liga 0995 09CD 09B7 09BF => 0995 09CD 09BF 09B7 group=CCCC +0xFF 0995 09CD 09B7 09BF => 0995 09CD 09B7 09BF group=CCCC +0x80 0995 09CD 09B7 09BF => 0995 09CD 09B7 09BF group=CCCC +0xFF +kern -liga 0995 09CD 09B7 09BF => 0995 09CD 09B7 09BF group=CCCC === gurmukhi === -0xFF 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A3F 0A38 group=CCCC -0x80 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A3F 0A38 group=CCCC -0xFF +kern -liga 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A3F 0A38 group=CCCC +0xFF 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A38 0A3F group=CCCC +0x80 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A38 0A3F group=CCCC +0xFF +kern -liga 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A38 0A3F group=CCCC === tamil === 0xFF 0B95 0BCD 0BB7 0BBF => 0B95 0BCD 0BB7 0BBF group=CCCC 0x80 0B95 0BCD 0BB7 0BBF => 0B95 0BCD 0BB7 0BBF group=CCCC diff --git a/tests/data/shaping/NotoSansTakri-GSUB53-Subset.txt b/tests/data/shaping/NotoSansTakri-GSUB53-Subset.txt index 70ccfe1e9..af3d569d5 100644 --- a/tests/data/shaping/NotoSansTakri-GSUB53-Subset.txt +++ b/tests/data/shaping/NotoSansTakri-GSUB53-Subset.txt @@ -31,13 +31,13 @@ 0x80 0915 094D 0937 093F => 0915 094D 093F 0937 group=CCCC 0xFF +kern -liga 0915 094D 0937 093F => 0915 094D 093F 0937 group=CCCC === bengali === -0xFF 0995 09CD 09B7 09BF => 0995 09CD 09BF 09B7 group=CCCC -0x80 0995 09CD 09B7 09BF => 0995 09CD 09BF 09B7 group=CCCC -0xFF +kern -liga 0995 09CD 09B7 09BF => 0995 09CD 09BF 09B7 group=CCCC +0xFF 0995 09CD 09B7 09BF => 0995 09CD 09B7 09BF group=CCCC +0x80 0995 09CD 09B7 09BF => 0995 09CD 09B7 09BF group=CCCC +0xFF +kern -liga 0995 09CD 09B7 09BF => 0995 09CD 09B7 09BF group=CCCC === gurmukhi === -0xFF 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A3F 0A38 group=CCCC -0x80 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A3F 0A38 group=CCCC -0xFF +kern -liga 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A3F 0A38 group=CCCC +0xFF 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A38 0A3F group=CCCC +0x80 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A38 0A3F group=CCCC +0xFF +kern -liga 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A38 0A3F group=CCCC === tamil === 0xFF 0B95 0BCD 0BB7 0BBF => 0B95 0BCD 0BB7 0BBF group=CCCC 0x80 0B95 0BCD 0BB7 0BBF => 0B95 0BCD 0BB7 0BBF group=CCCC diff --git a/tests/data/shaping/NotoSansWancho-ScriptTag-Subset.txt b/tests/data/shaping/NotoSansWancho-ScriptTag-Subset.txt index 63e57e1dd..0e50d88d6 100644 --- a/tests/data/shaping/NotoSansWancho-ScriptTag-Subset.txt +++ b/tests/data/shaping/NotoSansWancho-ScriptTag-Subset.txt @@ -15,9 +15,9 @@ 0x80 3042 3043 3044 => 3042 3043 3044 group=CCC 0xFF +kern -liga 3042 3043 3044 => 3042 3043 3044 group=CCC === arabic === -0xFF 0628 0640 0645 0644 0627 => 0628 0640 0645 0644 0627 group=CCCCC -0x80 0628 0640 0645 0644 0627 => 0628 0640 0645 0644 0627 group=CCCCC -0xFF +kern -liga 0628 0640 0645 0644 0627 => 0628 0640 0645 0644 0627 group=CCCCC +0xFF 0628 0640 0645 0644 0627 => 0628 0640 0645 0644 0627 group=CCCCC gpos={"1":{"kashida":8}} +0x80 0628 0640 0645 0644 0627 => 0628 0640 0645 0644 0627 group=CCCCC gpos={"1":{"kashida":8}} +0xFF +kern -liga 0628 0640 0645 0644 0627 => 0628 0640 0645 0644 0627 group=CCCCC gpos={"1":{"kashida":8}} === syriac === 0xFF 0710 0712 0713 0715 => 0710 0712 0713 0715 group=CCCC 0x80 0710 0712 0713 0715 => 0710 0712 0713 0715 group=CCCC @@ -27,17 +27,17 @@ 0x80 07CA 07CB 07CC => 07CA 07CB 07CC group=CCC 0xFF +kern -liga 07CA 07CB 07CC => 07CA 07CB 07CC group=CCC === devanagari === -0xFF 0915 094D 0937 093F => 0915 094D 0937 093F group=CCCC -0x80 0915 094D 0937 093F => 0915 094D 0937 093F group=CCCC -0xFF +kern -liga 0915 094D 0937 093F => 0915 094D 0937 093F group=CCCC +0xFF 0915 094D 0937 093F => 0915 094D 093F 0937 group=CCCC +0x80 0915 094D 0937 093F => 0915 094D 093F 0937 group=CCCC +0xFF +kern -liga 0915 094D 0937 093F => 0915 094D 093F 0937 group=CCCC === bengali === -0xFF 0995 09CD 09B7 09BF => 0995 09CD 09B7 09BF group=CCCC -0x80 0995 09CD 09B7 09BF => 0995 09CD 09B7 09BF group=CCCC -0xFF +kern -liga 0995 09CD 09B7 09BF => 0995 09CD 09B7 09BF group=CCCC +0xFF 0995 09CD 09B7 09BF => 0995 09CD 09BF 09B7 group=CCCC +0x80 0995 09CD 09B7 09BF => 0995 09CD 09BF 09B7 group=CCCC +0xFF +kern -liga 0995 09CD 09B7 09BF => 0995 09CD 09BF 09B7 group=CCCC === gurmukhi === -0xFF 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A38 0A3F group=CCCC -0x80 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A38 0A3F group=CCCC -0xFF +kern -liga 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A38 0A3F group=CCCC +0xFF 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A3F 0A38 group=CCCC +0x80 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A3F 0A38 group=CCCC +0xFF +kern -liga 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A3F 0A38 group=CCCC === tamil === 0xFF 0B95 0BCD 0BB7 0BBF => 0B95 0BCD 0BB7 0BBF group=CCCC 0x80 0B95 0BCD 0BB7 0BBF => 0B95 0BCD 0BB7 0BBF group=CCCC @@ -51,9 +51,9 @@ 0x80 0D9A 0DCA 0DBB 0DBB => 0D9A 0DCA 0DBB 0DBB group=CCCC 0xFF +kern -liga 0D9A 0DCA 0DBB 0DBB => 0D9A 0DCA 0DBB 0DBB group=CCCC === khmer === -0xFF 1780 17D2 1781 17C1 => 1780 17D2 1781 17C1 group=CCCC -0x80 1780 17D2 1781 17C1 => 1780 17D2 1781 17C1 group=CCCC -0xFF +kern -liga 1780 17D2 1781 17C1 => 1780 17D2 1781 17C1 group=CCCC +0xFF 1780 17D2 1781 17C1 => 17C1 1780 17D2 1781 group=CCCC +0x80 1780 17D2 1781 17C1 => 17C1 1780 17D2 1781 group=CCCC +0xFF +kern -liga 1780 17D2 1781 17C1 => 17C1 1780 17D2 1781 group=CCCC === thai === 0xFF 0E01 0E34 0E48 0E23 => 0E01 0E34 0E48 0E23 group=CCCC 0x80 0E01 0E34 0E48 0E23 => 0E01 0E34 0E48 0E23 group=CCCC diff --git a/tests/data/shaping/Poppins-Regular.txt b/tests/data/shaping/Poppins-Regular.txt index 1a2c8e6fa..b6e9c24bc 100644 --- a/tests/data/shaping/Poppins-Regular.txt +++ b/tests/data/shaping/Poppins-Regular.txt @@ -31,13 +31,13 @@ 0x80 0915 094D 0937 093F => E219 E000 group=CC 0xFF +kern -liga 0915 094D 0937 093F => E219 E000 group=CC === bengali === -0xFF 0995 09CD 09B7 09BF => 0995 09CD 09BF 09B7 group=CCCC -0x80 0995 09CD 09B7 09BF => 0995 09CD 09BF 09B7 group=CCCC -0xFF +kern -liga 0995 09CD 09B7 09BF => 0995 09CD 09BF 09B7 group=CCCC +0xFF 0995 09CD 09B7 09BF => 0995 09CD 09B7 09BF group=CCCC +0x80 0995 09CD 09B7 09BF => 0995 09CD 09B7 09BF group=CCCC +0xFF +kern -liga 0995 09CD 09B7 09BF => 0995 09CD 09B7 09BF group=CCCC === gurmukhi === -0xFF 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A3F 0A38 group=CCCC -0x80 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A3F 0A38 group=CCCC -0xFF +kern -liga 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A3F 0A38 group=CCCC +0xFF 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A38 0A3F group=CCCC +0x80 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A38 0A3F group=CCCC +0xFF +kern -liga 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A38 0A3F group=CCCC === tamil === 0xFF 0B95 0BCD 0BB7 0BBF => 0B95 0BCD 0BB7 0BBF group=CCCC 0x80 0B95 0BCD 0BB7 0BBF => 0B95 0BCD 0BB7 0BBF group=CCCC diff --git a/tests/data/shaping/SedanSC-EmptyFeature-Subset.txt b/tests/data/shaping/SedanSC-EmptyFeature-Subset.txt index be8834bae..4abaf6741 100644 --- a/tests/data/shaping/SedanSC-EmptyFeature-Subset.txt +++ b/tests/data/shaping/SedanSC-EmptyFeature-Subset.txt @@ -27,17 +27,17 @@ 0x80 07CA 07CB 07CC => 07CA 07CB 07CC group=CCC 0xFF +kern -liga 07CA 07CB 07CC => 07CA 07CB 07CC group=CCC === devanagari === -0xFF 0915 094D 0937 093F => 0915 094D 093F 0937 group=CCCC -0x80 0915 094D 0937 093F => 0915 094D 093F 0937 group=CCCC -0xFF +kern -liga 0915 094D 0937 093F => 0915 094D 093F 0937 group=CCCC +0xFF 0915 094D 0937 093F => 0915 094D 0937 093F group=CCCC +0x80 0915 094D 0937 093F => 0915 094D 0937 093F group=CCCC +0xFF +kern -liga 0915 094D 0937 093F => 0915 094D 0937 093F group=CCCC === bengali === -0xFF 0995 09CD 09B7 09BF => 0995 09CD 09BF 09B7 group=CCCC -0x80 0995 09CD 09B7 09BF => 0995 09CD 09BF 09B7 group=CCCC -0xFF +kern -liga 0995 09CD 09B7 09BF => 0995 09CD 09BF 09B7 group=CCCC +0xFF 0995 09CD 09B7 09BF => 0995 09CD 09B7 09BF group=CCCC +0x80 0995 09CD 09B7 09BF => 0995 09CD 09B7 09BF group=CCCC +0xFF +kern -liga 0995 09CD 09B7 09BF => 0995 09CD 09B7 09BF group=CCCC === gurmukhi === -0xFF 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A3F 0A38 group=CCCC -0x80 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A3F 0A38 group=CCCC -0xFF +kern -liga 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A3F 0A38 group=CCCC +0xFF 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A38 0A3F group=CCCC +0x80 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A38 0A3F group=CCCC +0xFF +kern -liga 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A38 0A3F group=CCCC === tamil === 0xFF 0B95 0BCD 0BB7 0BBF => 0B95 0BCD 0BB7 0BBF group=CCCC 0x80 0B95 0BCD 0BB7 0BBF => 0B95 0BCD 0BB7 0BBF group=CCCC diff --git a/tests/data/snapshots/tai-tham-sakot.pdf b/tests/data/snapshots/tai-tham-sakot.pdf index e55cd21af2ab91c93e6be745bb5419ca0d4b98d6..f1f33e900d6b03b7c5a74a1c10a5c1af481f37bd 100644 GIT binary patch delta 2632 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 diff --git a/tests/data/subset/NotoSansBengali-GuruScript-Synthetic.json b/tests/data/subset/NotoSansBengali-GuruScript-Synthetic.json new file mode 100644 index 000000000..88db6e53c --- /dev/null +++ b/tests/data/subset/NotoSansBengali-GuruScript-Synthetic.json @@ -0,0 +1,123 @@ +{ + "_": "Generated by composer subset:update. See tests/Mpdf/Fonts/SubsetGoldenMaster.php.", + "useOTL=0x00": { + "characters": 9, + "makeSubset": { + "bytes": 2172, + "sha256": "daed5a8a702380648982d2f7e9da14ac5f8f3d5404fb967c863fddae6ff08313", + "tables": { + "OS/2": "96 bytes, checksum 0x805479C8, sha256 9cdd48b09cc447f76c442e442f291973e5714da75917e3f81368e260671a2172", + "cmap": "108 bytes, checksum 0x394D146C, sha256 ab74a71cdee3ef547f433849232e56931cce629a6fb644c9be66e18832c4790d", + "gasp": "8 bytes, checksum 0x00000010, sha256 4ca731f86ad506ac0e320283dc9461926346de3c4d91d539ea7f6620d3826940", + "glyf": "1004 bytes, checksum 0x17873991, sha256 b147e21d29e0207fad56ab068b6224b76a19c0a1dbfc102a33c92d69f2e10283", + "head": "54 bytes, checksum 0x1E5ECCDE, sha256 c5648d974758747ac74170cba8c3b40aa54c5915f1962341692d76f20e8f9484", + "hhea": "36 bytes, checksum 0x068903B5, sha256 e7330e6f902fd111c3cb0932e4da6c2d5ee8208a28a8ba30bd33515f007c69c8", + "hmtx": "36 bytes, checksum 0x111C007C, sha256 793b6cad091178302ca7acf847b6a98b3f1d3fb83671c6456914464e17a3dd3e", + "loca": "20 bytes, checksum 0x047C054C, sha256 d7a03b8d662bbcbf0886ecac8efc8edeea8a1144b9c08cf4f003b45e9922c56a", + "maxp": "32 bytes, checksum 0x00120045, sha256 9b5303cdff58e0fc16dbdeec5fc8df4437bd1daf3b8feb4d9bc5371f666cbd60", + "name": "554 bytes, checksum 0x30964869, sha256 1470a1e9edf83ac4991c1d9303d3425f86dd4bafa480c3c48533b6be07679532", + "post": "32 bytes, checksum 0xFF9F0032, sha256 4fdc83d5e42fe44650fe86f15a645d5cc926d07355ba945e1ede42737607bf83" + }, + "maxUni": 65535, + "defaultWidth": 600, + "codeToGlyph": "9 entries, sha256 27676bbb4e70064f70b3bcbe0ddaa10526e80cd0f75ace6dd28e137393622478" + }, + "makeSubsetSIP": { + "bytes": 2152, + "sha256": "841c91a3f892f1a848659e146c01baa91548ce5d4a44a1bce1a53996f9268694", + "tables": { + "OS/2": "96 bytes, checksum 0x6633D504, sha256 b29abfebe280b7b9247efba33c975d35734f180921ca523e732af21026e0f8c8", + "cmap": "88 bytes, checksum 0x0046009F, sha256 a51feaf8ac92130c6dbb6928e930ab98438f8538e2d11d389bc59faa982dcf4a", + "gasp": "8 bytes, checksum 0x00000010, sha256 4ca731f86ad506ac0e320283dc9461926346de3c4d91d539ea7f6620d3826940", + "glyf": "1004 bytes, checksum 0x17873991, sha256 3e3813ae7fcb41995ce434a59ec7809da764e031159772f810ee8ef726af543b", + "head": "54 bytes, checksum 0x1E5ECCDE, sha256 7ce499c3231416297ac2b4368de966cdb6822e889dc469d8d619f28ecc1c693d", + "hhea": "36 bytes, checksum 0x068903B5, sha256 e7330e6f902fd111c3cb0932e4da6c2d5ee8208a28a8ba30bd33515f007c69c8", + "hmtx": "36 bytes, checksum 0x111C007C, sha256 9ffe6237ef9b4c84c931452a84f34f09c417f51e5ac1ef50c9cdd7864cfaa26f", + "loca": "20 bytes, checksum 0x03E0051A, sha256 a5c051ad4bb0091359bd0da187ad4cfc7a4794bb4e8ce4d647a8ece4dcaa05fd", + "maxp": "32 bytes, checksum 0x00120045, sha256 9b5303cdff58e0fc16dbdeec5fc8df4437bd1daf3b8feb4d9bc5371f666cbd60", + "name": "554 bytes, checksum 0x308F4869, sha256 b26e64e250583c6c3b6d4cdc533d80645cb7e30d08b0bbc6fd11f6eb835764ae", + "post": "32 bytes, checksum 0xFF9F0032, sha256 4fdc83d5e42fe44650fe86f15a645d5cc926d07355ba945e1ede42737607bf83" + }, + "maxUniChar": 65535, + "defaultWidth": 600 + }, + "repackageTTF": { + "bytes": 2224, + "sha256": "070934bfa3e32fe6d2dae7fe85a3ccee7f30544f104f93cd616b7c0d9265c87c", + "tables": { + "OS/2": "96 bytes, checksum 0x805479C8, sha256 9cdd48b09cc447f76c442e442f291973e5714da75917e3f81368e260671a2172", + "cmap": "92 bytes, checksum 0x5EC8EEB7, sha256 96f224410f3d7266dae94d9626b249591d84eab39e6e3653531088e1a0790b8d", + "gasp": "8 bytes, checksum 0x00000010, sha256 4ca731f86ad506ac0e320283dc9461926346de3c4d91d539ea7f6620d3826940", + "glyf": "996 bytes, checksum 0xB3639DAF, sha256 c9f3a1edbb1e3aee2c874d0401a77a00fd372d34321f0adbf8eef95ba179eaae", + "head": "54 bytes, checksum 0x1E5ECCDE, sha256 c7a47cbfbaaee77576b4f81c920aa21cc074b6b9cdf3e08771f480a3fb9b97b3", + "hhea": "36 bytes, checksum 0x068903B5, sha256 e7330e6f902fd111c3cb0932e4da6c2d5ee8208a28a8ba30bd33515f007c69c8", + "hmtx": "36 bytes, checksum 0x111C007C, sha256 793b6cad091178302ca7acf847b6a98b3f1d3fb83671c6456914464e17a3dd3e", + "loca": "20 bytes, checksum 0x04740542, sha256 3bce5cbaf580b8c53a539a8644b950d6c140731d00189bfaa6a721c8cfadf87b", + "maxp": "32 bytes, checksum 0x00120045, sha256 9b5303cdff58e0fc16dbdeec5fc8df4437bd1daf3b8feb4d9bc5371f666cbd60", + "name": "554 bytes, checksum 0x30964869, sha256 1470a1e9edf83ac4991c1d9303d3425f86dd4bafa480c3c48533b6be07679532", + "post": "108 bytes, checksum 0x8B7ABECC, sha256 f00be54574ac6dd29adbf678f195657fd56d5fd05bcc9338426d891783123f0c" + }, + "maxUni": 0 + } + }, + "useOTL=0xFF": { + "characters": 9, + "makeSubset": { + "bytes": 2172, + "sha256": "daed5a8a702380648982d2f7e9da14ac5f8f3d5404fb967c863fddae6ff08313", + "tables": { + "OS/2": "96 bytes, checksum 0x805479C8, sha256 9cdd48b09cc447f76c442e442f291973e5714da75917e3f81368e260671a2172", + "cmap": "108 bytes, checksum 0x394D146C, sha256 ab74a71cdee3ef547f433849232e56931cce629a6fb644c9be66e18832c4790d", + "gasp": "8 bytes, checksum 0x00000010, sha256 4ca731f86ad506ac0e320283dc9461926346de3c4d91d539ea7f6620d3826940", + "glyf": "1004 bytes, checksum 0x17873991, sha256 b147e21d29e0207fad56ab068b6224b76a19c0a1dbfc102a33c92d69f2e10283", + "head": "54 bytes, checksum 0x1E5ECCDE, sha256 c5648d974758747ac74170cba8c3b40aa54c5915f1962341692d76f20e8f9484", + "hhea": "36 bytes, checksum 0x068903B5, sha256 e7330e6f902fd111c3cb0932e4da6c2d5ee8208a28a8ba30bd33515f007c69c8", + "hmtx": "36 bytes, checksum 0x111C007C, sha256 793b6cad091178302ca7acf847b6a98b3f1d3fb83671c6456914464e17a3dd3e", + "loca": "20 bytes, checksum 0x047C054C, sha256 d7a03b8d662bbcbf0886ecac8efc8edeea8a1144b9c08cf4f003b45e9922c56a", + "maxp": "32 bytes, checksum 0x00120045, sha256 9b5303cdff58e0fc16dbdeec5fc8df4437bd1daf3b8feb4d9bc5371f666cbd60", + "name": "554 bytes, checksum 0x30964869, sha256 1470a1e9edf83ac4991c1d9303d3425f86dd4bafa480c3c48533b6be07679532", + "post": "32 bytes, checksum 0xFF9F0032, sha256 4fdc83d5e42fe44650fe86f15a645d5cc926d07355ba945e1ede42737607bf83" + }, + "maxUni": 65535, + "defaultWidth": 600, + "codeToGlyph": "9 entries, sha256 27676bbb4e70064f70b3bcbe0ddaa10526e80cd0f75ace6dd28e137393622478" + }, + "makeSubsetSIP": { + "bytes": 2152, + "sha256": "841c91a3f892f1a848659e146c01baa91548ce5d4a44a1bce1a53996f9268694", + "tables": { + "OS/2": "96 bytes, checksum 0x6633D504, sha256 b29abfebe280b7b9247efba33c975d35734f180921ca523e732af21026e0f8c8", + "cmap": "88 bytes, checksum 0x0046009F, sha256 a51feaf8ac92130c6dbb6928e930ab98438f8538e2d11d389bc59faa982dcf4a", + "gasp": "8 bytes, checksum 0x00000010, sha256 4ca731f86ad506ac0e320283dc9461926346de3c4d91d539ea7f6620d3826940", + "glyf": "1004 bytes, checksum 0x17873991, sha256 3e3813ae7fcb41995ce434a59ec7809da764e031159772f810ee8ef726af543b", + "head": "54 bytes, checksum 0x1E5ECCDE, sha256 7ce499c3231416297ac2b4368de966cdb6822e889dc469d8d619f28ecc1c693d", + "hhea": "36 bytes, checksum 0x068903B5, sha256 e7330e6f902fd111c3cb0932e4da6c2d5ee8208a28a8ba30bd33515f007c69c8", + "hmtx": "36 bytes, checksum 0x111C007C, sha256 9ffe6237ef9b4c84c931452a84f34f09c417f51e5ac1ef50c9cdd7864cfaa26f", + "loca": "20 bytes, checksum 0x03E0051A, sha256 a5c051ad4bb0091359bd0da187ad4cfc7a4794bb4e8ce4d647a8ece4dcaa05fd", + "maxp": "32 bytes, checksum 0x00120045, sha256 9b5303cdff58e0fc16dbdeec5fc8df4437bd1daf3b8feb4d9bc5371f666cbd60", + "name": "554 bytes, checksum 0x308F4869, sha256 b26e64e250583c6c3b6d4cdc533d80645cb7e30d08b0bbc6fd11f6eb835764ae", + "post": "32 bytes, checksum 0xFF9F0032, sha256 4fdc83d5e42fe44650fe86f15a645d5cc926d07355ba945e1ede42737607bf83" + }, + "maxUniChar": 65535, + "defaultWidth": 600 + }, + "repackageTTF": { + "bytes": 2232, + "sha256": "1f791abccd8fcc26af63ea617893f00f9cb7f118c8c960a8acba38751d9b9d40", + "tables": { + "OS/2": "96 bytes, checksum 0x805479C8, sha256 9cdd48b09cc447f76c442e442f291973e5714da75917e3f81368e260671a2172", + "cmap": "100 bytes, checksum 0x5EC8EEE4, sha256 82f1e3137c11b2b5df509fae504c72128e559311b143b570891f83b225628bcc", + "gasp": "8 bytes, checksum 0x00000010, sha256 4ca731f86ad506ac0e320283dc9461926346de3c4d91d539ea7f6620d3826940", + "glyf": "996 bytes, checksum 0xB3639DAF, sha256 c9f3a1edbb1e3aee2c874d0401a77a00fd372d34321f0adbf8eef95ba179eaae", + "head": "54 bytes, checksum 0x1E5ECCDE, sha256 12ad7c04737cce6b56575d034ca25a85f1398f13529371a9f963babcc95630a4", + "hhea": "36 bytes, checksum 0x068903B5, sha256 e7330e6f902fd111c3cb0932e4da6c2d5ee8208a28a8ba30bd33515f007c69c8", + "hmtx": "36 bytes, checksum 0x111C007C, sha256 793b6cad091178302ca7acf847b6a98b3f1d3fb83671c6456914464e17a3dd3e", + "loca": "20 bytes, checksum 0x04740542, sha256 3bce5cbaf580b8c53a539a8644b950d6c140731d00189bfaa6a721c8cfadf87b", + "maxp": "32 bytes, checksum 0x00120045, sha256 9b5303cdff58e0fc16dbdeec5fc8df4437bd1daf3b8feb4d9bc5371f666cbd60", + "name": "554 bytes, checksum 0x30964869, sha256 1470a1e9edf83ac4991c1d9303d3425f86dd4bafa480c3c48533b6be07679532", + "post": "108 bytes, checksum 0x8B7ABECC, sha256 f00be54574ac6dd29adbf678f195657fd56d5fd05bcc9338426d891783123f0c" + }, + "maxUni": 0 + } + } +} diff --git a/tests/data/subset/NotoSansTaiTham-LanaScript-Synthetic.json b/tests/data/subset/NotoSansTaiTham-LanaScript-Synthetic.json new file mode 100644 index 000000000..0d16ba2ef --- /dev/null +++ b/tests/data/subset/NotoSansTaiTham-LanaScript-Synthetic.json @@ -0,0 +1,123 @@ +{ + "_": "Generated by composer subset:update. See tests/Mpdf/Fonts/SubsetGoldenMaster.php.", + "useOTL=0x00": { + "characters": 6, + "makeSubset": { + "bytes": 1652, + "sha256": "1c046042cd31245c1bc344c19b4712174240b9f3a0d04b3fb245b305f5c759f2", + "tables": { + "OS/2": "96 bytes, checksum 0x62867003, sha256 223e1e34a0e510a770c27333b1bd4ed290c3604051892b0ec2a1774c1084e71d", + "cmap": "100 bytes, checksum 0x347C3581, sha256 0396bed186025aa7dea024e460be494f3c274717fc34fb406f4392a631f1adab", + "gasp": "8 bytes, checksum 0x00000010, sha256 4ca731f86ad506ac0e320283dc9461926346de3c4d91d539ea7f6620d3826940", + "glyf": "504 bytes, checksum 0x4002F834, sha256 6da5814507f437da72e4c49d9dbc02160678a48700b093bb30b21dbafbb8e5c1", + "head": "54 bytes, checksum 0x21F43A40, sha256 352604018d7734c7f091946407360833734318e959bf6e0950dbb0ca653dd031", + "hhea": "36 bytes, checksum 0x05500064, sha256 482dc9526afb95617a6bd0f8bd3c894ff478a2518dc1628ca1100767a1797dff", + "hmtx": "24 bytes, checksum 0x0CAE020B, sha256 8860e66ee50df9ef3a122950ba40a3a276aae2b3518aacec04d63b3c901e64b4", + "loca": "14 bytes, checksum 0x023C01B0, sha256 ed0b5d8a97bc4b6e3afd46bbb4cd83565d44acc1077fadc105fb5aaa41f2fff2", + "maxp": "32 bytes, checksum 0x000B0078, sha256 49ff426e03fe2641d4dea8eb3c9271e9e5cc2a2a9d8d7ac25c2be28f4181e01e", + "name": "560 bytes, checksum 0x303B48C5, sha256 5fa8da46289162eac1235dc1ec4e73ef61f3e2599d5e177cf6e19682e51f1f3e", + "post": "32 bytes, checksum 0xFFB80032, sha256 77a232e4db6b60c21f7b76ccf821e3c80c519901f11d10efb8c8df04ca82a4e8" + }, + "maxUni": 65535, + "defaultWidth": 619, + "codeToGlyph": "6 entries, sha256 e350b4ff46f1c3855ed9dd091c5df0def90c937bffea4c1fb63b6f9e8ebcc16b" + }, + "makeSubsetSIP": { + "bytes": 1636, + "sha256": "3f8939badfa0fad8c19dae8b5eab7f4965cc441ef0fa5043fcb8af4b1cb24092", + "tables": { + "OS/2": "96 bytes, checksum 0x6865D6A6, sha256 4c3b19c8ae72f32d4bac521a615063fcb8a31d296c1aaea32cf9e2f71e52abed", + "cmap": "82 bytes, checksum 0x00420076, sha256 f6d9593a66846b174499232d5c653827aca29fb4afa95c9d48a8b1a05f33bb84", + "gasp": "8 bytes, checksum 0x00000010, sha256 4ca731f86ad506ac0e320283dc9461926346de3c4d91d539ea7f6620d3826940", + "glyf": "504 bytes, checksum 0x4002F834, sha256 dddfaa3e3c129073f11c85fb05e209a376cdf97cc1d85420788af89628478243", + "head": "54 bytes, checksum 0x21F43A40, sha256 2cbbca66ee4647454a0581d60cfb6f64a5a0ab840a987989ce3659a4a865e25c", + "hhea": "36 bytes, checksum 0x05500064, sha256 482dc9526afb95617a6bd0f8bd3c894ff478a2518dc1628ca1100767a1797dff", + "hmtx": "24 bytes, checksum 0x0CAE020B, sha256 9c5e5a96ff0b113f4f5b223cf715a8a9c6f676d5c6e8a591ab02685fb8c182b5", + "loca": "14 bytes, checksum 0x01C60150, sha256 fdeab992766afdd530752ec3392a5154df70487c8d3431085edd3634d0b25003", + "maxp": "32 bytes, checksum 0x000B0078, sha256 49ff426e03fe2641d4dea8eb3c9271e9e5cc2a2a9d8d7ac25c2be28f4181e01e", + "name": "560 bytes, checksum 0x303448C5, sha256 4355ebe3a62e2d449df4301d1f39f9fb83e94cf8cf78031a7e9bed4aacfc3379", + "post": "32 bytes, checksum 0xFFB80032, sha256 77a232e4db6b60c21f7b76ccf821e3c80c519901f11d10efb8c8df04ca82a4e8" + }, + "maxUniChar": 65535, + "defaultWidth": 619 + }, + "repackageTTF": { + "bytes": 2028, + "sha256": "ecc951d3c33573b3cd98926bd77b6c4c32ce432c24cbeee06128f9bf329a165d", + "tables": { + "OS/2": "96 bytes, checksum 0x62867003, sha256 223e1e34a0e510a770c27333b1bd4ed290c3604051892b0ec2a1774c1084e71d", + "cmap": "80 bytes, checksum 0x4EB51B15, sha256 17b5d1e2ebb574ecdc4be5d119434c458894cb47655d442be42b6457e40eb6a7", + "gasp": "8 bytes, checksum 0x00000010, sha256 4ca731f86ad506ac0e320283dc9461926346de3c4d91d539ea7f6620d3826940", + "glyf": "790 bytes, checksum 0x1112BBA1, sha256 ea724f9268c5f7f5d83f111929a2f24bfa6c439df23a9052f70188f3f6ecac1e", + "head": "54 bytes, checksum 0x21F43A40, sha256 ab292f9d49d28251d9cfe9bfe526e43306ffad9cb75696b0bade6925def384bf", + "hhea": "36 bytes, checksum 0x05500067, sha256 8008d6840a167444cf66260d90c57a3b3d30ad18b892000362c2d5fb32f20aa0", + "hmtx": "36 bytes, checksum 0x0CB0FB43, sha256 d9535bccab58fda90a198a0e37151ec354e4be18ba03e8c7ecb1e220ccce3c4d", + "loca": "20 bytes, checksum 0x042204FD, sha256 c1c0faeb02e2f115d0f95e0055d64e70fae8ec176462e0801a7cca14e6aa49ed", + "maxp": "32 bytes, checksum 0x000E0078, sha256 d313a56897cd4fbd9de4c105d5b4b031af87210ead69c34e17995667cb07f5e0", + "name": "560 bytes, checksum 0x303B48C5, sha256 5fa8da46289162eac1235dc1ec4e73ef61f3e2599d5e177cf6e19682e51f1f3e", + "post": "124 bytes, checksum 0xD6A58816, sha256 da3f0007e4fbbea000daa270e069659b9c64d7009a83904872045ff341b1e1bd" + }, + "maxUni": 0 + } + }, + "useOTL=0xFF": { + "characters": 9, + "makeSubset": { + "bytes": 1972, + "sha256": "2d03a84a14d09ce0db3a85eb5190164bc55c18285f96c01d525eb3c0fb50590b", + "tables": { + "OS/2": "96 bytes, checksum 0x62867003, sha256 223e1e34a0e510a770c27333b1bd4ed290c3604051892b0ec2a1774c1084e71d", + "cmap": "108 bytes, checksum 0x14A8356F, sha256 a4e4463aa089ccb282e6911bdeeba8e4ed85d4f7a8eca51d06f6463e93cb055a", + "gasp": "8 bytes, checksum 0x00000010, sha256 4ca731f86ad506ac0e320283dc9461926346de3c4d91d539ea7f6620d3826940", + "glyf": "800 bytes, checksum 0xA34E2963, sha256 5f7c125c2cad36b939563e8795520acbe479b75d18864a42b46afd948d6b1732", + "head": "54 bytes, checksum 0x21F43A40, sha256 8a3916ebdfc05d6238b64bc900d81e3fcbc082e9f889e26c1afb8fe05f1bdaff", + "hhea": "36 bytes, checksum 0x05500067, sha256 8008d6840a167444cf66260d90c57a3b3d30ad18b892000362c2d5fb32f20aa0", + "hmtx": "36 bytes, checksum 0x0CB0FB43, sha256 d9535bccab58fda90a198a0e37151ec354e4be18ba03e8c7ecb1e220ccce3c4d", + "loca": "20 bytes, checksum 0x042C050A, sha256 9a1dc6179d64bf9997774ee965d64a439c24efd4d0e24b0826f3c5aea31512d1", + "maxp": "32 bytes, checksum 0x000E0078, sha256 d313a56897cd4fbd9de4c105d5b4b031af87210ead69c34e17995667cb07f5e0", + "name": "560 bytes, checksum 0x303B48C5, sha256 5fa8da46289162eac1235dc1ec4e73ef61f3e2599d5e177cf6e19682e51f1f3e", + "post": "32 bytes, checksum 0xFFB80032, sha256 77a232e4db6b60c21f7b76ccf821e3c80c519901f11d10efb8c8df04ca82a4e8" + }, + "maxUni": 65535, + "defaultWidth": 619, + "codeToGlyph": "9 entries, sha256 9391bb61221eced9d8c0f9d990c87a5959d374dad7961cc6a7332108eda0b259" + }, + "makeSubsetSIP": { + "bytes": 1952, + "sha256": "3d5199e8035ddda5ce042df4917ec92727d43dbfce18afd9f0a769dd8f7e3b84", + "tables": { + "OS/2": "96 bytes, checksum 0x6865D6A9, sha256 c2d76e430d6422a33826a5406025605dd713700f6b8bbeea1e8dbcd7736effbf", + "cmap": "88 bytes, checksum 0x0046009F, sha256 a51feaf8ac92130c6dbb6928e930ab98438f8538e2d11d389bc59faa982dcf4a", + "gasp": "8 bytes, checksum 0x00000010, sha256 4ca731f86ad506ac0e320283dc9461926346de3c4d91d539ea7f6620d3826940", + "glyf": "800 bytes, checksum 0xA3502963, sha256 e6ffdbd1a8b846ed5b667ccc76c05ace7bcf6694dc1ec45d69ea2be1950d4aae", + "head": "54 bytes, checksum 0x21F43A40, sha256 06799e26738cdeaba947e7be4b8f3e6166d04bb8925dc072461a56caf17248fd", + "hhea": "36 bytes, checksum 0x05500067, sha256 8008d6840a167444cf66260d90c57a3b3d30ad18b892000362c2d5fb32f20aa0", + "hmtx": "36 bytes, checksum 0x0CB0FB43, sha256 a35a27ee75aa89f6d12499b6bb4bd1a3efa26988cc76f3f0378e53785dd41a33", + "loca": "20 bytes, checksum 0x034E042C, sha256 a49f4272a25d76c957fbb96e2026c1f71a52b75842182d5509c27e7595a69e05", + "maxp": "32 bytes, checksum 0x000E0078, sha256 d313a56897cd4fbd9de4c105d5b4b031af87210ead69c34e17995667cb07f5e0", + "name": "560 bytes, checksum 0x303448C5, sha256 4355ebe3a62e2d449df4301d1f39f9fb83e94cf8cf78031a7e9bed4aacfc3379", + "post": "32 bytes, checksum 0xFFB80032, sha256 77a232e4db6b60c21f7b76ccf821e3c80c519901f11d10efb8c8df04ca82a4e8" + }, + "maxUniChar": 65535, + "defaultWidth": 619 + }, + "repackageTTF": { + "bytes": 2048, + "sha256": "0a1ed9e2cb68ddfb28d767e661f5d34b484fa35ff83bdf70fd09b7b14f4a05dc", + "tables": { + "OS/2": "96 bytes, checksum 0x62867003, sha256 223e1e34a0e510a770c27333b1bd4ed290c3604051892b0ec2a1774c1084e71d", + "cmap": "100 bytes, checksum 0xF4835587, sha256 04c65ef6477b9a9f8263b94332170dd23672f12dcb4366a2715844bad3df7378", + "gasp": "8 bytes, checksum 0x00000010, sha256 4ca731f86ad506ac0e320283dc9461926346de3c4d91d539ea7f6620d3826940", + "glyf": "790 bytes, checksum 0x1112BBA1, sha256 ea724f9268c5f7f5d83f111929a2f24bfa6c439df23a9052f70188f3f6ecac1e", + "head": "54 bytes, checksum 0x21F43A40, sha256 fad5095b1e69fc129c46063d8f6a623988cfb5480f7003569f25dc1e8dd365df", + "hhea": "36 bytes, checksum 0x05500067, sha256 8008d6840a167444cf66260d90c57a3b3d30ad18b892000362c2d5fb32f20aa0", + "hmtx": "36 bytes, checksum 0x0CB0FB43, sha256 d9535bccab58fda90a198a0e37151ec354e4be18ba03e8c7ecb1e220ccce3c4d", + "loca": "20 bytes, checksum 0x042204FD, sha256 c1c0faeb02e2f115d0f95e0055d64e70fae8ec176462e0801a7cca14e6aa49ed", + "maxp": "32 bytes, checksum 0x000E0078, sha256 d313a56897cd4fbd9de4c105d5b4b031af87210ead69c34e17995667cb07f5e0", + "name": "560 bytes, checksum 0x303B48C5, sha256 5fa8da46289162eac1235dc1ec4e73ef61f3e2599d5e177cf6e19682e51f1f3e", + "post": "124 bytes, checksum 0xD6A58816, sha256 da3f0007e4fbbea000daa270e069659b9c64d7009a83904872045ff341b1e1bd" + }, + "maxUni": 0 + } + } +} diff --git a/tests/data/ttf/NotoSansBengali-GuruScript-Synthetic.ttf b/tests/data/ttf/NotoSansBengali-GuruScript-Synthetic.ttf new file mode 100644 index 0000000000000000000000000000000000000000..e57242d938c546b4f0776557811a0faa611b0e3f GIT binary patch literal 2400 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 OQ?@rz>tl9~iRT~oH;a(~ literal 0 HcmV?d00001 From e6c507d07f4990d0485ff92dcd0e4aee6d7876a3 Mon Sep 17 00:00:00 2001 From: Jake Jackson Date: Thu, 17 Sep 2026 10:12:22 +1000 Subject: [PATCH 2/4] Split loading a script's GSUB data from loading its lookups, and read GSUB and GPOS features one way (#199) loadGsubData() took a flag only to return between its two halves: the derived tables every shaper reads, and the table, coverage and lookup list only a run with features needs. They are now two methods, and applyGSUB() calls the second where there are features. The GPOS feature read beside the GSUB one goes through the same accessor, and shaperForScriptTag() takes the shaper it narrows as an argument rather than reading it back off the object. Co-Authored-By: Claude Opus 5 (1M context) --- src/Otl.php | 71 ++++++++++++++++++++++++++++++----------------------- 1 file changed, 40 insertions(+), 31 deletions(-) diff --git a/src/Otl.php b/src/Otl.php index d0052ec9f..cdd81bed2 100644 --- a/src/Otl.php +++ b/src/Otl.php @@ -206,10 +206,10 @@ function applyOTL($str, $useOTL) list($GSUBscriptTag, $GSUBlangsys, $GPOSscriptTag, $GPOSlangsys, $is_old_spec) = $this->selectScriptAndLanguage($scriptblock, $useOTL); - $this->shaper = $this->shaperForScriptTag($scriptblock, $GSUBscriptTag); + $this->shaper = $this->shaperForScriptTag($this->shaper, $scriptblock, $GSUBscriptTag); // A run the font offers no script for still goes to its shaper, which reorders it with - // no lookups to apply. Every script with a shaper is one useOTL opens with 0x80, and a + // nothing to substitute. Every script with a shaper is one useOTL opens with 0x80, and a // document that has not opened it gets nothing. $shapeWithoutTables = $this->shaper && ($useOTL & 0x80); @@ -220,8 +220,8 @@ function applyOTL($str, $useOTL) continue; } - $GSUBFeatures = $this->gsubFeatures($GSUBscriptTag, $GSUBlangsys); - $GPOSFeatures = (isset($this->mpdf->CurrentFont['GPOSFeatures'][$GPOSscriptTag][$GPOSlangsys]) ? $this->mpdf->CurrentFont['GPOSFeatures'][$GPOSscriptTag][$GPOSlangsys] : false); + $GSUBFeatures = $this->features('GSUB', $GSUBscriptTag, $GSUBlangsys); + $GPOSFeatures = $this->features('GPOS', $GPOSscriptTag, $GPOSlangsys); $this->assocLigs = []; // Ligatures[$posarr lpos] => nc $this->assocMarks = []; // assocMarks[$posarr mpos] => array(compID, ligPos) @@ -481,7 +481,13 @@ private function applyGSUB($GSUBscriptTag, $GSUBlangsys, $GSUBFeatures, $scriptb return ''; } - $this->loadGsubData($GSUBscriptTag, $GSUBlangsys, (bool) $GSUBFeatures); + $this->loadGsubDerivedData($GSUBscriptTag, $GSUBlangsys); + + // A run with nothing to substitute still goes to its shaper, and its font need not have a + // GSUB table at all + if ($GSUBFeatures) { + $this->loadGsubLookups(); + } // 5. GSUB - Shaper if ($this->shaper == 'A') { @@ -512,12 +518,11 @@ private function applyGSUB($GSUBscriptTag, $GSUBlangsys, $GSUBFeatures, $scriptb /** * Phase 4: what this font's GSUB table says, for this script and language system. * - * Three things, cached for the life of the document because a document sets the same font for - * line after line: the derived tables the shapers work from, which the parser builds per script - * and language; the coverage of every lookup, which is how a lookup is passed over without being - * read; and the lookup list itself. + * Cached for the life of the document because a document sets the same font for line after line: + * the derived tables the shapers work from, which the parser builds per script and language, and + * which are empty where it built none. */ - private function loadGsubData($GSUBscriptTag, $GSUBlangsys, $hasFeatures) + private function loadGsubDerivedData($GSUBscriptTag, $GSUBlangsys) { $this->GSUBfont = $this->fontkey . '.GSUB.' . $GSUBscriptTag . '.' . $GSUBlangsys; @@ -541,13 +546,14 @@ private function loadGsubData($GSUBscriptTag, $GSUBlangsys, $hasFeatures) ]; } } + } - // Nothing past this is read for a run with no lookups, and its font need not have a GSUB - // table at all - if (!$hasFeatures) { - return; - } - + /** + * Phase 4, continued: the coverage of every lookup, which is how a lookup is passed over without + * being read, and the lookup list itself. + */ + private function loadGsubLookups() + { $this->readTable('GSUB'); $fontCacheFilename = $this->fontkey . '.GSUBdata.json'; @@ -1347,36 +1353,39 @@ private function selectShaper($scriptblock) * skip the shaper. Khmer, Thai and Lao keep theirs whatever was chosen, Arabic too, and Syriac * everywhere but under DFLT. Myanmar also gives the pre-specification mymr to the default shaper. * + * @param string $shaper The shaper selectShaper() picked for the run's script * @param int $scriptblock The run's Unicode script, as Ucdn::SCRIPT_* * @param string $GSUBscriptTag The GSUB script chosen for it, or '' for none * * @return string The shaper, as selectShaper() names it */ - private function shaperForScriptTag($scriptblock, $GSUBscriptTag) + private function shaperForScriptTag($shaper, $scriptblock, $GSUBscriptTag) { - if ($this->shaper == 'K' || $this->shaper == 'T' || $this->shaper == 'L' || $scriptblock == Ucdn::SCRIPT_ARABIC) { - return $this->shaper; + if ($shaper == 'K' || $shaper == 'T' || $shaper == 'L' || $scriptblock == Ucdn::SCRIPT_ARABIC) { + return $shaper; } if ($scriptblock == Ucdn::SCRIPT_SYRIAC) { - return $GSUBscriptTag == 'DFLT' ? '' : $this->shaper; + return $GSUBscriptTag == 'DFLT' ? '' : $shaper; } - if ($GSUBscriptTag == 'DFLT' || $GSUBscriptTag == 'latn' || ($this->shaper == 'M' && $GSUBscriptTag == 'mymr')) { + if ($GSUBscriptTag == 'DFLT' || $GSUBscriptTag == 'latn' || ($shaper == 'M' && $GSUBscriptTag == 'mymr')) { return ''; } - return $this->shaper; + return $shaper; } /** - * @return array The GSUB features the font offers under a script and language system, by tag, - * or none where it offers neither + * @param string $table 'GSUB' or 'GPOS' + * + * @return array The features the table offers under a script and language system, by tag, or + * none where it offers neither */ - private function gsubFeatures($scriptTag, $langsys) + private function features($table, $scriptTag, $langsys) { - return isset($this->mpdf->CurrentFont['GSUBFeatures'][$scriptTag][$langsys]) - ? $this->mpdf->CurrentFont['GSUBFeatures'][$scriptTag][$langsys] + return isset($this->mpdf->CurrentFont[$table . 'Features'][$scriptTag][$langsys]) + ? $this->mpdf->CurrentFont[$table . 'Features'][$scriptTag][$langsys] : []; } @@ -1581,7 +1590,7 @@ function _applyGSUBrules($usetags, $scriptTag, $langsys) // - Implemented in functions checkContextMatch and checkContextMatchMultiple by failing to match if outside scope of current 'syllable' // if $this->restrictToSyllable is true - $GSUBFeatures = $this->gsubFeatures($scriptTag, $langsys); + $GSUBFeatures = $this->features('GSUB', $scriptTag, $langsys); $LookupList = []; foreach ($GSUBFeatures as $tag => $arr) { if (strpos($usetags, $tag) !== false) { @@ -1642,7 +1651,7 @@ function _applyGSUBrulesSingly($usetags, $scriptTag, $langsys) { // Features are applied one at a time, working through each codepoint - $GSUBFeatures = $this->gsubFeatures($scriptTag, $langsys); + $GSUBFeatures = $this->features('GSUB', $scriptTag, $langsys); // A reverse Lookup runs the other way down the glyphs, so it cannot share the cursor the rest // of the list walks forward. Taking each over the whole run up front costs nothing here: this @@ -1730,7 +1739,7 @@ function _applyGSUBrulesMyanmar($usetags, $scriptTag, $langsys) // $usetags = locl ccmp rphf pref blwf pstf'; // applied to all characters - $GSUBFeatures = $this->gsubFeatures($scriptTag, $langsys); + $GSUBFeatures = $this->features('GSUB', $scriptTag, $langsys); // ALL should be applied one syllable at a time // Implemented in functions checkContextMatch and checkContextMatchMultiple by failing to match if outside scope of current 'syllable' @@ -1803,7 +1812,7 @@ function _applyGSUBrulesIndic($usetags, $scriptTag, $langsys, $is_old_spec) // rphf, pref, blwf, half, abvf, pstf, and init are only applied where ['mask'] indicates: Indic::FLAG(Indic::RPHF); // The rest are applied to all characters - $GSUBFeatures = $this->gsubFeatures($scriptTag, $langsys); + $GSUBFeatures = $this->features('GSUB', $scriptTag, $langsys); // ALL should be applied one syllable at a time // Implemented in functions checkContextMatch and checkContextMatchMultiple by failing to match if outside scope of current 'syllable' From ae5339f56292c4a86554548798af37efabfcf8b2 Mon Sep 17 00:00:00 2001 From: Jake Jackson Date: Thu, 17 Sep 2026 11:46:33 +1000 Subject: [PATCH 3/4] Record the Coptic IgnoreMarks font's Indic runs unreordered under its DFLT script (#199) #175's synthetic font reached gravitypdf after this branch was written. Its GSUB offers DFLT and no Bengali or Gurmukhi script, so those two runs now take the default shaper and are left in logical order. hb-shape 14.3.1 does the same: it returns the run as two grapheme clusters, 0 0 2 2, where the Indic shaper would have made one syllable of it. Co-Authored-By: Claude Opus 5 (1M context) --- .../NotoSansCoptic-IgnoreMarksClass-Synthetic.txt | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tests/data/shaping/NotoSansCoptic-IgnoreMarksClass-Synthetic.txt b/tests/data/shaping/NotoSansCoptic-IgnoreMarksClass-Synthetic.txt index 4abb2bd60..327333bfa 100644 --- a/tests/data/shaping/NotoSansCoptic-IgnoreMarksClass-Synthetic.txt +++ b/tests/data/shaping/NotoSansCoptic-IgnoreMarksClass-Synthetic.txt @@ -31,13 +31,13 @@ 0x80 0915 094D 0937 093F => 0915 094D 093F 0937 group=CCCC 0xFF +kern -liga 0915 094D 0937 093F => 0915 094D 093F 0937 group=CCCC === bengali === -0xFF 0995 09CD 09B7 09BF => 0995 09CD 09BF 09B7 group=CCCC -0x80 0995 09CD 09B7 09BF => 0995 09CD 09BF 09B7 group=CCCC -0xFF +kern -liga 0995 09CD 09B7 09BF => 0995 09CD 09BF 09B7 group=CCCC +0xFF 0995 09CD 09B7 09BF => 0995 09CD 09B7 09BF group=CCCC +0x80 0995 09CD 09B7 09BF => 0995 09CD 09B7 09BF group=CCCC +0xFF +kern -liga 0995 09CD 09B7 09BF => 0995 09CD 09B7 09BF group=CCCC === gurmukhi === -0xFF 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A3F 0A38 group=CCCC -0x80 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A3F 0A38 group=CCCC -0xFF +kern -liga 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A3F 0A38 group=CCCC +0xFF 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A38 0A3F group=CCCC +0x80 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A38 0A3F group=CCCC +0xFF +kern -liga 0A15 0A4D 0A38 0A3F => 0A15 0A4D 0A38 0A3F group=CCCC === tamil === 0xFF 0B95 0BCD 0BB7 0BBF => 0B95 0BCD 0BB7 0BBF group=CCCC 0x80 0B95 0BCD 0BB7 0BBF => 0B95 0BCD 0BB7 0BBF group=CCCC From 4e6b73b9476875f1c7eccf52c998ed57ce05d292 Mon Sep 17 00:00:00 2001 From: Jake Jackson Date: Thu, 17 Sep 2026 12:38:49 +1000 Subject: [PATCH 4/4] Drop the phase numbers from the GSUB loaders' docblocks (#199) Co-Authored-By: Claude Opus 5 (1M context) --- src/Otl.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Otl.php b/src/Otl.php index cdd81bed2..1782516f6 100644 --- a/src/Otl.php +++ b/src/Otl.php @@ -516,7 +516,7 @@ private function applyGSUB($GSUBscriptTag, $GSUBlangsys, $GSUBFeatures, $scriptb } /** - * Phase 4: what this font's GSUB table says, for this script and language system. + * What this font's GSUB table says, for this script and language system. * * Cached for the life of the document because a document sets the same font for line after line: * the derived tables the shapers work from, which the parser builds per script and language, and @@ -549,8 +549,8 @@ private function loadGsubDerivedData($GSUBscriptTag, $GSUBlangsys) } /** - * Phase 4, continued: the coverage of every lookup, which is how a lookup is passed over without - * being read, and the lookup list itself. + * The coverage of every lookup, which is how a lookup is passed over without being read, and the + * lookup list itself. */ private function loadGsubLookups() {