365 Commits

Author SHA1 Message Date
Nikolaus Waxweiler
f6a62e0db1
Merge pull request #2164 from fonttools/pen-maintenance
Pen maintenance
2021-02-22 10:26:39 +00:00
Nikolaus Waxweiler
f7546baf00 Complete implementation of TTGlyphPen 2021-02-21 10:20:59 +00:00
Nikolaus Waxweiler
8a55182f37 Make NullPen inherit from AbstractPen 2021-02-21 10:20:48 +00:00
Nikolaus Waxweiler
ab1883da1d Turn AbstractPen and AbstractPointPen into ABCs plus typing 2021-02-21 10:20:37 +00:00
Simon Cozens
9cb126b10a Document expected arguments for _TTGlyphSet, _TTGlyph and TTGlyphPen 2021-02-08 11:30:39 +00:00
Nikolaus Waxweiler
a3acb1426b Remove py23 import 2021-01-29 22:23:27 +00:00
Nikolaus Waxweiler
e0de5a8413 Add MissingComponentError for pens 2021-01-12 15:26:57 +00:00
Simon Cozens
855f1e4cb7
Merge pull request #2109 from simoncozens/interpolatable-fixes
Various fixes to varLib.interpolatable
2020-11-24 07:30:33 -08:00
Simon Cozens
c6e5a7ab93 Catch open contours more explicitly 2020-11-21 07:59:39 +00:00
Antonio Cavedoni
742983f087 Add QuartzPen 2020-11-20 12:38:43 +01:00
Jens Kutilek
b9c268943a
Add HashPointPen from psautohint (#2005)
* Add HashPointPen from psautohint (with changes)
* Decompose components
* Use format string and disambiguate critical changes
* Remove "getHash()" in favour of "hash" property
* Add transformation for composites
* Omit base glyph name from component hash
* Use untransformed coords for components
* Add tests
* Add example code

Co-authored-by: Cosimo Lupo <cosimo@anthrotype.com>
2020-10-22 11:16:24 +02:00
Cosimo Lupo
efd54dca61
fix typo
Thanks dscorbett
7cc4c7eb46 (commitcomment-38317945)
2020-04-06 16:51:20 +01:00
Cosimo Lupo
7cc4c7eb46
cu2qu: clarify DEFAULT_MAX_ERR is relative to EM, Cu2QuPen.max_err is absolute 2020-04-06 13:12:37 +01:00
Cosimo Lupo
0782b4e4cf
cu2qu: Add missing Apache 2.0 header and copyright notice 2020-03-31 17:09:26 +01:00
Cosimo Lupo
c2e8403937
cu2qu: remove from __future__ imports 2020-03-31 13:38:51 +01:00
Cosimo Lupo
00058833f2
Move cu2qu.pens to fontTools.pens.cu2quPen 2020-03-31 13:34:46 +01:00
Cosimo Lupo
b6467b7e85
ttGlyphPen: quantize component.transform to F2Dot14 to fix issue with bbox
Fixes https://github.com/googlefonts/fontmake/issues/558

When drawing a composite glyph with a scaled component using the TTGlyphPen, the bounding
box coordinates may change depending on whether one computes them *before* compiling or
*after* decompiling. Before compiling, component.transform holds double precision floats,
but after compiling and decompiling, these are necessarily clamped to F2Dot14 fixed precision.

The TTGlyphPen needs to quantize transform floats to F2Dot14 so that the values don't
change after compilation.

Without this change, it may happen that round-tripping fonts through ttx (which by default
recalcBBoxes) will produce different bounding boxes for composite glyphs that have
scaled or transformed components.
2020-02-13 13:49:01 +00:00
Cosimo Lupo
d9b6067447
roundingPen: Add RoundingPointPen, like RoundingPen but for point pens 2019-11-28 16:32:40 +00:00
Cosimo Lupo
b885a852ed
recordingPen: add RecordingPointPen, like RecordingPen but for point pens 2019-11-28 16:29:36 +00:00
Cosimo Lupo
0fef59fd9e
transformPen: add TransformPointPen, like TransformPen but for point pens 2019-11-28 16:29:36 +00:00
Cosimo Lupo
646e26603d
filterPen: add FilterPointPen, like FilterPen but for point pens
the base class simply passes through contours/components unchanged
2019-11-28 16:29:35 +00:00
Cosimo Lupo
3d4fb2b371
add RoundingPen, a filter pen to round coordinates and comp offsets 2019-11-27 11:01:09 +00:00
Cosimo Lupo
97fce155ad
ttGlyphPen: always round float coordinates and offsets to integers
Fixes googlefonts/fontmake#593
2019-11-26 16:16:48 +00:00
Cosimo Lupo
7c695d411f
Merge remote-tracking branch 'origin/master' into l3-instancer 2019-11-15 17:05:47 +00:00
Just van Rossum
07140c12bd
[pens] Improve error message if pen.moveTo() is omitted. (#1757)
Improve error message if pen.moveTo() is omitted. See also robotools/fontParts#470
2019-10-30 14:45:55 +01:00
Cosimo Lupo
550711e106
move MAX_F2DOT14 constant to fixedTools 2019-10-23 16:50:12 +01:00
Cosimo Lupo
d33eaaf4ca
PointToSegmentPen: preserve duplicate last point
The PointToSegmentPen translates between PointPen and (Segment)Pen
protocol.

In the SegmentPen protocol, closed contours always imply a final 'lineTo'
segment from the last oncurve point to the starting point.
So the PointToSegmentPen omits the final 'lineTo' segment for closed
contours -- unless the option 'outputImpliedClosingLine' is True
(it is False by default, and defcon.Glyph.draw method initializes the
converter pen without this option).

However, if the last oncurve point is on a "line" segment and has same
coordinates as the starting point of a closed contour, the converter pen must
always output the closing 'lineTo' explicitly (regardless of the value of the
'outputImpliedClosingLine' option) in order to disambiguate this case from
the implied closing 'lineTo'.

If it doesn't do that, a duplicate 'line' point at the end of a closed
contour gets lost in the conversion.

See https://github.com/googlefonts/fontmake/issues/572.
2019-09-10 13:05:36 +02:00
Nikolaus Waxweiler
01328213c7 Remove __future__ imports 2019-08-09 12:20:13 +01:00
Cosimo Lupo
fdb3974dd9 add identifier parameter to PointToSegmentPen.addComponent method
'identifier' param is part of the AbstractPointPen interface.
Even though it is unused by the segment pen protocol, the caller may attempt
to pass it by positional argument instead of keyword argument, e.g.
2920ddd07c/Lib/fontMath/mathGlyph.py (L486)

this patch avoids the resulting TypeError exception
2019-02-27 16:30:20 -08:00
ReadRoberts
a460eee80b varLib. Add support for building CFF2 variable font
Fix syntax error reported by build system: can't mix string string types when doing literal concatenation

Fix local import reference - doesn't work in Python3.

Addressed issues raised by @msousa for PR 1345 yesterday.

Will change cff2_merge_funcs.py and cff2mergePen.py from tab to space indentations after the current comments are resolved.

Add various improvements from comments:
- do not edit the post table under varLib.build(). Setting post table format 2 or 3 is now expected to be managed by whatever calls varLib.build().
- In the t2CharStringPen module, rename closure _round() nested in makeRoundFunc to an exportable function, and use it in cff2mergePen.
- remove TypeSupply copyright from cff2mergePen.
- use modulo function to convert float to int when it is meant to be 0 in cff2mergePen.

cff2_merge_funcs.py:merge_PrivateDicts() should only be blending the hint related fields in the PrivateDict. This oversight that was surfaced by @madig reporting an error building his Cantrell font. The bug appeared when the font was subroutinized, as the pen draw method then has to interpret the Subr field in order to access T2Charstring subroutines.

Fix expected ttx output file. When I removed the logic to add glyph names to the post table, glyph names in the ttx file changed.

Miguel prefers a simple list for readability in cff2_merge_funs.py:138.
2018-11-12 11:38:18 -08:00
justvanrossum
7bcb67f0cc avoid %r to eliminate unicode repr problems in the tests 2018-10-29 20:47:17 +01:00
justvanrossum
6b4a4e3087 don't use unicode literals in pointPen 2018-10-29 19:58:33 +01:00
justvanrossum
7d5530ec91 more pointpen method signature consistency fixes 2018-10-29 16:42:07 +01:00
justvanrossum
186e4615ab fix some PointPen method signatures 2018-10-29 16:23:54 +01:00
Cosimo Lupo
e871b2f41d
pointPen: add missing classes to __all__ 2018-10-18 16:12:58 +01:00
Cosimo Lupo
6b1bf4247b
move pointPen to fontTools.pens subpackage; keep ufoLib.pointPen alias 2018-10-18 16:03:09 +01:00
Cosimo Lupo
d570fc038a
use otRound when rounding visual coordinates or deltas
So we now round towards +Infinity in:

- floatToFixed (which fully examplify that quotes from OT spec)
- psCharStrings: when packing floats as fixed 16.16
- t2CharStringPen: when rounding coordinates and advance widths
- subset: when rounding advance widths to compute average
- TupleVariation: rounding gvar deltas
- _g_l_y_f: when rounding coordinates: both in GlyphComponent.{x,y}
  and for GlyphCoordinates.toInt()
- _h_m_t_x: for rounding horiz/vert metrics
- varLib: rounding horiz metrics and deltas
2018-06-14 17:40:11 +01:00
Cosimo Lupo
79449bc2d4
ttGlyphPen: always skip non-existing components
It doesn't make sense to add components that reference non-existing base glyphs
(ie. glyphs not in the input glyphSet, hence missing from the generated glyf table).
Even if we let them in here, it will fail immediately as soon as we attempt to
compile this glyf table containing 'dangling' component references.
Better to warn and skip.
2018-06-11 19:25:15 +01:00
Cosimo Lupo
ae69133924
ttGlyphPen: gracefully handle missing components while decomposing 2018-06-11 18:40:11 +01:00
Cosimo Lupo
d2ee826680
[ttGlyphPen] explain 'handleOverflowingTransforms' option in docstring
[skip ci]
2018-03-01 20:34:47 +00:00
Cosimo Lupo
4173315f09
[ttGlyphPen] rename option to 'handleOverflowingTransforms' 2018-03-01 20:17:48 +00:00
Cosimo Lupo
56be13915b
[ttGlyphPen] minor 2018-03-01 20:03:45 +00:00
Cosimo Lupo
aabc894d19
[ttGlyphPen] don't clamp to almost2 if asked to not decompose
In that case, let the struct.error do its job, no need to raise OverflowError ourselves here
2018-03-01 19:59:25 +00:00
Cosimo Lupo
acb1ebc793
[ttGlyphPen] add 'decomposeOverflowingTransform' option
if it's false and any transform value overflows, we raise an error instead of decomposing
2018-03-01 19:39:00 +00:00
Cosimo Lupo
4377185e29
[ttGlyphPen] further simplify 2018-03-01 19:15:36 +00:00
Cosimo Lupo
6606bbef3c
[ttGlyphPen] simplify 2018-03-01 18:50:45 +00:00
Cosimo Lupo
6a4ccd0e9f
[ttGlyphPen] check for out-of-range values before clamping 2018-03-01 18:00:41 +00:00
Denis Moyogo Jacquerye
098d9ecf6f
TTGlyphPen: handle scale limit
* decompose components with scale out of range [-2, 2)

* use closest F2Dot14 value when 0b1.11111111111111 < scale <= 2
2018-03-01 17:48:48 +00:00
Cosimo Lupo
2cc182ce58
Revert "Revert "t2CharStringPen: specializeCommands expects command args to be list, not tuples""
This reverts commit fe2e897d13aab383d03b7759a15787ed2db99c77.

ufo2ft tests are failing with fonttools master with this error:

fontTools/cffLib/specializer.py:497:
>   commands[i-1] = (new_op, args1+args2)
    TypeError: can only concatenate list (not "tuple") to list
2018-02-20 17:35:10 +00:00
Cosimo Lupo
fe2e897d13
Revert "t2CharStringPen: specializeCommands expects command args to be list, not tuples"
This reverts commit 41445b8449733ade6117b3ae834da518e5623ef8.

41445b8449 (commitcomment-27640426)
2018-02-19 14:57:18 +00:00