227 lines
7.4 KiB
Plaintext
227 lines
7.4 KiB
Plaintext
|
|
### COMMON FUNCTIONS
|
|
|
|
define [mix a b p] : a + [b - a] * p
|
|
define [xgrid p] : mix SB RIGHTSB p
|
|
|
|
### COMMON SHAPES
|
|
|
|
define [Ring u d l r] : begin {
|
|
local my [[u + d] / 2]
|
|
local mx [[l + r] / 2]
|
|
local s : new Stroke
|
|
:.set-transform globalTransform
|
|
:.start-from mx d
|
|
:.cubic-to [mx + [l - mx] * CKAPPA] d l [my + [d - my] * CKAPPA] l my
|
|
:.cubic-to l [my + [u - my] * CKAPPA] [mx + [l - mx] * CKAPPA] u mx u
|
|
:.cubic-to [mx + [r - mx] * CKAPPA] u r [my + [u - my] * CKAPPA] r my
|
|
:.cubic-to r [my + [d - my] * CKAPPA] [mx + [r - mx] * CKAPPA] d mx d
|
|
return s.points
|
|
}
|
|
define [ORing u d l r smooth] : begin {
|
|
local myu [u - smooth]
|
|
local myd [d + smooth]
|
|
local mx [[l + r] / 2]
|
|
local s : new Stroke
|
|
:.set-transform globalTransform
|
|
:.start-from mx d
|
|
:.cubic-to [mx + [l - mx] * CKAPPA] d l [myd + [d - myd] * CKAPPA] l myd
|
|
:.line-to l myu
|
|
:.cubic-to l [myu + [u - myu] * CKAPPA] [mx + [l - mx] * CKAPPA] u mx u
|
|
:.cubic-to [mx + [r - mx] * CKAPPA] u r [myu + [u - myu] * CKAPPA] r myu
|
|
:.line-to r myd
|
|
:.cubic-to r [myd + [d - myd] * CKAPPA] [mx + [r - mx] * CKAPPA] d mx d
|
|
return s.points
|
|
}
|
|
define [leftwardTopSerif x y length] : begin {
|
|
return : new Stroke
|
|
:.set-transform globalTransform
|
|
:.start-from [x + HALFSTROKE] y
|
|
:.heads-to LEFTWARD
|
|
:.set-width STROKE 0
|
|
:.line-to [x - length - globalTransform.yx * STROKE] y
|
|
:.to-outline
|
|
}
|
|
define [leftwardBottomSerif x y length] : begin {
|
|
return : new Stroke
|
|
:.set-transform globalTransform
|
|
:.start-from [x + HALFSTROKE] y
|
|
:.heads-to LEFTWARD
|
|
:.set-width 0 STROKE
|
|
:.line-to [x - length + globalTransform.yx * STROKE] y
|
|
:.to-outline
|
|
}
|
|
define [rightwardTopSerif x y length] : begin {
|
|
return : new Stroke
|
|
:.set-transform globalTransform
|
|
:.start-from [x - HALFSTROKE] y
|
|
:.heads-to RIGHTWARD
|
|
:.set-width 0 STROKE
|
|
:.line-to [x + length - globalTransform.yx * STROKE] y
|
|
:.to-outline
|
|
}
|
|
define [rightwardBottomSerif x y length] : begin {
|
|
return : new Stroke
|
|
:.set-transform globalTransform
|
|
:.start-from [x - HALFSTROKE] y
|
|
:.heads-to RIGHTWARD
|
|
:.set-width STROKE 0
|
|
:.line-to [x + length + globalTransform.yx * STROKE] y
|
|
:.to-outline
|
|
}
|
|
|
|
define [xsStrand _xleft yleft _xright yright _halfstroke0 _halfstroke1 _ess _expansion _roundp] : begin {
|
|
local expansion : _expansion || 0.25
|
|
local halfstroke0 : _halfstroke0 || HALFSTROKE
|
|
local halfstroke1 : _halfstroke1 || HALFSTROKE
|
|
local ess : _ess || [halfstroke0 + halfstroke1] / 2
|
|
local yItalicCorrection [globalTransform.yx * 0.98]
|
|
local xItalicCorrection : 1 / [Math.sqrt [1 - yItalicCorrection * yItalicCorrection]]
|
|
|
|
local roundsize : [_roundp || SMOOTHA * 0.4] * [if [yleft < yright] [-1] 1]
|
|
local roundleft [yleft - roundsize]
|
|
local roundright [yright + roundsize]
|
|
local xleft : _xleft + halfstroke0 * xItalicCorrection
|
|
local xright : _xright - halfstroke1 * xItalicCorrection
|
|
local sxleft : mix xleft xright [0.5 - expansion]
|
|
local sxright : mix xleft xright [0.5 + expansion]
|
|
local syleft : mix roundleft roundright [0.5 - expansion]
|
|
local syright : mix roundleft roundright [0.5 + expansion]
|
|
|
|
return : new Stroke
|
|
:.set-transform globalTransform
|
|
:.start-from xleft [yleft - halfstroke0 * yItalicCorrection]
|
|
:.set-width halfstroke0 halfstroke0
|
|
:.curve-to xleft roundleft sxleft syleft
|
|
:.set-width ess ess
|
|
:.line-to sxright syright
|
|
:.curve-to xright roundright xright [yright + halfstroke1 * yItalicCorrection]
|
|
:.set-width halfstroke1 halfstroke1
|
|
:.to-outline
|
|
}
|
|
define [sStrand yleft yright _expansion] : begin {
|
|
return : xsStrand SB yleft RIGHTSB yright HALFSTROKE HALFSTROKE HALFSTROKE _expansion [SMOOTHA * 0.4]
|
|
}
|
|
|
|
define [halfXStrand _leftx lefty rightx righty turn straight tension _fine] : begin {
|
|
local leftx : _leftx + [HALFSTROKE * [if [rightx > _leftx] 1 [-1]]]
|
|
local fine : [_fine || STROKE] * 0.5
|
|
|
|
local turnyleft : mix lefty righty turn
|
|
local cyleft : mix turnyleft righty tension
|
|
|
|
local straightxleft : mix leftx rightx straight
|
|
local straightyleft : mix cyleft righty straight
|
|
|
|
return : new Stroke
|
|
:.set-transform globalTransform
|
|
:.start-from leftx lefty
|
|
:.set-width HALFSTROKE HALFSTROKE
|
|
:.heads-to [if [lefty < righty] UPWARD DOWNWARD]
|
|
:.line-to leftx turnyleft
|
|
:.heads-to [if [lefty < righty] UPWARD DOWNWARD]
|
|
:.curve-to leftx cyleft straightxleft straightyleft
|
|
:.set-width fine fine
|
|
:.line-to rightx righty
|
|
:.to-outline
|
|
}
|
|
|
|
define [xStrand _leftx lefty _rightx righty turn straight tension] : begin {
|
|
local middlex : mix _leftx _rightx 0.5
|
|
local middley : mix lefty righty 0.5
|
|
|
|
return : halfXStrand _leftx lefty middlex middley turn straight tension
|
|
:.concat : halfXStrand _rightx righty middlex middley turn straight tension
|
|
}
|
|
|
|
define [nBowl left middle right fine] : begin {
|
|
local bandLeft : new Stroke
|
|
:.set-transform globalTransform
|
|
:.start-from right 0
|
|
:.heads-to UPWARD
|
|
:.set-width STROKE 0
|
|
:.line-to right [XH - SMALLSMOOTHB]
|
|
:.arc-vh-to middle XO
|
|
:.heads-to LEFTWARD
|
|
:.to-outline
|
|
local bandRight : new Stroke
|
|
:.set-transform globalTransform
|
|
:.start-from middle [XO - STROKE]
|
|
:.set-width 0 STROKE
|
|
:.heads-to LEFTWARD
|
|
:.arc-hv-to left [XH - SMALLSMOOTHA]
|
|
:.heads-to DOWNWARD
|
|
:.set-width 0 fine
|
|
:.to-outline
|
|
return : bandLeft.concat bandRight
|
|
}
|
|
|
|
define [sHookUpper top smooth hook _middle] : begin {
|
|
local middle : _middle || MIDDLE
|
|
return : new Stroke
|
|
:.set-transform globalTransform
|
|
:.start-from [RIGHTSB - OXHOOK] [top - hook]
|
|
:.set-width STROKE 0
|
|
:.curve-to [mix middle RIGHTSB KAPPA_HOOK] [top - O] middle [top - O]
|
|
:.heads-to LEFTWARD
|
|
:.arc-hv-to SB [top - smooth]
|
|
:.to-outline
|
|
}
|
|
define [twoHookUpper top smooth hook _middle] : begin {
|
|
local middle : _middle || MIDDLE
|
|
return : new Stroke
|
|
:.set-transform globalTransform
|
|
:.start-from [SB + OXHOOK] [top - hook]
|
|
:.set-width 0 STROKE
|
|
:.curve-to [mix middle SB KAPPA_HOOK] [top - O] middle [top - O]
|
|
:.heads-to RIGHTWARD
|
|
:.arc-hv-to RIGHTSB [top - smooth]
|
|
:.to-outline
|
|
}
|
|
define [sHookLower bottom smooth hook _middle] : begin {
|
|
local middle : _middle || MIDDLE
|
|
return : new Stroke
|
|
:.set-transform globalTransform
|
|
:.start-from RIGHTSB smooth
|
|
:.set-width 0 STROKE
|
|
:.arc-vh-to middle [bottom + O]
|
|
:.heads-to LEFTWARD
|
|
:.curve-to [mix middle SB KAPPA_HOOK] [bottom + O] [SB + OXHOOK] [bottom + hook]
|
|
:.to-outline
|
|
}
|
|
|
|
define [smallo u d l r] : begin {
|
|
local middle : [l + r] / 2
|
|
if [u - d > SMALLSMOOTHA + SMALLSMOOTHB] {
|
|
then : return : new Stroke
|
|
:.set-transform globalTransform
|
|
:.start-from middle [u - O]
|
|
:.set-width STROKE 0
|
|
:.heads-to LEFTWARD
|
|
:.arc-hv-to [l + O] [u - SMALLSMOOTHA]
|
|
:.line-to [l + O] [d + SMALLSMOOTHB]
|
|
:.arc-vh-to middle [d + O]
|
|
:.heads-to RIGHTWARD
|
|
:.arc-hv-to [r - O] [d + SMALLSMOOTHA]
|
|
:.line-to [r - O] [u - SMALLSMOOTHB]
|
|
:.arc-vh-to middle [u - O]
|
|
:.heads-to LEFTWARD
|
|
:.to-outline
|
|
else : begin {
|
|
local ymiddlea : [u - SMALLSMOOTHA + d + SMALLSMOOTHB] / 2
|
|
local ymiddleb : [u - SMALLSMOOTHB + d + SMALLSMOOTHA] / 2
|
|
return : new Stroke
|
|
:.set-transform globalTransform
|
|
:.start-from middle [u - O]
|
|
:.set-width STROKE 0
|
|
:.heads-to LEFTWARD
|
|
:.arc-hv-to [l + O] ymiddlea
|
|
:.arc-vh-to middle [d + O]
|
|
:.heads-to RIGHTWARD
|
|
:.arc-hv-to [r - O] ymiddleb
|
|
:.arc-vh-to middle [u - O]
|
|
:.heads-to LEFTWARD
|
|
:.to-outline
|
|
}
|
|
}
|
|
} |