87 Commits

Author SHA1 Message Date
Cosimo Lupo
5ef018e485
[instancer] FeatureVariations table is optional and can be None 2020-10-05 17:50:24 +01:00
Cosimo Lupo
d9d216f8f8
minor: rename OverlapsMode enum -> OverlapMode 2020-09-29 19:33:26 +01:00
Cosimo Lupo
85947cabb3
varLib.instancer: make 'overlap' an enum; add --remove-overlaps CLI option
'overlap' parameter in instantiateVariableFont was a bool, now it is a tri-state IntEnum, with value 2 meaning 'remove the overlaps'. The old bool False/True (0/1) values continue to work like before.

Also added a new --remove-overlaps commandline option to fonttools varLib.instancer script.
2020-09-27 17:48:52 +01:00
Simon Cozens
2cef07af80
[doc] Add help options to fonttools CLI (#1920)
This adds a `help` verb (and `--help` option) to the `fonttools` command line tool. Submodules will be listed in the help text if they have an importable `main` function with a docstring, and `main`'s docstring will be used as the one-line description for the help text.
2020-05-12 06:31:13 +01:00
Chris Simpkins
f47a9cf204
fix instancer documentation 2020-05-02 11:00:29 -04:00
Cosimo Lupo
dbe20b7217
minor: typos and variable names 2019-11-18 10:51:30 +00:00
Cosimo Lupo
0b9404d7a4
instancer: rename parameters to more generic 'axisLimits'
I use the term 'location' for map of {axis_tag: float} coordinates, 'axisRanges'
for a map of {axis_tag: Tuple[float, float]} ranges, and 'axisLimits' to include
either single-float coordinates or range tuples.
2019-11-15 19:36:57 +00:00
Cosimo Lupo
12e1a6de37
instancer: catch early if input range doesn't include current default 2019-11-15 19:02:12 +00:00
Cosimo Lupo
6142825d7b
instancer: document case when peak is < 1.0 but outer limit exceeds 2.0 2019-11-15 18:35:37 +00:00
Cosimo Lupo
7d136da836
remove stale comment
a featureVars' range(0,0) is perfectly valid.
2019-11-15 18:01:02 +00:00
Cosimo Lupo
599d24a9e1
instancer: add comments to instantiateAvar 2019-11-15 17:43:22 +00:00
Cosimo Lupo
8bf82539bb
instancer: update module-level docstring for L3 instancing 2019-10-28 17:39:21 +00:00
Cosimo Lupo
f861c68873
instancer: keep emptied HVAR table
Even if HVAR no longer contains any variations, it's better to keep it because
otherwise one would have to check the glyphs' phantom points to confirm that
the advance widths (or heights for VVAR) don't vary
2019-10-24 17:37:49 +01:00
Cosimo Lupo
3c6ddb0ef8
instancer: never drop STAT DesignAxes; only prune out-of-range AxisValues
The current method for L1 and L2 partial instacing of STAT table --
i.e. drop all pinned axes are respective axis values -- was incorrect.
STAT design axis are a superset of the fvar axes, they describe the relations
between members of a font family in which some aspects may be implemented as
variation axes within a single VF, others as multiple discrete fonts.

When we remove an axis from fvar, we still want to keep the STAT's DesignAxis,
as well as the single AxisValue table along that design axis which describes
the position of the new instance within the family's stylistic attributes.

This means, intantiateAvar will never drop any DesignAxis, but will only drops
AxisValue tables when: 1) we're pinning an axis and the desired instance
coordinate doesn't exactly equal any of the existing AxisValue records;
2) we're restricting an axis range, and the (nominal) AxisValue falls
outside of the desired range.

We never add new AxisValue records, as that's a design decision that
is outside of the scope of the partial instancer.
2019-10-24 17:37:48 +01:00
Cosimo Lupo
0b746bc38d
instancer: implement restricting axis ranges (L3)
Added method to limitTupleVariationAxisRanges which takes a map of
axis tags to (min, max) ranges and drops entire deltasets when outside
of the new limits, or scales the ones that are within range.

Modified _TupleVarStoreAdapter to account for the fact that, when limiting
axes, existing regions can be modifed rathern than simply dropped
(see rebuildRegions).

