separate
This commit is contained in:
parent
f6d8ed278b
commit
e7c6899f20
2
.gitignore
vendored
2
.gitignore
vendored
|
@ -53,4 +53,6 @@ support/transform.js
|
|||
support/simple-expand.js
|
||||
support/spiroexpand.js
|
||||
support/spirokit.js
|
||||
support/utils.js
|
||||
meta/*.js
|
||||
testdrive/assets
|
245
buildglyphs.ptl
245
buildglyphs.ptl
|
@ -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.
|
||||
|
|
|
@ -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
174
meta/aesthetics.ptl
Normal 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
66
meta/naming.ptl
Normal 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)
|
|
@ -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 };
|
||||
};
|
|
@ -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
|
Loading…
Reference in New Issue
Block a user