Ejemplo n.º 1
0
    def generate(self):

        doc = mutatorMath.ufo.document.DesignSpaceDocumentWriter(
            os.path.abspath(kit.relative_to_cwd(self.get_path()))
        )

        for i, master in enumerate(self.project.family.masters):

            doc.addSource(

                path = os.path.abspath(kit.relative_to_cwd(master.get_path())),
                name = "master " + master.name,
                location = {
                    "axis " + str(axis_number): axis_position
                    for axis_number, axis_position in enumerate(master.location)
                },

                copyLib    = i == 0,
                copyGroups = i == 0,
                copyInfo   = i == 0,

                # muteInfo = False,
                # muteKerning = False,
                # mutedGlyphNames = None,

            )

        for product in self.project.products:
            if not product.subsidiary:
                style = product.style
                doc.startInstance(
                    name = "instance " + style.name,
                    location = {
                        "axis " + str(axis_number): axis_position
                        for axis_number, axis_position in enumerate(style.location)
                    },
                    familyName = self.project.family.name,
                    styleName = style.name,
                    fileName = os.path.abspath(
                        kit.relative_to_cwd(style.get_path())
                    ),
                    postScriptFontName = style.full_name_postscript,
                    # styleMapFamilyName = None,
                    # styleMapStyleName = None,
                )
                doc.writeInfo()
                if self.project.options["prepare_kerning"]:
                    doc.writeKerning()
                doc.endInstance()
        doc.save()
Ejemplo n.º 2
0
    def __init__(
        self,
        family,
        target_tag=None,
        release_commit=None,  # (65535, 999)
        fontrevision="1.000",
        options={},
    ):

        self.family = family
        self.family.project = self

        self.target_tag = kit.fallback(target_tag, self.family.source_tag)

        if release_commit:
            release, commit = release_commit
            self.version = Version(release, commit, 1)
            self.version_last = Version(None, None, None)
            version_record_path = kit.relative_to_cwd("version{}.txt".format(
                "-" + self.target_tag if self.target_tag else ""))
            try:
                with open(version_record_path, "r") as f:
                    for line in f.read().splitlines():
                        k, _, v = line.partition(" ")
                        setattr(self.version_last, k, int(v))
            except IOError as e:
                if e.errno == errno.ENOENT:
                    pass
                else:
                    raise
            if (self.version.release,
                    self.version.commit) == (self.version_last.release,
                                             self.version_last.commit):
                self.version.build = self.version_last.build + 1
            with open(version_record_path, "w") as f:
                for k in ["release", "commit", "build"]:
                    f.write("{} {}\n".format(k, getattr(self.version, k)))
            self.fontrevision = "{}.{}".format(
                self.version.release,
                str(self.version.commit).zfill(3),
            )
            self.version_string = "{}b{}".format(
                self.fontrevision,
                self.version.build,
            )
        else:
            self.version = None
            self.version_last = None
            self.fontrevision = fontrevision
            self.version_string = None

        # (light_min, light_max), (bold_min, bold_max)
        self.adjustment_for_matching_mI_variants = None

        self.abbrs_of_scripts_to_match_mI_variants = []
        self.script_abbr_current = None

        self.options = {
            "prepare_masters": True,
            "prepare_styles": True,
            "prepare_features": True,
            "compile": True,
            "prepare_kerning": False,
            "prepare_mark_positioning": False,
            "prepare_mark_to_mark_positioning": True,
            "match_mI_variants": 0,
            "match_mI_variants_for_scripts": None,
            "position_marks_for_mI_variants": False,
            "run_makeinstances": True,
            "do_normalize": True,
            "run_checkoutlines": True,
            "run_autohint": False,
            "build_ttf": False,
            "override_GDEF": True,
            "override_x_and_cap_heights": False,
            "do_style_linking": False,
            "use_mac_name_records": False,
            "use_os_2_version_4": False,
            "prefer_typo_metrics": False,
            "is_width_weight_slope_only": False,
            "additional_unicode_range_bits": [],
            "additional_code_pages": [],
        }

        self.options.update(options)

        self.glyph_data = kit.GlyphData()

        self.designspace = kit.DesignSpace(self)
        self.fmndb = kit.Fmndb(self)

        self._finalize_options()
