Recursive generation is now much smarter and faster.

This commit is contained in:
Belleve Invis 2015-07-26 16:41:12 +08:00
parent 036024ba7f
commit b775d8db4e
7 changed files with 6337 additions and 5997 deletions

View file

@ -1,7 +1,7 @@
### Zoom all glyphs ### Zoom all glyphs
foreach glyph [items-of glyphList] : begin { if [upmscale != 1] : foreach glyph [items-of glyphList] : begin {
glyph.advanceWidth = glyph.advanceWidth * upmscale glyph.advanceWidth = glyph.advanceWidth * upmscale
if glyph.contours: foreach contour [items-of glyph.contours] : foreach point [items-of contour] : begin { if glyph.contours: foreach contour [items-of glyph.contours] : foreach point [items-of contour] : begin {
point.x = point.x * upmscale point.x = point.x * upmscale
@ -9,7 +9,9 @@ foreach glyph [items-of glyphList] : begin {
} }
} }
set font.glyf : font.glyf.filter : function [glyph] : glyph && [not glyph.dontExport] if [not recursive] : set font.glyf : font.glyf.filter : function [glyph] : glyph && [not glyph.dontExport]
set font.glyfMap glyphs set font.glyfMap glyphs
return font return font
} }
exports.build = buildFont

View file

