woff2: initialize WOFF2FlavorData from existing WOFFFlavorData

Fixes #1650

A regression was introduced with 3.43.0 when doing pyftsubset --flavor=woff2
and the input font is WOFF 1.0, thus it has a non-None flavorData already
but doesn't define the transformTables attribute.
This commit is contained in:
Cosimo Lupo 2019-06-19 11:44:40 +01:00
parent 33fa149c31
commit 6ba7c3c9e2
No known key found for this signature in database
GPG Key ID: 20D4A261E4A0E642

View File

@ -174,7 +174,7 @@ class WOFF2Writer(SFNTWriter):
self.file = file self.file = file
self.numTables = numTables self.numTables = numTables
self.sfntVersion = Tag(sfntVersion) self.sfntVersion = Tag(sfntVersion)
self.flavorData = flavorData or WOFF2FlavorData() self.flavorData = WOFF2FlavorData(data=flavorData)
self.directoryFormat = woff2DirectoryFormat self.directoryFormat = woff2DirectoryFormat
self.directorySize = woff2DirectorySize self.directorySize = woff2DirectorySize
@ -1128,19 +1128,35 @@ class WOFF2FlavorData(WOFFFlavorData):
Flavor = 'woff2' Flavor = 'woff2'
def __init__(self, reader=None, transformedTables=None): def __init__(self, reader=None, data=None, transformedTables=None):
"""Data class that holds the WOFF2 header major/minor version, any """Data class that holds the WOFF2 header major/minor version, any
metadata or private data (as bytes strings), and the set of metadata or private data (as bytes strings), and the set of
table tags that have transformations applied (if reader is not None), table tags that have transformations applied (if reader is not None),
or will have once the WOFF2 font is compiled. or will have once the WOFF2 font is compiled.
Args:
reader: an SFNTReader (or subclass) object to read flavor data from.
data: another WOFFFlavorData object to initialise data from.
transformedTables: set of strings containing table tags to be transformed.
Raises:
ImportError if the brotli module is not installed.
NOTE: The 'reader' argument, on the one hand, and the 'data' and
'transformedTables' arguments, on the other hand, are mutually exclusive.
""" """
if not haveBrotli: if not haveBrotli:
raise ImportError("No module named brotli") raise ImportError("No module named brotli")
if reader is not None and transformedTables is not None: if reader is not None:
raise TypeError( if data is not None:
"'reader' and 'transformedTables' arguments are mutually exclusive" raise TypeError(
) "'reader' and 'data' arguments are mutually exclusive"
)
if transformedTables is not None:
raise TypeError(
"'reader' and 'transformedTables' arguments are mutually exclusive"
)
if transformedTables is None: if transformedTables is None:
transformedTables = woff2TransformedTableTags transformedTables = woff2TransformedTableTags
@ -1164,19 +1180,26 @@ class WOFF2FlavorData(WOFFFlavorData):
reader.file.seek(reader.metaOffset) reader.file.seek(reader.metaOffset)
rawData = reader.file.read(reader.metaLength) rawData = reader.file.read(reader.metaLength)
assert len(rawData) == reader.metaLength assert len(rawData) == reader.metaLength
data = brotli.decompress(rawData) metaData = brotli.decompress(rawData)
assert len(data) == reader.metaOrigLength assert len(mataData) == reader.metaOrigLength
self.metaData = data self.metaData = metaData
if reader.privLength: if reader.privLength:
reader.file.seek(reader.privOffset) reader.file.seek(reader.privOffset)
data = reader.file.read(reader.privLength) privData = reader.file.read(reader.privLength)
assert len(data) == reader.privLength assert len(privData) == reader.privLength
self.privData = data self.privData = privData
transformedTables = [ transformedTables = [
tag tag
for tag, entry in reader.tables.items() for tag, entry in reader.tables.items()
if entry.transformed if entry.transformed
] ]
elif data:
self.majorVersion = data.majorVersion
self.majorVersion = data.minorVersion
self.metaData = data.metaData
self.privData = data.privData
if hasattr(data, "transformedTables"):
transformedTables = data.transformedTables
self.transformedTables = set(transformedTables) self.transformedTables = set(transformedTables)
@ -1354,7 +1377,9 @@ def compress(input_file, output_file, transform_tables=None):
font.flavor = "woff2" font.flavor = "woff2"
if transform_tables is not None: if transform_tables is not None:
font.flavorData = WOFF2FlavorData(transformedTables=transform_tables) font.flavorData = WOFF2FlavorData(
data=font.flavorData, transformedTables=transform_tables
)
font.save(output_file, reorderTables=False) font.save(output_file, reorderTables=False)