コード例 #1
0
    def optimize(self, origCoords, endPts, tolerance=0.5, isComposite=False):
        from fontTools.varLib.iup import iup_delta_optimize

        if None in self.coordinates:
            return  # already optimized

        deltaOpt = iup_delta_optimize(self.coordinates,
                                      origCoords,
                                      endPts,
                                      tolerance=tolerance)
        if None in deltaOpt:
            if isComposite and all(d is None for d in deltaOpt):
                # Fix for macOS composites
                # https://github.com/fonttools/fonttools/issues/1381
                deltaOpt = [(0, 0)] + [None] * (len(deltaOpt) - 1)
            # Use "optimized" version only if smaller...
            varOpt = TupleVariation(self.axes, deltaOpt)

            # Shouldn't matter that this is different from fvar...?
            axisTags = sorted(self.axes.keys())
            tupleData, auxData, _ = self.compile(axisTags, [], None)
            unoptimizedLength = len(tupleData) + len(auxData)
            tupleData, auxData, _ = varOpt.compile(axisTags, [], None)
            optimizedLength = len(tupleData) + len(auxData)

            if optimizedLength < unoptimizedLength:
                self.coordinates = varOpt.coordinates
コード例 #2
0
ファイル: __init__.py プロジェクト: lisuke/fonttools
def _add_gvar(font, model, master_ttfs, tolerance=0.5, optimize=True):

    assert tolerance >= 0

    log.info("Generating gvar")
    assert "gvar" not in font
    gvar = font["gvar"] = newTable('gvar')
    gvar.version = 1
    gvar.reserved = 0
    gvar.variations = {}

    for glyph in font.getGlyphOrder():

        allData = [_GetCoordinates(m, glyph) for m in master_ttfs]
        allCoords = [d[0] for d in allData]
        allControls = [d[1] for d in allData]
        control = allControls[0]
        if (any(c != control for c in allControls)):
            log.warning("glyph %s has incompatible masters; skipping" % glyph)
            continue
        del allControls

        # Update gvar
        gvar.variations[glyph] = []
        deltas = model.getDeltas(allCoords)
        supports = model.supports
        assert len(deltas) == len(supports)

        # Prepare for IUP optimization
        origCoords = deltas[0]
        endPts = control[1] if control[0] >= 1 else list(range(len(
            control[1])))

        for i, (delta, support) in enumerate(zip(deltas[1:], supports[1:])):
            if all(abs(v) <= tolerance for v in delta.array):
                continue
            var = TupleVariation(support, delta)
            if optimize:
                delta_opt = iup_delta_optimize(delta,
                                               origCoords,
                                               endPts,
                                               tolerance=tolerance)

                if None in delta_opt:
                    # Use "optimized" version only if smaller...
                    var_opt = TupleVariation(support, delta_opt)

                    axis_tags = sorted(support.keys(
                    ))  # Shouldn't matter that this is different from fvar...?
                    tupleData, auxData, _ = var.compile(axis_tags, [], None)
                    unoptimized_len = len(tupleData) + len(auxData)
                    tupleData, auxData, _ = var_opt.compile(
                        axis_tags, [], None)
                    optimized_len = len(tupleData) + len(auxData)

                    if optimized_len < unoptimized_len:
                        var = var_opt

            gvar.variations[glyph].append(var)
コード例 #3
0
ファイル: __init__.py プロジェクト: robmck-ms/fonttools
def _add_gvar(font, model, master_ttfs, tolerance=0.5, optimize=True):

	assert tolerance >= 0

	log.info("Generating gvar")
	assert "gvar" not in font
	gvar = font["gvar"] = newTable('gvar')
	gvar.version = 1
	gvar.reserved = 0
	gvar.variations = {}

	for glyph in font.getGlyphOrder():

		allData = [_GetCoordinates(m, glyph) for m in master_ttfs]
		allCoords = [d[0] for d in allData]
		allControls = [d[1] for d in allData]
		control = allControls[0]
		if (any(c != control for c in allControls)):
			log.warning("glyph %s has incompatible masters; skipping" % glyph)
			continue
		del allControls

		# Update gvar
		gvar.variations[glyph] = []
		deltas = model.getDeltas(allCoords)
		supports = model.supports
		assert len(deltas) == len(supports)

		# Prepare for IUP optimization
		origCoords = deltas[0]
		endPts = control[1] if control[0] >= 1 else list(range(len(control[1])))

		for i,(delta,support) in enumerate(zip(deltas[1:], supports[1:])):
			if all(abs(v) <= tolerance for v in delta.array):
				continue
			var = TupleVariation(support, delta)
			if optimize:
				delta_opt = iup_delta_optimize(delta, origCoords, endPts, tolerance=tolerance)

				if None in delta_opt:
					# Use "optimized" version only if smaller...
					var_opt = TupleVariation(support, delta_opt)

					axis_tags = sorted(support.keys()) # Shouldn't matter that this is different from fvar...?
					tupleData, auxData, _ = var.compile(axis_tags, [], None)
					unoptimized_len = len(tupleData) + len(auxData)
					tupleData, auxData, _ = var_opt.compile(axis_tags, [], None)
					optimized_len = len(tupleData) + len(auxData)

					if optimized_len < unoptimized_len:
						var = var_opt

			gvar.variations[glyph].append(var)
