256 Commits

Author SHA1 Message Date
Cosimo Lupo
d2298be083
[subset] modify --name-IDs help message to match new defaults 2018-02-16 17:58:14 +00:00
Behdad Esfahbod
25d3822275 [subset] Fixup for previous commit 2018-02-16 09:54:32 -08:00
Behdad Esfahbod
6eac96b2f5 [subset] Add nameIDs 0 and 5 as well and fix docstring
Fixes https://github.com/fonttools/fonttools/issues/1170
2018-02-16 09:32:29 -08:00
Behdad Esfahbod
007a72ac29 [subset] Change indentation to tabs 2018-02-14 01:32:54 -08:00
Behdad Esfahbod
3c717c7867 [subset] Starting to implement pruning VarStores
Part of https://github.com/fonttools/fonttools/issues/1179
2018-02-14 01:19:03 -08:00
Behdad Esfahbod
43ea974329 [subset] Include nameIDs 3, 4, 6 by default
Fixes https://github.com/fonttools/fonttools/issues/1170
2018-02-10 13:01:59 -06:00
Behdad Esfahbod
d723b695e7 [subset] Close glyphs over CFF
Fixes https://github.com/fonttools/fonttools/issues/1162
2018-01-26 17:41:53 -08:00
Hugo Giraudel
6a5fc617de
Fix typo in --glyphs option description 2017-11-28 13:07:06 +01:00
Cosimo Lupo
ca8963e527 [subset] pass a PrivateDict instance to _delete_empty_subrs func 2017-11-27 20:29:11 +00:00
Cosimo Lupo
cad8a8c072 minor 2017-11-27 20:24:32 +00:00
Cosimo Lupo
42d11cfd3e [subset] delete empty SubrsIndex after subsetting
Fixes https://github.com/fonttools/fonttools/issues/994
2017-11-27 19:37:19 +00:00
Cosimo Lupo
28bb992c1f replace int(round(...)) with round(...)
We don't need to cast to int when using the round function from py23,
as this is a backport of python3's built-in round and thus it returns
an int when called with a single argument.
2017-10-22 12:03:52 +01:00
Behdad Esfahbod
93763eec0b Minor 2017-09-15 00:58:42 -04:00
Sascha Brawer
898f6911f8 [AAT] Implement subsetting of anchor points table 2017-08-31 12:49:55 +02:00
Behdad Esfahbod
48bb8d9d59 [subset] Further minor simplification 2017-08-27 18:31:34 -07:00
Behdad Esfahbod
2d755f0d39 [subset] Simplify glyf.closure_glyphs() similarly 2017-08-27 18:30:04 -07:00
Behdad Esfahbod
61ac8e7589 [subset] Simplify COLR.closure_glyphs() 2017-08-27 18:27:03 -07:00
Sascha Brawer
307d0d4c57 [AAT] Implement subsetting of baseline table 2017-08-26 09:53:04 +02:00
Sascha Brawer
16a4001901 [AAT] Implement subsetting of lcar ligature carets table 2017-08-25 07:35:13 -07:00
Sascha Brawer
84b0cacf95 [AAT] Implement subsetting of opbd Optical Bounds table 2017-08-22 14:36:05 -07:00
Sascha Brawer
28b179a018 [AAT] Implement subsetting of prop table with AAT glyph properties 2017-08-22 08:06:59 -07:00
Behdad Esfahbod
6eb807b55f [subset] Keep (empty) DefaultLangSys for Script 'DFLT'
That's still required by the spec.
https://bugzilla.mozilla.org/show_bug.cgi?id=1331737#c32
2017-08-11 14:51:15 -07:00
Behdad Esfahbod
fe01d87b94 [subset] Support GSUB/GPOS.FeatureVariations
We should add a test using the font at:
https://github.com/behdad/harfbuzz/issues/521

Test with:
$ fonttools subset avar_rvrn.ttf --text=r
2017-08-08 17:21:58 -07:00
Behdad Esfahbod
b2e9882b30 [subset] Update list of features 2017-08-08 17:21:58 -07:00
Cosimo Lupo
c0d672ba70 [subset] return value from _DehintingT2Decompiler.op_hintmask
The `_SimpleT2Decompiler.execute` method expects that handlers for
hintmask/cntrmask operators return a tuple of (hintMaskBytes, index).
The index value is used to skip to the next token following the
hintmask bytes.
However, the `_DehintingT2Decompiler.op_hintmask` method was returning
None, thus the hintmask bytes were evaluated as the following token
instead of being consumed as such; but since in legacy python 2
`isinstance(token, basestring)` is True for both operators and
hintmask bytes, the latter might sometimes be wrongly interpreted
as operators!

