diff --git a/setup/extensions.py b/setup/extensions.py index 9a8a6e20a6..ebc258d7bd 100644 --- a/setup/extensions.py +++ b/setup/extensions.py @@ -257,6 +257,7 @@ if isunix: cc = os.environ.get('CC', 'gcc') cxx = os.environ.get('CXX', 'g++') cflags = os.environ.get('OVERRIDE_CFLAGS', + # '-Wall -DNDEBUG -ggdb -fno-strict-aliasing -pipe') '-O3 -Wall -DNDEBUG -fno-strict-aliasing -pipe') cflags = shlex.split(cflags) + ['-fPIC'] ldflags = os.environ.get('OVERRIDE_LDFLAGS', '-Wall') diff --git a/setup/sfntly.py b/setup/sfntly.py index 79a25a53f0..298d0044f0 100644 --- a/setup/sfntly.py +++ b/setup/sfntly.py @@ -46,6 +46,7 @@ class SfntlyBuilderMixin(object): self.sfntly_cflags += [ '-D_UNICODE', '-DUNICODE', ] + shlex.split('/W4 /WX /Gm- /Gy /GR-') + self.cflags += ['-DWIN32'] else: # Possibly add -fno-inline (slower, but more robust) self.sfntly_cflags += [ @@ -63,7 +64,10 @@ class SfntlyBuilderMixin(object): cflags.remove('/Ox') if '-O3' in cflags: cflags.remove('-O3') - cflags.insert(0, '/O2' if iswindows else '-O2') + if '/W3' in cflags: + cflags.remove('/W3') + if '-ggdb' not in cflags: + cflags.insert(0, '/O2' if iswindows else '-O2') groups = [] all_headers = set() @@ -71,7 +75,7 @@ class SfntlyBuilderMixin(object): src_dir = self.absolutize([os.path.join('sfntly', 'src')])[0] inc_dirs = [src_dir] self.inc_dirs += inc_dirs - inc_flags = builder.inc_dirs_to_cflags(inc_dirs) + inc_flags = builder.inc_dirs_to_cflags(self.inc_dirs) for loc in ('', 'port', 'data', 'math', 'table', 'table/bitmap', 'table/core', 'table/truetype'): path = os.path.join(src_dir, 'sfntly', *loc.split('/')) diff --git a/src/calibre/utils/fonts/subset.py b/src/calibre/utils/fonts/subset.py index 41f0365cdf..4fbadee955 100644 --- a/src/calibre/utils/fonts/subset.py +++ b/src/calibre/utils/fonts/subset.py @@ -10,6 +10,12 @@ __docformat__ = 'restructuredtext en' from future_builtins import map class NoGlyphs(ValueError): + 'Raised when the font has no glyphs for the specified characters' + pass + +class UnsupportedFont(ValueError): + 'Raised when the font is not supported for subsetting ' + '(usually an OTF font with PostScript outlines).' pass def load_sfntly(): @@ -19,7 +25,7 @@ def load_sfntly(): raise RuntimeError('Failed to load sfntly: %s'%err) return sfntly -def subset(font_data, individual_chars, ranges): +def subset(font_data, individual_chars, ranges=()): if font_data[:4] not in {b'\x00\x01\x00\x00', b'OTTO', b'true', b'typ1'}: raise ValueError('Not a supported font file. sfnt_version not recognized: %r'% font_data[:4]) @@ -37,6 +43,8 @@ def subset(font_data, individual_chars, ranges): except sfntly.NoGlyphs: raise NoGlyphs('No glyphs were found in this font for the' ' specified characters. Subsetting is pointless') + except sfntly.UnsupportedFont as e: + raise UnsupportedFont(type('')(e)) def option_parser(): import textwrap @@ -99,6 +107,31 @@ def test(): if len(sf) > 0.3 * len(raw): raise Exception('Subsetting failed') +def all(): + from calibre.utils.fonts.scanner import font_scanner + failed = [] + for family in font_scanner.find_font_families(): + for font in font_scanner.fonts_for_family(family): + raw = font_scanner.get_font_data(font) + print ('Subsetting', font['full_name']) + try: + sf, old_stats, new_stats = subset(raw, set(('a', 'b', 'c')), ()) + except (NoGlyphs, UnsupportedFont) as e: + continue + except Exception as e: + print ('Failed!') + failed.append((font['full_name'], font['path'], unicode(e))) + else: + print ('Reduced to:', '%.1f'%( + sum(new_stats.itervalues())/sum(old_stats.itervalues()) + * 100), '%') + if failed: + print ('\n\nFailures:') + for name, path, err in failed: + print (name, path, err) + print() + + def main(args): import sys, time from calibre import prints