def getSFNTData(pathOrFile, unsortGlyfLoca=False, glyphBBox="", alt255UInt16=False): font = TTFont(pathOrFile) tableChecksums = {} tableData = {} tableOrder = [i for i in sorted(font.keys()) if len(i) == 4] if unsortGlyfLoca: assert "loca" in tableOrder loca = tableOrder.index("loca") glyf = tableOrder.index("glyf") tableOrder.insert(glyf, tableOrder.pop(loca)) for tag in tableOrder: tableChecksums[tag] = font.reader.tables[tag].checkSum tableData[tag] = transformTable(font, tag, glyphBBox=glyphBBox, alt255UInt16=alt255UInt16) totalData = "".join([tableData[tag][1] for tag in tableOrder]) compData = brotli.compress(totalData, brotli.MODE_FONT) if len(compData) >= len(totalData): compData = totalData font.close() del font return tableData, compData, tableOrder, tableChecksums
def getWOFFCollectionData(pathOrFiles, MismatchGlyfLoca=False, reverseNames=False): from defaultData import defaultTestData tableChecksums = [] tableData = [] tableOrder = [] collectionDirectory = [] locaIndices = [] fonts = [TTFont(pathOrFile) for pathOrFile in pathOrFiles] for i, font in enumerate(fonts): index = i if reverseNames: index = len(fonts) - i - 1 # Make the name table unique name = font["name"] for namerecord in name.names: nameID = namerecord.nameID string = namerecord.toUnicode() if nameID == 1: namerecord.string = "%s %d" % (string, index) elif nameID == 4: namerecord.string = string.replace("Regular", "%d Regular" % index) elif nameID == 6: namerecord.string = string.replace("-", "%d-" % index) tags = [i for i in sorted(font.keys()) if len(i) == 4] if "glyf" in tags: glyf = tags.index("glyf") loca = tags.index("loca") tags.insert(glyf + 1, tags.pop(loca)) tableIndices = OrderedDict() for tag in tags: data = transformTable(font, tag) if MismatchGlyfLoca and tag in ("glyf", "loca"): tableData.append([tag, data]) tableChecksums.append([tag, font.reader.tables[tag].checkSum]) tableOrder.append(tag) tableIndex = len(tableData) - 1 tableIndices[tag] = tableIndex if tag == "loca": locaIndices.append(tableIndex) else: if [tag, data] not in tableData: tableData.append([tag, data]) tableChecksums.append([tag, font.reader.tables[tag].checkSum]) tableOrder.append(tag) tableIndices[tag] = tableData.index([tag, data]) collectionDirectory.append(dict(numTables=len(tableIndices), flavor=font.sfntVersion, index=tableIndices)) font.close() del font if MismatchGlyfLoca: locaIndices.reverse() for i, entry in enumerate(collectionDirectory): entry["index"]["loca"] = locaIndices[i] totalData = "".join([data[1][1] for data in tableData]) compData = brotli.compress(totalData, brotli.MODE_FONT) if len(compData) >= len(totalData): compData = totalData directory = [dict(tag=tag, origLength=0, transformLength=0, transformFlag=0) for tag in tableOrder] header, directory, collectionHeader, collectionDirectory, tableData = defaultTestData(directory=directory, tableData=tableData, compressedData=compData, collectionDirectory=collectionDirectory) data = packTestHeader(header) data += packTestDirectory(directory, isCollection=True) data += packTestCollectionHeader(collectionHeader) data += packTestCollectionDirectory(collectionDirectory) data += tableData data = padData(data) return data
def getWOFFCollectionData(pathOrFiles, MismatchGlyfLoca=False): from defaultData import defaultTestData tableChecksums = [] tableData = [] tableOrder = [] collectionDirectory = [] locaIndices = [] for i, pathOrFile in enumerate(pathOrFiles): font = TTFont(pathOrFile) # Make the name table unique name = font["name"] for namerecord in name.names: nameID = namerecord.nameID string = namerecord.toUnicode() if nameID == 1: namerecord.string = "%s %d" % (string, i) elif nameID == 4: namerecord.string = string.replace("Regular", "%d Regular" % i) elif nameID == 6: namerecord.string = string.replace("-", "%d-" % i) tags = [i for i in sorted(font.keys()) if len(i) == 4] if "glyf" in tags: glyf = tags.index("glyf") loca = tags.index("loca") tags.insert(glyf + 1, tags.pop(loca)) tableIndices = OrderedDict() for tag in tags: data = transformTable(font, tag) if MismatchGlyfLoca and tag in ("glyf", "loca"): tableData.append([tag, data]) tableChecksums.append([tag, font.reader.tables[tag].checkSum]) tableOrder.append(tag) tableIndex = len(tableData) - 1 tableIndices[tag] = tableIndex if tag == "loca": locaIndices.append(tableIndex) else: if [tag, data] not in tableData: tableData.append([tag, data]) tableChecksums.append( [tag, font.reader.tables[tag].checkSum]) tableOrder.append(tag) tableIndices[tag] = tableData.index([tag, data]) collectionDirectory.append( dict(numTables=len(tableIndices), flavor=font.sfntVersion, index=tableIndices)) font.close() del font if MismatchGlyfLoca: locaIndices.reverse() for i, entry in enumerate(collectionDirectory): entry["index"]["loca"] = locaIndices[i] totalData = "".join([data[1][1] for data in tableData]) compData = brotli.compress(totalData, brotli.MODE_FONT) if len(compData) >= len(totalData): compData = totalData directory = [ dict(tag=tag, origLength=0, transformLength=0) for tag in tableOrder ] header, directory, collectionHeader, collectionDirectory, tableData = defaultTestData( directory=directory, tableData=tableData, compressedData=compData, collectionDirectory=collectionDirectory) data = packTestHeader(header) data += packTestDirectory(directory, isCollection=True) data += packTestCollectionHeader(collectionHeader) data += packTestCollectionDirectory(collectionDirectory) data += tableData data = padData(data) return data