@ -8,12 +8,12 @@ define [mix a b p] : a + [b - a] * p
define [linreg x0 y0 x1 y1 x] : y0 + [x - x0] * [y1 - y0] / [x1 - x0] define [linreg x0 y0 x1 y1 x] : y0 + [x - x0] * [y1 - y0] / [x1 - x0]
define [fallback] : for [local j 0] [j < arguments.length] [inc j] : if [arguments`j !== nothing] : return arguments`j define [fallback] : for [local j 0] [j < arguments.length] [inc j] : if [arguments`j !== nothing] : return arguments`j
define [exports.build para picks] : begin { define emptyFontStr : JSON.stringify [require './empty.json']
define [buildFont para recursive] : begin {
define variantSelector para.variantSelector define variantSelector para.variantSelector
define font : JSON.parse emptyFontStr
define font : JSON.parse : JSON.stringify [require './empty.json']
define glyphList font.glyf define glyphList font.glyf
define glyphs (.'.notdef' glyphList.0) define glyphs (.'.notdef' glyphList.0)
define unicodeGlyphs () define unicodeGlyphs ()
@ -194,9 +194,17 @@ define-macro glyph-construction : syntax-rules {
local dependencyProfile (.) local dependencyProfile (.)
local nTemp 0 local nTemp 0
local pickHash : if recursive {
then : let [h (.)] : begin {
foreach j [items-of recursive] : set h.(j) j
* h
}
else nothing
}
define [create-glyph name actions] : piecewise { define [create-glyph name actions] : piecewise {
[name && actions] : begin { [name && actions] : begin {
if [picks && [picks.indexOf name] < 0] : return nothing if [pickHash && [not pickHash.(name)]] : return nothing
console.log : "Building /" + name + [if recursive " (recursive)" ""] + " for " + para.family + ' ' + para.style
set dependencyProfile`name () set dependencyProfile`name ()
define glyphObject [new Glyph name] define glyphObject [new Glyph name]
glyphList.push glyphObject glyphList.push glyphObject
@ -216,13 +224,13 @@ define [create-glyph name actions] : piecewise {
} }
} }
define [select-variant glyphid unicode default] : begin { define [select-variant name unicode default] : begin {
if [picks && [picks.indexOf glyphid] < 0] : return nothing if [pickHash && [not pickHash.(name)]] : return nothing
local variant : variantSelector`glyphid || default local variant : variantSelector`name || default
local chosenGlyph glyphs`[glyphid + '.' + variant] local chosenGlyph glyphs`[name + '.' + variant]
set glyphs`glyphid chosenGlyph set glyphs`name chosenGlyph
local allAliases : Object.keys glyphs :.filter [[k] -> [glyphs`k === glyphs.(chosenGlyph.name)]] local allAliases : Object.keys glyphs :.filter [[k] -> [glyphs`k === glyphs.(chosenGlyph.name)]]
set dependencyProfile`glyphid : allAliases.concat dependencyProfile.(chosenGlyph.name) set dependencyProfile`name : allAliases.concat dependencyProfile.(chosenGlyph.name)
if unicode : begin { if unicode : begin {
chosenGlyph.assign-unicode unicode chosenGlyph.assign-unicode unicode
set chosenGlyph.dontExport false set chosenGlyph.dontExport false
@ -232,8 +240,6 @@ define [select-variant glyphid unicode default] : begin {
###### HERE WE GO! ###### HERE WE GO!
define [xgrid p] : mix SB RIGHTSB p
create-glyph 'space' : glyph-construction { create-glyph 'space' : glyph-construction {
set-width WIDTH set-width WIDTH
assign-unicode ' ' assign-unicode ' '

File diff suppressed because it is too large Load diff

View file

@ -62,20 +62,20 @@ create-glyph 'latin1cedilla' : glyph-construction {
include glyphs.cedillaBelow include glyphs.cedillaBelow
} }
define [Miniature glyphs fold scale] : begin {
define [Miniature glyphid fold scale] : begin {
local forkedPara : Object.create para local forkedPara : Object.create para
forkedPara.upmscale = 1 forkedPara.upmscale = 1
forkedPara.buildFor = glyphid
forkedPara.stroke = [adviceBlackness fold] / scale forkedPara.stroke = [adviceBlackness fold] / scale
forkedPara.sb = SB / 2 forkedPara.sb = SB / 2
local forkFont : exports.build forkedPara (glyphid :: dependencyProfile.(glyphid)) local shouldBuildList ()
return forkFont.glyfMap`glyphid foreach glyphid [items-of glyphs] : set shouldBuildList : shouldBuildList.concat (glyphid :: dependencyProfile.(glyphid))
local forkFont : buildFont forkedPara shouldBuildList
return forkFont.glyfMap
} }
define [CircledGlyph glyphid] : glyph-construction { define [CircledGlyph glyphid] : glyph-construction {
local sw [adviceBlackness 6] local sw [adviceBlackness 6]
include : create-glyph : glyph-construction { include : create-glyph : glyph-construction {
include : Miniature glyphid 4.2 0.6 include [Miniature (glyphid) 4.2 0.6].(glyphid)
apply-transform : Upright apply-transform : Upright
apply-transform : Scale 0.45 apply-transform : Scale 0.45
apply-transform : Translate [[WIDTH - WIDTH * 0.45] / 2] [sw * 2] apply-transform : Translate [[WIDTH - WIDTH * 0.45] / 2] [sw * 2]
@ -86,11 +86,13 @@ define [CircledGlyph glyphid] : glyph-construction {
apply-transform : Translate 0 [parenMid - [CAP * 0.45 + sw * 4] / 2] apply-transform : Translate 0 [parenMid - [CAP * 0.45 + sw * 4] / 2]
apply-transform : Italify apply-transform : Italify
} }
define [createSuperscript unicode glyphid] : if glyphs`glyphid : begin { define [createSuperscripts records] : if [not recursive] : begin {
create-glyph ['superscript_' + glyphid] : glyph-construction { local pendingGlyphs : records.map : [record] -> record.1
local miniatureFont : Miniature pendingGlyphs 4.2 0.6
foreach (unicode glyphid) [items-of records] : create-glyph ['superscript_' + glyphid] : glyph-construction {
assign-unicode unicode assign-unicode unicode
include : create-glyph : glyph-construction { include : create-glyph : glyph-construction {
include : Miniature glyphid 4.2 0.6 include miniatureFont.(glyphid)
apply-transform : Upright apply-transform : Upright
apply-transform : Translate [-MIDDLE] [-CAP] apply-transform : Translate [-MIDDLE] [-CAP]
apply-transform : Scale 0.6 apply-transform : Scale 0.6
@ -99,11 +101,13 @@ define [createSuperscript unicode glyphid] : if glyphs`glyphid : begin {
} }
} }
} }
define [createSubscript unicode glyphid] : if glyphs`glyphid : begin { define [createSubscripts records] : if [not recursive] : begin {
create-glyph ['subscript_' + glyphid] : glyph-construction { local pendingGlyphs : records.map : [record] -> record.1
local miniatureFont : Miniature pendingGlyphs 4.2 0.6
foreach (unicode glyphid) [items-of records] : create-glyph ['subscript_' + glyphid] : glyph-construction {
assign-unicode unicode assign-unicode unicode
include : create-glyph : glyph-construction { include : create-glyph : glyph-construction {
include : Miniature glyphid 4.2 0.6 include miniatureFont.(glyphid)
apply-transform : Upright apply-transform : Upright
apply-transform : Translate [-MIDDLE] 0 apply-transform : Translate [-MIDDLE] 0
apply-transform : Scale 0.6 apply-transform : Scale 0.6
@ -155,85 +159,88 @@ create-glyph 'ordmasculine' : glyph-construction {
apply-transform : Italify apply-transform : Italify
} }
createSuperscript 0x2070 'zero' createSuperscripts : list {
createSuperscript 0x00B9 'one' list 0x2070 'zero'
createSuperscript 0x00B2 'two' list 0x00B9 'one'
createSuperscript 0x00B3 'three' list 0x00B2 'two'
createSuperscript 0x2074 'four' list 0x00B3 'three'
createSuperscript 0x2075 'five' list 0x2074 'four'
createSuperscript 0x2076 'six' list 0x2075 'five'
createSuperscript 0x2077 'seven' list 0x2076 'six'
createSuperscript 0x2078 'eight' list 0x2077 'seven'
createSuperscript 0x2079 'nine' list 0x2078 'eight'
createSuperscript 0x02B0 'h' list 0x2079 'nine'
createSuperscript 0x02B2 'j' list 0x02B0 'h'
createSuperscript 0x02B3 'r' list 0x02B2 'j'
createSuperscript 0x02B7 'w' list 0x02B3 'r'
createSuperscript 0x02B8 'y' list 0x02B7 'w'
createSuperscript 0x02E1 'l' list 0x02B8 'y'
createSuperscript 0x02E2 's' list 0x02E1 'l'
createSuperscript 0x02E3 'x' list 0x02E2 's'
createSuperscript 0x2071 'i' list 0x02E3 'x'
createSuperscript 0x207F 'n' list 0x2071 'i'
createSuperscript 0x1D43 'a' list 0x207F 'n'
createSuperscript 0x1D47 'b' list 0x1D43 'a'
createSuperscript 0x1D48 'd' list 0x1D47 'b'
createSuperscript 0x1D49 'e' list 0x1D48 'd'
createSuperscript 0x1D4D 'g' list 0x1D49 'e'
createSuperscript 0x1D4F 'k' list 0x1D4D 'g'
createSuperscript 0x1D50 'm' list 0x1D4F 'k'
createSuperscript 0x1D52 'o' list 0x1D50 'm'
createSuperscript 0x1D56 'p' list 0x1D52 'o'
createSuperscript 0x1D57 't' list 0x1D56 'p'
createSuperscript 0x1D58 'u' list 0x1D57 't'
createSuperscript 0x1D5B 'v' list 0x1D58 'u'
createSuperscript 0x1D9C 'c' list 0x1D5B 'v'
createSuperscript 0x1DA0 'f' list 0x1D9C 'c'
createSuperscript 0x1DBB 'z' list 0x1DA0 'f'
createSuperscript 0x1D2C 'A' list 0x1DBB 'z'
createSuperscript 0x1D2E 'B' list 0x1D2C 'A'
createSuperscript 0x1D30 'D' list 0x1D2E 'B'
createSuperscript 0x1D31 'E' list 0x1D30 'D'
createSuperscript 0x1D33 'G' list 0x1D31 'E'
createSuperscript 0x1D34 'H' list 0x1D33 'G'
createSuperscript 0x1D35 'I' list 0x1D34 'H'
createSuperscript 0x1D36 'J' list 0x1D35 'I'
createSuperscript 0x1D37 'K' list 0x1D36 'J'
createSuperscript 0x1D38 'L' list 0x1D37 'K'
createSuperscript 0x1D39 'M' list 0x1D38 'L'
createSuperscript 0x1D3A 'N' list 0x1D39 'M'
createSuperscript 0x1D3C 'O' list 0x1D3A 'N'
createSuperscript 0x1D3E 'P' list 0x1D3C 'O'
createSuperscript 0x1D3F 'R' list 0x1D3E 'P'
createSuperscript 0x1D40 'T' list 0x1D3F 'R'
createSuperscript 0x1D41 'U' list 0x1D40 'T'
createSuperscript 0x1D42 'W' list 0x1D41 'U'
list 0x1D42 'W'
}
createSubscript 0x2080 'zero' createSubscripts : list {
createSubscript 0x2081 'one' list 0x2080 'zero'
createSubscript 0x2082 'two' list 0x2081 'one'
createSubscript 0x2083 'three' list 0x2082 'two'
createSubscript 0x2084 'four' list 0x2083 'three'
createSubscript 0x2085 'five' list 0x2084 'four'
createSubscript 0x2086 'six' list 0x2085 'five'
createSubscript 0x2087 'seven' list 0x2086 'six'
createSubscript 0x2088 'eight' list 0x2087 'seven'
createSubscript 0x2089 'nine' list 0x2088 'eight'
list 0x2089 'nine'
createSubscript 0x2090 'a' list 0x2090 'a'
createSubscript 0x2091 'e' list 0x2091 'e'
createSubscript 0x2092 'o' list 0x2092 'o'
createSubscript 0x2093 'x' list 0x2093 'x'
# createSubscript 0x2094 'reve' # list 0x2094 'reve'
createSubscript 0x2095 'h' list 0x2095 'h'
createSubscript 0x2096 'k' list 0x2096 'k'
createSubscript 0x2097 'l' list 0x2097 'l'
createSubscript 0x2098 'm' list 0x2098 'm'
createSubscript 0x2099 'n' list 0x2099 'n'
createSubscript 0x209A 'p' list 0x209A 'p'
createSubscript 0x209B 's' list 0x209B 's'
createSubscript 0x209C 't' list 0x209C 't'
createSubscript 0x1D62 'i' list 0x1D62 'i'
createSubscript 0x1D63 'r' list 0x1D63 'r'
createSubscript 0x1D64 'u' list 0x1D64 'u'
createSubscript 0x1D65 'v' list 0x1D65 'v'
}

View file

@ -197,5 +197,5 @@ create-glyph 'nine' : glyph-construction {
:.start-from RIGHTSB ymiddlea :.start-from RIGHTSB ymiddlea
:.set-width 0 STROKE :.set-width 0 STROKE
:.line-to RIGHTSB [CAP * 0.4] :.line-to RIGHTSB [CAP * 0.4]
include : sHookLower 0 [CAP * 0.4] HOOK [xgrid 0.48] include : sHookLower 0 [CAP * 0.4] HOOK [mix SB RIGHTSB 0.48]
} }

View file

@ -194,7 +194,7 @@
return _r14_t3; return _r14_t3;
}; };
r0_Glyph['prototype']['include'] = function _r0_t13(r16_component, r16_copyAnchors) { r0_Glyph['prototype']['include'] = function _r0_t13(r16_component, r16_copyAnchors) {
var r16_component, r16_copyAnchors, r16_glyph, r16_otherwise, r16_contours, r16_it, r16_transform, r16_shiftx, r16_shifty, r16_markid, r16_anchorThis, r16_anchorThat, _r16_t0, _r16_t1, _r16_t2, _r16_t3, _r16_t4, _r16_t5, _r16_t6, _r16_t7, _r16_t8, _r16_t9, _r16_t10, _r16_t11, _r16_t12, _r16_t13, _r16_t14, _r16_t15, _r16_t16, _r16_t17, _r16_t18, _r16_t19, _r16_t20, _r16_t21, _r16_t22, _r16_tag23, _r16_t24, _r16_t25, _r16_t26; var r16_component, r16_copyAnchors, r16_glyph, r16_otherwise, r16_contours, r16_it, r16_transform, r16_shiftx, r16_shifty, r16_markid, r16_anchorThis, r16_anchorThat, _r16_t0, _r16_t1, _r16_t2, _r16_t3, _r16_t4, _r16_t5, _r16_t6, _r16_t7, _r16_t8, _r16_t9, _r16_t10, _r16_t11, _r16_t12, _r16_t13, _r16_t14, _r16_t15, _r16_t16, _r16_t17, _r16_t18, _r16_t19, _r16_t20, _r16_t21, _r16_t22, _r16_tag23, _r16_t24, _r16_t25, _r16_t26, _r16_t27;
_r16_t7 = this; _r16_t7 = this;
_r16_t0 = r16_component; _r16_t0 = r16_component;
if (_r16_t2 = r0_aFunction['unapply'](_r16_t0, 1)) { if (_r16_t2 = r0_aFunction['unapply'](_r16_t0, 1)) {
@ -245,16 +245,16 @@
r16_shiftx = _r16_t6[0]; r16_shiftx = _r16_t6[0];
r16_shifty = _r16_t6[1]; r16_shifty = _r16_t6[1];
if (r16_anchorThat['mbx'] !== void 0 && r16_anchorThat['mby'] !== void 0) if (r16_anchorThat['mbx'] !== void 0 && r16_anchorThat['mby'] !== void 0)
_r16_t26 = _r16_t7['anchors'][r16_markid] = { _r16_t27 = _r16_t7['anchors'][r16_markid] = {
'x': r16_anchorThis['x'] + r16_anchorThat['mbx'] - r16_anchorThat['x'], 'x': r16_anchorThis['x'] + r16_anchorThat['mbx'] - r16_anchorThat['x'],
'y': r16_anchorThis['y'] + r16_anchorThat['mby'] - r16_anchorThat['y'], 'y': r16_anchorThis['y'] + r16_anchorThat['mby'] - r16_anchorThat['y'],
'type': r16_anchorThis['type'], 'type': r16_anchorThis['type'],
'mbx': r16_anchorThis['mbx'], 'mbx': r16_anchorThis['mbx'],
'mby': r16_anchorThis['mby'] 'mby': r16_anchorThis['mby']
}; };
_r16_t25 = _r16_t26; _r16_t26 = _r16_t27;
} else } else
_r16_t25 = void 0; _r16_t26 = void 0;
_r16_t14 = _r16_t5 = _r16_t5 + 1; _r16_t14 = _r16_t5 = _r16_t5 + 1;
} }
_r16_t12 = _r16_t14; _r16_t12 = _r16_t14;
@ -292,6 +292,8 @@
_r16_t17 = void 0; _r16_t17 = void 0;
if (r16_glyph['name']) if (r16_glyph['name'])
return _r16_t7['dependencies']['push'](r16_glyph['name']); return _r16_t7['dependencies']['push'](r16_glyph['name']);
else if (r16_glyph['dependencies'])
return _r16_t7['dependencies'] = _r16_t7['dependencies']['concat'](r16_glyph['dependencies']);
else else
return void 0; return void 0;
}; };

View file

@ -129,7 +129,10 @@ define [Glyph.prototype.include component copyAnchors] : begin {
foreach k [items-of keys] [set a`k anchors`k] foreach k [items-of keys] [set a`k anchors`k]
* a * a
} }
if glyph.name : this.dependencies.push glyph.name piecewise {
glyph.name : this.dependencies.push glyph.name
glyph.dependencies : this.dependencies = [this.dependencies.concat glyph.dependencies]
}
} }
define [Glyph.prototype.apply-transform transform] : set this.contours : this.contours.map : function [contour] : begin { define [Glyph.prototype.apply-transform transform] : set this.contours : this.contours.map : function [contour] : begin {
return : contour.map : function [point] [tp transform point] return : contour.map : function [point] [tp transform point]