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,12 @@
|
|
|
1
|
+
from .otBase import BaseTTXConverter
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class table_V_A_R_C_(BaseTTXConverter):
|
|
5
|
+
"""Variable Components table
|
|
6
|
+
|
|
7
|
+
The ``VARC`` table contains variation information for composite glyphs.
|
|
8
|
+
|
|
9
|
+
See also https://github.com/harfbuzz/boring-expansion-spec/blob/main/VARC.md
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
pass
|
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
from . import DefaultTable
|
|
2
|
+
from fontTools.misc import sstruct
|
|
3
|
+
from fontTools.misc.textTools import safeEval
|
|
4
|
+
import struct
|
|
5
|
+
|
|
6
|
+
VDMX_HeaderFmt = """
|
|
7
|
+
> # big endian
|
|
8
|
+
version: H # Version number (0 or 1)
|
|
9
|
+
numRecs: H # Number of VDMX groups present
|
|
10
|
+
numRatios: H # Number of aspect ratio groupings
|
|
11
|
+
"""
|
|
12
|
+
# the VMDX header is followed by an array of RatRange[numRatios] (i.e. aspect
|
|
13
|
+
# ratio ranges);
|
|
14
|
+
VDMX_RatRangeFmt = """
|
|
15
|
+
> # big endian
|
|
16
|
+
bCharSet: B # Character set
|
|
17
|
+
xRatio: B # Value to use for x-Ratio
|
|
18
|
+
yStartRatio: B # Starting y-Ratio value
|
|
19
|
+
yEndRatio: B # Ending y-Ratio value
|
|
20
|
+
"""
|
|
21
|
+
# followed by an array of offset[numRatios] from start of VDMX table to the
|
|
22
|
+
# VDMX Group for this ratio range (offsets will be re-calculated on compile);
|
|
23
|
+
# followed by an array of Group[numRecs] records;
|
|
24
|
+
VDMX_GroupFmt = """
|
|
25
|
+
> # big endian
|
|
26
|
+
recs: H # Number of height records in this group
|
|
27
|
+
startsz: B # Starting yPelHeight
|
|
28
|
+
endsz: B # Ending yPelHeight
|
|
29
|
+
"""
|
|
30
|
+
# followed by an array of vTable[recs] records.
|
|
31
|
+
VDMX_vTableFmt = """
|
|
32
|
+
> # big endian
|
|
33
|
+
yPelHeight: H # yPelHeight to which values apply
|
|
34
|
+
yMax: h # Maximum value (in pels) for this yPelHeight
|
|
35
|
+
yMin: h # Minimum value (in pels) for this yPelHeight
|
|
36
|
+
"""
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
class table_V_D_M_X_(DefaultTable.DefaultTable):
|
|
40
|
+
"""Vertical Device Metrics table
|
|
41
|
+
|
|
42
|
+
The ``VDMX`` table records changes to the vertical glyph minima
|
|
43
|
+
and maxima that result from Truetype instructions.
|
|
44
|
+
|
|
45
|
+
See also https://learn.microsoft.com/en-us/typography/opentype/spec/vdmx
|
|
46
|
+
"""
|
|
47
|
+
|
|
48
|
+
def decompile(self, data, ttFont):
|
|
49
|
+
pos = 0 # track current position from to start of VDMX table
|
|
50
|
+
dummy, data = sstruct.unpack2(VDMX_HeaderFmt, data, self)
|
|
51
|
+
pos += sstruct.calcsize(VDMX_HeaderFmt)
|
|
52
|
+
self.ratRanges = []
|
|
53
|
+
for i in range(self.numRatios):
|
|
54
|
+
ratio, data = sstruct.unpack2(VDMX_RatRangeFmt, data)
|
|
55
|
+
pos += sstruct.calcsize(VDMX_RatRangeFmt)
|
|
56
|
+
# the mapping between a ratio and a group is defined further below
|
|
57
|
+
ratio["groupIndex"] = None
|
|
58
|
+
self.ratRanges.append(ratio)
|
|
59
|
+
lenOffset = struct.calcsize(">H")
|
|
60
|
+
_offsets = [] # temporarily store offsets to groups
|
|
61
|
+
for i in range(self.numRatios):
|
|
62
|
+
offset = struct.unpack(">H", data[0:lenOffset])[0]
|
|
63
|
+
data = data[lenOffset:]
|
|
64
|
+
pos += lenOffset
|
|
65
|
+
_offsets.append(offset)
|
|
66
|
+
self.groups = []
|
|
67
|
+
for groupIndex in range(self.numRecs):
|
|
68
|
+
# the offset to this group from beginning of the VDMX table
|
|
69
|
+
currOffset = pos
|
|
70
|
+
group, data = sstruct.unpack2(VDMX_GroupFmt, data)
|
|
71
|
+
# the group lenght and bounding sizes are re-calculated on compile
|
|
72
|
+
recs = group.pop("recs")
|
|
73
|
+
startsz = group.pop("startsz")
|
|
74
|
+
endsz = group.pop("endsz")
|
|
75
|
+
pos += sstruct.calcsize(VDMX_GroupFmt)
|
|
76
|
+
for j in range(recs):
|
|
77
|
+
vTable, data = sstruct.unpack2(VDMX_vTableFmt, data)
|
|
78
|
+
vTableLength = sstruct.calcsize(VDMX_vTableFmt)
|
|
79
|
+
pos += vTableLength
|
|
80
|
+
# group is a dict of (yMax, yMin) tuples keyed by yPelHeight
|
|
81
|
+
group[vTable["yPelHeight"]] = (vTable["yMax"], vTable["yMin"])
|
|
82
|
+
# make sure startsz and endsz match the calculated values
|
|
83
|
+
minSize = min(group.keys())
|
|
84
|
+
maxSize = max(group.keys())
|
|
85
|
+
assert (
|
|
86
|
+
startsz == minSize
|
|
87
|
+
), "startsz (%s) must equal min yPelHeight (%s): group %d" % (
|
|
88
|
+
group.startsz,
|
|
89
|
+
minSize,
|
|
90
|
+
groupIndex,
|
|
91
|
+
)
|
|
92
|
+
assert (
|
|
93
|
+
endsz == maxSize
|
|
94
|
+
), "endsz (%s) must equal max yPelHeight (%s): group %d" % (
|
|
95
|
+
group.endsz,
|
|
96
|
+
maxSize,
|
|
97
|
+
groupIndex,
|
|
98
|
+
)
|
|
99
|
+
self.groups.append(group)
|
|
100
|
+
# match the defined offsets with the current group's offset
|
|
101
|
+
for offsetIndex, offsetValue in enumerate(_offsets):
|
|
102
|
+
# when numRecs < numRatios there can more than one ratio range
|
|
103
|
+
# sharing the same VDMX group
|
|
104
|
+
if currOffset == offsetValue:
|
|
105
|
+
# map the group with the ratio range thas has the same
|
|
106
|
+
# index as the offset to that group (it took me a while..)
|
|
107
|
+
self.ratRanges[offsetIndex]["groupIndex"] = groupIndex
|
|
108
|
+
# check that all ratio ranges have a group
|
|
109
|
+
for i in range(self.numRatios):
|
|
110
|
+
ratio = self.ratRanges[i]
|
|
111
|
+
if ratio["groupIndex"] is None:
|
|
112
|
+
from fontTools import ttLib
|
|
113
|
+
|
|
114
|
+
raise ttLib.TTLibError("no group defined for ratRange %d" % i)
|
|
115
|
+
|
|
116
|
+
def _getOffsets(self):
|
|
117
|
+
"""
|
|
118
|
+
Calculate offsets to VDMX_Group records.
|
|
119
|
+
For each ratRange return a list of offset values from the beginning of
|
|
120
|
+
the VDMX table to a VDMX_Group.
|
|
121
|
+
"""
|
|
122
|
+
lenHeader = sstruct.calcsize(VDMX_HeaderFmt)
|
|
123
|
+
lenRatRange = sstruct.calcsize(VDMX_RatRangeFmt)
|
|
124
|
+
lenOffset = struct.calcsize(">H")
|
|
125
|
+
lenGroupHeader = sstruct.calcsize(VDMX_GroupFmt)
|
|
126
|
+
lenVTable = sstruct.calcsize(VDMX_vTableFmt)
|
|
127
|
+
# offset to the first group
|
|
128
|
+
pos = lenHeader + self.numRatios * lenRatRange + self.numRatios * lenOffset
|
|
129
|
+
groupOffsets = []
|
|
130
|
+
for group in self.groups:
|
|
131
|
+
groupOffsets.append(pos)
|
|
132
|
+
lenGroup = lenGroupHeader + len(group) * lenVTable
|
|
133
|
+
pos += lenGroup # offset to next group
|
|
134
|
+
offsets = []
|
|
135
|
+
for ratio in self.ratRanges:
|
|
136
|
+
groupIndex = ratio["groupIndex"]
|
|
137
|
+
offsets.append(groupOffsets[groupIndex])
|
|
138
|
+
return offsets
|
|
139
|
+
|
|
140
|
+
def compile(self, ttFont):
|
|
141
|
+
if not (self.version == 0 or self.version == 1):
|
|
142
|
+
from fontTools import ttLib
|
|
143
|
+
|
|
144
|
+
raise ttLib.TTLibError(
|
|
145
|
+
"unknown format for VDMX table: version %s" % self.version
|
|
146
|
+
)
|
|
147
|
+
data = sstruct.pack(VDMX_HeaderFmt, self)
|
|
148
|
+
for ratio in self.ratRanges:
|
|
149
|
+
data += sstruct.pack(VDMX_RatRangeFmt, ratio)
|
|
150
|
+
# recalculate offsets to VDMX groups
|
|
151
|
+
for offset in self._getOffsets():
|
|
152
|
+
data += struct.pack(">H", offset)
|
|
153
|
+
for group in self.groups:
|
|
154
|
+
recs = len(group)
|
|
155
|
+
startsz = min(group.keys())
|
|
156
|
+
endsz = max(group.keys())
|
|
157
|
+
gHeader = {"recs": recs, "startsz": startsz, "endsz": endsz}
|
|
158
|
+
data += sstruct.pack(VDMX_GroupFmt, gHeader)
|
|
159
|
+
for yPelHeight, (yMax, yMin) in sorted(group.items()):
|
|
160
|
+
vTable = {"yPelHeight": yPelHeight, "yMax": yMax, "yMin": yMin}
|
|
161
|
+
data += sstruct.pack(VDMX_vTableFmt, vTable)
|
|
162
|
+
return data
|
|
163
|
+
|
|
164
|
+
def toXML(self, writer, ttFont):
|
|
165
|
+
writer.simpletag("version", value=self.version)
|
|
166
|
+
writer.newline()
|
|
167
|
+
writer.begintag("ratRanges")
|
|
168
|
+
writer.newline()
|
|
169
|
+
for ratio in self.ratRanges:
|
|
170
|
+
groupIndex = ratio["groupIndex"]
|
|
171
|
+
writer.simpletag(
|
|
172
|
+
"ratRange",
|
|
173
|
+
bCharSet=ratio["bCharSet"],
|
|
174
|
+
xRatio=ratio["xRatio"],
|
|
175
|
+
yStartRatio=ratio["yStartRatio"],
|
|
176
|
+
yEndRatio=ratio["yEndRatio"],
|
|
177
|
+
groupIndex=groupIndex,
|
|
178
|
+
)
|
|
179
|
+
writer.newline()
|
|
180
|
+
writer.endtag("ratRanges")
|
|
181
|
+
writer.newline()
|
|
182
|
+
writer.begintag("groups")
|
|
183
|
+
writer.newline()
|
|
184
|
+
for groupIndex in range(self.numRecs):
|
|
185
|
+
group = self.groups[groupIndex]
|
|
186
|
+
recs = len(group)
|
|
187
|
+
startsz = min(group.keys())
|
|
188
|
+
endsz = max(group.keys())
|
|
189
|
+
writer.begintag("group", index=groupIndex)
|
|
190
|
+
writer.newline()
|
|
191
|
+
writer.comment("recs=%d, startsz=%d, endsz=%d" % (recs, startsz, endsz))
|
|
192
|
+
writer.newline()
|
|
193
|
+
for yPelHeight, (yMax, yMin) in sorted(group.items()):
|
|
194
|
+
writer.simpletag(
|
|
195
|
+
"record",
|
|
196
|
+
[("yPelHeight", yPelHeight), ("yMax", yMax), ("yMin", yMin)],
|
|
197
|
+
)
|
|
198
|
+
writer.newline()
|
|
199
|
+
writer.endtag("group")
|
|
200
|
+
writer.newline()
|
|
201
|
+
writer.endtag("groups")
|
|
202
|
+
writer.newline()
|
|
203
|
+
|
|
204
|
+
def fromXML(self, name, attrs, content, ttFont):
|
|
205
|
+
if name == "version":
|
|
206
|
+
self.version = safeEval(attrs["value"])
|
|
207
|
+
elif name == "ratRanges":
|
|
208
|
+
if not hasattr(self, "ratRanges"):
|
|
209
|
+
self.ratRanges = []
|
|
210
|
+
for element in content:
|
|
211
|
+
if not isinstance(element, tuple):
|
|
212
|
+
continue
|
|
213
|
+
name, attrs, content = element
|
|
214
|
+
if name == "ratRange":
|
|
215
|
+
if not hasattr(self, "numRatios"):
|
|
216
|
+
self.numRatios = 1
|
|
217
|
+
else:
|
|
218
|
+
self.numRatios += 1
|
|
219
|
+
ratio = {
|
|
220
|
+
"bCharSet": safeEval(attrs["bCharSet"]),
|
|
221
|
+
"xRatio": safeEval(attrs["xRatio"]),
|
|
222
|
+
"yStartRatio": safeEval(attrs["yStartRatio"]),
|
|
223
|
+
"yEndRatio": safeEval(attrs["yEndRatio"]),
|
|
224
|
+
"groupIndex": safeEval(attrs["groupIndex"]),
|
|
225
|
+
}
|
|
226
|
+
self.ratRanges.append(ratio)
|
|
227
|
+
elif name == "groups":
|
|
228
|
+
if not hasattr(self, "groups"):
|
|
229
|
+
self.groups = []
|
|
230
|
+
for element in content:
|
|
231
|
+
if not isinstance(element, tuple):
|
|
232
|
+
continue
|
|
233
|
+
name, attrs, content = element
|
|
234
|
+
if name == "group":
|
|
235
|
+
if not hasattr(self, "numRecs"):
|
|
236
|
+
self.numRecs = 1
|
|
237
|
+
else:
|
|
238
|
+
self.numRecs += 1
|
|
239
|
+
group = {}
|
|
240
|
+
for element in content:
|
|
241
|
+
if not isinstance(element, tuple):
|
|
242
|
+
continue
|
|
243
|
+
name, attrs, content = element
|
|
244
|
+
if name == "record":
|
|
245
|
+
yPelHeight = safeEval(attrs["yPelHeight"])
|
|
246
|
+
yMax = safeEval(attrs["yMax"])
|
|
247
|
+
yMin = safeEval(attrs["yMin"])
|
|
248
|
+
group[yPelHeight] = (yMax, yMin)
|
|
249
|
+
self.groups.append(group)
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
from fontTools.misc.textTools import bytesjoin, safeEval
|
|
2
|
+
from . import DefaultTable
|
|
3
|
+
import struct
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class table_V_O_R_G_(DefaultTable.DefaultTable):
|
|
7
|
+
"""Vertical Origin table
|
|
8
|
+
|
|
9
|
+
The ``VORG`` table contains the vertical origin of each glyph
|
|
10
|
+
in a `CFF` or `CFF2` font.
|
|
11
|
+
|
|
12
|
+
This table is structured so that you can treat it like a dictionary keyed by glyph name.
|
|
13
|
+
|
|
14
|
+
``ttFont['VORG'][<glyphName>]`` will return the vertical origin for any glyph.
|
|
15
|
+
|
|
16
|
+
``ttFont['VORG'][<glyphName>] = <value>`` will set the vertical origin for any glyph.
|
|
17
|
+
|
|
18
|
+
See also https://learn.microsoft.com/en-us/typography/opentype/spec/vorg
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
def decompile(self, data, ttFont):
|
|
22
|
+
self.getGlyphName = (
|
|
23
|
+
ttFont.getGlyphName
|
|
24
|
+
) # for use in get/set item functions, for access by GID
|
|
25
|
+
(
|
|
26
|
+
self.majorVersion,
|
|
27
|
+
self.minorVersion,
|
|
28
|
+
self.defaultVertOriginY,
|
|
29
|
+
self.numVertOriginYMetrics,
|
|
30
|
+
) = struct.unpack(">HHhH", data[:8])
|
|
31
|
+
assert (
|
|
32
|
+
self.majorVersion <= 1
|
|
33
|
+
), "Major version of VORG table is higher than I know how to handle"
|
|
34
|
+
data = data[8:]
|
|
35
|
+
vids = []
|
|
36
|
+
gids = []
|
|
37
|
+
pos = 0
|
|
38
|
+
for i in range(self.numVertOriginYMetrics):
|
|
39
|
+
gid, vOrigin = struct.unpack(">Hh", data[pos : pos + 4])
|
|
40
|
+
pos += 4
|
|
41
|
+
gids.append(gid)
|
|
42
|
+
vids.append(vOrigin)
|
|
43
|
+
|
|
44
|
+
self.VOriginRecords = vOrig = {}
|
|
45
|
+
glyphOrder = ttFont.getGlyphOrder()
|
|
46
|
+
try:
|
|
47
|
+
names = [glyphOrder[gid] for gid in gids]
|
|
48
|
+
except IndexError:
|
|
49
|
+
getGlyphName = self.getGlyphName
|
|
50
|
+
names = map(getGlyphName, gids)
|
|
51
|
+
|
|
52
|
+
for name, vid in zip(names, vids):
|
|
53
|
+
vOrig[name] = vid
|
|
54
|
+
|
|
55
|
+
def compile(self, ttFont):
|
|
56
|
+
vorgs = list(self.VOriginRecords.values())
|
|
57
|
+
names = list(self.VOriginRecords.keys())
|
|
58
|
+
nameMap = ttFont.getReverseGlyphMap()
|
|
59
|
+
try:
|
|
60
|
+
gids = [nameMap[name] for name in names]
|
|
61
|
+
except KeyError:
|
|
62
|
+
nameMap = ttFont.getReverseGlyphMap(rebuild=True)
|
|
63
|
+
gids = [nameMap[name] for name in names]
|
|
64
|
+
vOriginTable = list(zip(gids, vorgs))
|
|
65
|
+
self.numVertOriginYMetrics = len(vorgs)
|
|
66
|
+
vOriginTable.sort() # must be in ascending GID order
|
|
67
|
+
dataList = [struct.pack(">Hh", rec[0], rec[1]) for rec in vOriginTable]
|
|
68
|
+
header = struct.pack(
|
|
69
|
+
">HHhH",
|
|
70
|
+
self.majorVersion,
|
|
71
|
+
self.minorVersion,
|
|
72
|
+
self.defaultVertOriginY,
|
|
73
|
+
self.numVertOriginYMetrics,
|
|
74
|
+
)
|
|
75
|
+
dataList.insert(0, header)
|
|
76
|
+
data = bytesjoin(dataList)
|
|
77
|
+
return data
|
|
78
|
+
|
|
79
|
+
def toXML(self, writer, ttFont):
|
|
80
|
+
writer.simpletag("majorVersion", value=self.majorVersion)
|
|
81
|
+
writer.newline()
|
|
82
|
+
writer.simpletag("minorVersion", value=self.minorVersion)
|
|
83
|
+
writer.newline()
|
|
84
|
+
writer.simpletag("defaultVertOriginY", value=self.defaultVertOriginY)
|
|
85
|
+
writer.newline()
|
|
86
|
+
writer.simpletag("numVertOriginYMetrics", value=self.numVertOriginYMetrics)
|
|
87
|
+
writer.newline()
|
|
88
|
+
vOriginTable = []
|
|
89
|
+
glyphNames = self.VOriginRecords.keys()
|
|
90
|
+
for glyphName in glyphNames:
|
|
91
|
+
try:
|
|
92
|
+
gid = ttFont.getGlyphID(glyphName)
|
|
93
|
+
except:
|
|
94
|
+
assert 0, (
|
|
95
|
+
"VORG table contains a glyph name not in ttFont.getGlyphNames(): "
|
|
96
|
+
+ str(glyphName)
|
|
97
|
+
)
|
|
98
|
+
vOriginTable.append([gid, glyphName, self.VOriginRecords[glyphName]])
|
|
99
|
+
vOriginTable.sort()
|
|
100
|
+
for entry in vOriginTable:
|
|
101
|
+
vOriginRec = VOriginRecord(entry[1], entry[2])
|
|
102
|
+
vOriginRec.toXML(writer, ttFont)
|
|
103
|
+
|
|
104
|
+
def fromXML(self, name, attrs, content, ttFont):
|
|
105
|
+
if not hasattr(self, "VOriginRecords"):
|
|
106
|
+
self.VOriginRecords = {}
|
|
107
|
+
self.getGlyphName = (
|
|
108
|
+
ttFont.getGlyphName
|
|
109
|
+
) # for use in get/set item functions, for access by GID
|
|
110
|
+
if name == "VOriginRecord":
|
|
111
|
+
vOriginRec = VOriginRecord()
|
|
112
|
+
for element in content:
|
|
113
|
+
if isinstance(element, str):
|
|
114
|
+
continue
|
|
115
|
+
name, attrs, content = element
|
|
116
|
+
vOriginRec.fromXML(name, attrs, content, ttFont)
|
|
117
|
+
self.VOriginRecords[vOriginRec.glyphName] = vOriginRec.vOrigin
|
|
118
|
+
elif "value" in attrs:
|
|
119
|
+
setattr(self, name, safeEval(attrs["value"]))
|
|
120
|
+
|
|
121
|
+
def __getitem__(self, glyphSelector):
|
|
122
|
+
if isinstance(glyphSelector, int):
|
|
123
|
+
# its a gid, convert to glyph name
|
|
124
|
+
glyphSelector = self.getGlyphName(glyphSelector)
|
|
125
|
+
|
|
126
|
+
if glyphSelector not in self.VOriginRecords:
|
|
127
|
+
return self.defaultVertOriginY
|
|
128
|
+
|
|
129
|
+
return self.VOriginRecords[glyphSelector]
|
|
130
|
+
|
|
131
|
+
def __setitem__(self, glyphSelector, value):
|
|
132
|
+
if isinstance(glyphSelector, int):
|
|
133
|
+
# its a gid, convert to glyph name
|
|
134
|
+
glyphSelector = self.getGlyphName(glyphSelector)
|
|
135
|
+
|
|
136
|
+
if value != self.defaultVertOriginY:
|
|
137
|
+
self.VOriginRecords[glyphSelector] = value
|
|
138
|
+
elif glyphSelector in self.VOriginRecords:
|
|
139
|
+
del self.VOriginRecords[glyphSelector]
|
|
140
|
+
|
|
141
|
+
def __delitem__(self, glyphSelector):
|
|
142
|
+
del self.VOriginRecords[glyphSelector]
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
class VOriginRecord(object):
|
|
146
|
+
def __init__(self, name=None, vOrigin=None):
|
|
147
|
+
self.glyphName = name
|
|
148
|
+
self.vOrigin = vOrigin
|
|
149
|
+
|
|
150
|
+
def toXML(self, writer, ttFont):
|
|
151
|
+
writer.begintag("VOriginRecord")
|
|
152
|
+
writer.newline()
|
|
153
|
+
writer.simpletag("glyphName", value=self.glyphName)
|
|
154
|
+
writer.newline()
|
|
155
|
+
writer.simpletag("vOrigin", value=self.vOrigin)
|
|
156
|
+
writer.newline()
|
|
157
|
+
writer.endtag("VOriginRecord")
|
|
158
|
+
writer.newline()
|
|
159
|
+
|
|
160
|
+
def fromXML(self, name, attrs, content, ttFont):
|
|
161
|
+
value = attrs["value"]
|
|
162
|
+
if name == "glyphName":
|
|
163
|
+
setattr(self, name, value)
|
|
164
|
+
else:
|
|
165
|
+
setattr(self, name, safeEval(value))
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
from .otBase import BaseTTXConverter
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class table_V_V_A_R_(BaseTTXConverter):
|
|
5
|
+
"""Vertical Metrics Variations table
|
|
6
|
+
|
|
7
|
+
The ``VVAR`` table contains variation data for per-glyph vertical metrics
|
|
8
|
+
in a variable font.
|
|
9
|
+
|
|
10
|
+
See also https://learn.microsoft.com/en-us/typography/opentype/spec/vvar
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
pass
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
# DON'T EDIT! This file is generated by MetaTools/buildTableList.py.
|
|
2
|
+
def _moduleFinderHint():
|
|
3
|
+
"""Dummy function to let modulefinder know what tables may be
|
|
4
|
+
dynamically imported. Generated by MetaTools/buildTableList.py.
|
|
5
|
+
|
|
6
|
+
>>> _moduleFinderHint()
|
|
7
|
+
"""
|
|
8
|
+
from . import B_A_S_E_
|
|
9
|
+
from . import C_B_D_T_
|
|
10
|
+
from . import C_B_L_C_
|
|
11
|
+
from . import C_F_F_
|
|
12
|
+
from . import C_F_F__2
|
|
13
|
+
from . import C_O_L_R_
|
|
14
|
+
from . import C_P_A_L_
|
|
15
|
+
from . import D_S_I_G_
|
|
16
|
+
from . import D__e_b_g
|
|
17
|
+
from . import E_B_D_T_
|
|
18
|
+
from . import E_B_L_C_
|
|
19
|
+
from . import F_F_T_M_
|
|
20
|
+
from . import F__e_a_t
|
|
21
|
+
from . import G_D_E_F_
|
|
22
|
+
from . import G_M_A_P_
|
|
23
|
+
from . import G_P_K_G_
|
|
24
|
+
from . import G_P_O_S_
|
|
25
|
+
from . import G_S_U_B_
|
|
26
|
+
from . import G_V_A_R_
|
|
27
|
+
from . import G__l_a_t
|
|
28
|
+
from . import G__l_o_c
|
|
29
|
+
from . import H_V_A_R_
|
|
30
|
+
from . import J_S_T_F_
|
|
31
|
+
from . import L_T_S_H_
|
|
32
|
+
from . import M_A_T_H_
|
|
33
|
+
from . import M_E_T_A_
|
|
34
|
+
from . import M_V_A_R_
|
|
35
|
+
from . import O_S_2f_2
|
|
36
|
+
from . import S_I_N_G_
|
|
37
|
+
from . import S_T_A_T_
|
|
38
|
+
from . import S_V_G_
|
|
39
|
+
from . import S__i_l_f
|
|
40
|
+
from . import S__i_l_l
|
|
41
|
+
from . import T_S_I_B_
|
|
42
|
+
from . import T_S_I_C_
|
|
43
|
+
from . import T_S_I_D_
|
|
44
|
+
from . import T_S_I_J_
|
|
45
|
+
from . import T_S_I_P_
|
|
46
|
+
from . import T_S_I_S_
|
|
47
|
+
from . import T_S_I_V_
|
|
48
|
+
from . import T_S_I__0
|
|
49
|
+
from . import T_S_I__1
|
|
50
|
+
from . import T_S_I__2
|
|
51
|
+
from . import T_S_I__3
|
|
52
|
+
from . import T_S_I__5
|
|
53
|
+
from . import T_T_F_A_
|
|
54
|
+
from . import V_A_R_C_
|
|
55
|
+
from . import V_D_M_X_
|
|
56
|
+
from . import V_O_R_G_
|
|
57
|
+
from . import V_V_A_R_
|
|
58
|
+
from . import _a_n_k_r
|
|
59
|
+
from . import _a_v_a_r
|
|
60
|
+
from . import _b_s_l_n
|
|
61
|
+
from . import _c_i_d_g
|
|
62
|
+
from . import _c_m_a_p
|
|
63
|
+
from . import _c_v_a_r
|
|
64
|
+
from . import _c_v_t
|
|
65
|
+
from . import _f_e_a_t
|
|
66
|
+
from . import _f_p_g_m
|
|
67
|
+
from . import _f_v_a_r
|
|
68
|
+
from . import _g_a_s_p
|
|
69
|
+
from . import _g_c_i_d
|
|
70
|
+
from . import _g_l_y_f
|
|
71
|
+
from . import _g_v_a_r
|
|
72
|
+
from . import _h_d_m_x
|
|
73
|
+
from . import _h_e_a_d
|
|
74
|
+
from . import _h_h_e_a
|
|
75
|
+
from . import _h_m_t_x
|
|
76
|
+
from . import _k_e_r_n
|
|
77
|
+
from . import _l_c_a_r
|
|
78
|
+
from . import _l_o_c_a
|
|
79
|
+
from . import _l_t_a_g
|
|
80
|
+
from . import _m_a_x_p
|
|
81
|
+
from . import _m_e_t_a
|
|
82
|
+
from . import _m_o_r_t
|
|
83
|
+
from . import _m_o_r_x
|
|
84
|
+
from . import _n_a_m_e
|
|
85
|
+
from . import _o_p_b_d
|
|
86
|
+
from . import _p_o_s_t
|
|
87
|
+
from . import _p_r_e_p
|
|
88
|
+
from . import _p_r_o_p
|
|
89
|
+
from . import _s_b_i_x
|
|
90
|
+
from . import _t_r_a_k
|
|
91
|
+
from . import _v_h_e_a
|
|
92
|
+
from . import _v_m_t_x
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
if __name__ == "__main__":
|
|
96
|
+
import doctest, sys
|
|
97
|
+
|
|
98
|
+
sys.exit(doctest.testmod().failed)
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
from .otBase import BaseTTXConverter
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class table__a_n_k_r(BaseTTXConverter):
|
|
5
|
+
"""Anchor Point table
|
|
6
|
+
|
|
7
|
+
The anchor point table provides a way to define anchor points.
|
|
8
|
+
These are points within the coordinate space of a given glyph,
|
|
9
|
+
independent of the control points used to render the glyph.
|
|
10
|
+
Anchor points are used in conjunction with the ``kerx`` table.
|
|
11
|
+
|
|
12
|
+
See also https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6ankr.html
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
pass
|