This commit is contained in:
be5invis 2016-06-14 06:36:00 +08:00
parent f6d8ed278b
commit e7c6899f20
7 changed files with 273 additions and 261 deletions

2
.gitignore vendored
View File

@ -53,4 +53,6 @@ support/transform.js
support/simple-expand.js
support/spiroexpand.js
support/spirokit.js
support/utils.js
meta/*.js
testdrive/assets

View File

@ -8,26 +8,9 @@ import './support/anchor' as Anchor
import './support/monotonic-interpolate' as smoothreg
import './support/fairify' as fairify
import [mix linreg clamp fallback TempFont includeGlyphPart compsiteMarkSet] from './support/utils'
extern global
define [suggestGC] : begin
if (global && global.gc) : global.gc
return nothing
### File inclusion macro
define-macro $$include : syntax-rules
{'$$include' {'.quote' file}} : begin
local path : require 'path'
local fs : require 'fs'
local f0 [[env.macros.get 'input-path']].1
local parse [require './syntax.js'].parse
local absolutePath : path.resolve [path.dirname f0] [formOf file]
local input : fs.readFileSync absolutePath 'utf-8'
local ast : parse input {.within {.file absolutePath .input input}}
return {'.syntactic-closure' ast env}
otherwise `nothing
import [mix linreg clamp fallback TempFont includeGlyphPart compsiteMarkSet suggestGC] from './support/utils'
import [calculateMetrics setFontMetrics] from './meta/aesthetics'
import [nameFont] from './meta/naming'
### Autoarg macro
define [$NamedParameterPair$ l r] : begin
@ -174,6 +157,7 @@ define [tagged tag component] : begin
set component.tag tag
return component
# Main build procedure
export as build : define [buildFont para recursive recursiveCodes] : begin
define variantSelector para.variantSelector
define font this
@ -182,150 +166,28 @@ export as build : define [buildFont para recursive recursiveCodes] : begin
define glyphs {.}
define unicodeGlyphs {}
define UPM 1000
# Progress indicator
define [progress status] : if [not recursive] : begin
if para.verbose : console.log " \(font.name.uniqueSubFamily) : Done \(status)"
#suggestGC
return nothing
# Key metrics
define WIDTH para.width
define SB para.sb
define CAP para.cap
define XH para.xheight
define DESCENDER : fallback para.descender (XH - CAP)
define CONTRAST : fallback para.contrast 1
# Key metrics for symbols
local parenMid : fallback para.parenMid (XH * 0.65)
local parenTop (parenMid + (CAP - XH) * 2.6)
local parenBot (parenMid - (CAP - XH) * 2.6)
local operTop : mix parenMid parenTop 0.8
local operBot : mix parenMid parenBot 0.8
local operMid parenMid
# Transform constructors
define [Italify angle shift] : begin
local slope [Math.tan ([fallback angle para.slantAngle] / 180 * Math.PI)]
return : new Transform 1 slope 0 1 [fallback shift : -slope * parenMid] 0
define [Upright angle shift] [Italify angle shift :.inverse]
define [Scale sx sy] : new Transform sx 0 0 [fallback sy sx] 0 0
define [Translate x y] : new Transform 1 0 0 1 x y
define [Rotate angle] : new Transform [Math.cos angle] (-[Math.sin angle]) [Math.sin angle] [Math.cos angle] 0 0
define globalTransform : Italify para.slantAngle
define TANSLANT globalTransform.yx
define SINSLANT : Math.sin (para.slantAngle / 180 * Math.PI)
define COSSLANT : Math.cos (para.slantAngle / 180 * Math.PI)
define HVCONTRAST : CONTRAST * COSSLANT + SINSLANT * TANSLANT
# Orient parameters
define UPWARD : (-HVCONTRAST) <> 0
define DOWNWARD : HVCONTRAST <> 0
define RIGHTWARD : TANSLANT <> 1
define LEFTWARD : (- TANSLANT) <> (-1)
# Style parameters
define O para.overshoot
define OX para.overshootx
define OXHOOK para.oxhook
define HOOK para.hook
define AHOOK para.ahook
define SHOOK para.shook
define RHOOK para.rhook
define JHOOK para.jhook
define FHOOK para.fhook
define HOOKX para.hookx
define SMOOTH para.smooth
define SMALLSMOOTH para.smallsmooth
define STROKE para.stroke
define DOTSIZE : fallback para.dotsize STROKE
define PERIODSIZE : fallback para.periodsize DOTSIZE
define BARPOS : fallback para.barpos 0.5
define GBARPOS : fallback para.gbarpos 0.5
define PBARPOS : fallback para.pbarpos 0.5
define EBARPOS : fallback para.ebarpos BARPOS
define OVERLAYPOS para.overlaypos
define FIVEBARPOS para.fivebarpos
define LONGJUT para.longjut
define JUT para.jut
define VJUT para.vjut
define ACCENT para.accent
define ACCENTX para.accentx
define CTHIN : fallback para.cthin 0.75
define CTHINB : fallback para.cthinb 0.5
define SLAB para.slab
define TAILADJX : WIDTH * 0.2
define TAILADJY : XH * 0.25
define LBALANCE : LONGJUT * 0.04
define IBALANCE : fallback para.ibalance (LONGJUT * 0.04)
define JBALANCE : fallback para.jbalance 0
define JBALANCE2 : fallback para.jbalance2 (STROKE * 0.25 + LBALANCE)
define TBALANCE : fallback para.tbalance JBALANCE
define TBALANCE2 : fallback para.tbalance2 TBALANCE
define RBALANCE : fallback para.rbalance (JBALANCE * 0.3)
define RBALANCE2 : fallback para.rbalance2 0
define FBALANCE : fallback para.fbalance 0
define ONEBALANCE : fallback para.onebalance 0
# derived metrics
define FULLWIDTH : if (para.spacing >= 2) 1000 WIDTH
define FULLWIDTH1 : if (para.spacing >= 1) 1000 WIDTH
define FULLWIDTH2 : if (para.spacing >= 2) 1000 WIDTH
define FULLWIDTH3 : if (para.spacing >= 3) 1000 WIDTH
define OXE : OX - O
define ESS : STROKE * [fallback para.essx CONTRAST]
define ESSQUESTION : STROKE * [fallback para.essxq CONTRAST]
define XO : XH - O
define CAPO : CAP - O
define HALFSTROKE : STROKE / 2
define RIGHTSB : WIDTH - SB
define FWRSB : FULLWIDTH - SB
define MIDDLE : WIDTH / 2
define FWMIDDLE : FULLWIDTH / 2
define CAPMIDDLE : CAP / 2
define CAP_SMOOTH : CAP - SMOOTH
define DOTRADIUS : DOTSIZE / 2
define PERIODRADIUS : PERIODSIZE / 2
define SIDEJUT : JUT - HALFSTROKE * HVCONTRAST
define SMOOTHA : SMOOTH - TANSLANT * para.smoothadjust
define SMOOTHB : SMOOTH + TANSLANT * para.smoothadjust
define SMALLSMOOTHA : SMALLSMOOTH - TANSLANT * para.smoothadjust
define SMALLSMOOTHB : SMALLSMOOTH + TANSLANT * para.smoothadjust
define CORRECTION_OMIDX : TANSLANT * [linreg 18 1.3 126 0.9 STROKE]
define CORRECTION_OMIDS : STROKE * CORRECTION_OMIDX
# Blackness parameters
# We will estimate blackness using lower-case 'e'
define WHITENESS : ((XH - STROKE * 3) * (RIGHTSB - SB) * (1 / 3)) / (XH * (RIGHTSB - SB))
define [adviceBlackness crowdedness] : Math.min STROKE ((RIGHTSB - SB) * (1 - WHITENESS) / (crowdedness * HVCONTRAST))
define MVERTSTROKE : adviceBlackness : fallback para.lllcrowdedness (3 + 1 / 3)
define OVERLAYSTROKE : adviceBlackness 3.75
define OPERATORSTROKE : adviceBlackness 3.2
define SHOULDERFINE : if para.shoulderfine (STROKE * para.shoulderfine) [adviceBlackness 10]
define SUPERNESS : fallback para.superness 2
define [superxy x] : Math.pow (1 - [Math.pow x SUPERNESS]) (1 / SUPERNESS)
define [adviceSSmooth y sign] : begin
local ss : y * 0.21 + STROKE * 0.22 * [clamp 1 2 : linreg 126 1 137 1.025 STROKE] + 0.035 * (RIGHTSB - SB)
return : ss + sign * TANSLANT * para.smoothadjust * (ss / SMALLSMOOTH)
define [adviceGlottalStopSmooth y sign] : ((y - STROKE) * 0.24 + STROKE * 0.625) + sign * TANSLANT * para.smoothadjust
define [shoulderMidSlope _fine _stroke _dir] : 0.5 * HVCONTRAST * ([fallback _stroke STROKE] - [fallback _fine SHOULDERFINE]) / [fallback _stroke STROKE] + [fallback _dir 1] * TANSLANT
define metrics : calculateMetrics para
define [object
UPM WIDTH SB CAP XH DESCENDER CONTRAST
parenMid parenTop parenBot operTop operBot operMid Italify Upright Scale Translate Rotate globalTransform
TANSLANT SINSLANT COSSLANT HVCONTRAST UPWARD DOWNWARD RIGHTWARD LEFTWARD
O OX OXHOOK HOOK AHOOK SHOOK RHOOK JHOOK FHOOK HOOKX SMOOTH SMALLSMOOTH STROKE DOTSIZE PERIODSIZE
BARPOS GBARPOS PBARPOS EBARPOS OVERLAYPOS FIVEBARPOS LONGJUT JUT VJUT ACCENT ACCENTX CTHIN CTHINB SLAB
TAILADJX TAILADJY LBALANCE IBALANCE JBALANCE JBALANCE2 TBALANCE TBALANCE2 RBALANCE RBALANCE2
FBALANCE ONEBALANCE FULLWIDTH FULLWIDTH1 FULLWIDTH2 FULLWIDTH3 OXE ESS ESSQUESTION XO CAPO HALFSTROKE RIGHTSB FWRSB
MIDDLE FWMIDDLE CAPMIDDLE CAP_SMOOTH DOTRADIUS PERIODRADIUS SIDEJUT SMOOTHA SMOOTHB SMALLSMOOTHA SMALLSMOOTHB CORRECTION_OMIDX CORRECTION_OMIDS
WHITENESS adviceBlackness MVERTSTROKE OVERLAYSTROKE OPERATORSTROKE SHOULDERFINE SUPERNESS superxy
adviceSSmooth adviceGlottalStopSmooth shoulderMidSlope] metrics
# Anchor parameters
define BASE Anchor.BASE
define MARK Anchor.MARK
define AS_BASE 'AS-BASE'
define ALSO_METRICS 'ALSO-METRICS'
define [object MARK BASE] Anchor
define {AS_BASE ALSO_METRICS} {'AS-BASE' 'ALSO-METRICS'}
define markset : do
define [ta anchor] : return : new Anchor
@ -432,73 +294,8 @@ export as build : define [buildFont para recursive recursiveCodes] : begin
###### HERE WE GO!
### Metadata
# Font names
set para.family [para.family.trim]
set para.style : [para.style.trim] || "Regular"
set font.name {}
let : begin
define [nameFont nameid str] : begin
font.name.push : object # Mac Roman
platformID 1
encodingID 0
languageID 0
nameID nameid
nameString str
font.name.push : object # Windows Unicode English
platformID 3
encodingID 1
languageID 1033
nameID nameid
nameString str
nameFont 16 para.family # Preferred Family
nameFont 17 para.style # Preferred Style
nameFont 21 para.family # WWS Preferred Family
nameFont 22 para.style # WWS Preferred Style
set font.name.preferredFamily para.family
set font.name.preferredSubFamily para.style
if (para.style == 'Regular' || para.style == 'Bold' || para.style == 'Italic' || para.style == "Bold Italic") : then
nameFont 1 para.family # Family
nameFont 2 para.style # Style
: else
nameFont 1 : para.family + ' ' + [para.style.replace [regex ' Italic$'] '']
nameFont 2 : if [[regex ' Italic$'].test para.style] 'Italic' 'Regular'
nameFont 3 "\(para.family) \(para.style) \(para.version) (\(para.codename))" # Unique Name
nameFont 5 para.version # Version
local fontfullName : if (para.style != 'Regular') (para.family + ' ' + para.style) para.family
nameFont 4 fontfullName # Full Name
nameFont 6 : fontfullName.replace [regex ' ' 'g'] '-' # Postscript
nameFont 0 para.copyright # Copyright
# nameFont 7 para.trademark # Trademark
nameFont 8 para.manufacturer # Manufacturer
nameFont 9 para.designer # Designer
nameFont 10 para.description # Description
nameFont 13 para.licence # License
set font.name : font.name.sort : lambda [a b] : begin
if (a.platformID != b.platformID) : return : a.platformID - b.platformID
if (a.encodingID != b.encodingID) : return : a.encodingID - b.encodingID
if (a.languageID != b.languageID) : return : a.languageID - b.languageID
return : a.nameID - b.nameID
# Weight, width and slantness
set font.OS_2.usWeightClass para.weight
set font.OS_2.panose.3 9 # Monospaced
set font.OS_2.panose.2 : 1 + para.weight / 100
set font.OS_2.fsSelection : object
oblique : not : not para.isOblique
bold : not : not para.isBold
italic : not : not (para.isItalic || para.isOblique)
regular : not : not ([not para.isBold] && [not para.isItalic] && [not para.isOblique])
useTypoMetrics true
set font.OS_2.sFamilyClass : 8 * 0x100 + 9
set font.OS_2.xAvgCharWidth WIDTH
set font.post.isFixedPitch true
set font.head.macStyle : object
bold : not : not para.isBold
italic : not : not (para.isItalic || para.isOblique)
nameFont para metrics font
setFontMetrics para metrics font
# Metric metadata
# Note: we use 1000upm in design, and (1000 * upmsacle)upm in production, to avoid rounding error.

View File

@ -8,7 +8,7 @@ snapshot/assets :
@- mkdir $@
PATELC = node ./node_modules/patel/bin/patel-c
SUPPORT_FILES_FROM_PTL = support/glyph.js support/spiroexpand.js support/spirokit.js parameters.js support/anchor.js support/point.js support/transform.js support/utils.js
SUPPORT_FILES_FROM_PTL = support/glyph.js support/spiroexpand.js support/spirokit.js parameters.js support/anchor.js support/point.js support/transform.js support/utils.js meta/aesthetics.js meta/naming.js
SUPPORT_FILES = $(SUPPORT_FILES_FROM_PTL) generator.js emptyfont.toml parameters.toml support/fairify.js
GLYPH_SEGMENTS = glyphs/common-shapes.ptl glyphs/overmarks.ptl glyphs/letters-unified-basic.ptl glyphs/letters-unified-extended.ptl glyphs/numbers.ptl glyphs/symbol-punctuation.ptl glyphs/symbol-math.ptl glyphs/symbol-geometric.ptl glyphs/symbol-other.ptl glyphs/symbol-braille.ptl glyphs/symbol-letter.ptl glyphs/autobuilds.ptl glyphs/features.ptl
SCRIPTS = $(SUPPORT_FILES) buildglyphs.js
@ -26,6 +26,8 @@ support/glyph.js : support/glyph.ptl
support/spirokit.js : support/spirokit.ptl
support/spiroexpand.js : support/spiroexpand.ptl
support/utils.js : support/utils.ptl
meta/aesthetics.js : meta/aesthetics.ptl
meta/naming.js : meta/naming.ptl
parameters.js : parameters.ptl
cleanscripts :

174
meta/aesthetics.ptl Normal file
View File

@ -0,0 +1,174 @@
import '../support/point' as Point
import '../support/transform' as : Transform && [object [transformPoint tp] [untransform utp] inverse]
import [mix linreg clamp fallback] from '../support/utils'
# Parameter generation
export : define [calculateMetrics para] : begin
define UPM 1000
# Key metrics
define WIDTH para.width
define SB para.sb
define CAP para.cap
define XH para.xheight
define DESCENDER : fallback para.descender (XH - CAP)
define CONTRAST : fallback para.contrast 1
# Key metrics for symbols
define parenMid : fallback para.parenMid (XH * 0.65)
define parenTop (parenMid + (CAP - XH) * 2.6)
define parenBot (parenMid - (CAP - XH) * 2.6)
define operTop : mix parenMid parenTop 0.8
define operBot : mix parenMid parenBot 0.8
define operMid parenMid
# Transform constructors
define [Italify angle shift] : begin
local slope [Math.tan ([fallback angle para.slantAngle] / 180 * Math.PI)]
return : new Transform 1 slope 0 1 [fallback shift : -slope * parenMid] 0
define [Upright angle shift] [Italify angle shift :.inverse]
define [Scale sx sy] : new Transform sx 0 0 [fallback sy sx] 0 0
define [Translate x y] : new Transform 1 0 0 1 x y
define [Rotate angle] : new Transform [Math.cos angle] (-[Math.sin angle]) [Math.sin angle] [Math.cos angle] 0 0
define globalTransform : Italify para.slantAngle
define TANSLANT globalTransform.yx
define SINSLANT : Math.sin (para.slantAngle / 180 * Math.PI)
define COSSLANT : Math.cos (para.slantAngle / 180 * Math.PI)
define HVCONTRAST : CONTRAST * COSSLANT + SINSLANT * TANSLANT
# Orient parameters
define UPWARD : new Point (-HVCONTRAST) 0
define DOWNWARD : new Point HVCONTRAST 0
define RIGHTWARD : new Point TANSLANT 1
define LEFTWARD : new Point (- TANSLANT) (-1)
# Style parameters
define O para.overshoot
define OX para.overshootx
define OXHOOK para.oxhook
define HOOK para.hook
define AHOOK para.ahook
define SHOOK para.shook
define RHOOK para.rhook
define JHOOK para.jhook
define FHOOK para.fhook
define HOOKX para.hookx
define SMOOTH para.smooth
define SMALLSMOOTH para.smallsmooth
define STROKE para.stroke
define DOTSIZE : fallback para.dotsize STROKE
define PERIODSIZE : fallback para.periodsize DOTSIZE
define BARPOS : fallback para.barpos 0.5
define GBARPOS : fallback para.gbarpos 0.5
define PBARPOS : fallback para.pbarpos 0.5
define EBARPOS : fallback para.ebarpos BARPOS
define OVERLAYPOS para.overlaypos
define FIVEBARPOS para.fivebarpos
define LONGJUT para.longjut
define JUT para.jut
define VJUT para.vjut
define ACCENT para.accent
define ACCENTX para.accentx
define CTHIN : fallback para.cthin 0.75
define CTHINB : fallback para.cthinb 0.5
define SLAB para.slab
define TAILADJX : WIDTH * 0.2
define TAILADJY : XH * 0.25
define LBALANCE : LONGJUT * 0.04
define IBALANCE : fallback para.ibalance (LONGJUT * 0.04)
define JBALANCE : fallback para.jbalance 0
define JBALANCE2 : fallback para.jbalance2 (STROKE * 0.25 + LBALANCE)
define TBALANCE : fallback para.tbalance JBALANCE
define TBALANCE2 : fallback para.tbalance2 TBALANCE
define RBALANCE : fallback para.rbalance (JBALANCE * 0.3)
define RBALANCE2 : fallback para.rbalance2 0
define FBALANCE : fallback para.fbalance 0
define ONEBALANCE : fallback para.onebalance 0
# derived metrics
define FULLWIDTH : if (para.spacing >= 2) 1000 WIDTH
define FULLWIDTH1 : if (para.spacing >= 1) 1000 WIDTH
define FULLWIDTH2 : if (para.spacing >= 2) 1000 WIDTH
define FULLWIDTH3 : if (para.spacing >= 3) 1000 WIDTH
define OXE : OX - O
define ESS : STROKE * [fallback para.essx CONTRAST]
define ESSQUESTION : STROKE * [fallback para.essxq CONTRAST]
define XO : XH - O
define CAPO : CAP - O
define HALFSTROKE : STROKE / 2
define RIGHTSB : WIDTH - SB
define FWRSB : FULLWIDTH - SB
define MIDDLE : WIDTH / 2
define FWMIDDLE : FULLWIDTH / 2
define CAPMIDDLE : CAP / 2
define CAP_SMOOTH : CAP - SMOOTH
define DOTRADIUS : DOTSIZE / 2
define PERIODRADIUS : PERIODSIZE / 2
define SIDEJUT : JUT - HALFSTROKE * HVCONTRAST
define SMOOTHA : SMOOTH - TANSLANT * para.smoothadjust
define SMOOTHB : SMOOTH + TANSLANT * para.smoothadjust
define SMALLSMOOTHA : SMALLSMOOTH - TANSLANT * para.smoothadjust
define SMALLSMOOTHB : SMALLSMOOTH + TANSLANT * para.smoothadjust
define CORRECTION_OMIDX : TANSLANT * [linreg 18 1.3 126 0.9 STROKE]
define CORRECTION_OMIDS : STROKE * CORRECTION_OMIDX
# Blackness parameters
# We will estimate blackness using lower-case 'e'
define WHITENESS : ((XH - STROKE * 3) * (RIGHTSB - SB) * (1 / 3)) / (XH * (RIGHTSB - SB))
define [adviceBlackness crowdedness] : Math.min STROKE ((RIGHTSB - SB) * (1 - WHITENESS) / (crowdedness * HVCONTRAST))
define MVERTSTROKE : adviceBlackness : fallback para.lllcrowdedness (3 + 1 / 3)
define OVERLAYSTROKE : adviceBlackness 3.75
define OPERATORSTROKE : adviceBlackness 3.2
define SHOULDERFINE : if para.shoulderfine (STROKE * para.shoulderfine) [adviceBlackness 10]
define SUPERNESS : fallback para.superness 2
define [superxy x] : Math.pow (1 - [Math.pow x SUPERNESS]) (1 / SUPERNESS)
define [adviceSSmooth y sign] : begin
local ss : y * 0.21 + STROKE * 0.22 * [clamp 1 2 : linreg 126 1 137 1.025 STROKE] + 0.035 * (RIGHTSB - SB)
return : ss + sign * TANSLANT * para.smoothadjust * (ss / SMALLSMOOTH)
define [adviceGlottalStopSmooth y sign] : ((y - STROKE) * 0.24 + STROKE * 0.625) + sign * TANSLANT * para.smoothadjust
define [shoulderMidSlope _fine _stroke _dir] : 0.5 * HVCONTRAST * ([fallback _stroke STROKE] - [fallback _fine SHOULDERFINE]) / [fallback _stroke STROKE] + [fallback _dir 1] * TANSLANT
return [object
UPM WIDTH SB CAP XH DESCENDER CONTRAST
parenMid parenTop parenBot operTop operBot operMid Italify Upright Scale Translate Rotate globalTransform
TANSLANT SINSLANT COSSLANT HVCONTRAST UPWARD DOWNWARD RIGHTWARD LEFTWARD
O OX OXHOOK HOOK AHOOK SHOOK RHOOK JHOOK FHOOK HOOKX SMOOTH SMALLSMOOTH STROKE DOTSIZE PERIODSIZE
BARPOS GBARPOS PBARPOS EBARPOS OVERLAYPOS FIVEBARPOS LONGJUT JUT VJUT ACCENT ACCENTX CTHIN CTHINB SLAB
TAILADJX TAILADJY LBALANCE IBALANCE JBALANCE JBALANCE2 TBALANCE TBALANCE2 RBALANCE RBALANCE2
FBALANCE ONEBALANCE FULLWIDTH FULLWIDTH1 FULLWIDTH2 FULLWIDTH3 OXE ESS ESSQUESTION XO CAPO HALFSTROKE RIGHTSB FWRSB
MIDDLE FWMIDDLE CAPMIDDLE CAP_SMOOTH DOTRADIUS PERIODRADIUS SIDEJUT SMOOTHA SMOOTHB SMALLSMOOTHA SMALLSMOOTHB CORRECTION_OMIDX CORRECTION_OMIDS
WHITENESS adviceBlackness MVERTSTROKE OVERLAYSTROKE OPERATORSTROKE SHOULDERFINE SUPERNESS superxy
adviceSSmooth adviceGlottalStopSmooth shoulderMidSlope]
export : define [setFontMetrics para metrics font] : begin
define [object CAP DESCENDER XH WIDTH] metrics
# Metric metadata
# Note: we use 1000upm in design, and (1000 * upmsacle)upm in production, to avoid rounding error.
define asc : para.leading * CAP / (CAP - DESCENDER)
define desc : para.leading * DESCENDER / (CAP - DESCENDER)
define descenderPad : fallback para.descenderPad 0
set font.OS_2.xAvgCharWidth WIDTH
set font.head.unitsPerEm 1000
set font.hhea.ascender asc
set font.OS_2.usWinAscent asc
set font.OS_2.sTypoAscender asc
set font.hhea.descender (DESCENDER - descenderPad)
set font.OS_2.usWinDescent ([Math.abs desc] + descenderPad)
set font.OS_2.sTypoDescender (desc - descenderPad)
set font.hhea.lineGap (para.leading - asc + DESCENDER)
set font.OS_2.sTypoLineGap (para.leading - asc + desc)
set font.OS_2.sxHeight XH
set font.OS_2.sCapHeight CAP
set font.post.italicAngle (0 - para.slantAngle)

66
meta/naming.ptl Normal file
View File

@ -0,0 +1,66 @@
export : define [nameFont para metrics font] : begin
set font.name {}
set para.family [para.family.trim]
set para.style : [para.style.trim] || "Regular"
define [nameFont nameid str] : begin
font.name.push : object # Mac Roman
platformID 1
encodingID 0
languageID 0
nameID nameid
nameString str
font.name.push : object # Windows Unicode English
platformID 3
encodingID 1
languageID 1033
nameID nameid
nameString str
nameFont 16 para.family # Preferred Family
nameFont 17 para.style # Preferred Style
nameFont 21 para.family # WWS Preferred Family
nameFont 22 para.style # WWS Preferred Style
set font.name.preferredFamily para.family
set font.name.preferredSubFamily para.style
if (para.style == 'Regular' || para.style == 'Bold' || para.style == 'Italic' || para.style == "Bold Italic") : then
nameFont 1 para.family # Family
nameFont 2 para.style # Style
: else
nameFont 1 : para.family + ' ' + [para.style.replace [regex ' Italic$'] '']
nameFont 2 : if [[regex ' Italic$'].test para.style] 'Italic' 'Regular'
nameFont 3 "\(para.family) \(para.style) \(para.version) (\(para.codename))" # Unique Name
nameFont 5 para.version # Version
local fontfullName : if (para.style != 'Regular') (para.family + ' ' + para.style) para.family
nameFont 4 fontfullName # Full Name
nameFont 6 : fontfullName.replace [regex ' ' 'g'] '-' # Postscript
nameFont 0 para.copyright # Copyright
# nameFont 7 para.trademark # Trademark
nameFont 8 para.manufacturer # Manufacturer
nameFont 9 para.designer # Designer
nameFont 10 para.description # Description
nameFont 13 para.licence # License
set font.name : font.name.sort : lambda [a b] : begin
if (a.platformID != b.platformID) : return : a.platformID - b.platformID
if (a.encodingID != b.encodingID) : return : a.encodingID - b.encodingID
if (a.languageID != b.languageID) : return : a.languageID - b.languageID
return : a.nameID - b.nameID
# Weight, width and slantness
set font.OS_2.usWeightClass para.weight
set font.OS_2.panose.3 9 # Monospaced
set font.OS_2.panose.2 : 1 + para.weight / 100
set font.OS_2.fsSelection : object
oblique : not : not para.isOblique
bold : not : not para.isBold
italic : not : not (para.isItalic || para.isOblique)
regular : not : not ([not para.isBold] && [not para.isItalic] && [not para.isOblique])
useTypoMetrics true
set font.OS_2.sFamilyClass : 8 * 0x100 + 9
set font.post.isFixedPitch true
set font.head.macStyle : object
bold : not : not para.isBold
italic : not : not (para.isItalic || para.isOblique)

View File

@ -1,35 +0,0 @@
'use strict';
var r1_mix, r1_linreg, r1_clamp, r1_fallback, r1_TempFont, r1_includeGlyphPart, r1_compsiteMarkSet, _r1_t0, _r1_t1, _r1_t2, _r1_t3, _r1_t4, _r1_t5, _r1_t6, _r1_t7, _r1_t8, _r1_t9, _r1_t10, _r1_t11, _r1_t12, r1_Anchor = require('./anchor');
exports.mix = r1_mix = function _r1_t6(r120_a, r120_b, r120_p) {
return r120_a + (r120_b - r120_a) * r120_p;
}, exports.linreg = r1_linreg = function _r1_t7(r122_x0, r122_y0, r122_x1, r122_y1, r122_x) {
return r122_y0 + (r122_x - r122_x0) * (r122_y1 - r122_y0) / (r122_x1 - r122_x0);
}, exports.clamp = r1_clamp = function _r1_t8(r124_l, r124_h, r124_x) {
return r124_x < r124_l ? r124_l : r124_x > r124_h ? r124_h : r124_x;
}, exports.fallback = r1_fallback = function _r1_t9() {
var _r126_t1 = arguments, r126_j = 0;
for (; r126_j < arguments.length; r126_j += 1)
if (_r126_t1[r126_j] !== void 0)
return _r126_t1[r126_j];
return void 0;
}, exports.TempFont = r1_TempFont = function _r1_t10() {
return {
'glyf': [],
'head': {},
'hhea': {},
'OS_2': { 'panose': [] },
'name': {},
'post': {}
};
}, exports.includeGlyphPart = r1_includeGlyphPart = function _r1_t11(r130_cg, r130_gs, r130_nm) {
var _r130_t1 = arguments;
if (!r130_gs[r130_nm])
throw new Error('Glyph ' + r130_nm + ' is not defined, which is used for ' + r130_cg.name + '.');
return r130_cg.include.apply(r130_cg, [r130_gs[r130_nm]].concat([].slice.call(_r130_t1, 3)));
}, exports.compsiteMarkSet = r1_compsiteMarkSet = function _r1_t12() {
var r132_a, r132_k, _r132_t3, _r132_t4, _r132_t5, _r132_t7 = arguments, r132_h = {}, _r132_t0 = _r132_t7, _r132_t1 = _r132_t0.length, _r132_t2 = 0;
for (; _r132_t2 < _r132_t1; _r132_t2 += 1)
for (r132_a = _r132_t0[_r132_t2], _r132_t3 = Object.keys(r132_a.anchors), _r132_t4 = _r132_t3.length, _r132_t5 = 0; _r132_t5 < _r132_t4; _r132_t5 += 1)
r132_k = _r132_t3[_r132_t5], r132_h[r132_k] = new r1_Anchor(r132_a.anchors[r132_k].x, r132_a.anchors[r132_k].y, r132_a.anchors[r132_k].type, r132_a.anchors[r132_k].mbx, r132_a.anchors[r132_k].mby);
return { 'anchors': r132_h };
};

View File

@ -1,4 +1,5 @@
import './anchor' as Anchor
import './transform' as : Transform && [object [transformPoint tp] [untransform utp] inverse]
export : define [mix a b p] : a + (b - a) * p
export : define [linreg x0 y0 x1 y1 x] : y0 + (x - x0) * (y1 - y0) / (x1 - x0)
@ -16,4 +17,9 @@ export : define [compsiteMarkSet] : begin
local h {.}
foreach a [items-of arguments] : foreach k [items-of [Object.keys a.anchors]] : begin
set h.(k) : new Anchor a.anchors.(k).x a.anchors.(k).y a.anchors.(k).type a.anchors.(k).mbx a.anchors.(k).mby
return {.anchors h}
return {.anchors h}
extern global
export : define [suggestGC] : begin
if (global && global.gc) : global.gc
return nothing