245 Commits

Author SHA1 Message Date
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
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
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
Cosimo Lupo
16d0e5e8ad
subset: workaround for narrow py2 builds when iterating over non-BMP chars in unicode string
Fixes https://github.com/fonttools/fonttools/issues/750
2016-11-29 15:49:05 +00:00
Behdad Esfahbod
78d3cbea57 [subset] Fix subsetting MathVariants
Was failing on Caudex-Regular.ttf for example.
2016-11-11 10:58:02 -08:00
moyogo
4dd1e73b04 Revert "Merge pull request #606 from anthrotype/cff-dehint"
This reverts commit 25a03f5a5736ed70791a8dde31605ed4cee9bbd9, reversing
changes made to 8351600bc628278960390d747f45593a50b7c1ea.
2016-10-14 20:20:35 +01:00
Cosimo Lupo
ddfa48ea7c subset: 'draw' charstrings to set 'width' before calling 'drop_hints'
the horizontal advance of hinted charstrings gets lost when the CFF hinting
is stripped with '--no-hinting' option, as noted by @miguelsousa here:

https://github.com/behdad/fonttools/issues/343#issuecomment-156234918

The reason is 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:

https://github.com/behdad/fonttools/blob/master/Lib/fontTools/subset/__init__.py#L1908
2016-10-09 10:59:10 +01:00
Behdad Esfahbod
402d726692 [ot] Change Version to be an integer instead of float
API Change:
This will change XML output for GSUB/GPOS/GDEF/MATH/BASE/JSTF/...
Scripts that set the Version for those to 1.0 or other float values
also need fixing.  A warning is emitted when code or XML needs fix.
2016-09-27 19:49:41 +02:00
Behdad Esfahbod
ae93928275 [varLib] Rename fields in fvar, to accommodate for postscriptNameID 2016-09-27 19:49:41 +02:00
Cosimo Lupo
9de25ea628 [subset] add --passthrough-tables option to keep any tables that the subsetter does not know how to subset 2016-09-26 19:13:04 +01:00
JasonAtGithub
a41c60cb88 Fixed encoding error in subset tool in Windows
Fixed encoding error in subset tool in Windows which system default codepage isn't 65001.
For Example: 
When windows default codepage is 936, the command like 'pyftsubset myfont.ttf --text-file=mytextfile.txt' will throw an exception.
2016-08-29 20:43:33 +08:00
Cosimo Lupo
539a5010e5 subset: --recalc-average-width is disabled by default 2016-07-20 09:33:35 +01:00
Cosimo Lupo
d1a27bd671 subset: add --recalc-average-width command-line option (on by default); log message if xAvgCharWidth changed 2016-07-19 22:54:05 +01:00
Khaled Hosny
efb32d5402 [subset] Recalculate OS/2.xAvgCharWidth 2016-07-18 01:35:18 +02:00
Behdad Esfahbod
5cd1fbaff6 [subset] Clear CFF Encoding vector
Fixes https://github.com/behdad/fonttools/issues/620
2016-07-13 00:33:41 -07:00
Khaled Hosny
f88c43d105 Check for file attribute before deleting it
I don’t know why this is happening, but I’m getting attribute error when
I build https://github.com/khaledhosny/mada with compreffor
optimisations on.
2016-05-19 20:50:10 +02:00
Cosimo Lupo
ca8e49b6f5 subset: fix typo
Ouch.
2016-05-16 17:05:46 +01:00
Cosimo Lupo
920c6a8249 subset: set maxp.maxStorage to 0 when --no-hinting option is passed
'maxStorage' is the maximum number of Storage Area locations used.
If there's no hinting, it should be 0.
2016-05-16 15:57:17 +01:00
Behdad Esfahbod
26bb99e1c3 [subset] Whitespace 2016-05-12 13:40:14 +02:00
Behdad Esfahbod
cd914c9575 [subset] Protect against some more prematurely-short arrays 2016-05-12 13:40:14 +02:00
Behdad Esfahbod
85750a864a [subset] Protect against prematurely-short arrays GPOS 2016-05-12 13:40:14 +02:00
Behdad Esfahbod
a61b31a917 [subset] Mark avar and fvar tables as no-need-subsetting 2016-04-08 18:41:31 -07:00
Sascha Brawer
0fad6e66ec Support subsetting of variation fonts 2016-03-31 16:23:24 +02:00
Behdad Esfahbod
74e629e600 [subset] Retain GSUB ScriptRecords, even if they are empty
This slightly bloats subset fonts, but fixes:
https://bugzilla.mozilla.org/show_bug.cgi?id=1080739#c15
https://github.com/behdad/fonttools/issues/518

