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