Implemented limiting axis ranges for fvar, FeatureVariations, and avar.

Note how we pass user-scale coordinates to instantiateAvar, because we need
both the default normalized coordinates and the ones mapped forward (by
the very same avar table that we are instancing).

STAT table support will follow in a separate commit.
2019-10-24 17:10:32 +01:00
Nikolaus Waxweiler
b8f5d3d705 argparse.ArgumentParser.error takes a str 2019-08-16 22:08:35 +01:00
Nikolaus Waxweiler
68a5ceac6d varLib: Remove py23 imports 2019-08-10 15:39:02 +01:00
Nikolaus Waxweiler
01328213c7 Remove __future__ imports 2019-08-09 12:20:13 +01:00
Cosimo Lupo
e6b8897f18
instancer: reuse varLib.set_default_weight_width_slant function 2019-06-20 15:09:17 +01:00
Cosimo Lupo
a45af5d8db
minor: typos in comments [skip ci] 2019-06-14 16:06:04 +01:00
Cosimo Lupo
720b266e89
instancer: minor: skip add cvar delta if None or 0 2019-06-14 15:41:33 +01:00
Cosimo Lupo
952fe9b059
instancer: refactor _instantiateFeatureVariations to avoid too deep nesting
https://github.com/fonttools/fonttools/pull/1628#discussion_r292600019
2019-06-14 14:37:39 +01:00
Cosimo Lupo
29daa994f0
instancer: add docstring for 'instantiateTupleVariationStore' 2019-06-14 12:51:31 +01:00
Cosimo Lupo
1345ae8693
instancer: don't define self in terms of mutator, just say what it is 2019-06-14 11:24:33 +01:00
Cosimo Lupo
751c181f2d
instancer: remove comment about module being 'experimental' 2019-06-14 11:09:48 +01:00
Cosimo Lupo
97405ddb35
instancer: also update sidebearings+bbox of glyphs with no variations
Previously we were calling glyf.setCoordinates method only when a glyph had some
variation deltas to be applied to the default glyf coordinates.
However, some composite glyph may contain no variation delta but their base glyphs
may change, thus we still need to update the sidebearings and bounding box of the
composite glyphs.
2019-06-06 13:38:11 +01:00
Cosimo Lupo
1febf7f5a2
minor formatting 2019-05-31 12:37:31 +01:00
Cosimo Lupo
06ad903ef1
instancer: rename locals from snake_case to camelCase for consistency
the rest of the instancer module uses camelCase, no point in having both styles within the same module
2019-05-31 12:26:03 +01:00
Cosimo Lupo
de2d5382ba
instancer: add more info to module-level docstring 2019-05-31 12:26:03 +01:00
Cosimo Lupo
b878b867c0
instancer: don't break on unsupported condition formats
continue checking subsequent condition tables in case the other may
be format=1 and may reference a pinned axis; in which case, these
conditions need to be dropped from the condition set, or the whole
record needs to be dropped if the instance coordinate is outside the
condition range.
Condition tables within a condition set are associated with a AND
boolean operator, so if any one doesn't match, the whole set doesn't
apply. Even if we don't recognize one condition format, if we do
ascertain that another condition table does not match the current
partial instance location, we can drop the FeatureVariation record
since it doesn't apply.
2019-05-30 13:13:06 +01:00
Cosimo Lupo
36f2775d6c
instancer: always keep FeatureVariationRecords with unknown condition format
there was a logic issue in the function that checks whether a FeatureVariationRecord
has a unique set of condition (was returning False instead of True for unsupported condition).
It's safer to always keep such records with unknown condition formats as new formats
may be added in the future. A warning is already issued in these cases.
2019-05-30 11:22:01 +01:00
Cosimo Lupo
823f0fc021
instancer: fix invalid operand '-'; dict.keys() returns list in py27 2019-05-29 19:33:36 +01:00
Cosimo Lupo
5a3c3334fe
instancer: fix typo in logger name 2019-05-29 19:22:02 +01:00
Cosimo Lupo
11c662ee4d
instancer: only keep unique FeatureVariationRecords
After partial instancing, multiple FeatureVariationRecords may end up with
the same set of conditions (e.g. if one references two axes, one of which
is dropped, and a subsequent one also references the same axis that was
kept in the preceding record's condition set, and the min/max values are
the same for both records).
Therefore, we make sure only the first unique record with a given
configuration of conditions is kept. Any additional records with identical
conditions will never match the current context so they can be dropped.
2019-05-29 18:33:36 +01:00
Cosimo Lupo
60754aab8e
instancer: prune unreferenced lookups in instantiateFeatureVariations
the 'prune_lookups' method is dynamically set on the table_G_S_U_B class
only after importing the fontTools.subset module
2019-05-29 18:33:35 +01:00
Cosimo Lupo
7867c582da
instancer: remap axis indices in instantiateFeatureVariations
ConditionTable.AxisIndex needs to change when dropping axes, to
refer to the same axis in the modified fvar.axes array.

