Subset fonts: Fix error when trying to subset unicode characters that require two UTF-16 code points on Windows. Fixes #1811224 [Can not subset embed fonts for a epub with "wide" Unicode char](https://bugs.launchpad.net/calibre/+bug/1811224)

This commit is contained in:
Kovid Goyal 2019-01-10 16:06:35 +05:30
parent ec7a9059ae
commit dbf8c10e4c
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C

View File

@ -12,7 +12,7 @@ from collections import OrderedDict
from operator import itemgetter from operator import itemgetter
from functools import partial from functools import partial
from calibre.utils.icu import safe_chr from calibre.utils.icu import safe_chr, ord_string
from calibre.utils.fonts.sfnt.container import Sfnt from calibre.utils.fonts.sfnt.container import Sfnt
from calibre.utils.fonts.sfnt.errors import UnsupportedFont, NoGlyphs from calibre.utils.fonts.sfnt.errors import UnsupportedFont, NoGlyphs
@ -105,16 +105,20 @@ def pdf_subset(sfnt, glyphs):
'or PostScript outlines') 'or PostScript outlines')
def safe_ord(x):
return ord_string(unicode(x))[0]
def subset(raw, individual_chars, ranges=(), warnings=None): def subset(raw, individual_chars, ranges=(), warnings=None):
warn = partial(do_warn, warnings) warn = partial(do_warn, warnings)
chars = set(map(ord, individual_chars)) chars = set(map(safe_ord, individual_chars))
for r in ranges: for r in ranges:
chars |= set(xrange(ord(r[0]), ord(r[1])+1)) chars |= set(xrange(safe_ord(r[0]), safe_ord(r[1])+1))
# Always add the space character for ease of use from the command line # Always add the space character for ease of use from the command line
if ord(' ') not in chars: if safe_ord(' ') not in chars:
chars.add(ord(' ')) chars.add(safe_ord(' '))
sfnt = Sfnt(raw) sfnt = Sfnt(raw)
old_sizes = sfnt.sizes() old_sizes = sfnt.sizes()