xref: /aosp_15_r20/external/fonttools/Snippets/layout-features.py (revision e1fe3e4ad2793916b15cccdc4a7da52a7e1dd0e9)
1#! /usr/bin/env python3
2
3from fontTools.ttLib import TTFont
4from fontTools.ttLib.tables import otTables
5import sys
6
7if len(sys.argv) != 2:
8    print("usage: layout-features.py fontfile.ttf")
9    sys.exit(1)
10fontfile = sys.argv[1]
11if fontfile.rsplit(".", 1)[-1] == "ttx":
12    font = TTFont()
13    font.importXML(fontfile)
14else:
15    font = TTFont(fontfile)
16
17for tag in ("GSUB", "GPOS"):
18    if not tag in font:
19        continue
20    print("Table:", tag)
21    table = font[tag].table
22    if not table.ScriptList or not table.FeatureList:
23        continue
24    featureRecords = table.FeatureList.FeatureRecord
25    for script in table.ScriptList.ScriptRecord:
26        print("  Script:", script.ScriptTag)
27        if not script.Script:
28            print("    Null script.")
29            continue
30        languages = list(script.Script.LangSysRecord)
31        if script.Script.DefaultLangSys:
32            defaultlangsys = otTables.LangSysRecord()
33            defaultlangsys.LangSysTag = "default"
34            defaultlangsys.LangSys = script.Script.DefaultLangSys
35            languages.insert(0, defaultlangsys)
36        for langsys in languages:
37            print("    Language:", langsys.LangSysTag)
38            if not langsys.LangSys:
39                print("    Null language.")
40                continue
41            features = [featureRecords[index] for index in langsys.LangSys.FeatureIndex]
42            if langsys.LangSys.ReqFeatureIndex != 0xFFFF:
43                record = featureRecords[langsys.LangSys.ReqFeatureIndex]
44                requiredfeature = otTables.FeatureRecord()
45                requiredfeature.FeatureTag = "required(%s)" % record.FeatureTag
46                requiredfeature.Feature = record.Feature
47                features.insert(0, requiredfeature)
48            for feature in features:
49                print("      Feature:", feature.FeatureTag)
50                lookups = feature.Feature.LookupListIndex
51                print("        Lookups:", ",".join(str(l) for l in lookups))
52