75 Commits

Author SHA1 Message Date
Behdad Esfahbod
062b7c434e
Merge pull request #2214 from fonttools/varLib-round
[varLib] Move rounding to VariationModel, to avoid error accumulation from multiple deltas
2021-03-04 16:40:40 -07:00
Behdad Esfahbod
07a7dd3eb5 [varLib] Make newly-added round arguments keyword-only
So they are not accidentally set, only intentionally. Keeps positional-args
open for more direct uses.
2021-03-04 09:44:34 -07:00
Behdad Esfahbod
fdd8267065 [varLib.models] Add optional rounding to VariationModel() relevant methods
Users to be updated to benefit.

Part of https://github.com/fonttools/fonttools/issues/2213
2021-03-04 09:20:43 -07:00
Simon Cozens
4dd83e0d55 Make terminology consistent 2021-03-03 12:57:12 +00:00
Simon Cozens
e9b35d0318 Split off box-splitting/support code to separate function 2021-03-03 10:33:50 +00:00
Simon Cozens
8c8522560a Separate computing delta weights 2021-03-03 10:23:28 +00:00
Cosimo Lupo
81d0042a9e
varLib.models: fix argument name in main() 2020-08-12 09:41:46 +01:00
Simon Cozens
089f24da6b
Ensure all fonttools CLI tools have help documentation (#1948)
Note UI change : `fonttools varLib.models` now takes prefixed options `-d` or `-l` instead of guessing the intended feature from the number of arguments.

We have a number of command line tools which are somewhat opaque. (varLib.models in particular was very confusing.) This ensures that they all use argparse to have a consistent interface, and all have --help documentation which at least details their parameters, and hopefully therefore gives more of a clue about what they do. Those which use logging have had a command-line logging parameter added.
2020-05-12 15:11:30 +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
Nikolaus Waxweiler
5a53d1d4ad models: Use new exceptions where input is checked 2020-02-13 15:01:52 +00:00
Cosimo Lupo
38a8eb0e34
varLib.models: fix KeyError when no on-axis points while sorting masters
E.g. when trying to model/plot an unusual designspace like: fonttools varLib.plot 0,0 -1,-1 1,-1 -1,1 1,1
2019-08-12 12:59:45 +02:00
Nikolaus Waxweiler
0f3eaca219 models.py: minor lint fix 2019-08-10 22:20:24 +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
Behdad Esfahbod
2ac470b96b Ouch, fix indentation
My bad.  Really sorry.
2019-05-25 17:18:35 -04:00
Behdad Esfahbod
0442d9062a Improve allEqual 2019-05-25 16:12:24 -04:00
Cosimo Lupo
2dedea5f8f models: remove unused axisOrder argument from _computeMasterSupports private method
it's no longer used in the body of the method. If needed, it's accessible from self.axisOrder
2019-03-04 16:58:15 -08:00
Cosimo Lupo
f8c7950e48 models: minor: explicitly test for axisOrder is None
389cf7c56a (r32585140)
2019-03-04 16:51:53 -08:00
Cosimo Lupo
05824b8616 VariationModel: assert that locations are unique 2019-03-04 11:42:54 -08:00
Cosimo Lupo
d8152feb21 VariationModels: remove unused lowerBound/upperBound static methods 2019-03-04 11:15:06 -08:00
Cosimo Lupo
389cf7c56a VariationModel: don't use mutable list default value for 'axisOrder' parameter 2019-03-04 10:58:47 -08:00
Cosimo Lupo
148b421705 models.main: actually pass normalized master locations to VariationModel 2019-03-01 13:04:52 -08:00
Behdad Esfahbod
31019eac8e [CFF] Whitespace 2018-11-30 21:46:16 -05:00
ReadRoberts
331a55588b [varlib] update model.reorderMasters() to support arbitrary mapping. 2018-11-30 10:37:34 -08:00
ReadRoberts
29b1246515 [varlib] Move master list reordering into models.py
It is useful to re-order the CFF2 master font list to match the sorted location order, but doing so means touching internal fields of the model, so we'll move this into the VariationModel class.
2018-11-30 09:12:27 -08:00
Behdad Esfahbod
5c1ca73123 [varLib] Rename allSame() to allEqual()
Being same ("is") is not the same as being equal ("=="), even though
the two are equal most of the time.
2018-11-10 15:06:07 -05:00
Behdad Esfahbod
7711755b2c [varLib] Add mapper to allSameAs() and use it 2018-11-09 09:51:53 -05:00
Behdad Esfahbod
bff73edcfd [varLib] Add models.allNone 2018-11-09 09:48:02 -05:00
Behdad Esfahbod
7cda1c1a97 [varLib] Add models.allSameAs() 2018-11-08 23:41:09 -05:00
Behdad Esfahbod
14e8c06565 [varLib] Fixups
Part of https://github.com/googlei18n/fontmake/issues/88
Part of https://github.com/fonttools/fonttools/issues/1355
2018-11-08 12:29:07 -05:00
Behdad Esfahbod
b95967dd07 [varLib] Add models.allSame() and use it
Part of https://github.com/googlei18n/fontmake/issues/88
Part of https://github.com/fonttools/fonttools/issues/1355
2018-11-08 11:36:58 -05:00
Behdad Esfahbod
fba530a548 [varLib] Add VariationModel.getDeltasAndSupports()
which automatically fetches submodel.  Needs docstrings...

Part of https://github.com/googlei18n/fontmake/issues/88
Part of https://github.com/fonttools/fonttools/issues/1355
2018-11-08 11:31:44 -05:00
Behdad Esfahbod
6886075a23 [varLib] rename .modelFor() to .getSubModel()
Part of https://github.com/googlei18n/fontmake/issues/88
Part of https://github.com/fonttools/fonttools/issues/1355
2018-11-08 11:31:42 -05:00
Behdad Esfahbod
23c58e91d0 [varLib] Allow sparse masters for CVT tables
Part of https://github.com/googlei18n/fontmake/issues/88
Part of https://github.com/fonttools/fonttools/issues/1355
2018-11-08 11:31:41 -05:00
Behdad Esfahbod
65bcbf8ac2 [varLib] Implement getting subModels
To be used for sparse masters.

Part of https://github.com/googlei18n/fontmake/issues/88
Part of https://github.com/fonttools/fonttools/issues/1355
2018-11-08 11:31:25 -05:00
Behdad Esfahbod
62003f492f [varLib] If multiple axes have the same range ratio, cut across both
The symmetry is desired.

Before:
$ ./fonttools varLib.models 0,0 .5,0 0,.5 .5,.5 1,1
Sorted locations:
[{}, {'A': 0.5}, {'B': 0.5}, {'A': 0.5, 'B': 0.5}, {'A': 1.0, 'B': 1.0}]
Supports:
[{},
 {'A': (0, 0.5, 1.0)},
 {'B': (0, 0.5, 1.0)},
 {'A': (0, 0.5, 1.0), 'B': (0, 0.5, 1.0)},
 {'A': (0.5, 1.0, 1.0), 'B': (0, 1.0, 1.0)}]

Note the last line assymetry.

After:
$ ./fonttools varLib.models 0,0 .5,0 0,.5 .5,.5 1,1
Sorted locations:
[{}, {'A': 0.5}, {'B': 0.5}, {'A': 0.5, 'B': 0.5}, {'A': 1.0, 'B': 1.0}]
Supports:
[{},
 {'A': (0, 0.5, 1.0)},
 {'B': (0, 0.5, 1.0)},
 {'A': (0, 0.5, 1.0), 'B': (0, 0.5, 1.0)},
 {'A': (0.5, 1.0, 1.0), 'B': (0.5, 1.0, 1.0)}]

7ee81c8821 (commitcomment-31054804)
2018-10-28 09:30:09 -07:00
Cosimo Lupo
6a5a4c7422
varLib.models: fix TypeError comparing float with None 2018-10-26 11:07:12 +01:00
Behdad Esfahbod
7ee81c8821 [varLib] Take total bounding box into account when resolving model
Umm. Not sure how useful this is, but helps with cases where there
were not masters on extremes and people expected this to work.
Happens in Higher-Order Interpolation since the axis extremes
are not interesting.

Fixes https://github.com/googlei18n/fontmake/issues/473

Test case (in case someone wants to add it to test suite!):

Before:
$ ./fonttools varLib.models 0,0 .5,0 0,.5 .5,.5 1,1
Sorted locations:
[{}, {'A': 0.5}, {'B': 0.5}, {'A': 0.5, 'B': 0.5}, {'A': 1.0, 'B': 1.0}]
Supports:
[{},
 {'A': (0, 0.5, 0.5)},
 {'B': (0, 0.5, 0.5)},
 {'A': (0, 0.5, 0.5), 'B': (0, 0.5, 0.5)},
 {'A': (0.5, 1.0, 1.0), 'B': (0, 1.0, 1.0)}]

After:
$ ./fonttools varLib.models 0,0 .5,0 0,.5 .5,.5 1,1
Sorted locations:
[{}, {'A': 0.5}, {'B': 0.5}, {'A': 0.5, 'B': 0.5}, {'A': 1.0, 'B': 1.0}]
Supports:
[{},
 {'A': (0, 0.5, 1.0)},
 {'B': (0, 0.5, 1.0)},
 {'A': (0, 0.5, 1.0), 'B': (0, 0.5, 1.0)},
 {'A': (0.5, 1.0, 1.0), 'B': (0, 1.0, 1.0)}]
2018-10-25 19:46:44 -07:00
Cosimo Lupo
8900505200
models: add piecewiseLinearMap function
copied from fontTools.varLib._DesignspaceAxis._map static method.
I place it here since it is also used by varLib.mutator, so makes sense
to have a public function
2018-09-11 18:06:06 +02:00
Behdad Esfahbod
a3a25e09b2 [varLib.models] Rename variables for clarity 2018-06-17 18:47:53 -04:00
Behdad Esfahbod
09ae567070 [varLibs.models] Another fix
Though, the previous work was also working; the bug couldn't be hit.
2018-06-16 14:17:44 -04:00
Behdad Esfahbod
1801248938 [varLib.models] Fix model resolution
Oops.  Was introduced when I last changed modeling.

The problem was, for checking that a previous master m is outside the current
influence box of the current master, I was doing "not (lower < m[loc] < upper)".
This is wrong, where lower,peak,upper is the support of previous master.
This fails if lower == peak == m[loc], or m[loc] == peak == upper.

Fixes https://github.com/fonttools/fonttools/issues/1269#issuecomment-397655016
2018-06-16 14:07:18 -04:00
Behdad Esfahbod
be9a304dc4 [varLib.models] Allow solving for a .designspace doc from cmdline
Like varLib.plot does.
2018-06-16 13:53:56 -04:00
Cosimo Lupo
e75d6a8ca1
[varLib.models] add assertion debug message
Fixes #1268
2018-06-14 15:34:27 +01:00
Cosimo Lupo
e48e8ea7c9
Revert "models: convert delta array to float if overflows signed short integers"
This reverts commit 0055f9414ca5094b0c9beb0176ac4998cdbbba70.
2018-06-07 12:53:42 +01:00
Behdad Esfahbod
0ecf5c5c94 [varLib.models] Refine modeling one last time
In a523a697164a4 I changed the model such that when computing master
supports and we hit another master, cut the box in one dimension only,
to avoid interferring with other master.  The axis to cut against was
chosen as axis that minimizes volume loss.  That was fine in a sense,
but missed a great amount of information resulting from relative
positioning of the two masters.  As such, it could not distinguish
between the following two situations:

behdad:fonttools 0 (master*)$ ./fonttools varLib.models 0,0 0,1 1,0 1,1 .5,.5 .55,.75
Sorted locations:
[{},
 {'A': 1.0},
 {'B': 1.0},
 {'A': 1.0, 'B': 1.0},
 {'A': 0.5, 'B': 0.5},
 {'A': 0.55, 'B': 0.75}]
Supports:
[{},
 {'A': (0, 1.0, 1.0)},
 {'B': (0, 1.0, 1.0)},
 {'A': (0, 1.0, 1.0), 'B': (0, 1.0, 1.0)},
 {'A': (0, 0.5, 1.0), 'B': (0, 0.5, 1.0)},
 {'A': (0, 0.55, 1.0), 'B': (0.5, 0.75, 1.0)}]
behdad:fonttools 0 (02616ab...)$ ./fonttools varLib.models 0,0 0,1 1,0 1,1 .5,.5 .75,.55
Sorted locations:
[{},
 {'A': 1.0},
 {'B': 1.0},
 {'A': 1.0, 'B': 1.0},
 {'A': 0.5, 'B': 0.5},
 {'A': 0.75, 'B': 0.55}]
Supports:
[{},
 {'A': (0, 1.0, 1.0)},
 {'B': (0, 1.0, 1.0)},
 {'A': (0, 1.0, 1.0), 'B': (0, 1.0, 1.0)},
 {'A': (0, 0.5, 1.0), 'B': (0, 0.5, 1.0)},
 {'A': (0, 0.75, 1.0), 'B': (0.5, 0.55, 1.0)}]

Check the last line. In both cases the box was cut against the second axis.
After this change, we get:

behdad:fonttools 0 (master)$ ./fonttools varLib.models 0,0 0,1 1,0 1,1 .5,.5 .55,.75
Sorted locations:
[{},
 {'A': 1.0},
 {'B': 1.0},
 {'A': 1.0, 'B': 1.0},
 {'A': 0.5, 'B': 0.5},
 {'A': 0.55, 'B': 0.75}]
Supports:
[{},
 {'A': (0, 1.0, 1.0)},
 {'B': (0, 1.0, 1.0)},
 {'A': (0, 1.0, 1.0), 'B': (0, 1.0, 1.0)},
 {'A': (0, 0.5, 1.0), 'B': (0, 0.5, 1.0)},
 {'A': (0, 0.55, 1.0), 'B': (0.5, 0.75, 1.0)}]
behdad:fonttools 0 (master)$ ./fonttools varLib.models 0,0 0,1 1,0 1,1 .5,.5 .75,.55
Sorted locations:
[{},
 {'A': 1.0},
 {'B': 1.0},
 {'A': 1.0, 'B': 1.0},
 {'A': 0.5, 'B': 0.5},
 {'A': 0.75, 'B': 0.55}]
Supports:
[{},
 {'A': (0, 1.0, 1.0)},
 {'B': (0, 1.0, 1.0)},
 {'A': (0, 1.0, 1.0), 'B': (0, 1.0, 1.0)},
 {'A': (0, 0.5, 1.0), 'B': (0, 0.5, 1.0)},
 {'A': (0.5, 0.75, 1.0), 'B': (0, 0.55, 1.0)}]

Just draw the boxes on a piece of napkin and convince yourself that this
is a good change.

If the ratios are equal, we cut against the first axis in the axisOrder:

behdad:fonttools 0 (master)$ ./fonttools varLib.models 0,0 0,1 1,0 1,1 .5,.5 .75,.75
Sorted locations:
[{},
 {'A': 1.0},
 {'B': 1.0},
 {'A': 1.0, 'B': 1.0},
 {'A': 0.5, 'B': 0.5},
 {'A': 0.75, 'B': 0.75}]
Supports:
[{},
 {'A': (0, 1.0, 1.0)},
 {'B': (0, 1.0, 1.0)},
 {'A': (0, 1.0, 1.0), 'B': (0, 1.0, 1.0)},
 {'A': (0, 0.5, 1.0), 'B': (0, 0.5, 1.0)},
 {'A': (0.5, 0.75, 1.0), 'B': (0, 0.75, 1.0)}]
2018-04-27 16:50:32 -07:00
Cosimo Lupo
0055f9414c
models: convert delta array to float if overflows signed short integers
We should check other places where such overflows may occur and do the same.
Or do maybe it in GlyphCoordinates class.
2018-04-03 11:40:44 +01:00
Behdad Esfahbod
a523a69716 [varLib.models] Improve model
When adding a master and computing its support, when hitting another master,
we don't need to limit our box in every direction; we just need to limit in
one so we don't hit the older master with our support. Implement heuristic
that takes the first axis that minimizes the area loss.

This is not perfect, but a good improvement.

Before:
$ fonttools varLib.models 0,0 0,1 1,0 1,1 .4,0 .6,1 .5,.5 .7,.9Sorted locations:
[{},
 {'A': 0.4},
 {'A': 1.0},
 {'B': 1.0},
 {'A': 1.0, 'B': 1.0},
 {'A': 0.6, 'B': 1.0},
 {'A': 0.5, 'B': 0.5},
 {'A': 0.7, 'B': 0.9}]
Supports:
[{},
 {'A': (0, 0.4, 1.0)},
 {'A': (0.4, 1.0, 1.0)},
 {'B': (0, 1.0, 1.0)},
 {'A': (0, 1.0, 1.0), 'B': (0, 1.0, 1.0)},
 {'A': (0, 0.6, 1.0), 'B': (0, 1.0, 1.0)},
 {'A': (0, 0.5, 1.0), 'B': (0, 0.5, 1.0)},
 {'A': (0.5, 0.7, 1.0), 'B': (0.5, 0.9, 1.0)}]

After:
$ fonttools varLib.models 0,0 0,1 1,0 1,1 .4,0 .6,1 .5,.5 .7,.9
Sorted locations:
[{},
 {'A': 0.4},
 {'A': 1.0},
 {'B': 1.0},
 {'A': 1.0, 'B': 1.0},
 {'A': 0.6, 'B': 1.0},
 {'A': 0.5, 'B': 0.5},
 {'A': 0.7, 'B': 0.9}]
Supports:
[{},
 {'A': (0, 0.4, 1.0)},
 {'A': (0.4, 1.0, 1.0)},
 {'B': (0, 1.0, 1.0)},
 {'A': (0, 1.0, 1.0), 'B': (0, 1.0, 1.0)},
 {'A': (0, 0.6, 1.0), 'B': (0, 1.0, 1.0)},
 {'A': (0, 0.5, 1.0), 'B': (0, 0.5, 1.0)},
 {'A': (0, 0.7, 1.0), 'B': (0.5, 0.9, 1.0)}]

(Note the last line.)
2018-03-28 02:11:49 -07:00
Behdad Esfahbod
0359daad3d Revert "[varLib.models] Improve modeling"
This reverts commit e4d363cc5c14471b02a98657e9bc04b75109c687.
2018-03-28 01:38:10 -07:00
Behdad Esfahbod
e4d363cc5c [varLib.models] Improve modeling
After:
jj
2018-03-28 01:17:54 -07:00