newbeg
clone your own copy | download snapshot

Snapshots | iceberg

Inside this repository

app.py
text/x-python

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)