def test_sparse_mmotf(tmpdir): base = "%s/sparse_masters" % DATA_DIR paths = sorted(glob.glob(base + "/*.otf")) # the reference font is modified in-place, make a temp copy first # MasterSet_Kanji-w0.00.otf has to be the reference font. reference = make_temp_copy(tmpdir, paths[0]) inpaths = paths[1:] outpaths = [str(tmpdir / basename(p)) + ".out" for p in inpaths] options = Options(reference, inpaths, outpaths) options.allow_no_blues = True hintFiles(options) refs = [p + ".ref" for p in paths] for ref, out in zip(refs, [reference] + outpaths): for path in (ref, out): font = TTFont(path) assert "CFF " in font writer = XMLWriter(str(tmpdir / basename(path)) + ".xml") font["CFF "].toXML(writer, font) writer.close() assert differ([ str(tmpdir / basename(ref)) + ".xml", str(tmpdir / basename(out)) + ".xml" ])
def test_otf(otf, tmpdir): out = str(tmpdir / basename(otf)) + ".out" options = Options(otf, out) hintFiles(options) for path in (otf, out): font = TTFont(path) assert "CFF " in font writer = XMLWriter(str(tmpdir / basename(path)) + ".xml") font["CFF "].toXML(writer, font) writer.close() assert differ([str(tmpdir / basename(otf)) + ".xml", str(tmpdir / basename(out)) + ".xml"])
def test_cff(cff, tmpdir): out = str(tmpdir / basename(cff)) + ".out" options = Options(cff, out) hintFiles(options) for path in (cff, out): font = CFFFontSet() writer = XMLWriter(str(tmpdir / basename(path)) + ".xml") with open(path, "rb") as fp: font.decompile(fp, None) font.toXML(writer) writer.close() assert differ([str(tmpdir / basename(cff)) + ".xml", str(tmpdir / basename(out)) + ".xml"])
def test_vfotf(otf, tmpdir): out = str(tmpdir / basename(otf)) + ".out" options = Options(None, [otf], [out]) options.allow_no_blues = True hintFiles(options) for path in (otf, out): font = TTFont(path) assert "CFF2" in font writer = XMLWriter(str(tmpdir / basename(path)) + ".xml") font["CFF2"].toXML(writer, font) writer.close() assert differ([ str(tmpdir / basename(otf)) + ".xml", str(tmpdir / basename(out)) + ".xml" ])
def test_decimals_otf(tmpdir): otf = "%s/dummy/decimals.otf" % DATA_DIR out = str(tmpdir / basename(otf)) + ".out" options = Options(otf, out) options.round_coords = False hintFiles(options) for path in (otf, out): font = TTFont(path) assert "CFF " in font writer = XMLWriter(str(tmpdir / basename(path)) + ".xml") font["CFF "].toXML(writer, font) writer.close() assert differ([str(tmpdir / basename(otf)) + ".xml", str(tmpdir / basename(out)) + ".xml"])
def write_sbix_to_file(filename): basename = os.path.basename(filename) xml_filename = basename + '.xml' out_filename = os.path.join(os.getcwd(), xml_filename) if os.path.exists(out_filename): print('%s already exists. not extracting' % out_filename) return out_filename print('extracting sbix chunk to file %s' % out_filename) with open(out_filename, 'wb') as fx: mx = XMLWriter(fx) mx.begintag("root") font = TTFont(filename, fontNumber=1) bix = font['sbix'] bix.toXML(xmlWriter=mx, ttFont=font) mx.endtag("root") mx.close() return out_filename
def test_mmotf(base, tmpdir): paths = sorted(glob.glob(base + "/*.otf")) # the reference font is modified in-place, make a temp copy first reference = make_temp_copy(tmpdir, paths[0]) inpaths = paths[1:] outpaths = [str(tmpdir / basename(p)) + ".out" for p in inpaths] options = Options(reference, inpaths, outpaths) hintFiles(options) refs = [p + ".ref" for p in paths] for ref, out in zip(refs, [reference] + outpaths): for path in (ref, out): font = TTFont(path) assert "CFF " in font writer = XMLWriter(str(tmpdir / basename(path)) + ".xml") font["CFF "].toXML(writer, font) writer.close() assert differ([ str(tmpdir / basename(ref)) + ".xml", str(tmpdir / basename(out)) + ".xml" ])
class WoffMetaDataWriter(object): def __init__(self, metaDataPath, fontPath): self.writer = XMLWriter(metaDataPath, encoding="UTF-8") self.font = Font(fontPath) self.beginMetaData() self.uniqueId() self.vendor() self.credits() self.description() self.license() self.copyright() self.trademark() self.endMetaData() self.writer.close() def beginMetaData(self): self.writer.begintag("metadata") self.writer.newline() def uniqueId(self): url = self.font.info.get("openTypeNameManufacturerURL") if not url: return reverseUrl = reverseDomain(url) name = "%s%s" % (self.font.info.familyName, self.font.info.styleName) name = name.replace(" ", "") self.writer.simpletag("uniqueid", id="%s.%s" % (reverseUrl, name)) self.writer.newline() def vendor(self): name = self.font.info.get("openTypeNameManufacturer") url = self.font.info.get("openTypeNameManufacturerURL") if not name or not url: return self.writer.simpletag("vendor", name=name, url=url) self.writer.newline() def credits(self): manufacturerName = self.font.info.get("openTypeNameManufacturer") manufacturerUrl = self.font.info.get("openTypeNameManufacturerURL") designerName = self.font.info.get("openTypeNameDesigner") designerUrl = self.font.info.get("openTypeNameDesignerURL") if not manufacturerName and not manufacturerUrl and not designerName and not designerUrl: return self.writer.begintag("credits") self.writer.newline() if manufacturerName and manufacturerUrl: manufacturerName = manufacturerName.encode("utf-8") self.writer.simpletag("credit", name=manufacturerName, url=manufacturerUrl, role="Foundry") self.writer.newline() if designerName and designerUrl: designerName = designerName.encode("utf-8") self.writer.simpletag("credit", name=designerName, url=designerUrl, role="Designer") self.writer.newline() self.writer.endtag("credits") self.writer.newline() def _addData(self, tag, infoAttr, extra=dict()): data = self.font.info.get(infoAttr) if not data: return data = data.encode("utf-8") self.writer.begintag(tag, **extra) self.writer.newline() self.writer.begintag("text", lang="en") self.writer.newline() self.writer.write(data) self.writer.endtag("text") self.writer.newline() self.writer.endtag(tag) self.writer.newline() def description(self): self._addData("description", "openTypeNameDescription") def license(self): extra = dict() licenseUrl = self.font.info.get("openTypeNameLicenseURL") if licenseUrl: extra["url"] = licenseUrl self._addData("license", "openTypeNameLicense", extra) def copyright(self): self._addData("copyright", "copyright") def trademark(self): self._addData("trademark", "trademark") def endMetaData(self): self.writer.endtag("metadata") self.writer.newline()