def _cloneTypeface(typeface, ttFont, variations): fvar = ttFont.get("fvar") defaultLocation = {a.axisTag: variations.get(a.axisTag, a.defaultValue) for a in fvar.axes} tags = [a.axisTag for a in fvar.axes] location = [(tag, variations.get(tag, defaultLocation[tag])) for tag in tags] makeCoord = skia.FontArguments.VariationPosition.Coordinate rawCoords = [makeCoord(tagToInt(tag), value) for tag, value in location] coords = skia.FontArguments.VariationPosition.Coordinates(rawCoords) pos = skia.FontArguments.VariationPosition(coords) fontArgs = skia.FontArguments() fontArgs.setVariationDesignPosition(pos) return typeface.makeClone(fontArgs)
def _setFontVariationDesignPosition(self, location): from .font import tagToInt makeCoord = skia.FontArguments.VariationPosition.Coordinate rawCoords = [ makeCoord(tagToInt(tag), value) for tag, value in location ] coords = skia.FontArguments.VariationPosition.Coordinates(rawCoords) pos = skia.FontArguments.VariationPosition(coords) fontArgs = skia.FontArguments() fontArgs.setVariationDesignPosition(pos) tf = self.font.getTypeface().makeClone(fontArgs) self.font.setTypeface(tf)
def draw(pen, state, data): if state != 0: return if not pen.visible: return if isinstance(pen, DATText): if isinstance(pen.style.font, str): font = skia.Typeface(pen.style.font) else: font = skia.Typeface.MakeFromFile(str(pen.style.font.path)) if len(pen.style.variations) > 0: fa = skia.FontArguments() # h/t https://github.com/justvanrossum/drawbot-skia/blob/master/src/drawbot_skia/gstate.py to_int = lambda s: struct.unpack( ">i", bytes(s, "ascii"))[0] makeCoord = skia.FontArguments.VariationPosition.Coordinate rawCoords = [ makeCoord(to_int(tag), value) for tag, value in pen.style.variations.items() ] coords = skia.FontArguments.VariationPosition.Coordinates( rawCoords) fa.setVariationDesignPosition( skia.FontArguments.VariationPosition(coords)) font = font.makeClone(fa) pt = pen.frame.point("SW") canvas.drawString( pen.text, pt.x, rect.h - pt.y, skia.Font(font, pen.style.fontSize), skia.Paint(AntiAlias=True, Color=pen.style.fill.skia())) if state == 0: SkiaPen(pen, rect, canvas, scale, style=style, alpha=pen.calc_alpha())
def test_Typeface_makeClone(typeface): assert isinstance(typeface.makeClone(skia.FontArguments()), skia.Typeface)
def fontarguments(): return skia.FontArguments()