Ejemplo n.º 3
0
    def build(self):

        self.reset_directory("intermediates")

        if self.options["prepare_masters"]:

            # self.reset_directory("masters", temp=True)

            for master in self.family.masters:
                master.prepare()
                if hasattr(master, "postprocess"):
                    master.postprocess()
                    master.refresh_groups()

            for master in self.family.masters:
                master.save()

        if self.options["prepare_styles"]:

            # self.reset_directory("styles", temp=True)

            self.family.prepare_styles()

        if self.options["prepare_features"]:

            # self.reset_directory("features", temp=True)

            if self.family.styles[0].file_format == "UFO":
                reference_font = self.products[0].style.open()
                self.family.info.unitsPerEm = reference_font.info.unitsPerEm
            elif self.family.styles[0].file_format == "OTF":
                reference_font = fontTools.ttLib.TTFont(
                    self.products[0].style.get_path())
                self.family.info.unitsPerEm = reference_font["head"].unitsPerEm

            self.feature_classes = kit.FeatureClasses(self)
            self.feature_tables = kit.FeatureTables(self)
            self.feature_languagesystems = kit.FeatureLanguagesystems(self)
            self.feature_gsub = kit.FeatureGSUB(self)
            self.feature_gpos = kit.FeatureGPOS(self)

            self.feature_classes.prepare()
            self.feature_tables.prepare()
            self.feature_languagesystems.prepare()
            self.feature_gsub.prepare()
            self.feature_gpos.prepare()

            for product in (i for i in self.products
                            if i.file_format == "OTF"):

                self.feature_kern = kit.FeatureKern(self, style=product.style)
                self.feature_mark = kit.FeatureMark(self, style=product.style)
                self.feature_matches = kit.FeatureMatches(self,
                                                          style=product.style)
                self.feature_OS2_extension = kit.FeatureOS2Extension(
                    self, style=product.style)
                self.feature_name_extension = kit.FeatureNameExtension(
                    self, style=product.style)
                self.features_references = kit.FeatureReferences(
                    self, style=product.style)
                self.features_references._extension = ""

                if self.options["prepare_kerning"]:
                    self.feature_kern.prepare()
                if self.options["prepare_mark_positioning"]:
                    self.feature_mark.prepare()
                if self.options["match_mI_variants"]:
                    self.feature_matches.prepare()
                self.feature_OS2_extension.prepare()
                self.feature_name_extension.prepare()
                self.features_references.prepare()

        if self.options["compile"]:

            # self.reset_directory("products", temp=True)

            self.fmndb.prepare()

            for product in self.products:
                product.generate()

            products_built = [i for i in self.products if i.built]

        client_data = self.family.get_client_data()

        if client_data.name == "Google Fonts" and not self.args.test:

            with open(kit.relative_to_package("data/template-OFL.txt")) as f:
                template = f.read()
            with open(kit.relative_to_cwd("OFL.txt"), "w") as f:
                f.write(template.format(client_data.tables["name"][0]))

            file_format_to_paths = collections.defaultdict(list)
            for product in products_built:
                file_format_to_paths[product.file_format].append(
                    product.get_path(temp=False))
            for file_format, paths in list(file_format_to_paths.items()):
                archive_filename = "{}-{}-{}.zip".format(
                    self.family.name_postscript,
                    self.fontrevision.replace(".", ""),
                    file_format,
                )
                archive_path = os.path.join(self.directories["products"],
                                            archive_filename)
                kit.remove(archive_path)
                subprocess.call(["zip", "-j", archive_path] + paths)
                print("[ZIPPED]", archive_path)
                subprocess.call(["ttx", "-fq"] + paths)
                print("[TTX DUMPED]")
                for path in paths:
                    kit.remove(path)
                    print("[REMOVED]", path)