Book polishing: Do not scan book for font usage when subsetting if no embedded fonts are available. Fixes #1737400 [Ebook edit: Subset embedded fonts does something even if there are no fonts](https://bugs.launchpad.net/calibre/+bug/1737400)

This commit is contained in:
Kovid Goyal 2017-12-12 10:07:14 +05:30
parent 8301cdd8ed
commit 90101bd663
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
2 changed files with 58 additions and 45 deletions

View File

@ -13,7 +13,7 @@ from functools import partial
from calibre.ebooks.oeb.polish.container import get_container
from calibre.ebooks.oeb.polish.stats import StatsCollector
from calibre.ebooks.oeb.polish.subset import subset_all_fonts
from calibre.ebooks.oeb.polish.subset import subset_all_fonts, iter_subsettable_fonts
from calibre.ebooks.oeb.polish.images import compress_images
from calibre.ebooks.oeb.polish.embed import embed_all_fonts
from calibre.ebooks.oeb.polish.cover import set_cover
@ -145,8 +145,12 @@ def polish_one(ebook, opts, report, customization=None):
jacket = None
changed = False
customization = customization or CUSTOMIZATION.copy()
has_subsettable_fonts = False
for x in iter_subsettable_fonts(ebook):
has_subsettable_fonts = True
break
if opts.subset or opts.embed:
if (opts.subset and has_subsettable_fonts) or opts.embed:
stats = StatsCollector(ebook, do_embed=opts.embed)
if opts.opf:
@ -196,12 +200,16 @@ def polish_one(ebook, opts, report, customization=None):
rt(_('Embedding referenced fonts'))
if embed_all_fonts(ebook, stats, report):
changed = True
has_subsettable_fonts = True
report('')
if opts.subset:
if has_subsettable_fonts:
rt(_('Subsetting embedded fonts'))
if subset_all_fonts(ebook, stats.font_stats, report):
changed = True
else:
rt(_('No embedded fonts to subset'))
report('')
if opts.remove_unused_css:

View File

@ -34,12 +34,17 @@ def remove_font_face_rules(container, sheet, remove_names, base):
return changed
def iter_subsettable_fonts(container):
for name, mt in container.mime_map.iteritems():
if (mt in OEB_FONTS or name.rpartition('.')[-1].lower() in {'otf', 'ttf'}) and mt != guess_type('a.woff'):
yield name, mt
def subset_all_fonts(container, font_stats, report):
remove = set()
total_old = total_new = 0
changed = False
for name, mt in container.mime_map.iteritems():
if (mt in OEB_FONTS or name.rpartition('.')[-1].lower() in {'otf', 'ttf'}) and mt != guess_type('a.woff'):
for name, mt in iter_subsettable_fonts(container):
chars = font_stats.get(name, set())
with container.open(name, 'rb') as f:
f.seek(0, os.SEEK_END)