在使用 fontmake 把 UFO 打包成 ttf 時遇到錯誤,完整錯誤訊息:
INFO:fontmake.font_project:Building TTF for JasonHandwriting2-JasonHandwriting2
INFO:ufo2ft:Pre-processing glyphs
INFO:ufo2ft.filters:Running DecomposeComponentsFilter on JasonHandwriting2-JasonHandwriting2
INFO:ufo2ft.filters:Running RemoveOverlapsFilter on JasonHandwriting2-JasonHandwriting2
Traceback (most recent call last):
File "/usr/local/bin/fontmake", line 8, in <module>
sys.exit(main())
File "/usr/local/lib/python2.7/site-packages/fontmake/main.py", line 422, in main
ufo_paths, is_instance=args.pop("masters_as_instances"), **args
File "/usr/local/lib/python2.7/site-packages/fontmake/font_project.py", line 1026, in run_from_ufos
self.build_ttfs(ufos, **kwargs)
File "/usr/local/lib/python2.7/site-packages/fontmake/font_project.py", line 311, in build_ttfs
self.save_otfs(ufos, ttf=True, *kwargs) File "/usr/local/lib/python2.7/site-packages/fontTools/misc/loggingTools.py", line 375, in wrapper return func(args, **kwds)
File "/usr/local/lib/python2.7/site-packages/fontmake/font_project.py", line 578, in save_otfs
for font, ufo in zip(fonts, ufos):
File "/usr/local/lib/python2.7/site-packages/fontmake/font_project.py", line 441, in iter_compile yield compile_func(ufo, **options) File "/usr/local/lib/python2.7/site-packages/ufo2ft/init.py", line 198, in compileTTF glyphSet = preProcessor.process() File "/usr/local/lib/python2.7/site-packages/ufo2ft/preProcessor.py", line 49, in process func(ufo, glyphSet) File "/usr/local/lib/python2.7/site-packages/ufo2ft/filters/init.py", line 219, in call if include(glyph) and filter(glyph):
File "/usr/local/lib/python2.7/site-packages/ufo2ft/filters/removeOverlaps.py", line 50, in filter
self.union(contours, pen)
File "/usr/local/lib/python2.7/site-packages/booleanOperations/booleanOperationManager.py", line 101, in union
return _performOperation("union", contours, [], outPen)
File "/usr/local/lib/python2.7/site-packages/booleanOperations/booleanOperationManager.py", line 70, in _performOperation
subjectInputContours = [InputContour(contour) for contour in subjectContours if contour and len(contour) > 1]
File "/usr/local/lib/python2.7/site-packages/booleanOperations/flatten.py", line 69, in init
self.segments = _convertPointsToSegments(points)
File "/usr/local/lib/python2.7/site-packages/booleanOperations/flatten.py", line 441, in _convertPointsToSegments
willBeReversed=willBeReversed
File "/usr/local/lib/python2.7/site-packages/booleanOperations/flatten.py", line 171, in init
for pt1, pt2 in decomposeQuadraticSegment(pointCoordinates[1:]):
File "/usr/local/lib/python2.7/site-packages/fontTools/pens/basePen.py", line 360, in decomposeQuadraticSegment
assert n > 0
AssertionError
解法:先使用 fontmake -h 查看沒有可以使用的參數,找到關於 overlaps
Handling of contours:
--keep-overlaps Do not remove any overlap.
--overlaps-backend BACKEND
Select library to remove overlaps. Choose between:
booleanOperations, pathops (default:
booleanOperations)
由於 pathops 在 python2 已無法使用,python3 的安裝方法:
pip3 install --upgrade skia-pathops
由於直接執行 fontmake 會使用 python2 來執行,所以指令改成:
python3 -m fontmake
在 python3 使用 booleanOperations
錯誤訊息:
INFO:fontmake.font_project:Building TTF for JasonHandwriting2-JasonHandwriting2
INFO:ufo2ft:Pre-processing glyphs
INFO:ufo2ft.filters:Running DecomposeComponentsFilter on JasonHandwriting2-JasonHandwriting2
INFO:ufo2ft.filters:Running RemoveOverlapsFilter on JasonHandwriting2-JasonHandwriting2
ERROR:ufo2ft.filters.removeOverlaps:Failed to remove overlaps for glyph00004
Traceback (most recent call last):
File "/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.7/lib/python3.7/runpy.py", line 193, in run_module_as_main "main", mod_spec) File "/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.7/lib/python3.7/runpy.py", line 85, in _run_code exec(code, run_globals) File "/Users/chunyuyao/Library/Python/3.7/lib/python/site-packages/fontmake/main.py", line 471, in <module> sys.exit(main()) File "/Users/chunyuyao/Library/Python/3.7/lib/python/site-packages/fontmake/main.py", line 460, in main ufo_paths, is_instance=args.pop("masters_as_instances"), **args File "/Users/chunyuyao/Library/Python/3.7/lib/python/site-packages/fontmake/font_project.py", line 1019, in run_from_ufos self.build_ttfs(ufos, **kwargs) File "/Users/chunyuyao/Library/Python/3.7/lib/python/site-packages/fontmake/font_project.py", line 208, in build_ttfs self.save_otfs(ufos, ttf=True, *kwargs) File "/Users/chunyuyao/Library/Python/3.7/lib/python/site-packages/fontTools/misc/loggingTools.py", line 367, in wrapper return func(args, **kwds)
File "/Users/chunyuyao/Library/Python/3.7/lib/python/site-packages/fontmake/font_project.py", line 480, in save_otfs
for font, ufo in zip(fonts, ufos):
File "/Users/chunyuyao/Library/Python/3.7/lib/python/site-packages/fontmake/font_project.py", line 345, in _iter_compile
yield compile_func(ufo, debugFeatureFile=debugFeatureFile, **options)
File "/Users/chunyuyao/Library/Python/3.7/lib/python/site-packages/ufo2ft/init.py", line 198, in compileTTF
glyphSet = preProcessor.process()
File "/Users/chunyuyao/Library/Python/3.7/lib/python/site-packages/ufo2ft/preProcessor.py", line 49, in process
func(ufo, glyphSet)
File "/Users/chunyuyao/Library/Python/3.7/lib/python/site-packages/ufo2ft/filters/init.py", line 219, in call
if include(glyph) and filter(glyph):
File "/Users/chunyuyao/Library/Python/3.7/lib/python/site-packages/ufo2ft/filters/removeOverlaps.py", line 50, in filter
self.union(contours, pen)
File "/Users/chunyuyao/Library/Python/3.7/lib/python/site-packages/booleanOperations/booleanOperationManager.py", line 100, in union
return _performOperation("union", contours, [], outPen)
File "/Users/chunyuyao/Library/Python/3.7/lib/python/site-packages/booleanOperations/booleanOperationManager.py", line 69, in _performOperation
subjectInputContours = [InputContour(contour) for contour in subjectContours if contour and len(contour) > 1]
File "/Users/chunyuyao/Library/Python/3.7/lib/python/site-packages/booleanOperations/booleanOperationManager.py", line 69, in <listcomp>
subjectInputContours = [InputContour(contour) for contour in subjectContours if contour and len(contour) > 1]
File "/Users/chunyuyao/Library/Python/3.7/lib/python/site-packages/booleanOperations/flatten.py", line 68, in init
self.segments = _convertPointsToSegments(points)
File "/Users/chunyuyao/Library/Python/3.7/lib/python/site-packages/booleanOperations/flatten.py", line 448, in _convertPointsToSegments
point.segmentType
booleanOperations.exceptions.UnsupportedContourError: ('Trying to perform operation on unsupported segment type.', 'qcurve')
改用 pathops,一樣有錯誤:
INFO:fontmake.font_project:Building TTF for JasonHandwriting2-JasonHandwriting2
INFO:ufo2ft:Pre-processing glyphs
INFO:ufo2ft.filters:Running DecomposeComponentsFilter on JasonHandwriting2-JasonHandwriting2
INFO:ufo2ft.filters:Running RemoveOverlapsFilter on JasonHandwriting2-JasonHandwriting2
ERROR:ufo2ft.filters.removeOverlaps:Failed to remove overlaps for glyph00004
Traceback (most recent call last):
File "/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.7/lib/python3.7/runpy.py", line 193, in run_module_as_main "main", mod_spec) File "/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.7/lib/python3.7/runpy.py", line 85, in _run_code exec(code, run_globals) File "/Users/chunyuyao/Library/Python/3.7/lib/python/site-packages/fontmake/main.py", line 471, in <module> sys.exit(main()) File "/Users/chunyuyao/Library/Python/3.7/lib/python/site-packages/fontmake/main.py", line 460, in main ufo_paths, is_instance=args.pop("masters_as_instances"), **args File "/Users/chunyuyao/Library/Python/3.7/lib/python/site-packages/fontmake/font_project.py", line 1019, in run_from_ufos self.build_ttfs(ufos, **kwargs) File "/Users/chunyuyao/Library/Python/3.7/lib/python/site-packages/fontmake/font_project.py", line 208, in build_ttfs self.save_otfs(ufos, ttf=True, *kwargs) File "/Users/chunyuyao/Library/Python/3.7/lib/python/site-packages/fontTools/misc/loggingTools.py", line 367, in wrapper return func(args, **kwds)
File "/Users/chunyuyao/Library/Python/3.7/lib/python/site-packages/fontmake/font_project.py", line 480, in save_otfs
for font, ufo in zip(fonts, ufos):
File "/Users/chunyuyao/Library/Python/3.7/lib/python/site-packages/fontmake/font_project.py", line 345, in _iter_compile
yield compile_func(ufo, debugFeatureFile=debugFeatureFile, **options)
File "/Users/chunyuyao/Library/Python/3.7/lib/python/site-packages/ufo2ft/init.py", line 198, in compileTTF
glyphSet = preProcessor.process()
File "/Users/chunyuyao/Library/Python/3.7/lib/python/site-packages/ufo2ft/preProcessor.py", line 49, in process
func(ufo, glyphSet)
File "/Users/chunyuyao/Library/Python/3.7/lib/python/site-packages/ufo2ft/filters/init.py", line 219, in call
if include(glyph) and filter(glyph):
File "/Users/chunyuyao/Library/Python/3.7/lib/python/site-packages/ufo2ft/filters/removeOverlaps.py", line 50, in filter
self.union(contours, pen)
File "/Users/chunyuyao/Library/Python/3.7/lib/python/site-packages/booleanOperations/booleanOperationManager.py", line 100, in union
return performOperation("union", contours, [], outPen) File "/Users/chunyuyao/Library/Python/3.7/lib/python/site-packages/booleanOperations/booleanOperationManager.py", line 69, in _performOperation subjectInputContours = [InputContour(contour) for contour in subjectContours if contour and len(contour) > 1] File "/Users/chunyuyao/Library/Python/3.7/lib/python/site-packages/booleanOperations/booleanOperationManager.py", line 69, in <listcomp> subjectInputContours = [InputContour(contour) for contour in subjectContours if contour and len(contour) > 1] File "/Users/chunyuyao/Library/Python/3.7/lib/python/site-packages/booleanOperations/flatten.py", line 68, in init self.segments = _convertPointsToSegments(points) File "/Users/chunyuyao/Library/Python/3.7/lib/python/site-packages/booleanOperations/flatten.py", line 448, in _convertPointsToSegments point.segmentType booleanOperations.exceptions.UnsupportedContourError: ('Trying to perform operation on unsupported segment type.', 'qcurve') ➜ ttf ./build_jason_font2.sh INFO:fontmake.font_project:Building TTF for JasonHandwriting2-JasonHandwriting2 INFO:ufo2ft:Pre-processing glyphs INFO:ufo2ft.filters:Running DecomposeComponentsFilter on JasonHandwriting2-JasonHandwriting2 INFO:ufo2ft.filters:Running RemoveOverlapsFilter on JasonHandwriting2-JasonHandwriting2 Traceback (most recent call last): File "/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.7/lib/python3.7/runpy.py", line 193, in _run_module_as_main "main", mod_spec) File "/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.7/lib/python3.7/runpy.py", line 85, in _run_code exec(code, run_globals) File "/Users/chunyuyao/Library/Python/3.7/lib/python/site-packages/fontmake/main.py", line 471, in <module> sys.exit(main()) File "/Users/chunyuyao/Library/Python/3.7/lib/python/site-packages/fontmake/main.py", line 460, in main ufo_paths, is_instance=args.pop("masters_as_instances"), **args File "/Users/chunyuyao/Library/Python/3.7/lib/python/site-packages/fontmake/font_project.py", line 1019, in run_from_ufos self.build_ttfs(ufos, **kwargs) File "/Users/chunyuyao/Library/Python/3.7/lib/python/site-packages/fontmake/font_project.py", line 208, in build_ttfs self.save_otfs(ufos, ttf=True, *kwargs) File "/Users/chunyuyao/Library/Python/3.7/lib/python/site-packages/fontTools/misc/loggingTools.py", line 367, in wrapper return func(args, **kwds)
File "/Users/chunyuyao/Library/Python/3.7/lib/python/site-packages/fontmake/font_project.py", line 480, in save_otfs
for font, ufo in zip(fonts, ufos):
File "/Users/chunyuyao/Library/Python/3.7/lib/python/site-packages/fontmake/font_project.py", line 345, in _iter_compile
yield compile_func(ufo, debugFeatureFile=debugFeatureFile, *options) File "/Users/chunyuyao/Library/Python/3.7/lib/python/site-packages/ufo2ft/init.py", line 198, in compileTTF glyphSet = preProcessor.process() File "/Users/chunyuyao/Library/Python/3.7/lib/python/site-packages/ufo2ft/preProcessor.py", line 49, in process func(ufo, glyphSet) File "/Users/chunyuyao/Library/Python/3.7/lib/python/site-packages/ufo2ft/filters/init.py", line 219, in call if include(glyph) and filter(glyph):
File "/Users/chunyuyao/Library/Python/3.7/lib/python/site-packages/ufo2ft/filters/removeOverlaps.py", line 50, in filter
self.union(contours, pen)
File "/Users/chunyuyao/Library/Python/3.7/lib/python/site-packages/pathops/operations.py", line 10, in union
contour.draw(pen)
File "/Users/chunyuyao/Library/Python/3.7/lib/python/site-packages/ufoLib2/objects/contour.py", line 54, in draw
self.drawPoints(pointPen)
File "/Users/chunyuyao/Library/Python/3.7/lib/python/site-packages/ufoLib2/objects/contour.py", line 78, in drawPoints
pointPen.endPath()
File "/Users/chunyuyao/Library/Python/3.7/lib/python/site-packages/fontTools/pens/pointPen.py", line 140, in endPath
self._flushContour(segments)
File "/Users/chunyuyao/Library/Python/3.7/lib/python/site-packages/fontTools/pens/pointPen.py", line 211, in _flushContour
pen.qCurveTo(points)
File "src/python/pathops/_pathops.pyx", line 700, in pathops._pathops.PathPen.qCurveTo
File "src/python/pathops/_pathops.pyx", line 703, in pathops._pathops.PathPen._qCurveToOne
TypeError: 'NoneType' object is not subscriptable