232 Commits

Author SHA1 Message Date
Cosimo Lupo
934349a9c5 ttGlyphPen: handle open contours starting with 'move'; treat them as if they were closed
Fixes #2365
2021-07-15 18:25:19 +01:00
Takaaki Fuji
58d6ccf8ae Fix math.atan2 call
Shouldn't make any difference here, but math.atan2(y, x) should be the
correct order.
2021-06-25 09:47:21 +09:00
Takaaki Fuji
4c22d11aa7 Keep GuessSmoothPointPen in sync with fontPens
Imported 9b7ecb4 from fontPens, which is the version modified to accept
a parameterized tolerance. Recent changes in fontTools such as 2831096,
186e461 and 7d5530e were considered so that the diff will be minimal.
2021-06-25 09:39:58 +09:00
Cosimo Lupo
c995411a60 leave self.glyphSet alone 2021-05-20 14:03:56 +01:00
Cosimo Lupo
1d9f267ad5 make glyphSet required.. but Optional :) 2021-05-20 13:20:45 +01:00
Cosimo Lupo
d4408baf70 ttGlyphPen: fix typing annotation for glyphSet parameter
It is an optional dictionary. Even the ttGlypgPen_test.py or the fontBuilder.py calls TTGlyphPen(None) often.
We caught this because internally we run a type-checker. Originally the glyphSet parameter was not explicitly typed.
Now that it is, make the type hints match the way code is intended to be used.
2021-05-20 12:33:58 +01:00
Cosimo Lupo
d0bcae94dd ttGlyphPen: run black 2021-05-20 12:30:08 +01:00
Jens Kutilek
0cb2bea386
Add TTGlyphPointPen (#2205)
* Add TTGlyphPointPen
* Format code with black
* Implement TTGlyphPen and TTGlyphPointPen with common base class
* Use PenError instead of assert
* Add note about decomposing mixed composites to the docstring
2021-05-17 14:09:36 +02:00
Nikolaus Waxweiler
b449686a84 Use TypeError for not enough points 2021-05-01 18:56:38 +01:00
Nikolaus Waxweiler
2831096eeb Introduce PenError, use instead of asserts 2021-04-30 17:19:40 +01:00
Nikolaus Waxweiler
bc2bbe6a98 RecordingPointPen: handle identifier args 2021-04-30 17:19:28 +01:00
Just van Rossum
5fc65d7168
Misc py23 cleanups (#2243)
* Replaced all from ...py23 import * with explicit name imports, or removed completely when possible.
* Replaced tounicode() with tostr()
* Changed all BytesIO ans StringIO imports to from io import ..., replaced all UnicodeIO with StringIO.
* Replaced all unichr() with chr()
* Misc minor tweaks and fixes
2021-03-29 11:45:58 +02:00
Behdad Esfahbod
3a9a2bd4b1 [misc.roundTools] Add noRound(), maybeRound(), and roundFunc()
Moving out of CFF code, to be used in VariationModel().

Part of https://github.com/fonttools/fonttools/issues/2213
2021-03-04 09:20:43 -07:00
Behdad Esfahbod
abc1ba07a4 [misc.roundTools] New module; move otRound() here
Code relying on old place (fixedTools.otRound) still works.
2021-03-04 09:20:43 -07:00
Behdad Esfahbod
ed77aeaebf [cff] Speed-up rounding
We can choose specific round function based on tolerance once,
instead of choosing every time a number is being rounded.
2021-03-03 18:32:30 -07:00
Behdad Esfahbod
28fae1d95f [cff] Simplify rounding logic
No semantic change. Just refactoring and simplification in anticipation
of coming changes.
2021-03-03 18:27:06 -07:00
justvanrossum
2429a187fc Revert ABC changes to Pens, fixes #2198 2021-02-26 20:18:37 +01:00
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