Files
Iosevka/glyphs/symbol-geometric.ptl
T

573 lines
21 KiB
Plaintext

###### GEOMETRIC SHAPES
### Arrowheads
define {ArrowHead ArrowShape} : symbol-block 'Arrows'
local arrowSize : (RIGHTSB - SB) / 3 * [Math.pow (FULLWIDTH / WIDTH) 0.4]
local halfstroke : OPERATORSTROKE / 2
local fine : adviceBlackness 4
local arrowTop : mix parenMid parenTop 0.85
local arrowBot : mix parenMid parenBot 0.85
define [ArrowHead x1 y1 x2 y2 _size] : create-glyph : glyph-construction
local size : fallback _size arrowSize
local g this.gizmo
set this.gizmo : Translate 0 0
include : dispiro
function [set this.gizmo [Transform.Id]]
widths.rhs fine
flat 0 0 [heading UPWARD]
curl (size * 1) size
end [[] => (this.contrast = 1)]
include : dispiro
function [set this.gizmo [Transform.Id]]
widths.lhs fine
flat 0 0 [heading DOWNWARD]
curl (size * 1) (-size)
end [[] => (this.contrast = 1)]
apply-transform : Translate O 0
local {.x xo .y yo} : tp globalTransform {.x x1 .y y1}
local {.x xt .y yt} : tp globalTransform {.x x2 .y y2}
apply-transform : Rotate : Math.atan2 (yo - yt) (xo - xt)
apply-transform : Translate xt yt
set this.gizmo g
define [ArrowShape x1 y1 x2 y2 size] : glyph-construction
local mag : Math.hypot (y2 - y1) (x2 - x1)
local p : (mag - halfstroke * 1.1) / mag
include : ArrowHead x1 y1 x2 y2 size
include : dispiro
widths.center (halfstroke * 2)
flat x1 y1
curl [mix x1 x2 p] [mix y1 y2 p]
end [[] => (this.contrast = 1)]
define [arrow id unicode x1 y1 x2 y2] : sketch
set-width FULLWIDTH
set-anchor "slash" BASE FWMIDDLE parenMid
include : ArrowShape x1 y1 x2 y2
save id unicode
define [doublearrow id unicode x1 y1 x2 y2] : sketch
set-width FULLWIDTH
set-anchor "slash" BASE FWMIDDLE parenMid
local xm : mix x1 x2 0.5
local ym : mix y1 y2 0.5
include : ArrowShape xm ym x1 y1
include : ArrowShape xm ym x2 y2
save id unicode
arrow 'arrowleft' 0x2190 FWRSB parenMid SB parenMid
arrow 'arrowright' 0x2192 SB parenMid FWRSB parenMid
arrow 'arrowup' 0x2191 FWMIDDLE arrowBot FWMIDDLE arrowTop
arrow 'arrowdown' 0x2193 FWMIDDLE arrowTop FWMIDDLE arrowBot
doublearrow 'arrowleftright' 0x2194 SB parenMid FWRSB parenMid
doublearrow 'arrowupdown' 0x2195 FWMIDDLE arrowTop FWMIDDLE arrowBot
arrow 'arrowupleft' 0x2196 FWRSB arrowBot SB arrowTop
arrow 'arrowupright' 0x2197 SB arrowBot FWRSB arrowTop
arrow 'arrowdownright' 0x2198 SB arrowTop FWRSB arrowBot
arrow 'arrowdownleft' 0x2199 FWRSB arrowTop SB arrowBot
* {ArrowHead ArrowShape}
### Standard geometric shapes
symbol-block 'Geometric'
define left : mix MIDDLE SB 1.1
define right : mix MIDDLE RIGHTSB 1.1
define squareRadius : (right - left) / 2
local hollowSW : adviceBlackness 5
define [hollowScale w d s] : (w - [fallback s hollowSW] * [fallback d : WIDTH / FULLWIDTH]) / w
define [hollow newid unicode oldid zx zy cx cy] : sketch
include : create-glyph : glyph-construction
include glyphs.(oldid)
include UnFullWidthify
reverse-last
local zoom : hollowScale squareRadius
include : FlipAround [fallback cx MIDDLE] [fallback cy parenMid] [fallback zx zoom] [fallback zy zx zoom]
include : create-glyph : glyph-construction
include glyphs.(oldid)
include UnFullWidthify
include FullWidthify
save newid unicode
define [resized newid unicode id x y s sy] : sketch
include glyphs.(id) AS_BASE
include UnFullWidthify
include : FlipAround x y s [fallback sy s]
include FullWidthify
save [fallback newid : [if (s < 1) 'small' 'large'] + id] unicode
define FullWidthify : glyph-construction
apply-transform [Upright] true
apply-transform [Translate (-MIDDLE) (-parenMid)] true
apply-transform [Scale (FULLWIDTH / WIDTH)] true
apply-transform [Translate FWMIDDLE parenMid] true
apply-transform [Italify] true
set-width FULLWIDTH
define UnFullWidthify : glyph-construction
apply-transform [Upright] true
apply-transform [Translate (-FWMIDDLE) (-parenMid)] true
apply-transform [Scale (WIDTH / FULLWIDTH)] true
apply-transform [Translate MIDDLE parenMid] true
apply-transform [Italify] true
set-width WIDTH
sketch # blacksquare
start-from left (parenMid + squareRadius)
line-to right (parenMid + squareRadius)
line-to right (parenMid - squareRadius)
line-to left (parenMid - squareRadius)
include FullWidthify
save 'blacksquare' 0x25A0
sketch # blackrectangle
start-from left (parenMid + squareRadius / 1.5)
line-to right (parenMid + squareRadius / 1.5)
line-to right (parenMid - squareRadius / 1.5)
line-to left (parenMid - squareRadius / 1.5)
include FullWidthify
save 'blackrectangle' 0x25AC
sketch # blacklongrectangle
start-from left (parenMid + squareRadius * 1.5)
line-to right (parenMid + squareRadius * 1.5)
line-to right (parenMid - squareRadius * 1.5)
line-to left (parenMid - squareRadius * 1.5)
include FullWidthify
save 'blacklongrectangle' 0x25AE
local triangleOvershoot : 2 / [Math.sqrt 3]
sketch # blacktriangleup
start-from MIDDLE (parenMid + squareRadius)
line-to [mix MIDDLE right triangleOvershoot] (parenMid - squareRadius)
line-to [mix MIDDLE left triangleOvershoot] (parenMid - squareRadius)
include FullWidthify
save 'blacktriangleup' 0x25B2
sketch # blacktriangledown
start-from MIDDLE (parenMid - squareRadius)
line-to [mix MIDDLE left triangleOvershoot] (parenMid + squareRadius)
line-to [mix MIDDLE right triangleOvershoot] (parenMid + squareRadius)
include FullWidthify
save 'blacktriangledown' 0x25BC
sketch # blacktriangleleft
start-from left parenMid
line-to right (parenMid - squareRadius * triangleOvershoot)
line-to right (parenMid + squareRadius * triangleOvershoot)
include FullWidthify
save 'blacktriangleleft' 0x25C0
sketch # blacktriangleright
start-from right parenMid
line-to left (parenMid + squareRadius * triangleOvershoot)
line-to left (parenMid - squareRadius * triangleOvershoot)
include FullWidthify
save 'blacktriangleright' 0x25B6
sketch # blackdiamond
start-from MIDDLE (parenMid + squareRadius)
line-to right parenMid
line-to MIDDLE (parenMid - squareRadius)
line-to left parenMid
include FullWidthify
save 'blackdiamond' 0x25C6
sketch # blackcircle
include : spiro-outline
g4 MIDDLE (parenMid + squareRadius)
g4 left parenMid
g4 MIDDLE (parenMid - squareRadius)
g4 right parenMid
close
include FullWidthify
save 'blackcircle' 0x25CF
sketch # dottedcircle
local n 12
local fine : adviceBlackness 10
foreach j [range 0 n] : begin
local angle : Math.PI * 2 * j / n
local cx : MIDDLE + (right - MIDDLE) * [Math.cos angle]
local cy : (XH / 2) + (right - MIDDLE) * [Math.sin angle]
include : spiro-outline
g4 cx (cy + fine)
g4 (cx + fine) cy
g4 cx (cy - fine)
g4 (cx - fine) cy
close
#include : Ring (cy + fine) (cy - fine) (cx - fine) (cx + fine) true
include eMarks
apply-transform [Upright] true
apply-transform [Translate 0 (parenMid - (XH / 2))] true
apply-transform [Italify] true
include FullWidthify
save 'dottedcircle' 0x25CC
hollow 'whitesquare' 0x25A1 'blacksquare'
hollow 'whiterectangle' 0x25AD 'blackrectangle' [hollowScale squareRadius] [hollowScale (squareRadius / 1.5)]
hollow 'whitelongrectangle' 0x25AF 'blacklongrectangle' [hollowScale squareRadius] [hollowScale (squareRadius * 1.5)]
hollow 'whitecircle' 0x25CB 'blackcircle'
hollow 'whitebullet' 0x25E6 'bullet' [hollowScale (PERIODSIZE - O) 1]
hollow 'whitediamond' 0x25C7 'blackdiamond' [hollowScale squareRadius nothing (hollowSW * [Math.sqrt 2])]
let [sts 0.75]
: begin
resized 'smallblacktriangleup' 0x25B4 'blacktriangleup' MIDDLE parenMid 0.75
resized 'smallblacktriangleright' 0x25B8 'blacktriangleright' MIDDLE parenMid 0.75
resized 'smallblacktriangledown' 0x25BE 'blacktriangledown' MIDDLE parenMid 0.75
resized 'smallblacktriangleleft' 0x25C2 'blacktriangleleft' MIDDLE parenMid 0.75
let
: sl : hollowScale (squareRadius * 2 / [Math.sqrt 3]) nothing (hollowSW * [Math.sqrt 3])
: ss : hollowScale (squareRadius * sts * 2 / [Math.sqrt 3]) nothing (hollowSW * [Math.sqrt 3])
: begin
hollow 'whitetriangleup' 0x25B3 'blacktriangleup' sl nothing MIDDLE (parenMid - squareRadius / 3)
hollow 'whitetriangledown' 0x25BD 'blacktriangledown' sl nothing MIDDLE (parenMid + squareRadius / 3)
hollow 'whitetriangleleft' 0x25C1 'blacktriangleleft' sl nothing [mix MIDDLE right (1 / 3)] parenMid
hollow 'whitetriangleright' 0x25B7 'blacktriangleright' sl nothing [mix MIDDLE left (1 / 3)] parenMid
hollow 'smallwhitetriangleup' 0x25B5 'smallblacktriangleup' ss nothing MIDDLE (parenMid - squareRadius / 3 * sts)
hollow 'smallwhitetriangledown' 0x25BF 'smallblacktriangledown' ss nothing MIDDLE (parenMid + squareRadius / 3 * sts)
hollow 'smallwhitetriangleleft' 0x25C3 'smallblacktriangleleft' ss nothing [mix MIDDLE right (sts / 3)] parenMid
hollow 'smallwhitetriangleright' 0x25B9 'smallblacktriangleright' ss nothing [mix MIDDLE left (sts / 3)] parenMid
### Blocks
symbol-block 'Block Shapes'
sketch # fullblock
set-width FULLWIDTH
start-from 0 font.'OS/2'.usWinAscent
line-to FULLWIDTH font.'OS/2'.usWinAscent
line-to FULLWIDTH (-font.'OS/2'.usWinDescent)
line-to 0 (-font.'OS/2'.usWinDescent)
save 'fullblock' 0x2588
define [Shade fn] : glyph-construction
local top font.'OS/2'.usWinAscent
local bottom (-font.'OS/2'.usWinDescent)
local segx 6
local segy 16
local g : create-glyph : glyph-construction : foreach j [range 0 segx] : foreach k [range 0 segy] : if [fn j k] : begin
start-from [mix 0 WIDTH (j / segx)] [mix bottom top (k / segy)]
line-to [mix 0 WIDTH (j / segx)] [mix bottom top ((k + 1) / segy)]
line-to [mix 0 WIDTH ((j + 1) / segx)] [mix bottom top ((k + 1) / segy)]
line-to [mix 0 WIDTH ((j + 1) / segx)] [mix bottom top (k / segy)]
include g
if (FULLWIDTH > WIDTH) : begin
apply-transform : Translate (FULLWIDTH - WIDTH) 0
include g
sketch # lightshade
set-width FULLWIDTH
include : Shade ([j k] => ((k % 2) && (j + (k - 1) / 2) % 2))
save 'lightshade' 0x2591
sketch # mediumshade
set-width FULLWIDTH
include : Shade ([j k] => ((j + k) % 2))
save 'mediumshade' 0x2592
sketch # heavyshade
set-width FULLWIDTH
include : Shade ([j k] => ((k % 2) || (j + k / 2) % 2))
save 'heavyshade' 0x2593
foreach [fill : range 1 8] : begin
sketch # Vertical fill
set-width FULLWIDTH
start-from 0 [mix (-font.'OS/2'.usWinDescent) font.'OS/2'.usWinAscent (fill / 8)]
line-to FULLWIDTH [mix (-font.'OS/2'.usWinDescent) font.'OS/2'.usWinAscent (fill / 8)]
line-to FULLWIDTH (-font.'OS/2'.usWinDescent)
line-to 0 (-font.'OS/2'.usWinDescent)
save ('vfill' + fill) (0x2580 + fill)
sketch # Horizontal fill
set-width FULLWIDTH
start-from 0 font.'OS/2'.usWinAscent
line-to (FULLWIDTH * fill / 8) font.'OS/2'.usWinAscent
line-to (FULLWIDTH * fill / 8) (-font.'OS/2'.usWinDescent)
line-to 0 (-font.'OS/2'.usWinDescent)
save ('hfill' + fill) (0x2590 - fill)
sketch # upHalfblock
set-width FULLWIDTH
start-from 0 font.'OS/2'.usWinAscent
line-to FULLWIDTH font.'OS/2'.usWinAscent
line-to FULLWIDTH [mix (-font.'OS/2'.usWinDescent) font.'OS/2'.usWinAscent 0.5]
line-to 0 [mix (-font.'OS/2'.usWinDescent) font.'OS/2'.usWinAscent 0.5]
save 'upHalfblock' 0x2580
sketch # rightHalfBlock
set-width FULLWIDTH
start-from (FULLWIDTH * 0.5) font.'OS/2'.usWinAscent
line-to FULLWIDTH font.'OS/2'.usWinAscent
line-to FULLWIDTH (-font.'OS/2'.usWinDescent)
line-to (FULLWIDTH * 0.5) (-font.'OS/2'.usWinDescent)
save 'rightHalfBlock' 0x2590
### Box drawing glyphs
symbol-block 'Box-Drawing'
local light : adviceBlackness 3.5
local heavy : Math.max (light * 2) (WIDTH * 0.15)
local width FULLWIDTH
local midx : FULLWIDTH / 2
local midy : mix (-font.'OS/2'.usWinDescent) font.'OS/2'.usWinAscent 0.5
define [boxdraw unicode u d l r] : sketch
set-width width
local stopH : [Math.max u d] / 2
local stopV : [Math.max l r] / 2
if l : include : HBar 0 (midx + stopH) midy l
if r : include : HBar (midx - stopH) width midy r
if d : include : VBar midx (-font.'OS/2'.usWinDescent) (midy + stopV) d
if u : include : VBar midx (midy - stopV) font.'OS/2'.usWinAscent u
save ('bd' + [unicode.toString 16 :.toUpperCase]) unicode
define [dlboxdraw unicode u d l r] : sketch
set-width width
local stopH : [Math.max u d] - light * 1 - light * 0.5 * HVCONTRAST
local stopV : [Math.max l r] - light * 1.5
local capH : [Math.max u d] - light * 1
local capV : [Math.max l r] - light * 1
if l : begin
include : HBar 0 (midx - stopH) (midy + (l - light)) light
if (l > light) : include : HBar 0 (midx - stopH) (midy - (l - light)) light
if r : begin
include : HBar (midx + stopH) width (midy + (r - light)) light
if (r > light) : include : HBar (midx + stopH) width (midy - (r - light)) light
if d : begin
include : VBar (midx + (d - light)) (-font.'OS/2'.usWinDescent) (midy - stopV) light
if (d > light) : include : VBar (midx - (d - light)) (-font.'OS/2'.usWinDescent) (midy - stopV) light
if u : begin
include : VBar (midx + (u - light)) (midy + stopV) font.'OS/2'.usWinAscent light
if (u > light) : include : VBar (midx - (u - light)) (midy + stopV) font.'OS/2'.usWinAscent light
if (stopH > 0 && [not u]) : include : HBar (midx - stopH - light * HVCONTRAST) (midx + stopH + light * HVCONTRAST) (midy + capV) light
if (stopH > 0 && [not d]) : include : HBar (midx - stopH - light * HVCONTRAST) (midx + stopH + light * HVCONTRAST) (midy - capV) light
if (stopV > 0 && [not l]) : include : VBar (midx - capH) (midy - stopV - light) (midy + stopV + light) light
if (stopV > 0 && [not r]) : include : VBar (midx + capH) (midy - stopV - light) (midy + stopV + light) light
save ('bd' + [unicode.toString 16 :.toUpperCase]) unicode
define [complexBoxDraw unicodeStart U D L R fn dl] : begin
local order {
{light light light light}
{light light heavy light}
{light light light heavy}
{light light heavy heavy}
{heavy light light light}
{light heavy light light}
{heavy heavy light light}
{heavy light heavy light}
{heavy light light heavy}
{light heavy heavy light}
{light heavy light heavy}
{heavy light heavy heavy}
{light heavy heavy heavy}
{heavy heavy heavy light}
{heavy heavy light heavy}
{heavy heavy heavy heavy}
}
local existings {}
local n 0
foreach {u d l r} [items-of order] : begin
local newcome true
local masked {(U * u) (D * d) (L * l) (R * r)}
foreach existing [items-of existings] : if ('' + existing === '' + masked) : set newcome false
if newcome : begin
if ([not dl]
|| ([not masked.0] || [not masked.1] || (masked.0 === masked.1))
&& ([not masked.2] || [not masked.3] || (masked.2 === masked.3))
&& (masked.0 > light || masked.1 > light || masked.2 > light || masked.3 > light)
) : begin
[fallback fn boxdraw].apply null {(unicodeStart + n) :: masked}
inc n
existings.push masked
# Straight
boxdraw 0x2500 0 0 light light
boxdraw 0x2501 0 0 heavy heavy
boxdraw 0x2502 light light 0 0
boxdraw 0x2503 heavy heavy 0 0
boxdraw 0x2574 0 0 light 0
boxdraw 0x2575 light 0 0 0
boxdraw 0x2576 0 0 0 light
boxdraw 0x2577 0 light 0 0
boxdraw 0x2578 0 0 heavy 0
boxdraw 0x2579 heavy 0 0 0
boxdraw 0x257A 0 0 0 heavy
boxdraw 0x257B 0 heavy 0 0
boxdraw 0x257C 0 0 light heavy
boxdraw 0x257D light heavy 0 0
boxdraw 0x257E 0 0 heavy light
boxdraw 0x257F heavy light 0 0
dlboxdraw 0x2550 0 0 heavy heavy
dlboxdraw 0x2551 heavy heavy 0 0
# Complex
complexBoxDraw 0x250C 0 1 0 1
complexBoxDraw 0x2510 0 1 1 0
complexBoxDraw 0x2514 1 0 0 1
complexBoxDraw 0x2518 1 0 1 0
complexBoxDraw 0x251C 1 1 0 1
complexBoxDraw 0x2524 1 1 1 0
complexBoxDraw 0x252C 0 1 1 1
complexBoxDraw 0x2534 1 0 1 1
complexBoxDraw 0x253C 1 1 1 1
complexBoxDraw 0x2552 0 1 0 1 dlboxdraw 1
complexBoxDraw 0x2555 0 1 1 0 dlboxdraw 1
complexBoxDraw 0x2558 1 0 0 1 dlboxdraw 1
complexBoxDraw 0x255B 1 0 1 0 dlboxdraw 1
complexBoxDraw 0x255E 1 1 0 1 dlboxdraw 1
complexBoxDraw 0x2561 1 1 1 0 dlboxdraw 1
complexBoxDraw 0x2564 0 1 1 1 dlboxdraw 1
complexBoxDraw 0x2567 1 0 1 1 dlboxdraw 1
complexBoxDraw 0x256A 1 1 1 1 dlboxdraw 1
# Dashed
define [hDashed unicode segments weight] : sketch
set-width width
foreach j [range 0 segments] : include : HBar [mix (width * j / segments) (width * (j + 1) / segments) 0.2] [mix (width * j / segments) (width * (j + 1) / segments) 0.8] midy weight
save ('bd' + [unicode.toString 16 :.toUpperCase]) unicode
define [vDashed unicode segments weight] : sketch
set-width width
foreach j [range 0 segments] : include : VBar midx [mix [mix (-font.'OS/2'.usWinDescent) font.'OS/2'.usWinAscent (j / segments)] [mix (-font.'OS/2'.usWinDescent) font.'OS/2'.usWinAscent ((j + 1) / segments)] 0.2] [mix [mix (-font.'OS/2'.usWinDescent) font.'OS/2'.usWinAscent (j / segments)] [mix (-font.'OS/2'.usWinDescent) font.'OS/2'.usWinAscent ((j + 1) / segments)] 0.8] weight
save ('bd' + [unicode.toString 16 :.toUpperCase]) unicode
hDashed 0x2504 3 light
hDashed 0x2505 3 heavy
hDashed 0x2508 4 light
hDashed 0x2509 4 heavy
hDashed 0x254C 2 light
hDashed 0x254D 2 heavy
vDashed 0x2506 3 light
vDashed 0x2507 3 heavy
vDashed 0x250A 4 light
vDashed 0x250B 4 heavy
vDashed 0x254E 2 light
vDashed 0x254F 2 heavy
# Arcs
sketch # bd256D
set-width width
include : dispiro
widths.center light
g4.up.start midx (-font.'OS/2'.usWinDescent) [heading UPWARD]
arcvh
g4.right.end width midy [heading RIGHTWARD]
save 'bd256D' 0x256D
sketch # bd256E
set-width width
include : dispiro
widths.center light
g4.up.start midx (-font.'OS/2'.usWinDescent) [heading UPWARD]
arcvh
g4.left.end 0 midy [heading LEFTWARD]
save 'bd256E' 0x256E
sketch # bd256F
set-width width
include : dispiro
widths.center light
g4.down.start midx font.'OS/2'.usWinAscent [heading DOWNWARD]
arcvh
g4.left.end 0 midy [heading LEFTWARD]
save 'bd256F' 0x256F
sketch # bd2570
set-width width
include : dispiro
widths.center light
g4.down.start midx font.'OS/2'.usWinAscent [heading DOWNWARD]
arcvh
g4.right.end width midy [heading RIGHTWARD]
save 'bd2570' 0x2570
sketch # bd2571
set-width width
include : dispiro
widths.center light
flat width font.'OS/2'.usWinAscent
curl 0 (-font.'OS/2'.usWinDescent)
save 'bd2571' 0x2571
sketch # bd2572
set-width width
include : dispiro
widths.center light
flat 0 font.'OS/2'.usWinAscent
curl width (-font.'OS/2'.usWinDescent)
save 'bd2572' 0x2572
sketch # bd2573
set-width width
include glyphs.bd2571
include glyphs.bd2572
save 'bd2573' 0x2573
### POWERLINE glyphs
symbol-block 'Powerline'
sketch # branch
local fine : adviceBlackness 3.5
local vBarPos : mix SB RIGHTSB 0.2
local xRightBall : RIGHTSB - PERIODRADIUS
local yRightBall : mix parenBot parenTop 0.45
include : VBar vBarPos (parenBot + PERIODSIZE) [linreg SB parenTop xRightBall yRightBall vBarPos] fine
include : dispiro
widths.center fine
flat SB parenTop
curl xRightBall yRightBall
include : RingAt vBarPos (parenBot + PERIODSIZE) PERIODRADIUS
include : RingAt xRightBall yRightBall PERIODRADIUS
save 'branch' 0xE0A0
sketch # pwlTriangleRight
start-from O font.'OS/2'.usWinAscent
line-to 0 font.'OS/2'.usWinAscent
line-to WIDTH [mix font.'OS/2'.usWinAscent (-font.'OS/2'.usWinDescent) 0.5]
line-to 0 (-font.'OS/2'.usWinDescent)
line-to O (-font.'OS/2'.usWinDescent)
save 'pwlTriangleRight' 0xE0B0
sketch # pwlAngleRight
local fine : adviceBlackness 4
include : dispiro
widths.rhs fine
flat 0 font.'OS/2'.usWinAscent
curl WIDTH [mix font.'OS/2'.usWinAscent (-font.'OS/2'.usWinDescent) 0.5]
include : dispiro
widths.rhs fine
flat WIDTH [mix font.'OS/2'.usWinAscent (-font.'OS/2'.usWinDescent) 0.5]
curl 0 (-font.'OS/2'.usWinDescent)
save 'pwlAngleRight' 0xE0B1
sketch # pwlTriangleLeft
include glyphs.pwlTriangleRight
include : FlipAround MIDDLE [mix font.'OS/2'.usWinAscent (-font.'OS/2'.usWinDescent) 0.5]
save 'pwlTriangleLeft' 0xE0B2
sketch # pwlAngleLeft
include glyphs.pwlAngleRight
include : FlipAround MIDDLE [mix font.'OS/2'.usWinAscent (-font.'OS/2'.usWinDescent) 0.5]
save 'pwlAngleLeft' 0xE0B3
sketch # pwlLock
local fine : adviceBlackness 3.5
include glyphs.O
start-from (SB + OX) parenMid
line-to (RIGHTSB - OX) parenMid
line-to (RIGHTSB - OX) parenBot
line-to (SB + OX) parenBot
save 'pwlLock' 0xE0A2