frunge-internal
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Frunge] Metaſpline


From: Martin Roppelt
Subject: [Frunge] Metaſpline
Date: Thu, 11 Jun 2009 03:08:47 +0200
User-agent: Thunderbird 2.0.0.21 (X11/20090319)

Wie bereits angekündigt, werde ich etwas über meine Metaſchriftſprache ſchreiben: Sie iſt weniger mächtig als MetaFont/mf2ps1 aber auch parametriſierbar und kann Makros definieren. Für mich bietet ſich dieſer Anſatz geradezu an, da ich das Zeichnen von Outlines mit Fontforge als ſehr anſstrengend empfinde. Zudem iſt es damit einfacher z. B. einen Parameter zu ändern und der ganze Font verändert ſich mit. Außerdem planen wir ja eine normale und eine Zierſchrift anzubieten (in einer Schrift mittels OpenTypes ſtylistic ſets (ſalt) (\addfontfeature{Variant=01} etc.). Zuſätzlich bieten ſich noch weitere Varianten an. Siehe auch angehängte Dateien:

Sie sind ſtrikt getrennt: meta.ms enthält die Definition der Fontparameter und der Styliſtiſchen Alternativen. In weiteren Dateien ſind dann die Anweiſungen für die jeweiligen Buchſtaben zu finden.

Ich glaube aber wir ſollten beſſer MetaFont benutzen (mit mf2ps1-Umwandlung). Das iſt etabliert und mächtiger. Für Metaſpline (oder beſſer: Metaſpleen?) müſſte ich erſt einen Prozeſſor ſchreiben, der aber ziemlich ſimpel wäre, da die Sprache nicht deklarativ iſt und ſich eng an das sfd-Format anlehnt. Eigentlich müſſte man ſie ja Spline Aſſembler nennen, denn ſo ſieht ſie jedenfalls aus. :>

Ich werde, wenn ich, wie versprochen, die Verbindungsserifen entfernt habe, die Mixtura hochladen, damit wir Kerning, (Hinting, für mf2ps1 noch zu früh?), und OpenType-Features implementieren können.
/* first block gives standard values
@ is the spline data replacer */
#Blocks are delimited by blank lines

MetaSplineFont
Flags: W
LayerCount: 2
Fore
SplineSet
@
EndSplineSet
EndChar

Variants:
#the numbers are bit positions for easier access within salt tables and build
#the glyph name: n.v42 (decimal)
b 0 #begin: upper serif / ornament
m 1 #middle: connecting serifs (textualis)
e 2 #end: lower serif / ornament
s 3 #serif: ascender / descender serif
#h 4 #half: half serifs
#d 5 #down: shifted serifs
#t 6 #dot: dotted serifs
#biting: not defined here, it's done by kerning (or more generally: ligatures / 
substitution)

Alternates: alt
#those are also accessed by salt, but named differently: k.alt.v01

#font specification

#π: π #for angle definitions (shall be implemented)
Φ: 1+√5
Φ: Φ:2
#Φ: (1+√5):2 #goldener Schnitt

stem: 200
ylead: 3serif #300
xlead: stem #200
serif: stem:2 #100
offset: stem:2 #100
asc: x+ylead+serif #1300
dsc: -ylead-serif #-400
x: 2ylead+3serif #900
#stem=xlead=2serif=2offset=3:2ylead: 200 #=200
#…
/* #angles in percent
featherangle: 1:1 #x:y
stemangle: 0
serifangle: 1
yserif: serifangle∙serif?
ystem: featherangle∙stem */

/* Macro block:
Spline(var1 var2 …): #or:
Spline(n): #requires n parameters
Commands

Spline(v)
 selects (v): selector
  i. e. (v): is only applied if v is listed
 applies v: application
  i. e. v: is only applied if v is set
 */

/* 
All moves are relative!
x y #soft move (return to saved origin after drawing)
 x y #draw a line (indentation!)
x y ! #hard move (move origin)
The last origin defines the advance width (and is the origin for the next char).

If-construct:
condition: command
Indentations can be defined in the same line if it is a movement, for example.
*/

#single strokes

#ascender single stroke
asgl(s e):
sglm
 strm(asc)
s: asrf
e: lsrf
offm

#x-height single stroke
xsgl(b e):
sglm
 strm(x)
b: usrf
e: lsrf
offm

#descender single stroke
dsgl(b s):
sglm
0 dsc
 strm(-dsc)
b: usrf
s: dsrf
offm

#g / y single stroke
gysgl(b e):
b: usrf
0 dsc+serif+stem+xlead
 strm(2ylead+serif)
e: lsrf

#j / z single stroke
jzsgl(b e):
…

#round halfs

#x-height round half
xhlf(1):
(b): 0 0
(e): 0 serif+ylead
 strm(ylead+2serif)
(b): 0 0
 (b): srfm (2stem+xlead)
(e): usrf
b: usrf
e: lsrf
stem 0 !

#serifs

#ascender serif
asrf:
-100 asc-stem-xlead-serif
 srfm

#upper serif
usrf:
-100 x-stem-xlead-serif
 srfm

#middle serif
msrf:
0 2∙serif
 srfm

#lower serif
lsrf:
0 0
 srfm

#descender serif
dsrf:
0 dsc
 srfm

#dots

#dot over x-height
xdot:
0 x+stem
 strm(stem)

#dot serifs

#…

#moves

#single stroke move
sglm:
offset 0 !

#stroke move
strm(n):
0 n
stem stem
0 -n

#offset move
offm:
stem+xlead-offset 0 !

#serif move
srfm:
oblm(stem+xlead)

#oblique move
oblm(n):
0 serif
n n
0 -serif

#back move
bckm(n):
stem stem
n -n
-stem -stem

#dot serif move
dtsm:
bckm(stem)
a(b e):
xhlf(b)
xsgl(1 e)

b(b e):
asgl(b 1)
xhlf(e)

c(b e):
xhlf(b)
usrf
e: lsrf
stem-serif:2 0 !

d(b s e):
xhlf(b)
uxsrf
asgl(s e)

e(b e):
msrf
xhlf(b)
usrf
e: lsrf
0 3serif+ylead
 sglm(3serif)
stem:2 0 !

f:
xsgl
…

g(b !e):
dsrf
xhlf(b)
gysgl(e)

h(s m e):
asgl(s m)
xsgl(1 e)

i:
xdot
xsgl(b e)

j(b e):
xdot
jzsgl(b e)

k(s alt):
asgl(s 1)
?

l:
asgl(b e)

m(b m e):
xsgl(b m)
xsgl(1 m)
xsgl(1 e)

n:
xsgl(b m)
xsgl(1 e)

o:
xhlf(b)
xhlf(e)
-50 0 !

p(b s e):
dsgl(b s)
lsrf
xhlf(e)

q:
xhlf(b)
?
?

r(b e):
xsgl(b)
usrf
?

longs Å¿:
(f)?
…

s(b e):
msrf
xhlf(b)
usrf
e: lsrf
…

t(b e):
asgl(b e)
…

u(b m e):
xsgl(b 1)
xsgl(m e)

v(b e):
xsgl(b 1)
xhlf(e)

w(b m e):
xsgl(b m)
xsgl(1 1)
xhlf(e)

x(b e):
msrf
xsgl(b 0)
xsgl(0 e)

y(b m !e):
dsrf
xsgl(b 1)
gysgl(m e)

z(b !e):
-xlead 0
 srfm
jzsgl(b e)

reply via email to

[Prev in Thread] Current Thread [Next in Thread]