mirror of
https://bjh21.me.uk/bedstead/.git
synced 2026-07-09 13:33:06 -04:00
97 lines
3.1 KiB
Python
97 lines
3.1 KiB
Python
# SPDX-License-Identifier: CC0-1.0
|
|
|
|
from __future__ import print_function
|
|
|
|
import fontforge
|
|
from math import radians
|
|
from psMat import translate
|
|
from sys import argv
|
|
|
|
class Stroker(object):
|
|
def __init__(self, fontname):
|
|
self.fontname = fontname
|
|
self.dotwidth = max(0, 100 - self.nibwidth)
|
|
self.dotheight = max(0, 100 - self.nibheight)
|
|
def modify_font(self, f):
|
|
f.strokedfont = False
|
|
|
|
for g in f.glyphs():
|
|
for i, c in enumerate(list(g.layers[1])):
|
|
newc = self.adjust_contour(c)
|
|
if newc != None: g.layers[1] += newc
|
|
g.stroke(*self.nib)
|
|
g.removeOverlap()
|
|
g.addExtrema()
|
|
g.transform(translate(0, self.nibheight/2.0))
|
|
|
|
f.familyname = self.familyname
|
|
f.fontname = self.fontname
|
|
f.fullname = self.fullname
|
|
f.appendSFNTName('English (US)', 'Preferred Family', self.familyname)
|
|
f.private['StdHW'] = self.nibheight
|
|
f.private['StdVW'] = self.nibwidth
|
|
def adjustblue(y): return y - 100 + self.nibheight
|
|
bv = list(f.private['BlueValues'])
|
|
bv[1:] = map(adjustblue, bv[1:])
|
|
f.private['BlueValues'] = tuple(bv)
|
|
f.uwidth = self.nibheight
|
|
f.os2_weight = self.ttfweight
|
|
f.weight = self.weight
|
|
return f
|
|
def adjust_contour(self, c):
|
|
# This function just expands dots.
|
|
if len(c) != 1: return None
|
|
if self.dotwidth == 0 and self.dotheight == 0: return None
|
|
newc = fontforge.contour()
|
|
newc.moveTo(c[0].x + self.dotwidth/2, c[0].y)
|
|
newc.lineTo(c[0].x, c[0].y + self.dotheight/2)
|
|
newc.lineTo(c[0].x - self.dotwidth/2, c[0].y)
|
|
newc.lineTo(c[0].x, c[0].y - self.dotheight/2)
|
|
newc.closed = True
|
|
return newc
|
|
|
|
class Plotter(Stroker):
|
|
familyname = "Bedstead Plotter"
|
|
def __init__(self, penwidth, weight, ttfweight):
|
|
self.nib = ['circular', penwidth, 'round', 'round']
|
|
self.nibwidth = self.nibheight = penwidth
|
|
self.fontname = "BedsteadPlotter-" + weight
|
|
self.fullname = "%s %s" % (self.familyname, weight)
|
|
self.ttfweight = ttfweight
|
|
self.weight = weight
|
|
super(Plotter, self).__init__("BedsteadPlotter-" + weight)
|
|
|
|
class Chiseltip(Stroker):
|
|
familyname = "Bedstead Chiseltip"
|
|
fullname = "Bedstead Chiseltip"
|
|
weight = "Medium"
|
|
ttfweight = 500
|
|
def __init__(self):
|
|
chisel = fontforge.contour()
|
|
chisel.moveTo(-56, 7)
|
|
chisel.lineTo(39, 41)
|
|
chisel.lineTo(56, -7)
|
|
chisel.lineTo(-39, -41)
|
|
chisel.closed = True
|
|
self.nib = ['polygonal', chisel]
|
|
self.nibwidth = 112
|
|
self.nibheight = 82
|
|
super(Chiseltip, self).__init__("BedsteadChiseltip")
|
|
|
|
modes = {
|
|
'plotter-thin': Plotter(10, "Thin", 100),
|
|
'plotter-light': Plotter(50, "Light", 300),
|
|
'plotter-medium': Plotter(100, "Medium", 500),
|
|
'plotter-bold': Plotter(150, "Bold", 700),
|
|
'chiseltip': Chiseltip(),
|
|
}
|
|
|
|
mode = modes[argv[1]]
|
|
|
|
f = fontforge.open(argv[2])
|
|
|
|
mode.modify_font(f)
|
|
|
|
f.save(argv[3])
|
|
|