mirror of
https://github.com/be5invis/Iosevka.git
synced 2026-10-28 08:28:01 +00:00
296 lines
13 KiB
Plaintext
296 lines
13 KiB
Plaintext
import '../support/point' as Point
|
|
import '../support/transform' as : Transform && [object [transformPoint tp] [unTransform utp] inverse]
|
|
import [mix linreg clamp fallback] from '../support/utils'
|
|
import '../support/anchor' as Anchor
|
|
import [compsiteMarkSet] 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 symbolMid : fallback para.symbolMid (XH * 0.65)
|
|
define parenTop : symbolMid + para.parenSize / 2
|
|
define parenBot : symbolMid - para.parenSize / 2
|
|
|
|
define operTop : symbolMid + para.operSize * (WIDTH - SB * 2)
|
|
define operBot : symbolMid - para.operSize * (WIDTH - SB * 2)
|
|
define tackTop : symbolMid + para.tackSize * (WIDTH - SB * 2)
|
|
define tackBot : symbolMid - para.tackSize * (WIDTH - SB * 2)
|
|
define plusTop : symbolMid + para.plusSize * (WIDTH - SB * 2)
|
|
define plusBot : symbolMid - para.plusSize * (WIDTH - SB * 2)
|
|
define pictTop : symbolMid + para.pictSize * (WIDTH - SB * 2)
|
|
define pictBot : symbolMid - para.pictSize * (WIDTH - SB * 2)
|
|
define bgopTop : symbolMid + para.bgopSize * (WIDTH - SB * 2)
|
|
define bgopBot : symbolMid - para.bgopSize * (WIDTH - SB * 2)
|
|
|
|
|
|
# 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 * symbolMid] 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)
|
|
|
|
define [Upward] : new Point (-HVCONTRAST) 0
|
|
define [Downward] : new Point HVCONTRAST 0
|
|
define [Rightward] : new Point this.gizmo.yx 1
|
|
define [Leftward] : new Point (- this.gizmo.yx) (-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 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 LBALANCE2 : LONGJUT * 0.14
|
|
define IBALANCE2 : fallback para.ibalance (LONGJUT * 0.14)
|
|
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 MONOSPACE : para.diversityM == 1 && para.diversityF == 1 && para.diversityI == 1 && para.diversityII == 1
|
|
define WIDE-WIDTH-0 : if MONOSPACE (WIDTH * 2) UPM
|
|
define WIDE-WIDTH-1 : if (para.spacing >= 1) WIDE-WIDTH-0 WIDTH
|
|
define WIDE-WIDTH-2 : if (para.spacing >= 2) WIDE-WIDTH-0 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 : WIDE-WIDTH-1 - SB
|
|
define MIDDLE : WIDTH / 2
|
|
define FWMIDDLE : WIDE-WIDTH-1 / 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 * 0.9 * [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 div] : begin
|
|
local w : WIDTH * [fallback div 1] - SB * 2
|
|
return : ((XH - STROKE * 3) * w * (1 / 3)) / (XH * w)
|
|
define [adviceBlackness crowdedness div mul] : begin
|
|
local gap : (WIDTH * [fallback div 1]) - SB * 2
|
|
local shrink : (1 - [WHITENESS 1]) / (crowdedness * HVCONTRAST)
|
|
return : Math.min STROKE ([fallback mul 1] * gap * shrink)
|
|
define [adviceBlackness2 cowX cowY refH div] : Math.min
|
|
adviceBlackness cowX (refH / WIDTH)
|
|
adviceBlackness cowY div
|
|
define [MVERTSTROKE_D div] : adviceBlackness [fallback para.lllcrowdedness (3 + 1 / 3)] div
|
|
define MVERTSTROKE : MVERTSTROKE_D 1
|
|
define OVERLAYSTROKE : adviceBlackness 3.75
|
|
define OPERATORSTROKE : adviceBlackness 3.2
|
|
define GEOMETRYSTROKE : adviceBlackness 4.5
|
|
define SHOULDERFINE : Math.min (STROKE * para.shoulderfineMin) [adviceBlackness 16]
|
|
|
|
define SUPERNESS : fallback para.superness 2
|
|
define [superxy x superness] : Math.pow (1 - [Math.pow x [fallback superness SUPERNESS]]) (1 / [fallback superness SUPERNESS])
|
|
|
|
define [adviceSSmooth y sign _stroke] : begin
|
|
# Handle with extreme care.
|
|
local stroke : fallback _stroke STROKE
|
|
local strokeFactor : stroke * [clamp 1 2 : linreg 126 1 137 1.025 stroke]
|
|
local widthFactor : RIGHTSB - SB
|
|
local widthFactor2 : WIDTH - UPM / 2
|
|
local ss : y * 0.21 + 0.4 * strokeFactor + 0.035 * widthFactor
|
|
return : ss + sign * TANSLANT * (para.smoothadjust + 0.75 * stroke)
|
|
|
|
define [adviceGlottalStopSmooth y sign] : begin
|
|
return : ((y - STROKE) * 0.24 + STROKE * 0.625) + sign * TANSLANT * para.smoothadjust
|
|
|
|
define [shoulderMidSlope _fine _stroke _dir] : begin
|
|
local stroke : fallback _stroke STROKE
|
|
local fine : fallback _fine SHOULDERFINE
|
|
local dir : fallback _dir 1
|
|
return : 0.5 * HVCONTRAST * (stroke - fine) / stroke + dir * TANSLANT
|
|
|
|
return [object
|
|
UPM WIDTH SB CAP XH DESCENDER CONTRAST
|
|
symbolMid parenTop parenBot operTop operBot tackTop tackBot plusTop plusBot pictTop pictBot bgopTop bgopBot Italify Upright Scale Translate Rotate globalTransform
|
|
TANSLANT SINSLANT COSSLANT HVCONTRAST UPWARD DOWNWARD RIGHTWARD LEFTWARD
|
|
Upward Downward Leftward Rightward
|
|
O OX OXHOOK HOOK AHOOK SHOOK RHOOK JHOOK FHOOK HOOKX SMOOTH SMALLSMOOTH STROKE DOTSIZE PERIODSIZE
|
|
BARPOS GBARPOS EBARPOS OVERLAYPOS FIVEBARPOS LONGJUT JUT VJUT ACCENT ACCENTX CTHIN CTHINB SLAB
|
|
TAILADJX TAILADJY LBALANCE IBALANCE LBALANCE2 IBALANCE2 JBALANCE JBALANCE2 TBALANCE TBALANCE2 RBALANCE RBALANCE2
|
|
FBALANCE ONEBALANCE WIDE-WIDTH-0 WIDE-WIDTH-1 WIDE-WIDTH-2 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 adviceBlackness2 MVERTSTROKE MVERTSTROKE_D OVERLAYSTROKE OPERATORSTROKE GEOMETRYSTROKE SHOULDERFINE SUPERNESS superxy
|
|
adviceSSmooth adviceGlottalStopSmooth shoulderMidSlope]
|
|
|
|
export : define [setFontMetrics para metrics fm] : 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 fm.OS_2.xAvgCharWidth WIDTH
|
|
set fm.head.unitsPerEm 1000
|
|
set fm.hhea.ascender asc
|
|
set fm.OS_2.usWinAscent (asc + [fallback para.winMetricAscenderPad 0])
|
|
set fm.OS_2.sTypoAscender asc
|
|
|
|
set fm.hhea.descender (DESCENDER - descenderPad)
|
|
set fm.OS_2.usWinDescent ([Math.abs desc] + descenderPad + [fallback para.winMetricDescenderPad 0])
|
|
set fm.OS_2.sTypoDescender (desc - descenderPad)
|
|
|
|
set fm.hhea.lineGap (para.leading - asc + DESCENDER)
|
|
set fm.OS_2.sTypoLineGap (para.leading - asc + desc)
|
|
|
|
set fm.OS_2.sxHeight XH
|
|
set fm.OS_2.sCapHeight CAP
|
|
set fm.post.italicAngle (0 - para.slantAngle)
|
|
|
|
export : define [MarksetDiv p me] : begin
|
|
define [object MARK BASE] Anchor
|
|
define middle : p * me.MIDDLE
|
|
define rightSB : me.WIDTH * p - me.SB
|
|
define [ta anchor] : return : new Anchor
|
|
* (anchor.x * me.globalTransform.xx + anchor.y * me.TANSLANT + me.globalTransform.x)
|
|
* (anchor.x * me.globalTransform.xy + anchor.y * me.globalTransform.yy + me.globalTransform.y)
|
|
* anchor.type
|
|
|
|
define markAboveLower {.anchors {.above [ta : new Anchor middle me.XH BASE]}}
|
|
define markAboveOper {.anchors {.above [ta : new Anchor middle me.operTop BASE]}}
|
|
define markAboveTack {.anchors {.above [ta : new Anchor middle me.tackTop BASE]}}
|
|
define markAbovePlus {.anchors {.above [ta : new Anchor middle me.plusTop BASE]}}
|
|
define markAboveCap {.anchors {.above [ta : new Anchor middle me.CAP BASE]}}
|
|
define markBelowLower {.anchors {.below [ta : new Anchor middle me.DESCENDER BASE]}}
|
|
define markBelowTack {.anchors {.below [ta : new Anchor middle me.tackBot BASE]}}
|
|
define markBelowOper {.anchors {.below [ta : new Anchor middle me.operBot BASE]}}
|
|
define markBelowPlus {.anchors {.below [ta : new Anchor middle me.plusBot BASE]}}
|
|
define markBelowZero {.anchors {.below [ta : new Anchor middle 0 BASE]}}
|
|
define markToprightLower {.anchors {.topright [ta : new Anchor rightSB me.XH BASE]}}
|
|
define markToprightCap {.anchors {.topright [ta : new Anchor rightSB me.CAP BASE]}}
|
|
define markBottomrightLower {.anchors {.bottomright [ta : new Anchor rightSB me.DESCENDER BASE]}}
|
|
define markBottomrightZero {.anchors {.bottomright [ta : new Anchor rightSB 0 BASE]}}
|
|
|
|
define [buildStandardMarkSet] : begin
|
|
local a : compsiteMarkSet.apply null arguments
|
|
set a.anchors.overlay : new Anchor
|
|
* [mix a.anchors.below.x a.anchors.above.x me.OVERLAYPOS]
|
|
* [mix a.anchors.below.y a.anchors.above.y me.OVERLAYPOS]
|
|
* BASE
|
|
set a.anchors.slash : new Anchor
|
|
* [mix a.anchors.below.x a.anchors.above.x 0.5]
|
|
* [mix a.anchors.below.y a.anchors.above.y 0.5]
|
|
* BASE
|
|
return a
|
|
|
|
return : object
|
|
capital : buildStandardMarkSet markAboveCap markBelowZero markToprightCap markBottomrightZero
|
|
b : buildStandardMarkSet markAboveCap markBelowZero markToprightCap markBottomrightZero
|
|
e : buildStandardMarkSet markAboveLower markBelowZero markToprightLower markBottomrightZero
|
|
oper : buildStandardMarkSet markAboveOper markBelowOper markToprightLower markBottomrightZero
|
|
tack : buildStandardMarkSet markAboveTack markBelowTack markToprightLower markBottomrightZero
|
|
plus : buildStandardMarkSet markAbovePlus markBelowPlus markToprightLower markBottomrightZero
|
|
p : buildStandardMarkSet markAboveLower markBelowLower markToprightLower markBottomrightLower
|
|
if : buildStandardMarkSet markAboveCap markBelowLower markToprightCap markBottomrightLower
|
|
|
|
export : define designParameters : object
|
|
equal_wideness 0.075
|
|
logic_narrow_shrink 0.75
|
|
GeometricLargeX : lambda [mw uw] : (mw + uw / 2) / mw
|
|
geometric_small_x (4 / 7)
|
|
arrow_size (3 / 7)
|
|
# ()
|
|
parenOutside 0.2
|
|
parenInside 0.9
|
|
parenCurliness 0.7
|
|
parenOvershoot 0.0375
|
|
# []
|
|
bracketOutside 0.1
|
|
bracketInside 0.95
|
|
# {}
|
|
braceOutside 0.05
|
|
braceInside 0.95
|
|
braceCurlyM1 0.6
|
|
braceCurlyM2 0.45
|
|
braceOvershoot 0.02
|
|
|
|
export : define [GenDivFrame metrics] : lambda [_div _hPack _sbMul] : begin
|
|
local div : fallback _div 1
|
|
local hPack : Math.max 2 [fallback _hPack 0]
|
|
local sbMul : fallback _sbMul : Math.min 1 : (metrics.WIDTH * div - hPack * [metrics.adviceBlackness hPack div]) / (2 * hPack * metrics.SB)
|
|
return : object
|
|
div div
|
|
width : metrics.WIDTH * div
|
|
middle : metrics.MIDDLE * div
|
|
sb : metrics.SB * sbMul
|
|
leftSB : metrics.SB * sbMul
|
|
rightSB : metrics.WIDTH * div - metrics.SB * sbMul
|
|
mvs : metrics.MVERTSTROKE_D div
|
|
markSet: MarksetDiv div metrics
|