コード例 #4
0
ファイル: __init__.py プロジェクト: chrissimpkins/fonttools
def _add_gvar(font, masterModel, master_ttfs, tolerance=0.5, optimize=True):
    if tolerance < 0:
        raise ValueError("`tolerance` must be a positive number.")

    log.info("Generating gvar")
    assert "gvar" not in font
    gvar = font["gvar"] = newTable('gvar')
    glyf = font['glyf']
    defaultMasterIndex = masterModel.reverseMapping[0]

    # use hhea.ascent of base master as default vertical origin when vmtx is missing
    baseAscent = font['hhea'].ascent
    for glyph in font.getGlyphOrder():

        isComposite = glyf[glyph].isComposite()

        allData = [
            m["glyf"].getCoordinatesAndControls(
                glyph, m, defaultVerticalOrigin=baseAscent)
            for m in master_ttfs
        ]

        if allData[defaultMasterIndex][1].numberOfContours != 0:
            # If the default master is not empty, interpret empty non-default masters
            # as missing glyphs from a sparse master
            allData = [
                d if d is not None and d[1].numberOfContours != 0 else None
                for d in allData
            ]

        model, allData = masterModel.getSubModel(allData)

        allCoords = [d[0] for d in allData]
        allControls = [d[1] for d in allData]
        control = allControls[0]
        if not models.allEqual(allControls):
            log.warning("glyph %s has incompatible masters; skipping" % glyph)
            continue
        del allControls

        # Update gvar
        gvar.variations[glyph] = []
        deltas = model.getDeltas(allCoords,
                                 round=partial(GlyphCoordinates.__round__,
                                               round=round))
        supports = model.supports
        assert len(deltas) == len(supports)

        # Prepare for IUP optimization
        origCoords = deltas[0]
        endPts = control.endPts

        for i, (delta, support) in enumerate(zip(deltas[1:], supports[1:])):
            if all(v == 0 for v in delta.array) and not isComposite:
                continue
            var = TupleVariation(support, delta)
            if optimize:
                delta_opt = iup_delta_optimize(delta,
                                               origCoords,
                                               endPts,
                                               tolerance=tolerance)

                if None in delta_opt:
                    """In composite glyphs, there should be one 0 entry
					to make sure the gvar entry is written to the font.

					This is to work around an issue with macOS 10.14 and can be
					removed once the behaviour of macOS is changed.

					https://github.com/fonttools/fonttools/issues/1381
					"""
                    if all(d is None for d in delta_opt):
                        delta_opt = [(0, 0)] + [None] * (len(delta_opt) - 1)
                    # Use "optimized" version only if smaller...
                    var_opt = TupleVariation(support, delta_opt)

                    axis_tags = sorted(support.keys(
                    ))  # Shouldn't matter that this is different from fvar...?
                    tupleData, auxData, _ = var.compile(axis_tags, [], None)
                    unoptimized_len = len(tupleData) + len(auxData)
                    tupleData, auxData, _ = var_opt.compile(
                        axis_tags, [], None)
                    optimized_len = len(tupleData) + len(auxData)

                    if optimized_len < unoptimized_len:
                        var = var_opt

            gvar.variations[glyph].append(var)
