fonttools 4.60.2__cp311-cp311-win32.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- fontTools/__init__.py +8 -0
- fontTools/__main__.py +35 -0
- fontTools/afmLib.py +439 -0
- fontTools/agl.py +5233 -0
- fontTools/annotations.py +30 -0
- fontTools/cffLib/CFF2ToCFF.py +258 -0
- fontTools/cffLib/CFFToCFF2.py +305 -0
- fontTools/cffLib/__init__.py +3694 -0
- fontTools/cffLib/specializer.py +927 -0
- fontTools/cffLib/transforms.py +495 -0
- fontTools/cffLib/width.py +210 -0
- fontTools/colorLib/__init__.py +0 -0
- fontTools/colorLib/builder.py +664 -0
- fontTools/colorLib/errors.py +2 -0
- fontTools/colorLib/geometry.py +143 -0
- fontTools/colorLib/table_builder.py +223 -0
- fontTools/colorLib/unbuilder.py +81 -0
- fontTools/config/__init__.py +90 -0
- fontTools/cu2qu/__init__.py +15 -0
- fontTools/cu2qu/__main__.py +6 -0
- fontTools/cu2qu/benchmark.py +54 -0
- fontTools/cu2qu/cli.py +198 -0
- fontTools/cu2qu/cu2qu.c +15817 -0
- fontTools/cu2qu/cu2qu.cp311-win32.pyd +0 -0
- fontTools/cu2qu/cu2qu.py +563 -0
- fontTools/cu2qu/errors.py +77 -0
- fontTools/cu2qu/ufo.py +363 -0
- fontTools/designspaceLib/__init__.py +3343 -0
- fontTools/designspaceLib/__main__.py +6 -0
- fontTools/designspaceLib/split.py +475 -0
- fontTools/designspaceLib/statNames.py +260 -0
- fontTools/designspaceLib/types.py +147 -0
- fontTools/encodings/MacRoman.py +258 -0
- fontTools/encodings/StandardEncoding.py +258 -0
- fontTools/encodings/__init__.py +1 -0
- fontTools/encodings/codecs.py +135 -0
- fontTools/feaLib/__init__.py +4 -0
- fontTools/feaLib/__main__.py +78 -0
- fontTools/feaLib/ast.py +2143 -0
- fontTools/feaLib/builder.py +1814 -0
- fontTools/feaLib/error.py +22 -0
- fontTools/feaLib/lexer.c +17029 -0
- fontTools/feaLib/lexer.cp311-win32.pyd +0 -0
- fontTools/feaLib/lexer.py +287 -0
- fontTools/feaLib/location.py +12 -0
- fontTools/feaLib/lookupDebugInfo.py +12 -0
- fontTools/feaLib/parser.py +2394 -0
- fontTools/feaLib/variableScalar.py +118 -0
- fontTools/fontBuilder.py +1014 -0
- fontTools/help.py +36 -0
- fontTools/merge/__init__.py +248 -0
- fontTools/merge/__main__.py +6 -0
- fontTools/merge/base.py +81 -0
- fontTools/merge/cmap.py +173 -0
- fontTools/merge/layout.py +526 -0
- fontTools/merge/options.py +85 -0
- fontTools/merge/tables.py +352 -0
- fontTools/merge/unicode.py +78 -0
- fontTools/merge/util.py +143 -0
- fontTools/misc/__init__.py +1 -0
- fontTools/misc/arrayTools.py +424 -0
- fontTools/misc/bezierTools.c +39731 -0
- fontTools/misc/bezierTools.cp311-win32.pyd +0 -0
- fontTools/misc/bezierTools.py +1500 -0
- fontTools/misc/classifyTools.py +170 -0
- fontTools/misc/cliTools.py +53 -0
- fontTools/misc/configTools.py +349 -0
- fontTools/misc/cython.py +27 -0
- fontTools/misc/dictTools.py +83 -0
- fontTools/misc/eexec.py +119 -0
- fontTools/misc/encodingTools.py +72 -0
- fontTools/misc/enumTools.py +23 -0
- fontTools/misc/etree.py +456 -0
- fontTools/misc/filenames.py +245 -0
- fontTools/misc/filesystem/__init__.py +68 -0
- fontTools/misc/filesystem/_base.py +134 -0
- fontTools/misc/filesystem/_copy.py +45 -0
- fontTools/misc/filesystem/_errors.py +54 -0
- fontTools/misc/filesystem/_info.py +75 -0
- fontTools/misc/filesystem/_osfs.py +164 -0
- fontTools/misc/filesystem/_path.py +67 -0
- fontTools/misc/filesystem/_subfs.py +92 -0
- fontTools/misc/filesystem/_tempfs.py +34 -0
- fontTools/misc/filesystem/_tools.py +34 -0
- fontTools/misc/filesystem/_walk.py +55 -0
- fontTools/misc/filesystem/_zipfs.py +204 -0
- fontTools/misc/fixedTools.py +253 -0
- fontTools/misc/intTools.py +25 -0
- fontTools/misc/iterTools.py +12 -0
- fontTools/misc/lazyTools.py +42 -0
- fontTools/misc/loggingTools.py +543 -0
- fontTools/misc/macCreatorType.py +56 -0
- fontTools/misc/macRes.py +261 -0
- fontTools/misc/plistlib/__init__.py +681 -0
- fontTools/misc/plistlib/py.typed +0 -0
- fontTools/misc/psCharStrings.py +1511 -0
- fontTools/misc/psLib.py +398 -0
- fontTools/misc/psOperators.py +572 -0
- fontTools/misc/py23.py +96 -0
- fontTools/misc/roundTools.py +110 -0
- fontTools/misc/sstruct.py +227 -0
- fontTools/misc/symfont.py +242 -0
- fontTools/misc/testTools.py +233 -0
- fontTools/misc/textTools.py +156 -0
- fontTools/misc/timeTools.py +88 -0
- fontTools/misc/transform.py +516 -0
- fontTools/misc/treeTools.py +45 -0
- fontTools/misc/vector.py +147 -0
- fontTools/misc/visitor.py +158 -0
- fontTools/misc/xmlReader.py +188 -0
- fontTools/misc/xmlWriter.py +231 -0
- fontTools/mtiLib/__init__.py +1400 -0
- fontTools/mtiLib/__main__.py +5 -0
- fontTools/otlLib/__init__.py +1 -0
- fontTools/otlLib/builder.py +3465 -0
- fontTools/otlLib/error.py +11 -0
- fontTools/otlLib/maxContextCalc.py +96 -0
- fontTools/otlLib/optimize/__init__.py +53 -0
- fontTools/otlLib/optimize/__main__.py +6 -0
- fontTools/otlLib/optimize/gpos.py +439 -0
- fontTools/pens/__init__.py +1 -0
- fontTools/pens/areaPen.py +52 -0
- fontTools/pens/basePen.py +475 -0
- fontTools/pens/boundsPen.py +98 -0
- fontTools/pens/cairoPen.py +26 -0
- fontTools/pens/cocoaPen.py +26 -0
- fontTools/pens/cu2quPen.py +325 -0
- fontTools/pens/explicitClosingLinePen.py +101 -0
- fontTools/pens/filterPen.py +433 -0
- fontTools/pens/freetypePen.py +462 -0
- fontTools/pens/hashPointPen.py +89 -0
- fontTools/pens/momentsPen.c +13378 -0
- fontTools/pens/momentsPen.cp311-win32.pyd +0 -0
- fontTools/pens/momentsPen.py +879 -0
- fontTools/pens/perimeterPen.py +69 -0
- fontTools/pens/pointInsidePen.py +192 -0
- fontTools/pens/pointPen.py +643 -0
- fontTools/pens/qtPen.py +29 -0
- fontTools/pens/qu2cuPen.py +105 -0
- fontTools/pens/quartzPen.py +43 -0
- fontTools/pens/recordingPen.py +335 -0
- fontTools/pens/reportLabPen.py +79 -0
- fontTools/pens/reverseContourPen.py +96 -0
- fontTools/pens/roundingPen.py +130 -0
- fontTools/pens/statisticsPen.py +312 -0
- fontTools/pens/svgPathPen.py +310 -0
- fontTools/pens/t2CharStringPen.py +88 -0
- fontTools/pens/teePen.py +55 -0
- fontTools/pens/transformPen.py +115 -0
- fontTools/pens/ttGlyphPen.py +335 -0
- fontTools/pens/wxPen.py +29 -0
- fontTools/qu2cu/__init__.py +15 -0
- fontTools/qu2cu/__main__.py +7 -0
- fontTools/qu2cu/benchmark.py +56 -0
- fontTools/qu2cu/cli.py +125 -0
- fontTools/qu2cu/qu2cu.c +16682 -0
- fontTools/qu2cu/qu2cu.cp311-win32.pyd +0 -0
- fontTools/qu2cu/qu2cu.py +405 -0
- fontTools/subset/__init__.py +4096 -0
- fontTools/subset/__main__.py +6 -0
- fontTools/subset/cff.py +184 -0
- fontTools/subset/svg.py +253 -0
- fontTools/subset/util.py +25 -0
- fontTools/svgLib/__init__.py +3 -0
- fontTools/svgLib/path/__init__.py +65 -0
- fontTools/svgLib/path/arc.py +154 -0
- fontTools/svgLib/path/parser.py +322 -0
- fontTools/svgLib/path/shapes.py +183 -0
- fontTools/t1Lib/__init__.py +648 -0
- fontTools/tfmLib.py +460 -0
- fontTools/ttLib/__init__.py +30 -0
- fontTools/ttLib/__main__.py +148 -0
- fontTools/ttLib/macUtils.py +54 -0
- fontTools/ttLib/removeOverlaps.py +395 -0
- fontTools/ttLib/reorderGlyphs.py +285 -0
- fontTools/ttLib/scaleUpem.py +436 -0
- fontTools/ttLib/sfnt.py +661 -0
- fontTools/ttLib/standardGlyphOrder.py +271 -0
- fontTools/ttLib/tables/B_A_S_E_.py +14 -0
- fontTools/ttLib/tables/BitmapGlyphMetrics.py +64 -0
- fontTools/ttLib/tables/C_B_D_T_.py +113 -0
- fontTools/ttLib/tables/C_B_L_C_.py +19 -0
- fontTools/ttLib/tables/C_F_F_.py +61 -0
- fontTools/ttLib/tables/C_F_F__2.py +26 -0
- fontTools/ttLib/tables/C_O_L_R_.py +165 -0
- fontTools/ttLib/tables/C_P_A_L_.py +305 -0
- fontTools/ttLib/tables/D_S_I_G_.py +158 -0
- fontTools/ttLib/tables/D__e_b_g.py +35 -0
- fontTools/ttLib/tables/DefaultTable.py +49 -0
- fontTools/ttLib/tables/E_B_D_T_.py +835 -0
- fontTools/ttLib/tables/E_B_L_C_.py +718 -0
- fontTools/ttLib/tables/F_F_T_M_.py +52 -0
- fontTools/ttLib/tables/F__e_a_t.py +149 -0
- fontTools/ttLib/tables/G_D_E_F_.py +13 -0
- fontTools/ttLib/tables/G_M_A_P_.py +148 -0
- fontTools/ttLib/tables/G_P_K_G_.py +133 -0
- fontTools/ttLib/tables/G_P_O_S_.py +14 -0
- fontTools/ttLib/tables/G_S_U_B_.py +13 -0
- fontTools/ttLib/tables/G_V_A_R_.py +5 -0
- fontTools/ttLib/tables/G__l_a_t.py +235 -0
- fontTools/ttLib/tables/G__l_o_c.py +85 -0
- fontTools/ttLib/tables/H_V_A_R_.py +13 -0
- fontTools/ttLib/tables/J_S_T_F_.py +13 -0
- fontTools/ttLib/tables/L_T_S_H_.py +58 -0
- fontTools/ttLib/tables/M_A_T_H_.py +13 -0
- fontTools/ttLib/tables/M_E_T_A_.py +352 -0
- fontTools/ttLib/tables/M_V_A_R_.py +13 -0
- fontTools/ttLib/tables/O_S_2f_2.py +752 -0
- fontTools/ttLib/tables/S_I_N_G_.py +99 -0
- fontTools/ttLib/tables/S_T_A_T_.py +15 -0
- fontTools/ttLib/tables/S_V_G_.py +223 -0
- fontTools/ttLib/tables/S__i_l_f.py +1040 -0
- fontTools/ttLib/tables/S__i_l_l.py +92 -0
- fontTools/ttLib/tables/T_S_I_B_.py +13 -0
- fontTools/ttLib/tables/T_S_I_C_.py +14 -0
- fontTools/ttLib/tables/T_S_I_D_.py +13 -0
- fontTools/ttLib/tables/T_S_I_J_.py +13 -0
- fontTools/ttLib/tables/T_S_I_P_.py +13 -0
- fontTools/ttLib/tables/T_S_I_S_.py +13 -0
- fontTools/ttLib/tables/T_S_I_V_.py +26 -0
- fontTools/ttLib/tables/T_S_I__0.py +70 -0
- fontTools/ttLib/tables/T_S_I__1.py +163 -0
- fontTools/ttLib/tables/T_S_I__2.py +17 -0
- fontTools/ttLib/tables/T_S_I__3.py +22 -0
- fontTools/ttLib/tables/T_S_I__5.py +60 -0
- fontTools/ttLib/tables/T_T_F_A_.py +14 -0
- fontTools/ttLib/tables/TupleVariation.py +884 -0
- fontTools/ttLib/tables/V_A_R_C_.py +12 -0
- fontTools/ttLib/tables/V_D_M_X_.py +249 -0
- fontTools/ttLib/tables/V_O_R_G_.py +165 -0
- fontTools/ttLib/tables/V_V_A_R_.py +13 -0
- fontTools/ttLib/tables/__init__.py +98 -0
- fontTools/ttLib/tables/_a_n_k_r.py +15 -0
- fontTools/ttLib/tables/_a_v_a_r.py +193 -0
- fontTools/ttLib/tables/_b_s_l_n.py +15 -0
- fontTools/ttLib/tables/_c_i_d_g.py +24 -0
- fontTools/ttLib/tables/_c_m_a_p.py +1591 -0
- fontTools/ttLib/tables/_c_v_a_r.py +94 -0
- fontTools/ttLib/tables/_c_v_t.py +56 -0
- fontTools/ttLib/tables/_f_e_a_t.py +15 -0
- fontTools/ttLib/tables/_f_p_g_m.py +62 -0
- fontTools/ttLib/tables/_f_v_a_r.py +261 -0
- fontTools/ttLib/tables/_g_a_s_p.py +63 -0
- fontTools/ttLib/tables/_g_c_i_d.py +13 -0
- fontTools/ttLib/tables/_g_l_y_f.py +2311 -0
- fontTools/ttLib/tables/_g_v_a_r.py +340 -0
- fontTools/ttLib/tables/_h_d_m_x.py +127 -0
- fontTools/ttLib/tables/_h_e_a_d.py +130 -0
- fontTools/ttLib/tables/_h_h_e_a.py +147 -0
- fontTools/ttLib/tables/_h_m_t_x.py +164 -0
- fontTools/ttLib/tables/_k_e_r_n.py +289 -0
- fontTools/ttLib/tables/_l_c_a_r.py +13 -0
- fontTools/ttLib/tables/_l_o_c_a.py +70 -0
- fontTools/ttLib/tables/_l_t_a_g.py +72 -0
- fontTools/ttLib/tables/_m_a_x_p.py +147 -0
- fontTools/ttLib/tables/_m_e_t_a.py +112 -0
- fontTools/ttLib/tables/_m_o_r_t.py +14 -0
- fontTools/ttLib/tables/_m_o_r_x.py +15 -0
- fontTools/ttLib/tables/_n_a_m_e.py +1242 -0
- fontTools/ttLib/tables/_o_p_b_d.py +14 -0
- fontTools/ttLib/tables/_p_o_s_t.py +319 -0
- fontTools/ttLib/tables/_p_r_e_p.py +16 -0
- fontTools/ttLib/tables/_p_r_o_p.py +12 -0
- fontTools/ttLib/tables/_s_b_i_x.py +129 -0
- fontTools/ttLib/tables/_t_r_a_k.py +332 -0
- fontTools/ttLib/tables/_v_h_e_a.py +139 -0
- fontTools/ttLib/tables/_v_m_t_x.py +19 -0
- fontTools/ttLib/tables/asciiTable.py +20 -0
- fontTools/ttLib/tables/grUtils.py +92 -0
- fontTools/ttLib/tables/otBase.py +1458 -0
- fontTools/ttLib/tables/otConverters.py +2068 -0
- fontTools/ttLib/tables/otData.py +6400 -0
- fontTools/ttLib/tables/otTables.py +2703 -0
- fontTools/ttLib/tables/otTraverse.py +163 -0
- fontTools/ttLib/tables/sbixGlyph.py +149 -0
- fontTools/ttLib/tables/sbixStrike.py +177 -0
- fontTools/ttLib/tables/table_API_readme.txt +91 -0
- fontTools/ttLib/tables/ttProgram.py +594 -0
- fontTools/ttLib/ttCollection.py +125 -0
- fontTools/ttLib/ttFont.py +1148 -0
- fontTools/ttLib/ttGlyphSet.py +490 -0
- fontTools/ttLib/ttVisitor.py +32 -0
- fontTools/ttLib/woff2.py +1680 -0
- fontTools/ttx.py +479 -0
- fontTools/ufoLib/__init__.py +2575 -0
- fontTools/ufoLib/converters.py +407 -0
- fontTools/ufoLib/errors.py +30 -0
- fontTools/ufoLib/etree.py +6 -0
- fontTools/ufoLib/filenames.py +356 -0
- fontTools/ufoLib/glifLib.py +2120 -0
- fontTools/ufoLib/kerning.py +141 -0
- fontTools/ufoLib/plistlib.py +47 -0
- fontTools/ufoLib/pointPen.py +6 -0
- fontTools/ufoLib/utils.py +107 -0
- fontTools/ufoLib/validators.py +1208 -0
- fontTools/unicode.py +50 -0
- fontTools/unicodedata/Blocks.py +817 -0
- fontTools/unicodedata/Mirrored.py +446 -0
- fontTools/unicodedata/OTTags.py +50 -0
- fontTools/unicodedata/ScriptExtensions.py +832 -0
- fontTools/unicodedata/Scripts.py +3639 -0
- fontTools/unicodedata/__init__.py +306 -0
- fontTools/varLib/__init__.py +1600 -0
- fontTools/varLib/__main__.py +6 -0
- fontTools/varLib/avar/__init__.py +0 -0
- fontTools/varLib/avar/__main__.py +72 -0
- fontTools/varLib/avar/build.py +79 -0
- fontTools/varLib/avar/map.py +108 -0
- fontTools/varLib/avar/plan.py +1004 -0
- fontTools/varLib/avar/unbuild.py +271 -0
- fontTools/varLib/avarPlanner.py +8 -0
- fontTools/varLib/builder.py +215 -0
- fontTools/varLib/cff.py +631 -0
- fontTools/varLib/errors.py +219 -0
- fontTools/varLib/featureVars.py +703 -0
- fontTools/varLib/hvar.py +113 -0
- fontTools/varLib/instancer/__init__.py +2052 -0
- fontTools/varLib/instancer/__main__.py +5 -0
- fontTools/varLib/instancer/featureVars.py +190 -0
- fontTools/varLib/instancer/names.py +388 -0
- fontTools/varLib/instancer/solver.py +309 -0
- fontTools/varLib/interpolatable.py +1209 -0
- fontTools/varLib/interpolatableHelpers.py +399 -0
- fontTools/varLib/interpolatablePlot.py +1269 -0
- fontTools/varLib/interpolatableTestContourOrder.py +82 -0
- fontTools/varLib/interpolatableTestStartingPoint.py +107 -0
- fontTools/varLib/interpolate_layout.py +124 -0
- fontTools/varLib/iup.c +19815 -0
- fontTools/varLib/iup.cp311-win32.pyd +0 -0
- fontTools/varLib/iup.py +490 -0
- fontTools/varLib/merger.py +1717 -0
- fontTools/varLib/models.py +642 -0
- fontTools/varLib/multiVarStore.py +253 -0
- fontTools/varLib/mutator.py +529 -0
- fontTools/varLib/mvar.py +40 -0
- fontTools/varLib/plot.py +238 -0
- fontTools/varLib/stat.py +149 -0
- fontTools/varLib/varStore.py +739 -0
- fontTools/voltLib/__init__.py +5 -0
- fontTools/voltLib/__main__.py +206 -0
- fontTools/voltLib/ast.py +452 -0
- fontTools/voltLib/error.py +12 -0
- fontTools/voltLib/lexer.py +99 -0
- fontTools/voltLib/parser.py +664 -0
- fontTools/voltLib/voltToFea.py +911 -0
- fonttools-4.60.2.data/data/share/man/man1/ttx.1 +225 -0
- fonttools-4.60.2.dist-info/METADATA +2250 -0
- fonttools-4.60.2.dist-info/RECORD +353 -0
- fonttools-4.60.2.dist-info/WHEEL +5 -0
- fonttools-4.60.2.dist-info/entry_points.txt +5 -0
- fonttools-4.60.2.dist-info/licenses/LICENSE +21 -0
- fonttools-4.60.2.dist-info/licenses/LICENSE.external +388 -0
- fonttools-4.60.2.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
from fontTools.misc import sstruct
|
|
2
|
+
from fontTools.misc.fixedTools import floatToFixedToStr
|
|
3
|
+
from fontTools.misc.textTools import safeEval
|
|
4
|
+
from . import DefaultTable
|
|
5
|
+
from . import grUtils
|
|
6
|
+
import struct
|
|
7
|
+
|
|
8
|
+
Sill_hdr = """
|
|
9
|
+
>
|
|
10
|
+
version: 16.16F
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class table_S__i_l_l(DefaultTable.DefaultTable):
|
|
15
|
+
"""Graphite Languages table
|
|
16
|
+
|
|
17
|
+
See also https://graphite.sil.org/graphite_techAbout#graphite-font-tables
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
def __init__(self, tag=None):
|
|
21
|
+
DefaultTable.DefaultTable.__init__(self, tag)
|
|
22
|
+
self.langs = {}
|
|
23
|
+
|
|
24
|
+
def decompile(self, data, ttFont):
|
|
25
|
+
(_, data) = sstruct.unpack2(Sill_hdr, data, self)
|
|
26
|
+
self.version = float(floatToFixedToStr(self.version, precisionBits=16))
|
|
27
|
+
(numLangs,) = struct.unpack(">H", data[:2])
|
|
28
|
+
data = data[8:]
|
|
29
|
+
maxsetting = 0
|
|
30
|
+
langinfo = []
|
|
31
|
+
for i in range(numLangs):
|
|
32
|
+
(langcode, numsettings, offset) = struct.unpack(
|
|
33
|
+
">4sHH", data[i * 8 : (i + 1) * 8]
|
|
34
|
+
)
|
|
35
|
+
offset = int(offset / 8) - (numLangs + 1)
|
|
36
|
+
langcode = langcode.replace(b"\000", b"")
|
|
37
|
+
langinfo.append((langcode.decode("utf-8"), numsettings, offset))
|
|
38
|
+
maxsetting = max(maxsetting, offset + numsettings)
|
|
39
|
+
data = data[numLangs * 8 :]
|
|
40
|
+
finfo = []
|
|
41
|
+
for i in range(maxsetting):
|
|
42
|
+
(fid, val, _) = struct.unpack(">LHH", data[i * 8 : (i + 1) * 8])
|
|
43
|
+
finfo.append((fid, val))
|
|
44
|
+
self.langs = {}
|
|
45
|
+
for c, n, o in langinfo:
|
|
46
|
+
self.langs[c] = []
|
|
47
|
+
for i in range(o, o + n):
|
|
48
|
+
self.langs[c].append(finfo[i])
|
|
49
|
+
|
|
50
|
+
def compile(self, ttFont):
|
|
51
|
+
ldat = b""
|
|
52
|
+
fdat = b""
|
|
53
|
+
offset = len(self.langs)
|
|
54
|
+
for c, inf in sorted(self.langs.items()):
|
|
55
|
+
ldat += struct.pack(">4sHH", c.encode("utf8"), len(inf), 8 * offset + 20)
|
|
56
|
+
for fid, val in inf:
|
|
57
|
+
fdat += struct.pack(">LHH", fid, val, 0)
|
|
58
|
+
offset += len(inf)
|
|
59
|
+
ldat += struct.pack(">LHH", 0x80808080, 0, 8 * offset + 20)
|
|
60
|
+
return (
|
|
61
|
+
sstruct.pack(Sill_hdr, self)
|
|
62
|
+
+ grUtils.bininfo(len(self.langs))
|
|
63
|
+
+ ldat
|
|
64
|
+
+ fdat
|
|
65
|
+
)
|
|
66
|
+
|
|
67
|
+
def toXML(self, writer, ttFont):
|
|
68
|
+
writer.simpletag("version", version=self.version)
|
|
69
|
+
writer.newline()
|
|
70
|
+
for c, inf in sorted(self.langs.items()):
|
|
71
|
+
writer.begintag("lang", name=c)
|
|
72
|
+
writer.newline()
|
|
73
|
+
for fid, val in inf:
|
|
74
|
+
writer.simpletag("feature", fid=grUtils.num2tag(fid), val=val)
|
|
75
|
+
writer.newline()
|
|
76
|
+
writer.endtag("lang")
|
|
77
|
+
writer.newline()
|
|
78
|
+
|
|
79
|
+
def fromXML(self, name, attrs, content, ttFont):
|
|
80
|
+
if name == "version":
|
|
81
|
+
self.version = float(safeEval(attrs["version"]))
|
|
82
|
+
elif name == "lang":
|
|
83
|
+
c = attrs["name"]
|
|
84
|
+
self.langs[c] = []
|
|
85
|
+
for element in content:
|
|
86
|
+
if not isinstance(element, tuple):
|
|
87
|
+
continue
|
|
88
|
+
tag, a, subcontent = element
|
|
89
|
+
if tag == "feature":
|
|
90
|
+
self.langs[c].append(
|
|
91
|
+
(grUtils.tag2num(a["fid"]), int(safeEval(a["val"])))
|
|
92
|
+
)
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
""" TSI{B,C,D,J,P,S,V} are private tables used by Microsoft Visual TrueType (VTT)
|
|
2
|
+
tool to store its table source data.
|
|
3
|
+
|
|
4
|
+
TSIB contains the source text for the ``BASE`` table.
|
|
5
|
+
|
|
6
|
+
See also https://learn.microsoft.com/en-us/typography/tools/vtt/tsi-tables
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from .T_S_I_V_ import table_T_S_I_V_
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class table_T_S_I_B_(table_T_S_I_V_):
|
|
13
|
+
pass
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
""" TSI{B,C,D,J,P,S,V} are private tables used by Microsoft Visual TrueType (VTT)
|
|
2
|
+
tool to store its table source data.
|
|
3
|
+
|
|
4
|
+
TSIC contains the source text for the Variation CVT window and data for
|
|
5
|
+
the ``cvar`` table.
|
|
6
|
+
|
|
7
|
+
See also https://learn.microsoft.com/en-us/typography/tools/vtt/tsi-tables
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from .otBase import BaseTTXConverter
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class table_T_S_I_C_(BaseTTXConverter):
|
|
14
|
+
pass
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
""" TSI{B,C,D,J,P,S,V} are private tables used by Microsoft Visual TrueType (VTT)
|
|
2
|
+
tool to store its table source data.
|
|
3
|
+
|
|
4
|
+
TSID contains the source text for the ``GDEF`` table.
|
|
5
|
+
|
|
6
|
+
See also https://learn.microsoft.com/en-us/typography/tools/vtt/tsi-tables
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from .T_S_I_V_ import table_T_S_I_V_
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class table_T_S_I_D_(table_T_S_I_V_):
|
|
13
|
+
pass
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
""" TSI{B,C,D,J,P,S,V} are private tables used by Microsoft Visual TrueType (VTT)
|
|
2
|
+
tool to store its table source data.
|
|
3
|
+
|
|
4
|
+
TSIJ contains the source text for the ``JSTF`` table.
|
|
5
|
+
|
|
6
|
+
See also https://learn.microsoft.com/en-us/typography/tools/vtt/tsi-tables
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from .T_S_I_V_ import table_T_S_I_V_
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class table_T_S_I_J_(table_T_S_I_V_):
|
|
13
|
+
pass
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
""" TSI{B,C,D,J,P,S,V} are private tables used by Microsoft Visual TrueType (VTT)
|
|
2
|
+
tool to store its table source data.
|
|
3
|
+
|
|
4
|
+
TSIP contains the source text for the ``GPOS`` table.
|
|
5
|
+
|
|
6
|
+
See also https://learn.microsoft.com/en-us/typography/tools/vtt/tsi-tables
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from .T_S_I_V_ import table_T_S_I_V_
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class table_T_S_I_P_(table_T_S_I_V_):
|
|
13
|
+
pass
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
""" TSI{B,C,D,J,P,S,V} are private tables used by Microsoft Visual TrueType (VTT)
|
|
2
|
+
tool to store its table source data.
|
|
3
|
+
|
|
4
|
+
TSIS contains the source text for the ``GSUB`` table.
|
|
5
|
+
|
|
6
|
+
See also https://learn.microsoft.com/en-us/typography/tools/vtt/tsi-tables
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from .T_S_I_V_ import table_T_S_I_V_
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class table_T_S_I_S_(table_T_S_I_V_):
|
|
13
|
+
pass
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
""" TSI{B,C,D,J,P,S,V} are private tables used by Microsoft Visual TrueType (VTT)
|
|
2
|
+
tool to store its table source data.
|
|
3
|
+
|
|
4
|
+
See also https://learn.microsoft.com/en-us/typography/tools/vtt/tsi-tables
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from fontTools.misc.textTools import strjoin, tobytes, tostr
|
|
8
|
+
from . import asciiTable
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class table_T_S_I_V_(asciiTable.asciiTable):
|
|
12
|
+
def toXML(self, writer, ttFont):
|
|
13
|
+
data = tostr(self.data)
|
|
14
|
+
# removing null bytes. XXX needed??
|
|
15
|
+
data = data.split("\0")
|
|
16
|
+
data = strjoin(data)
|
|
17
|
+
writer.begintag("source")
|
|
18
|
+
writer.newline()
|
|
19
|
+
writer.write_noindent(data.replace("\r", "\n"))
|
|
20
|
+
writer.newline()
|
|
21
|
+
writer.endtag("source")
|
|
22
|
+
writer.newline()
|
|
23
|
+
|
|
24
|
+
def fromXML(self, name, attrs, content, ttFont):
|
|
25
|
+
lines = strjoin(content).split("\n")
|
|
26
|
+
self.data = tobytes("\r".join(lines[1:-1]))
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
"""TSI{0,1,2,3,5} are private tables used by Microsoft Visual TrueType (VTT)
|
|
2
|
+
tool to store its hinting source data.
|
|
3
|
+
|
|
4
|
+
TSI0 is the index table containing the lengths and offsets for the glyph
|
|
5
|
+
programs and 'extra' programs ('fpgm', 'prep', and 'cvt') that are contained
|
|
6
|
+
in the TSI1 table.
|
|
7
|
+
|
|
8
|
+
See also https://learn.microsoft.com/en-us/typography/tools/vtt/tsi-tables
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
import logging
|
|
12
|
+
import struct
|
|
13
|
+
|
|
14
|
+
from . import DefaultTable
|
|
15
|
+
|
|
16
|
+
log = logging.getLogger(__name__)
|
|
17
|
+
|
|
18
|
+
tsi0Format = ">HHL"
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def fixlongs(glyphID, textLength, textOffset):
|
|
22
|
+
return int(glyphID), int(textLength), textOffset
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class table_T_S_I__0(DefaultTable.DefaultTable):
|
|
26
|
+
dependencies = ["TSI1"]
|
|
27
|
+
|
|
28
|
+
def decompile(self, data, ttFont):
|
|
29
|
+
numGlyphs = ttFont["maxp"].numGlyphs
|
|
30
|
+
indices = []
|
|
31
|
+
size = struct.calcsize(tsi0Format)
|
|
32
|
+
numEntries = len(data) // size
|
|
33
|
+
if numEntries != numGlyphs + 5:
|
|
34
|
+
diff = numEntries - numGlyphs - 5
|
|
35
|
+
log.warning(
|
|
36
|
+
"Number of glyphPrograms differs from the number of glyphs in the font "
|
|
37
|
+
f"by {abs(diff)} ({numEntries - 5} programs vs. {numGlyphs} glyphs)."
|
|
38
|
+
)
|
|
39
|
+
for _ in range(numEntries):
|
|
40
|
+
glyphID, textLength, textOffset = fixlongs(
|
|
41
|
+
*struct.unpack(tsi0Format, data[:size])
|
|
42
|
+
)
|
|
43
|
+
indices.append((glyphID, textLength, textOffset))
|
|
44
|
+
data = data[size:]
|
|
45
|
+
assert len(data) == 0
|
|
46
|
+
assert indices[-5] == (0xFFFE, 0, 0xABFC1F34), "bad magic number"
|
|
47
|
+
self.indices = indices[:-5]
|
|
48
|
+
self.extra_indices = indices[-4:]
|
|
49
|
+
|
|
50
|
+
def compile(self, ttFont):
|
|
51
|
+
if not hasattr(self, "indices"):
|
|
52
|
+
# We have no corresponding table (TSI1 or TSI3); let's return
|
|
53
|
+
# no data, which effectively means "ignore us".
|
|
54
|
+
return b""
|
|
55
|
+
data = b""
|
|
56
|
+
for index, textLength, textOffset in self.indices:
|
|
57
|
+
data = data + struct.pack(tsi0Format, index, textLength, textOffset)
|
|
58
|
+
data = data + struct.pack(tsi0Format, 0xFFFE, 0, 0xABFC1F34)
|
|
59
|
+
for index, textLength, textOffset in self.extra_indices:
|
|
60
|
+
data = data + struct.pack(tsi0Format, index, textLength, textOffset)
|
|
61
|
+
return data
|
|
62
|
+
|
|
63
|
+
def set(self, indices, extra_indices):
|
|
64
|
+
# gets called by 'TSI1' or 'TSI3'
|
|
65
|
+
self.indices = indices
|
|
66
|
+
self.extra_indices = extra_indices
|
|
67
|
+
|
|
68
|
+
def toXML(self, writer, ttFont):
|
|
69
|
+
writer.comment("This table will be calculated by the compiler")
|
|
70
|
+
writer.newline()
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
""" TSI{0,1,2,3,5} are private tables used by Microsoft Visual TrueType (VTT)
|
|
2
|
+
tool to store its hinting source data.
|
|
3
|
+
|
|
4
|
+
TSI1 contains the text of the glyph programs in the form of low-level assembly
|
|
5
|
+
code, as well as the 'extra' programs 'fpgm', 'ppgm' (i.e. 'prep'), and 'cvt'.
|
|
6
|
+
|
|
7
|
+
See also https://learn.microsoft.com/en-us/typography/tools/vtt/tsi-tables
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from . import DefaultTable
|
|
11
|
+
from fontTools.misc.loggingTools import LogMixin
|
|
12
|
+
from fontTools.misc.textTools import strjoin, tobytes, tostr
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class table_T_S_I__1(LogMixin, DefaultTable.DefaultTable):
|
|
16
|
+
extras = {0xFFFA: "ppgm", 0xFFFB: "cvt", 0xFFFC: "reserved", 0xFFFD: "fpgm"}
|
|
17
|
+
|
|
18
|
+
indextable = "TSI0"
|
|
19
|
+
|
|
20
|
+
def decompile(self, data, ttFont):
|
|
21
|
+
totalLength = len(data)
|
|
22
|
+
indextable = ttFont[self.indextable]
|
|
23
|
+
for indices, isExtra in zip(
|
|
24
|
+
(indextable.indices, indextable.extra_indices), (False, True)
|
|
25
|
+
):
|
|
26
|
+
programs = {}
|
|
27
|
+
for i, (glyphID, textLength, textOffset) in enumerate(indices):
|
|
28
|
+
if isExtra:
|
|
29
|
+
name = self.extras[glyphID]
|
|
30
|
+
else:
|
|
31
|
+
name = ttFont.getGlyphName(glyphID)
|
|
32
|
+
if textOffset > totalLength:
|
|
33
|
+
self.log.warning("textOffset > totalLength; %r skipped" % name)
|
|
34
|
+
continue
|
|
35
|
+
if textLength < 0x8000:
|
|
36
|
+
# If the length stored in the record is less than 32768, then use
|
|
37
|
+
# that as the length of the record.
|
|
38
|
+
pass
|
|
39
|
+
elif textLength == 0x8000:
|
|
40
|
+
# If the length is 32768, compute the actual length as follows:
|
|
41
|
+
isLast = i == (len(indices) - 1)
|
|
42
|
+
if isLast:
|
|
43
|
+
if isExtra:
|
|
44
|
+
# For the last "extra" record (the very last record of the
|
|
45
|
+
# table), the length is the difference between the total
|
|
46
|
+
# length of the TSI1 table and the textOffset of the final
|
|
47
|
+
# record.
|
|
48
|
+
nextTextOffset = totalLength
|
|
49
|
+
else:
|
|
50
|
+
# For the last "normal" record (the last record just prior
|
|
51
|
+
# to the record containing the "magic number"), the length
|
|
52
|
+
# is the difference between the textOffset of the record
|
|
53
|
+
# following the "magic number" (0xFFFE) record (i.e. the
|
|
54
|
+
# first "extra" record), and the textOffset of the last
|
|
55
|
+
# "normal" record.
|
|
56
|
+
nextTextOffset = indextable.extra_indices[0][2]
|
|
57
|
+
else:
|
|
58
|
+
# For all other records with a length of 0x8000, the length is
|
|
59
|
+
# the difference between the textOffset of the record in
|
|
60
|
+
# question and the textOffset of the next record.
|
|
61
|
+
nextTextOffset = indices[i + 1][2]
|
|
62
|
+
assert nextTextOffset >= textOffset, "entries not sorted by offset"
|
|
63
|
+
if nextTextOffset > totalLength:
|
|
64
|
+
self.log.warning(
|
|
65
|
+
"nextTextOffset > totalLength; %r truncated" % name
|
|
66
|
+
)
|
|
67
|
+
nextTextOffset = totalLength
|
|
68
|
+
textLength = nextTextOffset - textOffset
|
|
69
|
+
else:
|
|
70
|
+
from fontTools import ttLib
|
|
71
|
+
|
|
72
|
+
raise ttLib.TTLibError(
|
|
73
|
+
"%r textLength (%d) must not be > 32768" % (name, textLength)
|
|
74
|
+
)
|
|
75
|
+
text = data[textOffset : textOffset + textLength]
|
|
76
|
+
assert len(text) == textLength
|
|
77
|
+
text = tostr(text, encoding="utf-8")
|
|
78
|
+
if text:
|
|
79
|
+
programs[name] = text
|
|
80
|
+
if isExtra:
|
|
81
|
+
self.extraPrograms = programs
|
|
82
|
+
else:
|
|
83
|
+
self.glyphPrograms = programs
|
|
84
|
+
|
|
85
|
+
def compile(self, ttFont):
|
|
86
|
+
if not hasattr(self, "glyphPrograms"):
|
|
87
|
+
self.glyphPrograms = {}
|
|
88
|
+
self.extraPrograms = {}
|
|
89
|
+
data = b""
|
|
90
|
+
indextable = ttFont[self.indextable]
|
|
91
|
+
glyphNames = ttFont.getGlyphOrder()
|
|
92
|
+
|
|
93
|
+
indices = []
|
|
94
|
+
for i, name in enumerate(glyphNames):
|
|
95
|
+
if len(data) % 2:
|
|
96
|
+
data = (
|
|
97
|
+
data + b"\015"
|
|
98
|
+
) # align on 2-byte boundaries, fill with return chars. Yum.
|
|
99
|
+
if name in self.glyphPrograms:
|
|
100
|
+
text = tobytes(self.glyphPrograms[name], encoding="utf-8")
|
|
101
|
+
else:
|
|
102
|
+
text = b""
|
|
103
|
+
textLength = len(text)
|
|
104
|
+
if textLength >= 0x8000:
|
|
105
|
+
textLength = 0x8000
|
|
106
|
+
indices.append((i, textLength, len(data)))
|
|
107
|
+
data = data + text
|
|
108
|
+
|
|
109
|
+
extra_indices = []
|
|
110
|
+
for code, name in sorted(self.extras.items()):
|
|
111
|
+
if len(data) % 2:
|
|
112
|
+
data = (
|
|
113
|
+
data + b"\015"
|
|
114
|
+
) # align on 2-byte boundaries, fill with return chars.
|
|
115
|
+
if name in self.extraPrograms:
|
|
116
|
+
text = tobytes(self.extraPrograms[name], encoding="utf-8")
|
|
117
|
+
else:
|
|
118
|
+
text = b""
|
|
119
|
+
textLength = len(text)
|
|
120
|
+
if textLength >= 0x8000:
|
|
121
|
+
textLength = 0x8000
|
|
122
|
+
extra_indices.append((code, textLength, len(data)))
|
|
123
|
+
data = data + text
|
|
124
|
+
indextable.set(indices, extra_indices)
|
|
125
|
+
return data
|
|
126
|
+
|
|
127
|
+
def toXML(self, writer, ttFont):
|
|
128
|
+
names = sorted(self.glyphPrograms.keys())
|
|
129
|
+
writer.newline()
|
|
130
|
+
for name in names:
|
|
131
|
+
text = self.glyphPrograms[name]
|
|
132
|
+
if not text:
|
|
133
|
+
continue
|
|
134
|
+
writer.begintag("glyphProgram", name=name)
|
|
135
|
+
writer.newline()
|
|
136
|
+
writer.write_noindent(text.replace("\r", "\n"))
|
|
137
|
+
writer.newline()
|
|
138
|
+
writer.endtag("glyphProgram")
|
|
139
|
+
writer.newline()
|
|
140
|
+
writer.newline()
|
|
141
|
+
extra_names = sorted(self.extraPrograms.keys())
|
|
142
|
+
for name in extra_names:
|
|
143
|
+
text = self.extraPrograms[name]
|
|
144
|
+
if not text:
|
|
145
|
+
continue
|
|
146
|
+
writer.begintag("extraProgram", name=name)
|
|
147
|
+
writer.newline()
|
|
148
|
+
writer.write_noindent(text.replace("\r", "\n"))
|
|
149
|
+
writer.newline()
|
|
150
|
+
writer.endtag("extraProgram")
|
|
151
|
+
writer.newline()
|
|
152
|
+
writer.newline()
|
|
153
|
+
|
|
154
|
+
def fromXML(self, name, attrs, content, ttFont):
|
|
155
|
+
if not hasattr(self, "glyphPrograms"):
|
|
156
|
+
self.glyphPrograms = {}
|
|
157
|
+
self.extraPrograms = {}
|
|
158
|
+
lines = strjoin(content).replace("\r", "\n").split("\n")
|
|
159
|
+
text = "\r".join(lines[1:-1])
|
|
160
|
+
if name == "glyphProgram":
|
|
161
|
+
self.glyphPrograms[attrs["name"]] = text
|
|
162
|
+
elif name == "extraProgram":
|
|
163
|
+
self.extraPrograms[attrs["name"]] = text
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
""" TSI{0,1,2,3,5} are private tables used by Microsoft Visual TrueType (VTT)
|
|
2
|
+
tool to store its hinting source data.
|
|
3
|
+
|
|
4
|
+
TSI2 is the index table containing the lengths and offsets for the glyph
|
|
5
|
+
programs that are contained in the TSI3 table. It uses the same format as
|
|
6
|
+
the TSI0 table.
|
|
7
|
+
|
|
8
|
+
See also https://learn.microsoft.com/en-us/typography/tools/vtt/tsi-tables
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
from fontTools import ttLib
|
|
12
|
+
|
|
13
|
+
superclass = ttLib.getTableClass("TSI0")
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class table_T_S_I__2(superclass):
|
|
17
|
+
dependencies = ["TSI3"]
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
""" TSI{0,1,2,3,5} are private tables used by Microsoft Visual TrueType (VTT)
|
|
2
|
+
tool to store its hinting source data.
|
|
3
|
+
|
|
4
|
+
TSI3 contains the text of the glyph programs in the form of 'VTTTalk' code.
|
|
5
|
+
|
|
6
|
+
See also https://learn.microsoft.com/en-us/typography/tools/vtt/tsi-tables
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from fontTools import ttLib
|
|
10
|
+
|
|
11
|
+
superclass = ttLib.getTableClass("TSI1")
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class table_T_S_I__3(superclass):
|
|
15
|
+
extras = {
|
|
16
|
+
0xFFFA: "reserved0",
|
|
17
|
+
0xFFFB: "reserved1",
|
|
18
|
+
0xFFFC: "reserved2",
|
|
19
|
+
0xFFFD: "reserved3",
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
indextable = "TSI2"
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
"""TSI{0,1,2,3,5} are private tables used by Microsoft Visual TrueType (VTT)
|
|
2
|
+
tool to store its hinting source data.
|
|
3
|
+
|
|
4
|
+
TSI5 contains the VTT character groups.
|
|
5
|
+
|
|
6
|
+
See also https://learn.microsoft.com/en-us/typography/tools/vtt/tsi-tables
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
import array
|
|
10
|
+
import logging
|
|
11
|
+
import sys
|
|
12
|
+
|
|
13
|
+
from fontTools.misc.textTools import safeEval
|
|
14
|
+
|
|
15
|
+
from . import DefaultTable
|
|
16
|
+
|
|
17
|
+
log = logging.getLogger(__name__)
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class table_T_S_I__5(DefaultTable.DefaultTable):
|
|
21
|
+
def decompile(self, data, ttFont):
|
|
22
|
+
numGlyphs = ttFont["maxp"].numGlyphs
|
|
23
|
+
a = array.array("H")
|
|
24
|
+
a.frombytes(data)
|
|
25
|
+
if sys.byteorder != "big":
|
|
26
|
+
a.byteswap()
|
|
27
|
+
self.glyphGrouping = {}
|
|
28
|
+
numEntries = len(data) // 2
|
|
29
|
+
if numEntries != numGlyphs:
|
|
30
|
+
diff = numEntries - numGlyphs
|
|
31
|
+
log.warning(
|
|
32
|
+
"Number of entries differs from the number of glyphs in the font "
|
|
33
|
+
f"by {abs(diff)} ({numEntries} entries vs. {numGlyphs} glyphs)."
|
|
34
|
+
)
|
|
35
|
+
for i in range(numEntries):
|
|
36
|
+
self.glyphGrouping[ttFont.getGlyphName(i)] = a[i]
|
|
37
|
+
|
|
38
|
+
def compile(self, ttFont):
|
|
39
|
+
glyphNames = ttFont.getGlyphOrder()
|
|
40
|
+
a = array.array("H")
|
|
41
|
+
for glyphName in glyphNames:
|
|
42
|
+
a.append(self.glyphGrouping.get(glyphName, 0))
|
|
43
|
+
if sys.byteorder != "big":
|
|
44
|
+
a.byteswap()
|
|
45
|
+
return a.tobytes()
|
|
46
|
+
|
|
47
|
+
def toXML(self, writer, ttFont):
|
|
48
|
+
names = sorted(self.glyphGrouping.keys())
|
|
49
|
+
for glyphName in names:
|
|
50
|
+
writer.simpletag(
|
|
51
|
+
"glyphgroup", name=glyphName, value=self.glyphGrouping[glyphName]
|
|
52
|
+
)
|
|
53
|
+
writer.newline()
|
|
54
|
+
|
|
55
|
+
def fromXML(self, name, attrs, content, ttFont):
|
|
56
|
+
if not hasattr(self, "glyphGrouping"):
|
|
57
|
+
self.glyphGrouping = {}
|
|
58
|
+
if name != "glyphgroup":
|
|
59
|
+
return
|
|
60
|
+
self.glyphGrouping[attrs["name"]] = safeEval(attrs["value"])
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
from . import asciiTable
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class table_T_T_F_A_(asciiTable.asciiTable):
|
|
5
|
+
"""ttfautohint parameters table
|
|
6
|
+
|
|
7
|
+
The ``TTFA`` table is used by the free-software `ttfautohint` program
|
|
8
|
+
to record the parameters that `ttfautohint` was called with when it
|
|
9
|
+
was used to auto-hint the font.
|
|
10
|
+
|
|
11
|
+
See also http://freetype.org/ttfautohint/doc/ttfautohint.html#miscellaneous-1
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
pass
|