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,94 @@
|
|
|
1
|
+
from . import DefaultTable
|
|
2
|
+
from fontTools.misc import sstruct
|
|
3
|
+
from fontTools.misc.textTools import bytesjoin
|
|
4
|
+
from fontTools.ttLib.tables.TupleVariation import (
|
|
5
|
+
compileTupleVariationStore,
|
|
6
|
+
decompileTupleVariationStore,
|
|
7
|
+
TupleVariation,
|
|
8
|
+
)
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
# https://www.microsoft.com/typography/otspec/cvar.htm
|
|
12
|
+
# https://www.microsoft.com/typography/otspec/otvarcommonformats.htm
|
|
13
|
+
# https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6cvar.html
|
|
14
|
+
|
|
15
|
+
CVAR_HEADER_FORMAT = """
|
|
16
|
+
> # big endian
|
|
17
|
+
majorVersion: H
|
|
18
|
+
minorVersion: H
|
|
19
|
+
tupleVariationCount: H
|
|
20
|
+
offsetToData: H
|
|
21
|
+
"""
|
|
22
|
+
|
|
23
|
+
CVAR_HEADER_SIZE = sstruct.calcsize(CVAR_HEADER_FORMAT)
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class table__c_v_a_r(DefaultTable.DefaultTable):
|
|
27
|
+
"""Control Value Table (CVT) variations table
|
|
28
|
+
|
|
29
|
+
The ``cvar`` table contains variations for the values in a ``cvt``
|
|
30
|
+
table.
|
|
31
|
+
|
|
32
|
+
See also https://learn.microsoft.com/en-us/typography/opentype/spec/cvar
|
|
33
|
+
"""
|
|
34
|
+
|
|
35
|
+
dependencies = ["cvt ", "fvar"]
|
|
36
|
+
|
|
37
|
+
def __init__(self, tag=None):
|
|
38
|
+
DefaultTable.DefaultTable.__init__(self, tag)
|
|
39
|
+
self.majorVersion, self.minorVersion = 1, 0
|
|
40
|
+
self.variations = []
|
|
41
|
+
|
|
42
|
+
def compile(self, ttFont, useSharedPoints=False):
|
|
43
|
+
tupleVariationCount, tuples, data = compileTupleVariationStore(
|
|
44
|
+
variations=[v for v in self.variations if v.hasImpact()],
|
|
45
|
+
pointCount=len(ttFont["cvt "].values),
|
|
46
|
+
axisTags=[axis.axisTag for axis in ttFont["fvar"].axes],
|
|
47
|
+
sharedTupleIndices={},
|
|
48
|
+
useSharedPoints=useSharedPoints,
|
|
49
|
+
)
|
|
50
|
+
header = {
|
|
51
|
+
"majorVersion": self.majorVersion,
|
|
52
|
+
"minorVersion": self.minorVersion,
|
|
53
|
+
"tupleVariationCount": tupleVariationCount,
|
|
54
|
+
"offsetToData": CVAR_HEADER_SIZE + len(tuples),
|
|
55
|
+
}
|
|
56
|
+
return b"".join([sstruct.pack(CVAR_HEADER_FORMAT, header), tuples, data])
|
|
57
|
+
|
|
58
|
+
def decompile(self, data, ttFont):
|
|
59
|
+
axisTags = [axis.axisTag for axis in ttFont["fvar"].axes]
|
|
60
|
+
header = {}
|
|
61
|
+
sstruct.unpack(CVAR_HEADER_FORMAT, data[0:CVAR_HEADER_SIZE], header)
|
|
62
|
+
self.majorVersion = header["majorVersion"]
|
|
63
|
+
self.minorVersion = header["minorVersion"]
|
|
64
|
+
assert self.majorVersion == 1, self.majorVersion
|
|
65
|
+
self.variations = decompileTupleVariationStore(
|
|
66
|
+
tableTag=self.tableTag,
|
|
67
|
+
axisTags=axisTags,
|
|
68
|
+
tupleVariationCount=header["tupleVariationCount"],
|
|
69
|
+
pointCount=len(ttFont["cvt "].values),
|
|
70
|
+
sharedTuples=None,
|
|
71
|
+
data=data,
|
|
72
|
+
pos=CVAR_HEADER_SIZE,
|
|
73
|
+
dataPos=header["offsetToData"],
|
|
74
|
+
)
|
|
75
|
+
|
|
76
|
+
def fromXML(self, name, attrs, content, ttFont):
|
|
77
|
+
if name == "version":
|
|
78
|
+
self.majorVersion = int(attrs.get("major", "1"))
|
|
79
|
+
self.minorVersion = int(attrs.get("minor", "0"))
|
|
80
|
+
elif name == "tuple":
|
|
81
|
+
valueCount = len(ttFont["cvt "].values)
|
|
82
|
+
var = TupleVariation({}, [None] * valueCount)
|
|
83
|
+
self.variations.append(var)
|
|
84
|
+
for tupleElement in content:
|
|
85
|
+
if isinstance(tupleElement, tuple):
|
|
86
|
+
tupleName, tupleAttrs, tupleContent = tupleElement
|
|
87
|
+
var.fromXML(tupleName, tupleAttrs, tupleContent)
|
|
88
|
+
|
|
89
|
+
def toXML(self, writer, ttFont):
|
|
90
|
+
axisTags = [axis.axisTag for axis in ttFont["fvar"].axes]
|
|
91
|
+
writer.simpletag("version", major=self.majorVersion, minor=self.minorVersion)
|
|
92
|
+
writer.newline()
|
|
93
|
+
for var in self.variations:
|
|
94
|
+
var.toXML(writer, axisTags)
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
from fontTools.misc.textTools import safeEval
|
|
2
|
+
from . import DefaultTable
|
|
3
|
+
import sys
|
|
4
|
+
import array
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class table__c_v_t(DefaultTable.DefaultTable):
|
|
8
|
+
"""Control Value Table
|
|
9
|
+
|
|
10
|
+
The Control Value Table holds a list of values that can be referenced
|
|
11
|
+
by TrueType font instructions.
|
|
12
|
+
|
|
13
|
+
See also https://learn.microsoft.com/en-us/typography/opentype/spec/cvt
|
|
14
|
+
"""
|
|
15
|
+
|
|
16
|
+
def decompile(self, data, ttFont):
|
|
17
|
+
values = array.array("h")
|
|
18
|
+
values.frombytes(data)
|
|
19
|
+
if sys.byteorder != "big":
|
|
20
|
+
values.byteswap()
|
|
21
|
+
self.values = values
|
|
22
|
+
|
|
23
|
+
def compile(self, ttFont):
|
|
24
|
+
if not hasattr(self, "values"):
|
|
25
|
+
return b""
|
|
26
|
+
values = self.values[:]
|
|
27
|
+
if sys.byteorder != "big":
|
|
28
|
+
values.byteswap()
|
|
29
|
+
return values.tobytes()
|
|
30
|
+
|
|
31
|
+
def toXML(self, writer, ttFont):
|
|
32
|
+
for i, value in enumerate(self.values):
|
|
33
|
+
writer.simpletag("cv", value=value, index=i)
|
|
34
|
+
writer.newline()
|
|
35
|
+
|
|
36
|
+
def fromXML(self, name, attrs, content, ttFont):
|
|
37
|
+
if not hasattr(self, "values"):
|
|
38
|
+
self.values = array.array("h")
|
|
39
|
+
if name == "cv":
|
|
40
|
+
index = safeEval(attrs["index"])
|
|
41
|
+
value = safeEval(attrs["value"])
|
|
42
|
+
for i in range(1 + index - len(self.values)):
|
|
43
|
+
self.values.append(0)
|
|
44
|
+
self.values[index] = value
|
|
45
|
+
|
|
46
|
+
def __len__(self):
|
|
47
|
+
return len(self.values)
|
|
48
|
+
|
|
49
|
+
def __getitem__(self, index):
|
|
50
|
+
return self.values[index]
|
|
51
|
+
|
|
52
|
+
def __setitem__(self, index, value):
|
|
53
|
+
self.values[index] = value
|
|
54
|
+
|
|
55
|
+
def __delitem__(self, index):
|
|
56
|
+
del self.values[index]
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
from .otBase import BaseTTXConverter
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class table__f_e_a_t(BaseTTXConverter):
|
|
5
|
+
"""Feature name table
|
|
6
|
+
|
|
7
|
+
The feature name table is an AAT (Apple Advanced Typography) table for
|
|
8
|
+
storing font features, settings, and their human-readable names. It should
|
|
9
|
+
not be confused with the ``Feat`` table or the OpenType Layout ``GSUB``/``GPOS``
|
|
10
|
+
tables.
|
|
11
|
+
|
|
12
|
+
See also https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6feat.html
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
pass
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
from . import DefaultTable
|
|
2
|
+
from . import ttProgram
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
class table__f_p_g_m(DefaultTable.DefaultTable):
|
|
6
|
+
"""Font Program table
|
|
7
|
+
|
|
8
|
+
The ``fpgm`` table typically contains function defintions that are
|
|
9
|
+
used by font instructions. This Font Program is similar to the Control
|
|
10
|
+
Value Program that is stored in the ``prep`` table, but
|
|
11
|
+
the ``fpgm`` table is only executed one time, when the font is first
|
|
12
|
+
used.
|
|
13
|
+
|
|
14
|
+
See also https://learn.microsoft.com/en-us/typography/opentype/spec/fpgm
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
def decompile(self, data, ttFont):
|
|
18
|
+
program = ttProgram.Program()
|
|
19
|
+
program.fromBytecode(data)
|
|
20
|
+
self.program = program
|
|
21
|
+
|
|
22
|
+
def compile(self, ttFont):
|
|
23
|
+
if hasattr(self, "program"):
|
|
24
|
+
return self.program.getBytecode()
|
|
25
|
+
return b""
|
|
26
|
+
|
|
27
|
+
def toXML(self, writer, ttFont):
|
|
28
|
+
self.program.toXML(writer, ttFont)
|
|
29
|
+
|
|
30
|
+
def fromXML(self, name, attrs, content, ttFont):
|
|
31
|
+
program = ttProgram.Program()
|
|
32
|
+
program.fromXML(name, attrs, content, ttFont)
|
|
33
|
+
self.program = program
|
|
34
|
+
|
|
35
|
+
def __bool__(self):
|
|
36
|
+
"""
|
|
37
|
+
>>> fpgm = table__f_p_g_m()
|
|
38
|
+
>>> bool(fpgm)
|
|
39
|
+
False
|
|
40
|
+
>>> p = ttProgram.Program()
|
|
41
|
+
>>> fpgm.program = p
|
|
42
|
+
>>> bool(fpgm)
|
|
43
|
+
False
|
|
44
|
+
>>> bc = bytearray([0])
|
|
45
|
+
>>> p.fromBytecode(bc)
|
|
46
|
+
>>> bool(fpgm)
|
|
47
|
+
True
|
|
48
|
+
>>> p.bytecode.pop()
|
|
49
|
+
0
|
|
50
|
+
>>> bool(fpgm)
|
|
51
|
+
False
|
|
52
|
+
"""
|
|
53
|
+
return hasattr(self, "program") and bool(self.program)
|
|
54
|
+
|
|
55
|
+
__nonzero__ = __bool__
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
if __name__ == "__main__":
|
|
59
|
+
import sys
|
|
60
|
+
import doctest
|
|
61
|
+
|
|
62
|
+
sys.exit(doctest.testmod().failed)
|
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
from fontTools.misc import sstruct
|
|
2
|
+
from fontTools.misc.fixedTools import (
|
|
3
|
+
fixedToFloat as fi2fl,
|
|
4
|
+
floatToFixed as fl2fi,
|
|
5
|
+
floatToFixedToStr as fl2str,
|
|
6
|
+
strToFixedToFloat as str2fl,
|
|
7
|
+
)
|
|
8
|
+
from fontTools.misc.textTools import Tag, bytesjoin, safeEval
|
|
9
|
+
from fontTools.ttLib import TTLibError
|
|
10
|
+
from . import DefaultTable
|
|
11
|
+
import struct
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
# Apple's documentation of 'fvar':
|
|
15
|
+
# https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6fvar.html
|
|
16
|
+
|
|
17
|
+
FVAR_HEADER_FORMAT = """
|
|
18
|
+
> # big endian
|
|
19
|
+
version: L
|
|
20
|
+
offsetToData: H
|
|
21
|
+
countSizePairs: H
|
|
22
|
+
axisCount: H
|
|
23
|
+
axisSize: H
|
|
24
|
+
instanceCount: H
|
|
25
|
+
instanceSize: H
|
|
26
|
+
"""
|
|
27
|
+
|
|
28
|
+
FVAR_AXIS_FORMAT = """
|
|
29
|
+
> # big endian
|
|
30
|
+
axisTag: 4s
|
|
31
|
+
minValue: 16.16F
|
|
32
|
+
defaultValue: 16.16F
|
|
33
|
+
maxValue: 16.16F
|
|
34
|
+
flags: H
|
|
35
|
+
axisNameID: H
|
|
36
|
+
"""
|
|
37
|
+
|
|
38
|
+
FVAR_INSTANCE_FORMAT = """
|
|
39
|
+
> # big endian
|
|
40
|
+
subfamilyNameID: H
|
|
41
|
+
flags: H
|
|
42
|
+
"""
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
class table__f_v_a_r(DefaultTable.DefaultTable):
|
|
46
|
+
"""FonT Variations table
|
|
47
|
+
|
|
48
|
+
The ``fvar`` table contains records of the variation axes and of the
|
|
49
|
+
named instances in a variable font.
|
|
50
|
+
|
|
51
|
+
See also https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6fvar.html
|
|
52
|
+
"""
|
|
53
|
+
|
|
54
|
+
dependencies = ["name"]
|
|
55
|
+
|
|
56
|
+
def __init__(self, tag=None):
|
|
57
|
+
DefaultTable.DefaultTable.__init__(self, tag)
|
|
58
|
+
self.axes = []
|
|
59
|
+
self.instances = []
|
|
60
|
+
|
|
61
|
+
def compile(self, ttFont):
|
|
62
|
+
instanceSize = sstruct.calcsize(FVAR_INSTANCE_FORMAT) + (len(self.axes) * 4)
|
|
63
|
+
includePostScriptNames = any(
|
|
64
|
+
instance.postscriptNameID != 0xFFFF for instance in self.instances
|
|
65
|
+
)
|
|
66
|
+
if includePostScriptNames:
|
|
67
|
+
instanceSize += 2
|
|
68
|
+
header = {
|
|
69
|
+
"version": 0x00010000,
|
|
70
|
+
"offsetToData": sstruct.calcsize(FVAR_HEADER_FORMAT),
|
|
71
|
+
"countSizePairs": 2,
|
|
72
|
+
"axisCount": len(self.axes),
|
|
73
|
+
"axisSize": sstruct.calcsize(FVAR_AXIS_FORMAT),
|
|
74
|
+
"instanceCount": len(self.instances),
|
|
75
|
+
"instanceSize": instanceSize,
|
|
76
|
+
}
|
|
77
|
+
result = [sstruct.pack(FVAR_HEADER_FORMAT, header)]
|
|
78
|
+
result.extend([axis.compile() for axis in self.axes])
|
|
79
|
+
axisTags = [axis.axisTag for axis in self.axes]
|
|
80
|
+
for instance in self.instances:
|
|
81
|
+
result.append(instance.compile(axisTags, includePostScriptNames))
|
|
82
|
+
return bytesjoin(result)
|
|
83
|
+
|
|
84
|
+
def decompile(self, data, ttFont):
|
|
85
|
+
header = {}
|
|
86
|
+
headerSize = sstruct.calcsize(FVAR_HEADER_FORMAT)
|
|
87
|
+
header = sstruct.unpack(FVAR_HEADER_FORMAT, data[0:headerSize])
|
|
88
|
+
if header["version"] != 0x00010000:
|
|
89
|
+
raise TTLibError("unsupported 'fvar' version %04x" % header["version"])
|
|
90
|
+
pos = header["offsetToData"]
|
|
91
|
+
axisSize = header["axisSize"]
|
|
92
|
+
for _ in range(header["axisCount"]):
|
|
93
|
+
axis = Axis()
|
|
94
|
+
axis.decompile(data[pos : pos + axisSize])
|
|
95
|
+
self.axes.append(axis)
|
|
96
|
+
pos += axisSize
|
|
97
|
+
instanceSize = header["instanceSize"]
|
|
98
|
+
axisTags = [axis.axisTag for axis in self.axes]
|
|
99
|
+
for _ in range(header["instanceCount"]):
|
|
100
|
+
instance = NamedInstance()
|
|
101
|
+
instance.decompile(data[pos : pos + instanceSize], axisTags)
|
|
102
|
+
self.instances.append(instance)
|
|
103
|
+
pos += instanceSize
|
|
104
|
+
|
|
105
|
+
def toXML(self, writer, ttFont):
|
|
106
|
+
for axis in self.axes:
|
|
107
|
+
axis.toXML(writer, ttFont)
|
|
108
|
+
for instance in self.instances:
|
|
109
|
+
instance.toXML(writer, ttFont)
|
|
110
|
+
|
|
111
|
+
def fromXML(self, name, attrs, content, ttFont):
|
|
112
|
+
if name == "Axis":
|
|
113
|
+
axis = Axis()
|
|
114
|
+
axis.fromXML(name, attrs, content, ttFont)
|
|
115
|
+
self.axes.append(axis)
|
|
116
|
+
elif name == "NamedInstance":
|
|
117
|
+
instance = NamedInstance()
|
|
118
|
+
instance.fromXML(name, attrs, content, ttFont)
|
|
119
|
+
self.instances.append(instance)
|
|
120
|
+
|
|
121
|
+
def getAxes(self):
|
|
122
|
+
return {a.axisTag: (a.minValue, a.defaultValue, a.maxValue) for a in self.axes}
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
class Axis(object):
|
|
126
|
+
def __init__(self):
|
|
127
|
+
self.axisTag = None
|
|
128
|
+
self.axisNameID = 0
|
|
129
|
+
self.flags = 0
|
|
130
|
+
self.minValue = -1.0
|
|
131
|
+
self.defaultValue = 0.0
|
|
132
|
+
self.maxValue = 1.0
|
|
133
|
+
|
|
134
|
+
def compile(self):
|
|
135
|
+
return sstruct.pack(FVAR_AXIS_FORMAT, self)
|
|
136
|
+
|
|
137
|
+
def decompile(self, data):
|
|
138
|
+
sstruct.unpack2(FVAR_AXIS_FORMAT, data, self)
|
|
139
|
+
|
|
140
|
+
def toXML(self, writer, ttFont):
|
|
141
|
+
name = (
|
|
142
|
+
ttFont["name"].getDebugName(self.axisNameID) if "name" in ttFont else None
|
|
143
|
+
)
|
|
144
|
+
if name is not None:
|
|
145
|
+
writer.newline()
|
|
146
|
+
writer.comment(name)
|
|
147
|
+
writer.newline()
|
|
148
|
+
writer.begintag("Axis")
|
|
149
|
+
writer.newline()
|
|
150
|
+
for tag, value in [
|
|
151
|
+
("AxisTag", self.axisTag),
|
|
152
|
+
("Flags", "0x%X" % self.flags),
|
|
153
|
+
("MinValue", fl2str(self.minValue, 16)),
|
|
154
|
+
("DefaultValue", fl2str(self.defaultValue, 16)),
|
|
155
|
+
("MaxValue", fl2str(self.maxValue, 16)),
|
|
156
|
+
("AxisNameID", str(self.axisNameID)),
|
|
157
|
+
]:
|
|
158
|
+
writer.begintag(tag)
|
|
159
|
+
writer.write(value)
|
|
160
|
+
writer.endtag(tag)
|
|
161
|
+
writer.newline()
|
|
162
|
+
writer.endtag("Axis")
|
|
163
|
+
writer.newline()
|
|
164
|
+
|
|
165
|
+
def fromXML(self, name, _attrs, content, ttFont):
|
|
166
|
+
assert name == "Axis"
|
|
167
|
+
for tag, _, value in filter(lambda t: type(t) is tuple, content):
|
|
168
|
+
value = "".join(value)
|
|
169
|
+
if tag == "AxisTag":
|
|
170
|
+
self.axisTag = Tag(value)
|
|
171
|
+
elif tag in {"Flags", "MinValue", "DefaultValue", "MaxValue", "AxisNameID"}:
|
|
172
|
+
setattr(
|
|
173
|
+
self,
|
|
174
|
+
tag[0].lower() + tag[1:],
|
|
175
|
+
str2fl(value, 16) if tag.endswith("Value") else safeEval(value),
|
|
176
|
+
)
|
|
177
|
+
|
|
178
|
+
|
|
179
|
+
class NamedInstance(object):
|
|
180
|
+
def __init__(self):
|
|
181
|
+
self.subfamilyNameID = 0
|
|
182
|
+
self.postscriptNameID = 0xFFFF
|
|
183
|
+
self.flags = 0
|
|
184
|
+
self.coordinates = {}
|
|
185
|
+
|
|
186
|
+
def compile(self, axisTags, includePostScriptName):
|
|
187
|
+
result = [sstruct.pack(FVAR_INSTANCE_FORMAT, self)]
|
|
188
|
+
for axis in axisTags:
|
|
189
|
+
fixedCoord = fl2fi(self.coordinates[axis], 16)
|
|
190
|
+
result.append(struct.pack(">l", fixedCoord))
|
|
191
|
+
if includePostScriptName:
|
|
192
|
+
result.append(struct.pack(">H", self.postscriptNameID))
|
|
193
|
+
return bytesjoin(result)
|
|
194
|
+
|
|
195
|
+
def decompile(self, data, axisTags):
|
|
196
|
+
sstruct.unpack2(FVAR_INSTANCE_FORMAT, data, self)
|
|
197
|
+
pos = sstruct.calcsize(FVAR_INSTANCE_FORMAT)
|
|
198
|
+
for axis in axisTags:
|
|
199
|
+
value = struct.unpack(">l", data[pos : pos + 4])[0]
|
|
200
|
+
self.coordinates[axis] = fi2fl(value, 16)
|
|
201
|
+
pos += 4
|
|
202
|
+
if pos + 2 <= len(data):
|
|
203
|
+
self.postscriptNameID = struct.unpack(">H", data[pos : pos + 2])[0]
|
|
204
|
+
else:
|
|
205
|
+
self.postscriptNameID = 0xFFFF
|
|
206
|
+
|
|
207
|
+
def toXML(self, writer, ttFont):
|
|
208
|
+
name = (
|
|
209
|
+
ttFont["name"].getDebugName(self.subfamilyNameID)
|
|
210
|
+
if "name" in ttFont
|
|
211
|
+
else None
|
|
212
|
+
)
|
|
213
|
+
if name is not None:
|
|
214
|
+
writer.newline()
|
|
215
|
+
writer.comment(name)
|
|
216
|
+
writer.newline()
|
|
217
|
+
psname = (
|
|
218
|
+
ttFont["name"].getDebugName(self.postscriptNameID)
|
|
219
|
+
if "name" in ttFont
|
|
220
|
+
else None
|
|
221
|
+
)
|
|
222
|
+
if psname is not None:
|
|
223
|
+
writer.comment("PostScript: " + psname)
|
|
224
|
+
writer.newline()
|
|
225
|
+
if self.postscriptNameID == 0xFFFF:
|
|
226
|
+
writer.begintag(
|
|
227
|
+
"NamedInstance",
|
|
228
|
+
flags=("0x%X" % self.flags),
|
|
229
|
+
subfamilyNameID=self.subfamilyNameID,
|
|
230
|
+
)
|
|
231
|
+
else:
|
|
232
|
+
writer.begintag(
|
|
233
|
+
"NamedInstance",
|
|
234
|
+
flags=("0x%X" % self.flags),
|
|
235
|
+
subfamilyNameID=self.subfamilyNameID,
|
|
236
|
+
postscriptNameID=self.postscriptNameID,
|
|
237
|
+
)
|
|
238
|
+
writer.newline()
|
|
239
|
+
for axis in ttFont["fvar"].axes:
|
|
240
|
+
writer.simpletag(
|
|
241
|
+
"coord",
|
|
242
|
+
axis=axis.axisTag,
|
|
243
|
+
value=fl2str(self.coordinates[axis.axisTag], 16),
|
|
244
|
+
)
|
|
245
|
+
writer.newline()
|
|
246
|
+
writer.endtag("NamedInstance")
|
|
247
|
+
writer.newline()
|
|
248
|
+
|
|
249
|
+
def fromXML(self, name, attrs, content, ttFont):
|
|
250
|
+
assert name == "NamedInstance"
|
|
251
|
+
self.subfamilyNameID = safeEval(attrs["subfamilyNameID"])
|
|
252
|
+
self.flags = safeEval(attrs.get("flags", "0"))
|
|
253
|
+
if "postscriptNameID" in attrs:
|
|
254
|
+
self.postscriptNameID = safeEval(attrs["postscriptNameID"])
|
|
255
|
+
else:
|
|
256
|
+
self.postscriptNameID = 0xFFFF
|
|
257
|
+
|
|
258
|
+
for tag, elementAttrs, _ in filter(lambda t: type(t) is tuple, content):
|
|
259
|
+
if tag == "coord":
|
|
260
|
+
value = str2fl(elementAttrs["value"], 16)
|
|
261
|
+
self.coordinates[elementAttrs["axis"]] = value
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
from fontTools.misc.textTools import safeEval
|
|
2
|
+
from . import DefaultTable
|
|
3
|
+
import struct
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
GASP_SYMMETRIC_GRIDFIT = 0x0004
|
|
7
|
+
GASP_SYMMETRIC_SMOOTHING = 0x0008
|
|
8
|
+
GASP_DOGRAY = 0x0002
|
|
9
|
+
GASP_GRIDFIT = 0x0001
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class table__g_a_s_p(DefaultTable.DefaultTable):
|
|
13
|
+
"""Grid-fitting and Scan-conversion Procedure table
|
|
14
|
+
|
|
15
|
+
The ``gasp`` table defines the preferred rasterization settings for
|
|
16
|
+
the font when rendered on monochrome and greyscale output devices.
|
|
17
|
+
|
|
18
|
+
See also https://learn.microsoft.com/en-us/typography/opentype/spec/gasp
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
def decompile(self, data, ttFont):
|
|
22
|
+
self.version, numRanges = struct.unpack(">HH", data[:4])
|
|
23
|
+
assert 0 <= self.version <= 1, "unknown 'gasp' format: %s" % self.version
|
|
24
|
+
data = data[4:]
|
|
25
|
+
self.gaspRange = {}
|
|
26
|
+
for i in range(numRanges):
|
|
27
|
+
rangeMaxPPEM, rangeGaspBehavior = struct.unpack(">HH", data[:4])
|
|
28
|
+
self.gaspRange[int(rangeMaxPPEM)] = int(rangeGaspBehavior)
|
|
29
|
+
data = data[4:]
|
|
30
|
+
assert not data, "too much data"
|
|
31
|
+
|
|
32
|
+
def compile(self, ttFont):
|
|
33
|
+
version = 0 # ignore self.version
|
|
34
|
+
numRanges = len(self.gaspRange)
|
|
35
|
+
data = b""
|
|
36
|
+
items = sorted(self.gaspRange.items())
|
|
37
|
+
for rangeMaxPPEM, rangeGaspBehavior in items:
|
|
38
|
+
data = data + struct.pack(">HH", rangeMaxPPEM, rangeGaspBehavior)
|
|
39
|
+
if rangeGaspBehavior & ~(GASP_GRIDFIT | GASP_DOGRAY):
|
|
40
|
+
version = 1
|
|
41
|
+
data = struct.pack(">HH", version, numRanges) + data
|
|
42
|
+
return data
|
|
43
|
+
|
|
44
|
+
def toXML(self, writer, ttFont):
|
|
45
|
+
items = sorted(self.gaspRange.items())
|
|
46
|
+
for rangeMaxPPEM, rangeGaspBehavior in items:
|
|
47
|
+
writer.simpletag(
|
|
48
|
+
"gaspRange",
|
|
49
|
+
[
|
|
50
|
+
("rangeMaxPPEM", rangeMaxPPEM),
|
|
51
|
+
("rangeGaspBehavior", rangeGaspBehavior),
|
|
52
|
+
],
|
|
53
|
+
)
|
|
54
|
+
writer.newline()
|
|
55
|
+
|
|
56
|
+
def fromXML(self, name, attrs, content, ttFont):
|
|
57
|
+
if name != "gaspRange":
|
|
58
|
+
return
|
|
59
|
+
if not hasattr(self, "gaspRange"):
|
|
60
|
+
self.gaspRange = {}
|
|
61
|
+
self.gaspRange[safeEval(attrs["rangeMaxPPEM"])] = safeEval(
|
|
62
|
+
attrs["rangeGaspBehavior"]
|
|
63
|
+
)
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
from .otBase import BaseTTXConverter
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
# https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6gcid.html
|
|
5
|
+
class table__g_c_i_d(BaseTTXConverter):
|
|
6
|
+
"""Glyph ID to CID table
|
|
7
|
+
|
|
8
|
+
The AAT ``gcid`` table stores glyphID-to-CID mappings.
|
|
9
|
+
|
|
10
|
+
See also https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6gcid.html
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
pass
|