Added /Cbar, /cbar, /Ubar. Also separated mark lookups.
This commit is contained in:
parent
ede5c96571
commit
02d84bc010
|
@ -43,33 +43,14 @@ define [buildFont para recursive] : begin {
|
|||
define unicodeGlyphs ()
|
||||
|
||||
define UPM 1000
|
||||
# metrics
|
||||
define DESCENDER para.descender
|
||||
define serifed : not [not para.serif]
|
||||
# Key metrics
|
||||
define WIDTH para.width
|
||||
define SB para.sb
|
||||
define CAP para.cap
|
||||
define XH para.xheight
|
||||
define O para.o
|
||||
define OXHOOK para.oxhook
|
||||
define SB para.sb
|
||||
define HOOK para.hook
|
||||
define AHOOK para.ahook
|
||||
define SHOOK para.shook
|
||||
define RHOOK para.rhook
|
||||
define HOOKX para.hookx
|
||||
define SMOOTH para.smooth
|
||||
define SMALLSMOOTH para.smallsmooth
|
||||
define STROKE para.stroke
|
||||
define DOTSIZE para.dotsize
|
||||
define PERIODSIZE para.periodsize
|
||||
define BARPOS para.barpos
|
||||
define GBARPOS para.gbarpos
|
||||
define FIVEBARPOS para.fivebarpos
|
||||
define LONGJUT para.longjut
|
||||
define JUT para.jut
|
||||
define ACCENT para.accent
|
||||
define ACCENTX para.accentx
|
||||
|
||||
# Common metrics for symbols
|
||||
define DESCENDER para.descender
|
||||
# Key metrics for symbols
|
||||
local parenTop [[XH * 0.625] + [CAP - XH] * 2.5]
|
||||
local parenBot [[XH * 0.625] - [CAP - XH] * 2.5]
|
||||
local parenMid [mix parenTop parenBot 0.5]
|
||||
|
@ -97,6 +78,45 @@ define [buildFont para recursive] : begin {
|
|||
return (.x [a.x / m] .y [a.y / m])
|
||||
}
|
||||
|
||||
# Style parameters
|
||||
define O para.o
|
||||
define OXHOOK para.oxhook
|
||||
define HOOK para.hook
|
||||
define AHOOK para.ahook
|
||||
define SHOOK para.shook
|
||||
define RHOOK para.rhook
|
||||
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 ACCENT para.accent
|
||||
define ACCENTX para.accentx
|
||||
|
||||
define KAPPA para.kappa
|
||||
define BKAPPA : para.bkappa || KAPPA + 0.1
|
||||
define KAPPA_SPIRO_ARC : KAPPA + 0.1
|
||||
define CKAPPA : para.ckappa || BKAPPA
|
||||
define KAPPA_HOOK : fallback para.kappa_hook [BKAPPA + 0.1]
|
||||
define KAPPA_AHOOK : fallback para.kappa_ahook KAPPA_HOOK
|
||||
define KAPPA_RHOOK : fallback para.kappa_rhook KAPPA_HOOK
|
||||
define TAILADJX : WIDTH * 0.2
|
||||
define TAILADJY : XH * 0.25
|
||||
define ILBALANCE : LONGJUT * 0.04
|
||||
define JBALANCE : fallback para.jbalance [STROKE / 2 + ILBALANCE]
|
||||
define TBALANCE : fallback para.tbalance JBALANCE
|
||||
define TBALANCE2 : fallback para.tbalance2 TBALANCE
|
||||
define RBALANCE : fallback para.rbalance [JBALANCE * 0.3]
|
||||
define SBALANCE : fallback para.sbalance 0.52
|
||||
|
||||
# derived metrics
|
||||
define FULLWIDTH : if para.cjkSpacing [WIDTH * 2] WIDTH
|
||||
define XO : XH - O
|
||||
|
@ -120,32 +140,6 @@ define [buildFont para recursive] : begin {
|
|||
define CORRECTION_OMIDX : globalTransform.yx * 1.2
|
||||
define CORRECTION_OMIDS : STROKE * CORRECTION_OMIDX
|
||||
|
||||
# style parameters
|
||||
define EBARPOS : para.ebarpos || BARPOS
|
||||
define KAPPA para.kappa
|
||||
define COKAPPA : 1 - KAPPA
|
||||
define BKAPPA : para.bkappa || KAPPA + 0.1
|
||||
define KAPPA_SPIRO_ARC : KAPPA + 0.1
|
||||
define CKAPPA : para.ckappa || BKAPPA
|
||||
define COBKAPPA : 1 - BKAPPA
|
||||
define KAPPA_HOOK : fallback para.kappa_hook [BKAPPA + 0.1]
|
||||
define KAPPA_AHOOK : fallback para.kappa_ahook KAPPA_HOOK
|
||||
define KAPPA_RHOOK : fallback para.kappa_rhook KAPPA_HOOK
|
||||
define TAILADJX : WIDTH * 0.2
|
||||
define TAILADJY : XH * 0.25
|
||||
define TAILADJKAPPA 0.75
|
||||
define TAILADJSX : WIDTH * 0.2
|
||||
define TAILADJSY 0
|
||||
define TAILADJSKAPPA 0.75
|
||||
define ILBALANCE : LONGJUT * 0.04
|
||||
define JBALANCE : para.jbalance || HALFSTROKE + ILBALANCE
|
||||
define TBALANCE : para.tbalance || JBALANCE
|
||||
define TBALANCE2 : para.tbalance2 || TBALANCE
|
||||
define RBALANCE : para.rbalance || JBALANCE * 0.3
|
||||
define SBALANCE : fallback para.sbalance 0.52
|
||||
|
||||
define serifed : not [not para.serif]
|
||||
|
||||
# Blackness parameters
|
||||
# We will estimate blackness using lower-case 'e'
|
||||
define WHITENESS : [[XH - STROKE * 3] * [RIGHTSB - SB] * [1 / 3]] / [XH * [RIGHTSB - SB]]
|
||||
|
@ -184,7 +178,14 @@ define [buildFont para recursive] : begin {
|
|||
}
|
||||
define [StdAnchorGroup] : begin {
|
||||
local a : anchorDeriv.apply null arguments
|
||||
set a.anchors.overlay (.type BASE .x [mix a.anchors.below.x a.anchors.above.x BARPOS] .y [mix a.anchors.below.y a.anchors.above.y BARPOS])
|
||||
set a.anchors.overlay (.type BASE
|
||||
.x [mix a.anchors.below.x a.anchors.above.x OVERLAYPOS]
|
||||
.y [mix a.anchors.below.y a.anchors.above.y OVERLAYPOS]
|
||||
)
|
||||
set a.anchors.slash (.type BASE
|
||||
.x [mix a.anchors.below.x a.anchors.above.x 0.5]
|
||||
.y [mix a.anchors.below.y a.anchors.above.y 0.5]
|
||||
)
|
||||
return a
|
||||
}
|
||||
|
||||
|
|
|
@ -45,16 +45,44 @@ feature ccmp {
|
|||
feature mark {
|
||||
script latn;
|
||||
language dflt;
|
||||
lookup markAuto;
|
||||
lookup markAuto_above;
|
||||
lookup markAuto_below;
|
||||
lookup markAuto_trailing;
|
||||
lookup markAuto_lf;
|
||||
lookup markAuto_topright;
|
||||
lookup markAuto_bottomright;
|
||||
lookup markAuto_overlay;
|
||||
lookup markAuto_slash;
|
||||
script grek;
|
||||
language dflt;
|
||||
lookup markAuto;
|
||||
lookup markAuto_above;
|
||||
lookup markAuto_below;
|
||||
lookup markAuto_trailing;
|
||||
lookup markAuto_lf;
|
||||
lookup markAuto_topright;
|
||||
lookup markAuto_bottomright;
|
||||
lookup markAuto_overlay;
|
||||
lookup markAuto_slash;
|
||||
script cyrl;
|
||||
language dflt;
|
||||
lookup markAuto;
|
||||
lookup markAuto_above;
|
||||
lookup markAuto_below;
|
||||
lookup markAuto_trailing;
|
||||
lookup markAuto_lf;
|
||||
lookup markAuto_topright;
|
||||
lookup markAuto_bottomright;
|
||||
lookup markAuto_overlay;
|
||||
lookup markAuto_slash;
|
||||
script dflt;
|
||||
language dflt;
|
||||
lookup markAuto;
|
||||
lookup markAuto_above;
|
||||
lookup markAuto_below;
|
||||
lookup markAuto_trailing;
|
||||
lookup markAuto_lf;
|
||||
lookup markAuto_topright;
|
||||
lookup markAuto_bottomright;
|
||||
lookup markAuto_overlay;
|
||||
lookup markAuto_slash;
|
||||
} mark;
|
||||
|
||||
feature mkmk {
|
||||
|
|
|
@ -55,7 +55,11 @@ if(argv.dumpfeature) {
|
|||
}
|
||||
// mark
|
||||
var mark = ttfFont.features.mark;
|
||||
featurefile += 'lookup markAuto {' + mark.marks.join(';\n') + ';\n' + mark.bases.join(';\n') + ';} markAuto;'
|
||||
for(var id in mark) {
|
||||
var lookup = mark[id];
|
||||
var lookupName = 'markAuto_' + id;
|
||||
featurefile += 'lookup ' + lookupName + ' {' + lookup.marks.join(';\n') + ';\n' + lookup.bases.join(';\n') + ';} ' + lookupName + ';'
|
||||
}
|
||||
|
||||
// mkmk
|
||||
var mkmk = ttfFont.features.mkmk;
|
||||
|
|
|
@ -33,6 +33,7 @@ define customDecompositions (
|
|||
|
||||
."\u1D7F" "\u028A\u0336"
|
||||
."\u0289" "u\u0336"
|
||||
."\u0244" "U\u0336"
|
||||
|
||||
."\u0290" "z\u0322"
|
||||
."\u0256" "d\u0322"
|
||||
|
@ -490,7 +491,7 @@ create-glyph 'servicemark' : glyph-construction {
|
|||
|
||||
|
||||
### Generate MARK and MKMK features
|
||||
set font.features.mark (.marks () .bases ())
|
||||
set font.features.mark (.)
|
||||
set font.features.mkmk (.marks () .bases ())
|
||||
set font.features.markGlyphs (.)
|
||||
|
||||
|
@ -499,14 +500,32 @@ define [buildAnchorDescription glyph inserter propx propy] : begin {
|
|||
foreach key [items-of : Object.keys glyph.anchors] : buf = buf + ' <anchor ' + [Math.round [upmscale * glyph.anchors.(key).(propx)]] + ' ' + [Math.round [upmscale * glyph.anchors.(key).(propy)]] + '> ' + inserter + ' @' + key
|
||||
return buf
|
||||
}
|
||||
|
||||
# mark
|
||||
define [createMarkLookup anchorid] : let [lookup : set font.features.mark.(anchorid) (.marks () .bases ())] : foreach glyph [items-of glyphList] : begin {
|
||||
if [glyph.anchors && glyph.anchors.(anchorid)] : begin {
|
||||
local anchor glyph.anchors.(anchorid)
|
||||
if [anchor.type === 'base'] {
|
||||
lookup.bases.push : 'pos mark [' + glyph.name + '] <anchor ' + [Math.round : upmscale * anchor.x] + ' ' + [Math.round : upmscale * anchor.y] + '> mark @' + anchorid
|
||||
lookup.marks.push : 'markClass [' + glyph.name + '] <anchor ' + [Math.round : upmscale * anchor.x] + ' ' + [Math.round : upmscale * anchor.y] + '> @' + anchorid
|
||||
}
|
||||
}
|
||||
}
|
||||
createMarkLookup 'above'
|
||||
createMarkLookup 'below'
|
||||
createMarkLookup 'trailing'
|
||||
createMarkLookup 'lf'
|
||||
createMarkLookup 'topright'
|
||||
createMarkLookup 'bottomright'
|
||||
createMarkLookup 'overlay'
|
||||
createMarkLookup 'slash'
|
||||
# mkmk
|
||||
foreach glyph [items-of glyphList] : if [glyph.anchors && [begin [local anchorKeys : Object.keys glyph.anchors] anchorKeys.length]] : begin {
|
||||
local isMarkGlyph false
|
||||
foreach key [items-of anchorKeys] : if [glyph.anchors.(key).type == 'mark'] : set isMarkGlyph true
|
||||
|
||||
if isMarkGlyph {
|
||||
then {
|
||||
font.features.mark.marks.push : 'markClass [' + glyph.name + '] ' + [buildAnchorDescription glyph '' 'x' 'y']
|
||||
# font.features.mark.marks.push : 'markClass [' + glyph.name + '] ' + [buildAnchorDescription glyph '' 'x' 'y']
|
||||
font.features.mkmk.marks.push : 'markClass [' + glyph.name + '] ' + [buildAnchorDescription glyph '' 'x' 'y']
|
||||
font.features.mkmk.bases.push : 'pos mark [' + glyph.name + '] ' + [buildAnchorDescription glyph 'mark' 'mbx' 'mby']
|
||||
foreach key [items-of anchorKeys] : begin {
|
||||
|
@ -514,6 +533,6 @@ foreach glyph [items-of glyphList] : if [glyph.anchors && [begin [local anchorKe
|
|||
font.features.markGlyphs.(key).push glyph.name
|
||||
}
|
||||
}
|
||||
else : font.features.mark.bases.push : 'pos base [' + glyph.name + '] ' + [buildAnchorDescription glyph 'mark' 'x' 'y']
|
||||
# else : font.features.mark.bases.push : 'pos base [' + glyph.name + '] ' + [buildAnchorDescription glyph 'mark' 'x' 'y']
|
||||
}
|
||||
}
|
|
@ -43,8 +43,6 @@ define [CyrYeriShape top _left _right _fine] : glyph-construction {
|
|||
local right : fallback _right RIGHTSB
|
||||
|
||||
local bowl : top * 0.55 + HALFSTROKE
|
||||
local tkappa [COKAPPA - 0.22]
|
||||
local bkappa [COKAPPA - 0.2]
|
||||
|
||||
local turnbottom : bowl / 2
|
||||
include : spiro {
|
||||
|
|
|
@ -190,8 +190,6 @@ create-glyph 'K' : glyph-construction {
|
|||
### B D P R
|
||||
define [BShape top] : glyph-construction {
|
||||
local bowl : top * 0.52 + HALFSTROKE
|
||||
local tkappa [COKAPPA - 0.22]
|
||||
local bkappa [COKAPPA - 0.2]
|
||||
|
||||
local turntop : [top - [bowl - STROKE]] * 0.5
|
||||
local turnbottom : bowl * 0.45
|
||||
|
@ -295,7 +293,6 @@ create-glyph 'C' : glyph-construction {
|
|||
set-width WIDTH
|
||||
assign-unicode 'C'
|
||||
include capitalMarks
|
||||
|
||||
include : spiro {
|
||||
widths.lhs
|
||||
g4 RIGHTSB [CAP - HOOK]
|
||||
|
|
|
@ -202,7 +202,7 @@ define [SmallTShape top bot] : glyph-construction {
|
|||
curl center [bot + smb + STROKE]
|
||||
arcvh
|
||||
g4 turn [bot + O + STROKE]
|
||||
quadcontrols [KAPPA_HOOK + TAILADJKAPPA * globalTransform.yx + 0.1] 0
|
||||
quadcontrols [KAPPA_HOOK + 0.75 * globalTransform.yx + 0.1] 0
|
||||
g4 hookx [bot + HOOK + STROKE * 0.24]
|
||||
}
|
||||
|
||||
|
|
|
@ -150,12 +150,7 @@ create-glyph 'Eth' : glyph-construction {
|
|||
assign-unicode 0xD0
|
||||
|
||||
include glyphs.D AS_BASE
|
||||
include : create-stroke
|
||||
:.start-from [SB * 0.3] [CAP * 0.54]
|
||||
:.set-width HALFSTROKE HALFSTROKE
|
||||
:.heads-to RIGHTWARD
|
||||
:.line-to [mix [SB + STROKE] [RIGHTSB - STROKE] 0.55] [CAP * 0.54]
|
||||
:.heads-to RIGHTWARD
|
||||
include : HOverlayBar [SB * 0.3] [mix [SB + STROKE] [RIGHTSB - STROKE] 0.55] [CAP * BARPOS]
|
||||
}
|
||||
alias 'DCroat' 0x110 'Eth'
|
||||
alias 'arficanD' 0x189 'Eth'
|
||||
|
@ -199,20 +194,17 @@ create-glyph 'Thorn' : glyph-construction {
|
|||
|
||||
local bowlTop [CAP * 0.77]
|
||||
local bowlBottom [CAP * 0.23]
|
||||
local bkappa [COKAPPA - 0.2]
|
||||
|
||||
local turn : mix bowlTop bowlBottom 0.5
|
||||
local turnRadius : [bowlTop - bowlBottom] / 2
|
||||
|
||||
include : create-stroke
|
||||
:.start-from [SB * 1.25 + HALFSTROKE * 0.1] bowlTop
|
||||
:.heads-to RIGHTWARD
|
||||
:.set-width 0 STROKE
|
||||
:.line-to [RIGHTSB - turnRadius] bowlTop
|
||||
:.arc-hv-to [RIGHTSB - O] turn
|
||||
:.arc-vh-to [RIGHTSB - turnRadius] bowlBottom
|
||||
:.line-to [SB * 1.25 + HALFSTROKE * 0.1] bowlBottom
|
||||
:.heads-to LEFTWARD
|
||||
include : spiro {
|
||||
widths.rhs
|
||||
flat [SB * 1.25 + 1] bowlTop [heading RIGHTWARD]
|
||||
curl [RIGHTSB - turnRadius] bowlTop
|
||||
g4 [RIGHTSB - O] turn
|
||||
flat [RIGHTSB - turnRadius] bowlBottom
|
||||
curl [SB * 1.25 + 1] bowlBottom [heading LEFTWARD]
|
||||
}
|
||||
|
||||
include : create-stroke
|
||||
:.start-from [SB * 1.25] 0
|
||||
|
@ -693,6 +685,7 @@ alias 'smcpH' 0x29C 'cyren'
|
|||
alias 'latiniota' 0x269 'iota'
|
||||
alias 'revlatinepsilon' 0x25C 'cyrze'
|
||||
# Turned glyphs
|
||||
turned nothing 0x2C6F 'A' MIDDLE [CAP / 2]
|
||||
turned nothing 0x250 'a' MIDDLE [XH / 2]
|
||||
turned nothing 0x252 'scripta' MIDDLE [XH / 2]
|
||||
turned nothing 0x186 'C' MIDDLE [CAP / 2]
|
||||
|
@ -702,6 +695,7 @@ turned nothing 0x1DD 'e' MIDDLE [XH / 2]
|
|||
turned 'schwa' 0x259 'e' MIDDLE [XH / 2]
|
||||
turned nothing 0x1D77 'g' MIDDLE [mix DESCENDER XH 0.5]
|
||||
turned nothing 0x265 'h' MIDDLE [XH / 2] pMarks
|
||||
turned nothing 0xA7B0 'K' MIDDLE [CAP / 2]
|
||||
turned nothing 0x29E 'k' MIDDLE [XH / 2] pMarks
|
||||
turned nothing 0x26F 'm' MIDDLE [XH / 2]
|
||||
turned nothing 0x279 'r' MIDDLE [XH / 2] [anchorDeriv eMarks (.anchors (.bottomright (.x RIGHTSB - RBALANCE .y 0)))]
|
||||
|
|
|
@ -70,6 +70,16 @@ create-glyph 'tbar' : glyph-construction {
|
|||
include glyphs.t AS_BASE
|
||||
include : HOverlayBar [[mix MIDDLE SB 0.7] - TBALANCE * 0.5] [[mix MIDDLE RIGHTSB 0.7] - TBALANCE * 0.5] [mix 0 XH 0.6]
|
||||
}
|
||||
create-glyph 'Cbar' : glyph-construction {
|
||||
assign-unicode 0xA792
|
||||
include glyphs.C AS_BASE
|
||||
include : HOverlayBar [SB * 0.3] [mix [SB + STROKE] [RIGHTSB - STROKE] 0.55] [CAP * BARPOS]
|
||||
}
|
||||
create-glyph 'cbar' : glyph-construction {
|
||||
assign-unicode 0xA793
|
||||
include glyphs.c AS_BASE
|
||||
include : HOverlayBar [SB * 0.3] [mix [SB + STROKE] [RIGHTSB - STROKE] 0.55] [XH * BARPOS]
|
||||
}
|
||||
# Dotted
|
||||
create-glyph 'Ldot' : glyph-construction {
|
||||
assign-unicode 0x13F
|
||||
|
|
|
@ -715,6 +715,24 @@ create-glyph 'longBarOver' : glyph-construction {
|
|||
set-anchor 'overlay' MARK markMiddle [XH / 2] markMiddle [XH / 2]
|
||||
include : HOverlayBar [[mix 0 SB 0.5] - WIDTH] [[mix WIDTH RIGHTSB 0.5] - WIDTH] [XH / 2]
|
||||
}
|
||||
create-glyph 'slashOver' : glyph-construction {
|
||||
set-width 0
|
||||
assign-unicode 0x337
|
||||
set-anchor 'slash' MARK markMiddle [XH / 2] markMiddle [XH / 2]
|
||||
include : create-stroke
|
||||
:.start-from [[mix 0 SB 0.5] - WIDTH] [XH * 0.25]
|
||||
:.set-width markHalfStroke markHalfStroke
|
||||
:.line-to [[mix WIDTH RIGHTSB 0.5] - WIDTH] [XH * 0.75]
|
||||
}
|
||||
create-glyph 'longSlashOver' : glyph-construction {
|
||||
set-width 0
|
||||
assign-unicode 0x338
|
||||
set-anchor 'slash' MARK markMiddle [XH / 2] markMiddle [XH / 2]
|
||||
include : create-stroke
|
||||
:.start-from [[mix 0 SB 0.5] - WIDTH] [XH * 0.1]
|
||||
:.set-width markHalfStroke markHalfStroke
|
||||
:.line-to [[mix WIDTH RIGHTSB 0.5] - WIDTH] [XH * 0.9]
|
||||
}
|
||||
# Double-character arcs
|
||||
create-glyph 'tieAbove' : glyph-construction {
|
||||
set-width 0
|
||||
|
|
|
@ -156,15 +156,10 @@ let : begin {
|
|||
local cy : [XH / 2] + [RIGHTSB - MIDDLE] * [Math.sin angle]
|
||||
include : list : Ring [cy + fine] [cy - fine] [cx - fine] [cx + fine] true
|
||||
}
|
||||
apply-transform : Upright
|
||||
apply-transform : Translate 0 [parenMid - [XH / 2]]
|
||||
apply-transform : Italify
|
||||
include eMarks
|
||||
foreach k [items-of : Object.keys this.anchors] : begin {
|
||||
set this.anchors.(k) (.x [this.anchors.(k).x + [parenMid - [XH / 2]] * globalTransform.yx]
|
||||
.y [this.anchors.(k).y + [parenMid - [XH / 2]]]
|
||||
.type this.anchors.(k).type )
|
||||
}
|
||||
apply-transform [Upright] true
|
||||
apply-transform [Translate 0 [parenMid - [XH / 2]]] true
|
||||
apply-transform [Italify] true
|
||||
include : FullWidthify
|
||||
}
|
||||
|
||||
|
|
|
@ -11,6 +11,7 @@ define regular (
|
|||
.descender [-194]
|
||||
.xheight 570
|
||||
.barpos 0.52
|
||||
.overlaypos 0.52
|
||||
.ebarpos 0.45
|
||||
.gbarpos 0.35
|
||||
.fivebarpos 0.55
|
||||
|
|
|
@ -13,9 +13,7 @@ define SAMPLES 3
|
|||
define TINY 0.001
|
||||
define LITTLE 0.01
|
||||
define KAPPA 0.51
|
||||
define COKAPPA : 1 - KAPPA
|
||||
define BKAPPA : KAPPA + 0.1
|
||||
define COBKAPPA : COKAPPA - 0.1
|
||||
define CKAPPA BKAPPA
|
||||
|
||||
define [Stroke] : begin {
|
||||
|
|
Loading…
Reference in New Issue
Block a user