For example, the hintmask bits '0110111101110010', encoded as a
bytes string `'\x6f\x72'` was being confused for the unimplemented
`'or'` operator...

Fixes #1006
2017-07-20 21:45:30 +01:00
Behdad Esfahbod
787b39d9b5 [subset] Add MVAR and STAT as no-susbetting-needed tables 2017-04-14 15:27:52 -07:00
Miguel Sousa
e69960cce0 [subset] Remove outdated comment from instructions
https://github.com/fonttools/fonttools/issues/144#issuecomment-290982065
2017-04-12 18:26:38 -07:00
Cosimo Lupo
46d487c728
the Zopfli bindings are finally available from PyPI, change url in the docstring 2017-03-01 14:01:15 +00:00
Masaya Nakamura
87527d7261 [subset] Don't assign the unused second item of getItemAndSelector() to sel
It was confusing, since `sel` is used for FDSelect elsewhere in this script.
2017-02-16 11:41:44 +09:00
Masaya Nakamura
4d315892af [subset] Set the correct glyph width for blank .notdef
`font.FDSelect[i]` returns a GID, not an index of `font.FDArray`.

Before this commit `.notdef` might have wrong glyph width in CharStrings,
if its fdSelectIndex is not 0 in the input font.
2017-02-16 11:09:52 +09:00
Behdad Esfahbod
65f0f98dba [subset.CFF] Drop empty subroutines 2017-02-15 01:17:26 -08:00
Behdad Esfahbod
079e10f31b [subset] Refactor code; hopefully didn't break it! 2017-02-15 00:52:55 -08:00
Behdad Esfahbod
8f03413aef [subset] Fix for 1ec6d30aa9b03ee40148ae8115848340ffd852a1 2017-02-15 00:33:37 -08:00
Behdad Esfahbod
32f2d6c3e8 Revert "[subset] Minor; towards refactoring"
This reverts commit 2348522167838132c06b0eecbce9c77e2ca07d02.
2017-02-14 23:52:38 -08:00
Behdad Esfahbod
684cdeef41 Revert "[subset] Minor; towards refactoring"
This reverts commit 697811178503edefd7c1f00ae8a8dcebf32d8fbb.
2017-02-14 23:52:24 -08:00
Behdad Esfahbod
2a171c852b Revert "[subset] Minor; towards refactoring"
This reverts commit 17dfafdd158c59cb34d15a2dd2f37db1d6f7b68b.
2017-02-14 23:52:18 -08:00
Behdad Esfahbod
17dfafdd15 [subset] Minor; towards refactoring 2017-02-14 23:49:02 -08:00
Behdad Esfahbod
6978111785 [subset] Minor; towards refactoring 2017-02-14 23:44:17 -08:00
Behdad Esfahbod
2348522167 [subset] Minor; towards refactoring 2017-02-14 23:42:45 -08:00
Behdad Esfahbod
e4a853466d [subset] Adjust comment for previous fix 2017-02-14 23:25:37 -08:00
Cosimo Lupo
3ae59d3dce
[subset] minor: use for ... else 2017-02-14 22:56:48 -08:00
Cosimo Lupo
2b76efb4ad
[subset] set has_hint if a subr contains hintmask acting as implicit vstemhm
When a subroutine contains no explicit hint stem operators (has_hint=False),
but it contains a hintmask operator which, in the context of the calling
charstring, would be understood as implying a vstemhm, then we need to set
has_hint=True on the subroutine, and update the last_hint index.

Otherwise, the drop_hints function leaves behind the arguments of the implicit
vstemhm operator.

This case is exemplified in the test font Tests/subset/data/Lobster.subset.ttx,
for charstrings "B" and "B.salt", and subroutine index="2".

--- /Users/cosimolupo/Documents/Github/fonttools/Tests/subset/data/expect_no_hinting_CFF.ttx
+++ /var/folders/jb/rjz76yw92w7144mwqg119jnm0000gn/T/tmpO_XOWh/tmp3.ttx
@@ -47,7 +47,7 @@
             107 return
           </CharString>
           <CharString index="2">
-            230 636 rmoveto
+            119 230 636 rmoveto
             -136 -636 rlineto
             144 hlineto
             return
@@ -94,7 +94,7 @@
           endchar
         </CharString>
         <CharString name="B">
-          187 -105 callsubr
+          187 6 93 362 139 -119 101 -101 -105 callsubr
           82 383 rlineto
           2 18 20 1 8 hhcurveto
           73 22 -57 -70 hvcurveto
