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,219 @@
|
|
|
1
|
+
import textwrap
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class VarLibError(Exception):
|
|
5
|
+
"""Base exception for the varLib module."""
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class VarLibValidationError(VarLibError):
|
|
9
|
+
"""Raised when input data is invalid from varLib's point of view."""
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class VarLibMergeError(VarLibError):
|
|
13
|
+
"""Raised when input data cannot be merged into a variable font."""
|
|
14
|
+
|
|
15
|
+
def __init__(self, merger=None, **kwargs):
|
|
16
|
+
self.merger = merger
|
|
17
|
+
if not kwargs:
|
|
18
|
+
kwargs = {}
|
|
19
|
+
if "stack" in kwargs:
|
|
20
|
+
self.stack = kwargs["stack"]
|
|
21
|
+
del kwargs["stack"]
|
|
22
|
+
else:
|
|
23
|
+
self.stack = []
|
|
24
|
+
self.cause = kwargs
|
|
25
|
+
|
|
26
|
+
@property
|
|
27
|
+
def reason(self):
|
|
28
|
+
return self.__doc__
|
|
29
|
+
|
|
30
|
+
def _master_name(self, ix):
|
|
31
|
+
if self.merger is not None:
|
|
32
|
+
ttf = self.merger.ttfs[ix]
|
|
33
|
+
if "name" in ttf and ttf["name"].getBestFullName():
|
|
34
|
+
return ttf["name"].getBestFullName()
|
|
35
|
+
elif hasattr(ttf.reader, "file") and hasattr(ttf.reader.file, "name"):
|
|
36
|
+
return ttf.reader.file.name
|
|
37
|
+
return f"master number {ix}"
|
|
38
|
+
|
|
39
|
+
@property
|
|
40
|
+
def offender(self):
|
|
41
|
+
if "expected" in self.cause and "got" in self.cause:
|
|
42
|
+
index = [x == self.cause["expected"] for x in self.cause["got"]].index(
|
|
43
|
+
False
|
|
44
|
+
)
|
|
45
|
+
master_name = self._master_name(index)
|
|
46
|
+
if "location" in self.cause:
|
|
47
|
+
master_name = f"{master_name} ({self.cause['location']})"
|
|
48
|
+
return index, master_name
|
|
49
|
+
return None, None
|
|
50
|
+
|
|
51
|
+
@property
|
|
52
|
+
def details(self):
|
|
53
|
+
if "expected" in self.cause and "got" in self.cause:
|
|
54
|
+
offender_index, offender = self.offender
|
|
55
|
+
got = self.cause["got"][offender_index]
|
|
56
|
+
return f"Expected to see {self.stack[0]}=={self.cause['expected']!r}, instead saw {got!r}\n"
|
|
57
|
+
return ""
|
|
58
|
+
|
|
59
|
+
def __str__(self):
|
|
60
|
+
offender_index, offender = self.offender
|
|
61
|
+
location = ""
|
|
62
|
+
if offender:
|
|
63
|
+
location = f"\n\nThe problem is likely to be in {offender}:\n"
|
|
64
|
+
context = "".join(reversed(self.stack))
|
|
65
|
+
basic = textwrap.fill(
|
|
66
|
+
f"Couldn't merge the fonts, because {self.reason}. "
|
|
67
|
+
f"This happened while performing the following operation: {context}",
|
|
68
|
+
width=78,
|
|
69
|
+
)
|
|
70
|
+
return "\n\n" + basic + location + self.details
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
class ShouldBeConstant(VarLibMergeError):
|
|
74
|
+
"""some values were different, but should have been the same"""
|
|
75
|
+
|
|
76
|
+
@property
|
|
77
|
+
def details(self):
|
|
78
|
+
basic_message = super().details
|
|
79
|
+
|
|
80
|
+
if self.stack[0] != ".FeatureCount" or self.merger is None:
|
|
81
|
+
return basic_message
|
|
82
|
+
|
|
83
|
+
assert self.stack[0] == ".FeatureCount"
|
|
84
|
+
offender_index, _ = self.offender
|
|
85
|
+
bad_ttf = self.merger.ttfs[offender_index]
|
|
86
|
+
good_ttf = next(
|
|
87
|
+
ttf
|
|
88
|
+
for ttf in self.merger.ttfs
|
|
89
|
+
if self.stack[-1] in ttf
|
|
90
|
+
and ttf[self.stack[-1]].table.FeatureList.FeatureCount
|
|
91
|
+
== self.cause["expected"]
|
|
92
|
+
)
|
|
93
|
+
|
|
94
|
+
good_features = [
|
|
95
|
+
x.FeatureTag
|
|
96
|
+
for x in good_ttf[self.stack[-1]].table.FeatureList.FeatureRecord
|
|
97
|
+
]
|
|
98
|
+
bad_features = [
|
|
99
|
+
x.FeatureTag
|
|
100
|
+
for x in bad_ttf[self.stack[-1]].table.FeatureList.FeatureRecord
|
|
101
|
+
]
|
|
102
|
+
return basic_message + (
|
|
103
|
+
"\nIncompatible features between masters.\n"
|
|
104
|
+
f"Expected: {', '.join(good_features)}.\n"
|
|
105
|
+
f"Got: {', '.join(bad_features)}.\n"
|
|
106
|
+
)
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
class FoundANone(VarLibMergeError):
|
|
110
|
+
"""one of the values in a list was empty when it shouldn't have been"""
|
|
111
|
+
|
|
112
|
+
@property
|
|
113
|
+
def offender(self):
|
|
114
|
+
index = [x is None for x in self.cause["got"]].index(True)
|
|
115
|
+
return index, self._master_name(index)
|
|
116
|
+
|
|
117
|
+
@property
|
|
118
|
+
def details(self):
|
|
119
|
+
cause, stack = self.cause, self.stack
|
|
120
|
+
return f"{stack[0]}=={cause['got']}\n"
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
class NotANone(VarLibMergeError):
|
|
124
|
+
"""one of the values in a list was not empty when it should have been"""
|
|
125
|
+
|
|
126
|
+
@property
|
|
127
|
+
def offender(self):
|
|
128
|
+
index = [x is not None for x in self.cause["got"]].index(True)
|
|
129
|
+
return index, self._master_name(index)
|
|
130
|
+
|
|
131
|
+
@property
|
|
132
|
+
def details(self):
|
|
133
|
+
cause, stack = self.cause, self.stack
|
|
134
|
+
return f"{stack[0]}=={cause['got']}\n"
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
class MismatchedTypes(VarLibMergeError):
|
|
138
|
+
"""data had inconsistent types"""
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
class LengthsDiffer(VarLibMergeError):
|
|
142
|
+
"""a list of objects had inconsistent lengths"""
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
class KeysDiffer(VarLibMergeError):
|
|
146
|
+
"""a list of objects had different keys"""
|
|
147
|
+
|
|
148
|
+
|
|
149
|
+
class InconsistentGlyphOrder(VarLibMergeError):
|
|
150
|
+
"""the glyph order was inconsistent between masters"""
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
class InconsistentExtensions(VarLibMergeError):
|
|
154
|
+
"""the masters use extension lookups in inconsistent ways"""
|
|
155
|
+
|
|
156
|
+
|
|
157
|
+
class UnsupportedFormat(VarLibMergeError):
|
|
158
|
+
"""an OpenType subtable (%s) had a format I didn't expect"""
|
|
159
|
+
|
|
160
|
+
def __init__(self, merger=None, **kwargs):
|
|
161
|
+
super().__init__(merger, **kwargs)
|
|
162
|
+
if not self.stack:
|
|
163
|
+
self.stack = [".Format"]
|
|
164
|
+
|
|
165
|
+
@property
|
|
166
|
+
def reason(self):
|
|
167
|
+
s = self.__doc__ % self.cause["subtable"]
|
|
168
|
+
if "value" in self.cause:
|
|
169
|
+
s += f" ({self.cause['value']!r})"
|
|
170
|
+
return s
|
|
171
|
+
|
|
172
|
+
|
|
173
|
+
class InconsistentFormats(UnsupportedFormat):
|
|
174
|
+
"""an OpenType subtable (%s) had inconsistent formats between masters"""
|
|
175
|
+
|
|
176
|
+
|
|
177
|
+
class VarLibCFFMergeError(VarLibError):
|
|
178
|
+
pass
|
|
179
|
+
|
|
180
|
+
|
|
181
|
+
class VarLibCFFDictMergeError(VarLibCFFMergeError):
|
|
182
|
+
"""Raised when a CFF PrivateDict cannot be merged."""
|
|
183
|
+
|
|
184
|
+
def __init__(self, key, value, values):
|
|
185
|
+
error_msg = (
|
|
186
|
+
f"For the Private Dict key '{key}', the default font value list:"
|
|
187
|
+
f"\n\t{value}\nhad a different number of values than a region font:"
|
|
188
|
+
)
|
|
189
|
+
for region_value in values:
|
|
190
|
+
error_msg += f"\n\t{region_value}"
|
|
191
|
+
self.args = (error_msg,)
|
|
192
|
+
|
|
193
|
+
|
|
194
|
+
class VarLibCFFPointTypeMergeError(VarLibCFFMergeError):
|
|
195
|
+
"""Raised when a CFF glyph cannot be merged because of point type differences."""
|
|
196
|
+
|
|
197
|
+
def __init__(self, point_type, pt_index, m_index, default_type, glyph_name):
|
|
198
|
+
error_msg = (
|
|
199
|
+
f"Glyph '{glyph_name}': '{point_type}' at point index {pt_index} in "
|
|
200
|
+
f"master index {m_index} differs from the default font point type "
|
|
201
|
+
f"'{default_type}'"
|
|
202
|
+
)
|
|
203
|
+
self.args = (error_msg,)
|
|
204
|
+
|
|
205
|
+
|
|
206
|
+
class VarLibCFFHintTypeMergeError(VarLibCFFMergeError):
|
|
207
|
+
"""Raised when a CFF glyph cannot be merged because of hint type differences."""
|
|
208
|
+
|
|
209
|
+
def __init__(self, hint_type, cmd_index, m_index, default_type, glyph_name):
|
|
210
|
+
error_msg = (
|
|
211
|
+
f"Glyph '{glyph_name}': '{hint_type}' at index {cmd_index} in "
|
|
212
|
+
f"master index {m_index} differs from the default font hint type "
|
|
213
|
+
f"'{default_type}'"
|
|
214
|
+
)
|
|
215
|
+
self.args = (error_msg,)
|
|
216
|
+
|
|
217
|
+
|
|
218
|
+
class VariationModelError(VarLibError):
|
|
219
|
+
"""Raised when a variation model is faulty."""
|