There was also another bug when a condition was not met,
and the `applies` flag (initialised to `True`) was not set to
`False`, thus substutions were incorrectly applied.
2019-05-29 18:20:11 +01:00
Cosimo Lupo
1fdee0454a
instancer: also in GDEF 1.3 VarStore is optional and can be None 2019-05-21 18:42:13 -04:00
Cosimo Lupo
058165dc5c
instancer: mention special None and 'drop' in docstring and --help 2019-05-21 14:40:26 -04:00
Cosimo Lupo
0e9c5d9fe8
instancer: rename 'None' to 'drop'
https://github.com/fonttools/fonttools/pull/1617#issuecomment-494455729
2019-05-21 14:06:44 -04:00
Cosimo Lupo
3bc983e78d
instancer: skip instantiating GPOS/GDEF if GDEF version < 0x00010003
in which case GDEF doesn't have a VarStore attatched, thus GPOS can't have variations
2019-05-21 12:17:27 -04:00
Cosimo Lupo
28fb29e758
instancer: make 'None' mean to drop an axis, or pinning at default
This allows to drop an axis (aka L1 instancing) without knowing the
axis' actual default value from fvar table. One can simply call
`instantiateVariableFont` function with a `None` value for a given
axis (i.e. axis_limits={'wght': None}); the `None` value is replaced
by the axis default value as per fvar table.

The same can be done from the console script as well.
The special string literal 'None' is parsed as the Python `None`
object. E.g.:

$ fonttools varLib.instancer MyFont-VF.ttf wght=None
2019-05-20 17:31:46 -04:00
Cosimo Lupo
b5da46425c
instancer: rename --no-overlap to --no-overlap-flag
as suggested by Laurence
https://github.com/fonttools/fonttools/pull/1603#commitcomment-33462372
2019-05-09 16:39:26 +01:00
Cosimo Lupo
d9ad9d8ef5
instancer: set OS/2 weight/width and post.italicAngle 2019-05-08 18:46:43 +01:00
Cosimo Lupo
2d99beb0da
instancer: distinguish full/partial instance in log and outfile
and call argparse parser.error() instead of letting ValueError propagate
when parsing CLI options in parseArgs
2019-05-08 17:23:24 +01:00
Cosimo Lupo
178840dcf9
instancer: add --no-overlap to CLI options 2019-05-08 17:23:24 +01:00
Cosimo Lupo
5871a754de
instancer: set mac overlap glyf flags when fully instancing
like varLib.mutator does
2019-05-08 17:23:24 +01:00
Cosimo Lupo
5a530880c0
instancer: prune unused name records after instancing 2019-05-08 11:38:38 +01:00
Cosimo Lupo
0010a3cd9a
instancer: return default deltas as floats from instantiateTupleVariationStore
Do not round them to integer, but let the caller do the rounding immediately before adding them to the default instance (or just before compiling the binary table as with glyf).

This ensures that the glyphs' left sidebearings are calculated in the same way as they were by varLib.mutator.
If we round deltas too early, then we may get off-by-one differences.
See the glyf table setCoordinates method where left sidebearings are computed.
2019-05-07 14:05:27 +01:00
Cosimo Lupo
3bfff09c8c
instancer: remap STAT AxisValue.AxisIndex
if STAT table contains no DesignAxisRecord, then keep it empty and skip.
2019-05-03 13:29:43 +01:00
Cosimo Lupo
aa6c9a1110
instancer: drop STAT DesignAxes and AxisValues for pinned axes 2019-05-01 19:25:41 +01:00