@@ -109,7 +109,7 @@
           endchar
         </CharString>
         <CharString name="B.salt">
-          185 -105 callsubr
+          185 6 93 350 149 -119 105 -105 -105 callsubr
           6 30 rlineto
           -41 39 41 -17 39 hhcurveto
           125 110 175 136 72 -32 62 -82 15 hvcurveto
2017-01-26 12:23:51 +00:00
Cosimo Lupo
dcaf27d726
[subset] set the width on _DehintingT2Decompiler and avoid extra draw()
_DehintingT2Decompiler now inherits from T2WidthExtractor, so we can save
the charstring width and insert it back after we dropp the hints.

This avoids the need to do an extra .draw() just for the sake of
extracting the width.
2017-01-26 12:09:37 +00:00
Cosimo Lupo
3b7124757c
[subset] draw charstrings with NullPen to set the width before dropping hints
This is the same patch as PR #606

Quoting myself:
```
It seems that the horizontal advance of hinted charstrings gets lost when the CFF hinting is stripped with '--no-hinting' option...

T2CharString objects only get assigned a 'witdh' attribute after their 'draw' method is called.

The subsetter's drop_hints function attempts to insert the width back at the beginning of the de-hinted charstring's program, but can do that only if the charstring does have a 'width' attribute:

c63fea0f8f/Lib/fontTools/subset/__init__.py (L1928)

Hence, we must 'draw' the charstring (with a NullPen) before stripping the hints.
```

Now this method fixes the issue (advances are kept) when doing _both_ --no-hinting and --desubroutinize (the test_no_hinting_desubroutinize should now pass, while it was failing before).

However, when one only does does --no-hinting, this method raises an error:

AttributeError: 'NoneType' object has no attribute 'nominalWidthX'
Lib/fontTools/misc/psCharStrings.py:282: AttributeError

(this is reflected in the failing `test_no_hinting_CFF`)
2017-01-25 15:31:54 +00:00
Cosimo Lupo
78ad48eaf3
Move all *_test.py modules and test data to external Tests/ folder 2017-01-16 09:14:12 +00:00
Cosimo Lupo
c63fea0f8f
[subset] when no --output-file=, use INPUT_FILE.subset.{extension}
We should probably use cliTools.makeOutputFileName here for consistency with ttx,
but I know some prefer the approach taken by pyftsubset so I don't want force this.

Howver, I find it a bit annoying that when one is too lazy (like me) to specify
the --output-file=, the subsetter outputs a file ending with an invalid ".subset" extension, which Finder or Windows Explorer don't recongize as a font, and so one has to rename it anyway.

This makes the '.subset' string is inserted between the file name and its original extension (if any).
2017-01-13 12:50:46 +00:00
Cosimo Lupo
f168c0ccb5
[subset] allow to pass --options=... before the fontfile positional argument
The code in main() assumes that the first of the args which are not consumed by Options.parse_opts(args) is the positional argument (ie. does not start with  '--') for the input font file, and that is what the usage() says too.

However I find it myself writing --options=... first, and then at the end the positional arguments, as is the convention for many other Unix tools.

This patch makes this possible, while also keeping the current behavior.
2017-01-13 12:47:00 +00:00
Cosimo Lupo
49bcbb916b
consistently do sys.exit(unittest.main()) in all test modules
So that when run as scrips they report test failures with exit code

Follow up on b7bb391033ef3255c90134da3d7aef50d2d5326d
2017-01-11 13:05:35 +00:00
Cosimo Lupo
b7bb391033
don't use sys.exit(...) inside main(), but only under if __name__ == "__main__"
The convention is that sys.exit(...) is called only if a module is run as a script,
and that main() entry points use return statements to report exit codes: 0 (or None)
for successful execution, or any non-zero integer for errors.

E.g. see the console scripts generated when installing with pip.
2017-01-11 12:10:58 +00:00
Cosimo Lupo
ae05b2a583
[logging] for runnable modules, spell out module name instead of using __name__
If a module is run as script, as in `python module.py` or when using
`runpy.run_module()`, then __name__ == "__main__".

So when we instantiate modules' loggers with `logging.getLogger(__name__)`,
those loggers' name may become "__main__" when run as scripts, and hence
fall outside of the "fontTools" logging namespace.

fontTools.configureLogger() by default only configures the "fontTools"
library loggers, anything outside of it (e.g. logger called "__main__")
is not attached a handler.

So here I name loggers explicitly instead of relying on __name__, but
only for modules which can be run as "__main__".

Fixes #801
2017-01-11 11:58:17 +00:00