Download raw (2.0 KB)
import fontforge import math import os, os.path from flask import Flask, send_file, render_template, request, abort skeletons = { 'HersheySans1': os.path.abspath('fonts/skeletons/HersheySans1.svg'), 'HersheySerifMed': os.path.abspath('fonts/skeletons/HersheySerifMed.svg') } app = Flask(__name__) @app.route('/font', methods=["GET"]) def font (): outputDir = os.path.abspath(os.path.join("fonts", "generated")) skeleton = request.args['skeleton'] scaleX = float(request.args['scaleX']) scaleY = float(request.args['scaleY']) skewX = math.tan(math.radians(min(float(request.args['skew']), 70))) # matrix(scaleX(), skewY(), skewX(), scaleY(), translateX(), translateY()) matrix = [ scaleX, 0, skewX, scaleY, 0, 0 ] pen = request.args['pen'] # https://fontforge.org/docs/scripting/python/fontforge.html#fontforge.glyph.stroke penWidth = max(10, int(request.args['penWidth'])) penMinorWidth = max(10, int(request.args['penMinorWidth'])) penAngle = int(request.args['penAngle']) fontname = "{}-{:.2f}-{:.2f}-{:.2f}-{}-{}-{}-{}.otf".format(skeleton, scaleX, scaleY, skewX, pen, penWidth, penMinorWidth, penAngle) fontPath = os.path.join(outputDir, fontname) if not os.path.exists(outputDir): os.makedirs(outputDir) if not os.path.exists(fontPath): print(skeletons[skeleton]) font = fontforge.open(skeletons[skeleton]) for glyph in font.glyphs(): glyph.transform(matrix) if glyph.glyphname in [ "six", "eight", "nine"]: # Avoid part of the glyph to be filled glyph.stroke(pen, penWidth, penMinorWidth, cap="nib", join="nib", angle=penAngle, removeoverlap="contour") else: glyph.stroke(pen, penWidth, penMinorWidth, cap="nib", join="nib", angle=penAngle) glyph.correctDirection() font.generate(fontPath) font.close() # finally: # font.close() # return abort(500) return send_file(fontPath) @app.route('/') def index (): context = { 'skeletons': skeletons } return render_template('index.html', **context)