コード例 #5
0
ファイル: __init__.py プロジェクト: PeterDekkers/fonttools
def _add_gvar(font, masterModel, master_ttfs, tolerance=0.5, optimize=True):

    assert tolerance >= 0

    log.info("Generating gvar")
    assert "gvar" not in font
    gvar = font["gvar"] = newTable('gvar')
    gvar.version = 1
    gvar.reserved = 0
    gvar.variations = {}

    glyf = font['glyf']

    # use hhea.ascent of base master as default vertical origin when vmtx is missing
    defaultVerticalOrigin = font['hhea'].ascent
    for glyph in font.getGlyphOrder():

        isComposite = glyf[glyph].isComposite()

        allData = [
            _GetCoordinates(m,
                            glyph,
                            defaultVerticalOrigin=defaultVerticalOrigin)
            for m in master_ttfs
        ]
        model, allData = masterModel.getSubModel(allData)

        allCoords = [d[0] for d in allData]
        allControls = [d[1] for d in allData]
        control = allControls[0]
        if not models.allEqual(allControls):
            log.warning("glyph %s has incompatible masters; skipping" % glyph)
            continue
        del allControls

        # Update gvar
        gvar.variations[glyph] = []
        deltas = model.getDeltas(allCoords)
        supports = model.supports
        assert len(deltas) == len(supports)

        # Prepare for IUP optimization
        origCoords = deltas[0]
        endPts = control[1] if control[0] >= 1 else list(range(len(
            control[1])))

        for i, (delta, support) in enumerate(zip(deltas[1:], supports[1:])):
            if all(abs(v) <= tolerance
                   for v in delta.array) and not isComposite:
                continue
            var = TupleVariation(support, delta)
            if optimize:
                delta_opt = iup_delta_optimize(delta,
                                               origCoords,
                                               endPts,
                                               tolerance=tolerance)

                if None in delta_opt:
                    """In composite glyphs, there should be one 0 entry
					to make sure the gvar entry is written to the font.

					This is to work around an issue with macOS 10.14 and can be
					removed once the behaviour of macOS is changed.

					https://github.com/fonttools/fonttools/issues/1381
					"""
                    if all(d is None for d in delta_opt):
                        delta_opt = [(0, 0)] + [None] * (len(delta_opt) - 1)
                    # Use "optimized" version only if smaller...
                    var_opt = TupleVariation(support, delta_opt)

                    axis_tags = sorted(support.keys(
                    ))  # Shouldn't matter that this is different from fvar...?
                    tupleData, auxData, _ = var.compile(axis_tags, [], None)
                    unoptimized_len = len(tupleData) + len(auxData)
                    tupleData, auxData, _ = var_opt.compile(
                        axis_tags, [], None)
                    optimized_len = len(tupleData) + len(auxData)

                    if optimized_len < unoptimized_len:
                        var = var_opt

            gvar.variations[glyph].append(var)
コード例 #6
0
ファイル: __init__.py プロジェクト: khaledhosny/fonttools
def _add_gvar(font, masterModel, master_ttfs, tolerance=0.5, optimize=True):

	assert tolerance >= 0

	log.info("Generating gvar")
	assert "gvar" not in font
	gvar = font["gvar"] = newTable('gvar')
	gvar.version = 1
	gvar.reserved = 0
	gvar.variations = {}

	glyf = font['glyf']

	for glyph in font.getGlyphOrder():

		isComposite = glyf[glyph].isComposite()

		allData = [_GetCoordinates(m, glyph) for m in master_ttfs]
		model, allData = masterModel.getSubModel(allData)

		allCoords = [d[0] for d in allData]
		allControls = [d[1] for d in allData]
		control = allControls[0]
		if not models.allEqual(allControls):
			log.warning("glyph %s has incompatible masters; skipping" % glyph)
			continue
		del allControls

		# Update gvar
		gvar.variations[glyph] = []
		deltas = model.getDeltas(allCoords)
		supports = model.supports
		assert len(deltas) == len(supports)

		# Prepare for IUP optimization
		origCoords = deltas[0]
		endPts = control[1] if control[0] >= 1 else list(range(len(control[1])))

		for i,(delta,support) in enumerate(zip(deltas[1:], supports[1:])):
			if all(abs(v) <= tolerance for v in delta.array) and not isComposite:
				continue
			var = TupleVariation(support, delta)
			if optimize:
				delta_opt = iup_delta_optimize(delta, origCoords, endPts, tolerance=tolerance)

				if None in delta_opt:
					"""In composite glyphs, there should be one 0 entry
					to make sure the gvar entry is written to the font.

					This is to work around an issue with macOS 10.14 and can be
					removed once the behaviour of macOS is changed.

					https://github.com/fonttools/fonttools/issues/1381
					"""
					if all(d is None for d in delta_opt):
						delta_opt = [(0, 0)] + [None] * (len(delta_opt) - 1)
					# Use "optimized" version only if smaller...
					var_opt = TupleVariation(support, delta_opt)

					axis_tags = sorted(support.keys()) # Shouldn't matter that this is different from fvar...?
					tupleData, auxData, _ = var.compile(axis_tags, [], None)
					unoptimized_len = len(tupleData) + len(auxData)
					tupleData, auxData, _ = var_opt.compile(axis_tags, [], None)
					optimized_len = len(tupleData) + len(auxData)

					if optimized_len < unoptimized_len:
						var = var_opt

			gvar.variations[glyph].append(var)