At some point we might want to do something smarter based
on Unicode script of retained characters.
2016-02-10 16:22:24 +07:00
Cosimo Lupo
f6b8445515 [subset] catch OptionError exception, print usage + error and throw exit code 2 2016-02-04 12:17:01 +00:00
Cosimo Lupo
7ac65613eb [subset] add --with-zopfli option; set 'canonical_order' to None
'canonical_order' default value was set to False in the subsetter. However,
the meaning of the related 'reorderTables' argument in TTFont.save method has changed
with commit 6ba67ab699d62962690a7a523c286ebf0c8b0ae4.
When the latter is set to False, the original input font's table order is "kept": which
still means doing some sort of reordering. If one wishes to avoid any kind of reordering,
reorderTables needs to be set to None.
2016-01-31 14:50:04 +00:00
Cosimo Lupo
c5febaf1a5 [subset] remove custom Logger and use logging instead
The Subsetter class now uses a module-level 'log', and no longer uses
its own custom Logger. This has been removed, and its features replaced
by equivalents.

log.lapse() are replaced with Timer context manager/decorator (these should make clearer where the elapsed time starts/stops);

log.glyphs() is kept for convenience: it is bound dynamically to the logger instance instead of subclassing logging.Logger, as it's only
useful in here.

log.font() is replaced by `font.saveXML(sys.stdout)`.

A distinct sub-logger is configured for timing messages, to allow --timing option to be enabled independently from --verbose
2016-01-27 19:05:05 +00:00
Cosimo Lupo
ce5d230eef [subset] add --prune-unicode-ranges option (enabled by default) 2016-01-27 18:38:32 +00:00
Khaled Hosny
0e1cc9fb73 [subset] Add support for MATH table 2016-01-23 23:00:30 +04:00
Behdad Esfahbod
0ec2911c47 [subset] Fix for f0eb7e98ca0642f17ac82433db8c957fffd6a9d3 2016-01-13 17:00:29 +00:00
Rod Sheeter
9927a91653 Remove change to _dict_subset (meant to be local/test only). Add a cmap fmt 0 to color font test file. 2015-12-09 13:32:35 -08:00
Rod Sheeter
905eb831b9 Add Google-style color font test and make _dict_subset more forgiving. 2015-12-09 13:05:16 -08:00
Cosimo Lupo
812609e90c [subset] fix logic of EBLC subsetting; avoid KeyError in EBDT subsetting 2015-12-09 09:42:15 -08:00
Rod Sheeter
9189d1a1f0 Experimental support for Google-style color bitmap fonts 2015-12-09 09:42:15 -08:00
Behdad Esfahbod
8128b509a4 [subset] Augment ContextHelper
As needed in my Monotype OpenType format parser.  I'm not using the object
directly from subset module, but pushing back my changes here, in the hope
that we move this object to ttLib proper soon.
2015-12-08 20:40:42 +01:00
Behdad Esfahbod
f129f658c9 [subset] Fix Options parsing
Fixes https://github.com/behdad/fonttools/issues/413
Test passes now.
2015-12-07 11:14:04 +01:00
Khaled Hosny
301d2db812 [subset] Support subsetting MS color tables
Add support for subsetting COLR table.

The CPAL table does not need subsetting, but unused palettes should be
pruned, this is not implemented however as it depends on COLR table,
which in turn will not be updated after pruning CPAL.
2015-12-01 11:59:52 +04:00
Miguel Sousa
6db7d30ed9 [subset] Preserve the .notdef glyph width when removing its outlines 2015-11-13 17:43:22 -08:00
Miguel Sousa
51bd7e00b5 white space 2015-11-13 17:36:13 -08:00
Miguel Sousa
29d7edf76f [subset] mv subset.py subset/__init__.py 2015-11-13 17:36:02 -08:00