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,352 @@
|
|
|
1
|
+
from fontTools.misc import sstruct
|
|
2
|
+
from fontTools.misc.textTools import byteord, safeEval
|
|
3
|
+
from . import DefaultTable
|
|
4
|
+
import pdb
|
|
5
|
+
import struct
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
METAHeaderFormat = """
|
|
9
|
+
> # big endian
|
|
10
|
+
tableVersionMajor: H
|
|
11
|
+
tableVersionMinor: H
|
|
12
|
+
metaEntriesVersionMajor: H
|
|
13
|
+
metaEntriesVersionMinor: H
|
|
14
|
+
unicodeVersion: L
|
|
15
|
+
metaFlags: H
|
|
16
|
+
nMetaRecs: H
|
|
17
|
+
"""
|
|
18
|
+
# This record is followed by nMetaRecs of METAGlyphRecordFormat.
|
|
19
|
+
# This in turn is followd by as many METAStringRecordFormat entries
|
|
20
|
+
# as specified by the METAGlyphRecordFormat entries
|
|
21
|
+
# this is followed by the strings specifried in the METAStringRecordFormat
|
|
22
|
+
METAGlyphRecordFormat = """
|
|
23
|
+
> # big endian
|
|
24
|
+
glyphID: H
|
|
25
|
+
nMetaEntry: H
|
|
26
|
+
"""
|
|
27
|
+
# This record is followd by a variable data length field:
|
|
28
|
+
# USHORT or ULONG hdrOffset
|
|
29
|
+
# Offset from start of META table to the beginning
|
|
30
|
+
# of this glyphs array of ns Metadata string entries.
|
|
31
|
+
# Size determined by metaFlags field
|
|
32
|
+
# METAGlyphRecordFormat entries must be sorted by glyph ID
|
|
33
|
+
|
|
34
|
+
METAStringRecordFormat = """
|
|
35
|
+
> # big endian
|
|
36
|
+
labelID: H
|
|
37
|
+
stringLen: H
|
|
38
|
+
"""
|
|
39
|
+
# This record is followd by a variable data length field:
|
|
40
|
+
# USHORT or ULONG stringOffset
|
|
41
|
+
# METAStringRecordFormat entries must be sorted in order of labelID
|
|
42
|
+
# There may be more than one entry with the same labelID
|
|
43
|
+
# There may be more than one strign with the same content.
|
|
44
|
+
|
|
45
|
+
# Strings shall be Unicode UTF-8 encoded, and null-terminated.
|
|
46
|
+
|
|
47
|
+
METALabelDict = {
|
|
48
|
+
0: "MojikumiX4051", # An integer in the range 1-20
|
|
49
|
+
1: "UNIUnifiedBaseChars",
|
|
50
|
+
2: "BaseFontName",
|
|
51
|
+
3: "Language",
|
|
52
|
+
4: "CreationDate",
|
|
53
|
+
5: "FoundryName",
|
|
54
|
+
6: "FoundryCopyright",
|
|
55
|
+
7: "OwnerURI",
|
|
56
|
+
8: "WritingScript",
|
|
57
|
+
10: "StrokeCount",
|
|
58
|
+
11: "IndexingRadical",
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
def getLabelString(labelID):
|
|
63
|
+
try:
|
|
64
|
+
label = METALabelDict[labelID]
|
|
65
|
+
except KeyError:
|
|
66
|
+
label = "Unknown label"
|
|
67
|
+
return str(label)
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
class table_M_E_T_A_(DefaultTable.DefaultTable):
|
|
71
|
+
"""Glyphlets META table
|
|
72
|
+
|
|
73
|
+
The ``META`` table is used by Adobe's SING Glyphlets.
|
|
74
|
+
|
|
75
|
+
See also https://web.archive.org/web/20080627183635/http://www.adobe.com/devnet/opentype/gdk/topic.html
|
|
76
|
+
"""
|
|
77
|
+
|
|
78
|
+
dependencies = []
|
|
79
|
+
|
|
80
|
+
def decompile(self, data, ttFont):
|
|
81
|
+
dummy, newData = sstruct.unpack2(METAHeaderFormat, data, self)
|
|
82
|
+
self.glyphRecords = []
|
|
83
|
+
for i in range(self.nMetaRecs):
|
|
84
|
+
glyphRecord, newData = sstruct.unpack2(
|
|
85
|
+
METAGlyphRecordFormat, newData, GlyphRecord()
|
|
86
|
+
)
|
|
87
|
+
if self.metaFlags == 0:
|
|
88
|
+
[glyphRecord.offset] = struct.unpack(">H", newData[:2])
|
|
89
|
+
newData = newData[2:]
|
|
90
|
+
elif self.metaFlags == 1:
|
|
91
|
+
[glyphRecord.offset] = struct.unpack(">H", newData[:4])
|
|
92
|
+
newData = newData[4:]
|
|
93
|
+
else:
|
|
94
|
+
assert 0, (
|
|
95
|
+
"The metaFlags field in the META table header has a value other than 0 or 1 :"
|
|
96
|
+
+ str(self.metaFlags)
|
|
97
|
+
)
|
|
98
|
+
glyphRecord.stringRecs = []
|
|
99
|
+
newData = data[glyphRecord.offset :]
|
|
100
|
+
for j in range(glyphRecord.nMetaEntry):
|
|
101
|
+
stringRec, newData = sstruct.unpack2(
|
|
102
|
+
METAStringRecordFormat, newData, StringRecord()
|
|
103
|
+
)
|
|
104
|
+
if self.metaFlags == 0:
|
|
105
|
+
[stringRec.offset] = struct.unpack(">H", newData[:2])
|
|
106
|
+
newData = newData[2:]
|
|
107
|
+
else:
|
|
108
|
+
[stringRec.offset] = struct.unpack(">H", newData[:4])
|
|
109
|
+
newData = newData[4:]
|
|
110
|
+
stringRec.string = data[
|
|
111
|
+
stringRec.offset : stringRec.offset + stringRec.stringLen
|
|
112
|
+
]
|
|
113
|
+
glyphRecord.stringRecs.append(stringRec)
|
|
114
|
+
self.glyphRecords.append(glyphRecord)
|
|
115
|
+
|
|
116
|
+
def compile(self, ttFont):
|
|
117
|
+
offsetOK = 0
|
|
118
|
+
self.nMetaRecs = len(self.glyphRecords)
|
|
119
|
+
count = 0
|
|
120
|
+
while offsetOK != 1:
|
|
121
|
+
count = count + 1
|
|
122
|
+
if count > 4:
|
|
123
|
+
pdb.set_trace()
|
|
124
|
+
metaData = sstruct.pack(METAHeaderFormat, self)
|
|
125
|
+
stringRecsOffset = len(metaData) + self.nMetaRecs * (
|
|
126
|
+
6 + 2 * (self.metaFlags & 1)
|
|
127
|
+
)
|
|
128
|
+
stringRecSize = 6 + 2 * (self.metaFlags & 1)
|
|
129
|
+
for glyphRec in self.glyphRecords:
|
|
130
|
+
glyphRec.offset = stringRecsOffset
|
|
131
|
+
if (glyphRec.offset > 65535) and ((self.metaFlags & 1) == 0):
|
|
132
|
+
self.metaFlags = self.metaFlags + 1
|
|
133
|
+
offsetOK = -1
|
|
134
|
+
break
|
|
135
|
+
metaData = metaData + glyphRec.compile(self)
|
|
136
|
+
stringRecsOffset = stringRecsOffset + (
|
|
137
|
+
glyphRec.nMetaEntry * stringRecSize
|
|
138
|
+
)
|
|
139
|
+
# this will be the String Record offset for the next GlyphRecord.
|
|
140
|
+
if offsetOK == -1:
|
|
141
|
+
offsetOK = 0
|
|
142
|
+
continue
|
|
143
|
+
|
|
144
|
+
# metaData now contains the header and all of the GlyphRecords. Its length should bw
|
|
145
|
+
# the offset to the first StringRecord.
|
|
146
|
+
stringOffset = stringRecsOffset
|
|
147
|
+
for glyphRec in self.glyphRecords:
|
|
148
|
+
assert glyphRec.offset == len(
|
|
149
|
+
metaData
|
|
150
|
+
), "Glyph record offset did not compile correctly! for rec:" + str(
|
|
151
|
+
glyphRec
|
|
152
|
+
)
|
|
153
|
+
for stringRec in glyphRec.stringRecs:
|
|
154
|
+
stringRec.offset = stringOffset
|
|
155
|
+
if (stringRec.offset > 65535) and ((self.metaFlags & 1) == 0):
|
|
156
|
+
self.metaFlags = self.metaFlags + 1
|
|
157
|
+
offsetOK = -1
|
|
158
|
+
break
|
|
159
|
+
metaData = metaData + stringRec.compile(self)
|
|
160
|
+
stringOffset = stringOffset + stringRec.stringLen
|
|
161
|
+
if offsetOK == -1:
|
|
162
|
+
offsetOK = 0
|
|
163
|
+
continue
|
|
164
|
+
|
|
165
|
+
if ((self.metaFlags & 1) == 1) and (stringOffset < 65536):
|
|
166
|
+
self.metaFlags = self.metaFlags - 1
|
|
167
|
+
continue
|
|
168
|
+
else:
|
|
169
|
+
offsetOK = 1
|
|
170
|
+
|
|
171
|
+
# metaData now contains the header and all of the GlyphRecords and all of the String Records.
|
|
172
|
+
# Its length should be the offset to the first string datum.
|
|
173
|
+
for glyphRec in self.glyphRecords:
|
|
174
|
+
for stringRec in glyphRec.stringRecs:
|
|
175
|
+
assert stringRec.offset == len(
|
|
176
|
+
metaData
|
|
177
|
+
), "String offset did not compile correctly! for string:" + str(
|
|
178
|
+
stringRec.string
|
|
179
|
+
)
|
|
180
|
+
metaData = metaData + stringRec.string
|
|
181
|
+
|
|
182
|
+
return metaData
|
|
183
|
+
|
|
184
|
+
def toXML(self, writer, ttFont):
|
|
185
|
+
writer.comment(
|
|
186
|
+
"Lengths and number of entries in this table will be recalculated by the compiler"
|
|
187
|
+
)
|
|
188
|
+
writer.newline()
|
|
189
|
+
formatstring, names, fixes = sstruct.getformat(METAHeaderFormat)
|
|
190
|
+
for name in names:
|
|
191
|
+
value = getattr(self, name)
|
|
192
|
+
writer.simpletag(name, value=value)
|
|
193
|
+
writer.newline()
|
|
194
|
+
for glyphRec in self.glyphRecords:
|
|
195
|
+
glyphRec.toXML(writer, ttFont)
|
|
196
|
+
|
|
197
|
+
def fromXML(self, name, attrs, content, ttFont):
|
|
198
|
+
if name == "GlyphRecord":
|
|
199
|
+
if not hasattr(self, "glyphRecords"):
|
|
200
|
+
self.glyphRecords = []
|
|
201
|
+
glyphRec = GlyphRecord()
|
|
202
|
+
self.glyphRecords.append(glyphRec)
|
|
203
|
+
for element in content:
|
|
204
|
+
if isinstance(element, str):
|
|
205
|
+
continue
|
|
206
|
+
name, attrs, content = element
|
|
207
|
+
glyphRec.fromXML(name, attrs, content, ttFont)
|
|
208
|
+
glyphRec.offset = -1
|
|
209
|
+
glyphRec.nMetaEntry = len(glyphRec.stringRecs)
|
|
210
|
+
else:
|
|
211
|
+
setattr(self, name, safeEval(attrs["value"]))
|
|
212
|
+
|
|
213
|
+
|
|
214
|
+
class GlyphRecord(object):
|
|
215
|
+
def __init__(self):
|
|
216
|
+
self.glyphID = -1
|
|
217
|
+
self.nMetaEntry = -1
|
|
218
|
+
self.offset = -1
|
|
219
|
+
self.stringRecs = []
|
|
220
|
+
|
|
221
|
+
def toXML(self, writer, ttFont):
|
|
222
|
+
writer.begintag("GlyphRecord")
|
|
223
|
+
writer.newline()
|
|
224
|
+
writer.simpletag("glyphID", value=self.glyphID)
|
|
225
|
+
writer.newline()
|
|
226
|
+
writer.simpletag("nMetaEntry", value=self.nMetaEntry)
|
|
227
|
+
writer.newline()
|
|
228
|
+
for stringRec in self.stringRecs:
|
|
229
|
+
stringRec.toXML(writer, ttFont)
|
|
230
|
+
writer.endtag("GlyphRecord")
|
|
231
|
+
writer.newline()
|
|
232
|
+
|
|
233
|
+
def fromXML(self, name, attrs, content, ttFont):
|
|
234
|
+
if name == "StringRecord":
|
|
235
|
+
stringRec = StringRecord()
|
|
236
|
+
self.stringRecs.append(stringRec)
|
|
237
|
+
for element in content:
|
|
238
|
+
if isinstance(element, str):
|
|
239
|
+
continue
|
|
240
|
+
stringRec.fromXML(name, attrs, content, ttFont)
|
|
241
|
+
stringRec.stringLen = len(stringRec.string)
|
|
242
|
+
else:
|
|
243
|
+
setattr(self, name, safeEval(attrs["value"]))
|
|
244
|
+
|
|
245
|
+
def compile(self, parentTable):
|
|
246
|
+
data = sstruct.pack(METAGlyphRecordFormat, self)
|
|
247
|
+
if parentTable.metaFlags == 0:
|
|
248
|
+
datum = struct.pack(">H", self.offset)
|
|
249
|
+
elif parentTable.metaFlags == 1:
|
|
250
|
+
datum = struct.pack(">L", self.offset)
|
|
251
|
+
data = data + datum
|
|
252
|
+
return data
|
|
253
|
+
|
|
254
|
+
def __repr__(self):
|
|
255
|
+
return (
|
|
256
|
+
"GlyphRecord[ glyphID: "
|
|
257
|
+
+ str(self.glyphID)
|
|
258
|
+
+ ", nMetaEntry: "
|
|
259
|
+
+ str(self.nMetaEntry)
|
|
260
|
+
+ ", offset: "
|
|
261
|
+
+ str(self.offset)
|
|
262
|
+
+ " ]"
|
|
263
|
+
)
|
|
264
|
+
|
|
265
|
+
|
|
266
|
+
# XXX The following two functions are really broken around UTF-8 vs Unicode
|
|
267
|
+
|
|
268
|
+
|
|
269
|
+
def mapXMLToUTF8(string):
|
|
270
|
+
uString = str()
|
|
271
|
+
strLen = len(string)
|
|
272
|
+
i = 0
|
|
273
|
+
while i < strLen:
|
|
274
|
+
prefixLen = 0
|
|
275
|
+
if string[i : i + 3] == "&#x":
|
|
276
|
+
prefixLen = 3
|
|
277
|
+
elif string[i : i + 7] == "&#x":
|
|
278
|
+
prefixLen = 7
|
|
279
|
+
if prefixLen:
|
|
280
|
+
i = i + prefixLen
|
|
281
|
+
j = i
|
|
282
|
+
while string[i] != ";":
|
|
283
|
+
i = i + 1
|
|
284
|
+
valStr = string[j:i]
|
|
285
|
+
|
|
286
|
+
uString = uString + chr(eval("0x" + valStr))
|
|
287
|
+
else:
|
|
288
|
+
uString = uString + chr(byteord(string[i]))
|
|
289
|
+
i = i + 1
|
|
290
|
+
|
|
291
|
+
return uString.encode("utf_8")
|
|
292
|
+
|
|
293
|
+
|
|
294
|
+
def mapUTF8toXML(string):
|
|
295
|
+
uString = string.decode("utf_8")
|
|
296
|
+
string = ""
|
|
297
|
+
for uChar in uString:
|
|
298
|
+
i = ord(uChar)
|
|
299
|
+
if (i < 0x80) and (i > 0x1F):
|
|
300
|
+
string = string + uChar
|
|
301
|
+
else:
|
|
302
|
+
string = string + "&#x" + hex(i)[2:] + ";"
|
|
303
|
+
return string
|
|
304
|
+
|
|
305
|
+
|
|
306
|
+
class StringRecord(object):
|
|
307
|
+
def toXML(self, writer, ttFont):
|
|
308
|
+
writer.begintag("StringRecord")
|
|
309
|
+
writer.newline()
|
|
310
|
+
writer.simpletag("labelID", value=self.labelID)
|
|
311
|
+
writer.comment(getLabelString(self.labelID))
|
|
312
|
+
writer.newline()
|
|
313
|
+
writer.newline()
|
|
314
|
+
writer.simpletag("string", value=mapUTF8toXML(self.string))
|
|
315
|
+
writer.newline()
|
|
316
|
+
writer.endtag("StringRecord")
|
|
317
|
+
writer.newline()
|
|
318
|
+
|
|
319
|
+
def fromXML(self, name, attrs, content, ttFont):
|
|
320
|
+
for element in content:
|
|
321
|
+
if isinstance(element, str):
|
|
322
|
+
continue
|
|
323
|
+
name, attrs, content = element
|
|
324
|
+
value = attrs["value"]
|
|
325
|
+
if name == "string":
|
|
326
|
+
self.string = mapXMLToUTF8(value)
|
|
327
|
+
else:
|
|
328
|
+
setattr(self, name, safeEval(value))
|
|
329
|
+
|
|
330
|
+
def compile(self, parentTable):
|
|
331
|
+
data = sstruct.pack(METAStringRecordFormat, self)
|
|
332
|
+
if parentTable.metaFlags == 0:
|
|
333
|
+
datum = struct.pack(">H", self.offset)
|
|
334
|
+
elif parentTable.metaFlags == 1:
|
|
335
|
+
datum = struct.pack(">L", self.offset)
|
|
336
|
+
data = data + datum
|
|
337
|
+
return data
|
|
338
|
+
|
|
339
|
+
def __repr__(self):
|
|
340
|
+
return (
|
|
341
|
+
"StringRecord [ labelID: "
|
|
342
|
+
+ str(self.labelID)
|
|
343
|
+
+ " aka "
|
|
344
|
+
+ getLabelString(self.labelID)
|
|
345
|
+
+ ", offset: "
|
|
346
|
+
+ str(self.offset)
|
|
347
|
+
+ ", length: "
|
|
348
|
+
+ str(self.stringLen)
|
|
349
|
+
+ ", string: "
|
|
350
|
+
+ self.string
|
|
351
|
+
+ " ]"
|
|
352
|
+
)
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
from .otBase import BaseTTXConverter
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class table_M_V_A_R_(BaseTTXConverter):
|
|
5
|
+
"""Metrics Variations table
|
|
6
|
+
|
|
7
|
+
The ``MVAR`` table contains variation information for font-wide
|
|
8
|
+
metrics in a variable font.
|
|
9
|
+
|
|
10
|
+
See also https://learn.microsoft.com/en-us/typography/opentype/spec/mvar
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
pass
|