diff --git a/buildglyphs.patel b/buildglyphs.patel index a5bd189..8c5d5ad 100644 --- a/buildglyphs.patel +++ b/buildglyphs.patel @@ -33,24 +33,6 @@ define [buildFont para recursive] : begin { define glyphs (.'.notdef' glyphList.0) define unicodeGlyphs () - # Transform constructors - define [Italify angle] : begin { - local slope [Math.tan [[fallback angle para.italicangle] / 180 * Math.PI]] - return (.xx 1 .yx slope .xy 0 .yy 1 .x [-slope * 0.5 * para.xheight] .y 0) - } - define [Upright angle] [inverse : Italify angle] - define [Scale sx sy] (.xx sx .yx 0 .xy 0 .yy [fallback sy sx] .x 0 .y 0) - define [Translate x y] (.xx 1 .yx 0 .xy 0 .yy 1 .x x .y y) - define [Rotate angle] (.xx [Math.cos angle] .yx [-[Math.sin angle]] .xy [Math.sin angle] .yy [Math.cos angle] .x 0 .y 0) - - define globalTransform : Italify para.italicAngle - define ITALICCOR : 1 / [Math.sqrt [1 - globalTransform.yx * globalTransform.yx]] - - define UPWARD (.x [-ITALICCOR] .y 0) - define DOWNWARD (.x ITALICCOR .y 0) - define RIGHTWARD (.x globalTransform.yx .y 1) - define LEFTWARD (.x [- globalTransform.yx] .y [-1]) - # metrics define DESCENDER para.descender define WIDTH para.width @@ -76,6 +58,28 @@ define [buildFont para recursive] : begin { define ACCENT para.accent define ACCENTX para.accentx + # Common 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] + + # Transform constructors + define [Italify angle] : begin { + local slope [Math.tan [[fallback angle para.italicangle] / 180 * Math.PI]] + return (.xx 1 .yx slope .xy 0 .yy 1 .x [-slope * parenMid] .y 0) + } + define [Upright angle] [inverse : Italify angle] + define [Scale sx sy] (.xx sx .yx 0 .xy 0 .yy [fallback sy sx] .x 0 .y 0) + define [Translate x y] (.xx 1 .yx 0 .xy 0 .yy 1 .x x .y y) + define [Rotate angle] (.xx [Math.cos angle] .yx [-[Math.sin angle]] .xy [Math.sin angle] .yy [Math.cos angle] .x 0 .y 0) + + define globalTransform : Italify para.italicAngle + define ITALICCOR : 1 / [Math.sqrt [1 - globalTransform.yx * globalTransform.yx]] + + define UPWARD (.x [-ITALICCOR] .y 0) + define DOWNWARD (.x ITALICCOR .y 0) + define RIGHTWARD (.x globalTransform.yx .y 1) + define LEFTWARD (.x [- globalTransform.yx] .y [-1]) # derived metrics define XO : XH - O @@ -308,6 +312,7 @@ define [buildFont para recursive] : begin { $$include 'glyphs/symbol-math.patel' $$include 'glyphs/symbol-letter.patel' $$include 'glyphs/symbol-geometric.patel' + $$include 'glyphs/symbol-other.patel' $$include 'glyphs/autobuilds.patel' ### Zoom all glyphs by para.upmscale diff --git a/glyphs/symbol-ascii.patel b/glyphs/symbol-ascii.patel index 7fefdf4..dc2c649 100644 --- a/glyphs/symbol-ascii.patel +++ b/glyphs/symbol-ascii.patel @@ -91,10 +91,6 @@ create-glyph 'at' : glyph-construction { ### Brackets -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] - local parenOutside 0.15 local parenInside 0.65 local bracketOutside 0.15 diff --git a/glyphs/symbol-geometric.patel b/glyphs/symbol-geometric.patel index 73c11c0..1af5dee 100644 --- a/glyphs/symbol-geometric.patel +++ b/glyphs/symbol-geometric.patel @@ -1,151 +1,209 @@ ###### GEOMETRIC SHAPES +### Arrowheads +let [arrowSize : [RIGHTSB - SB] / 3] [halfstroke : [adviceBlackness 4] / 2] [fine : adviceBlackness 4.5] [arrowTop : mix parenMid parenTop 0.75] [arrowBot : mix parenMid parenBot 0.75] : begin { + define [ArrowHead x1 y1 x2 y2] : create-glyph : glyph-construction { + set this.gizmo : Translate 0 0 + include : create-stroke + :.start-from 0 0 + :.heads-to UPWARD + :.set-width 0 fine + :.line-to [arrowSize * 1] arrowSize + :.set-width 0 fine + :.set-samples 1 + include : create-stroke + :.start-from 0 0 + :.heads-to DOWNWARD + :.set-width fine 0 + :.line-to [arrowSize * 1] [-arrowSize] + :.set-width fine 0 + :.set-samples 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 + } + define [ArrowShape x1 y1 x2 y2] : glyph-construction { + local mag : Math.hypot [y2 - y1] [x2 - x1] + local p : [mag - halfstroke * 1.1] / mag + include : ArrowHead x1 y1 x2 y2 + include : create-stroke + :.start-from x1 y1 + :.set-width halfstroke halfstroke + :.line-to [mix x1 x2 p] [mix y1 y2 p] + } + define [arrow id unicode x1 y1 x2 y2] : create-glyph id : glyph-construction { + assign-unicode unicode + include : ArrowShape x1 y1 x2 y2 + } + define [doublearrow id unicode x1 y1 x2 y2] : create-glyph id : glyph-construction { + assign-unicode unicode + 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 + } + arrow 'arrowleft' 0x2190 RIGHTSB parenMid SB parenMid + arrow 'arrowright' 0x2192 SB parenMid RIGHTSB parenMid + arrow 'arrowup' 0x2191 MIDDLE arrowBot MIDDLE arrowTop + arrow 'arrowdown' 0x2193 MIDDLE arrowTop MIDDLE arrowBot + doublearrow 'arrowleftright' 0x2194 SB parenMid RIGHTSB parenMid + doublearrow 'arrowupdown' 0x2195 MIDDLE arrowTop MIDDLE arrowBot + arrow 'arrowupleft' 0x2196 RIGHTSB arrowBot SB arrowTop + arrow 'arrowupright' 0x2197 SB arrowBot RIGHTSB arrowTop + arrow 'arrowdownright' 0x2198 SB arrowTop RIGHTSB arrowBot + arrow 'arrowdownleft' 0x2199 RIGHTSB arrowTop SB arrowBot +} ### Standard geometric shapes -define squareRadius : [RIGHTSB - SB] / 2 -define [hollowScale w] : [w - [adviceBlackness 5]] / w -define [hollow newid unicode oldid zx zy] : create-glyph newid : glyph-construction { - assign-unicode unicode - include glyphs.(oldid) - reverse-last - local zoom : hollowScale squareRadius - include : FlipAround MIDDLE parenMid [fallback zx zoom] [fallback zy zx zoom] - include glyphs.(oldid) -} -create-glyph 'blacksquare' : glyph-construction { - assign-unicode 0x25A0 - start-from SB [parenMid + squareRadius] - line-to RIGHTSB [parenMid + squareRadius] - line-to RIGHTSB [parenMid - squareRadius] - line-to SB [parenMid - squareRadius] -} -create-glyph 'blackrectangle' : glyph-construction { - assign-unicode 0x25AC - start-from SB [parenMid + squareRadius / 1.5] - line-to RIGHTSB [parenMid + squareRadius / 1.5] - line-to RIGHTSB [parenMid - squareRadius / 1.5] - line-to SB [parenMid - squareRadius / 1.5] -} -create-glyph 'blacklongrectangle' : glyph-construction { - assign-unicode 0x25AE - start-from SB [parenMid + squareRadius * 1.5] - line-to RIGHTSB [parenMid + squareRadius * 1.5] - line-to RIGHTSB [parenMid - squareRadius * 1.5] - line-to SB [parenMid - squareRadius * 1.5] -} -create-glyph 'blacktriangleup' : glyph-construction { - assign-unicode 0x25B2 - start-from MIDDLE [parenMid + squareRadius] - line-to RIGHTSB [parenMid - squareRadius] - line-to SB [parenMid - squareRadius] -} -create-glyph 'blackdiamond' : glyph-construction { - assign-unicode 0x25C6 - start-from MIDDLE [parenMid + squareRadius] - line-to RIGHTSB parenMid - line-to MIDDLE [parenMid - squareRadius] - line-to SB parenMid -} -create-glyph 'blacktriangledown' : glyph-construction { - assign-unicode 0x25BC - start-from MIDDLE [parenMid - squareRadius] - line-to SB [parenMid + squareRadius] - line-to RIGHTSB [parenMid + squareRadius] -} -create-glyph 'blackcircle' : glyph-construction { - assign-unicode 0x25CF - include : list : Ring [parenMid + squareRadius] [parenMid - squareRadius] SB RIGHTSB -} -create-glyph 'dottedcircle' : glyph-construction { - assign-unicode 0x25CC - local n 12 - local fine : [adviceBlackness 5] / 2 - foreach j [range 0 n] : begin { - local angle : Math.PI * 2 * j / n - local cx : MIDDLE + [RIGHTSB - MIDDLE] * [Math.cos angle] - local cy : [XH / 2] + [RIGHTSB - MIDDLE] * [Math.sin angle] - include : list : Ring [cy + fine] [cy - fine] [cx - fine] [cx + fine] true +let : begin { + define squareRadius : [RIGHTSB - SB] / 2 + define [hollowScale w] : [w - [adviceBlackness 5]] / w + define [hollow newid unicode oldid zx zy] : create-glyph newid : glyph-construction { + assign-unicode unicode + include glyphs.(oldid) + reverse-last + local zoom : hollowScale squareRadius + include : FlipAround MIDDLE parenMid [fallback zx zoom] [fallback zy zx zoom] + include glyphs.(oldid) } - 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 ) + create-glyph 'blacksquare' : glyph-construction { + assign-unicode 0x25A0 + start-from SB [parenMid + squareRadius] + line-to RIGHTSB [parenMid + squareRadius] + line-to RIGHTSB [parenMid - squareRadius] + line-to SB [parenMid - squareRadius] } + create-glyph 'blackrectangle' : glyph-construction { + assign-unicode 0x25AC + start-from SB [parenMid + squareRadius / 1.5] + line-to RIGHTSB [parenMid + squareRadius / 1.5] + line-to RIGHTSB [parenMid - squareRadius / 1.5] + line-to SB [parenMid - squareRadius / 1.5] + } + create-glyph 'blacklongrectangle' : glyph-construction { + assign-unicode 0x25AE + start-from SB [parenMid + squareRadius * 1.5] + line-to RIGHTSB [parenMid + squareRadius * 1.5] + line-to RIGHTSB [parenMid - squareRadius * 1.5] + line-to SB [parenMid - squareRadius * 1.5] + } + create-glyph 'blacktriangleup' : glyph-construction { + assign-unicode 0x25B2 + start-from MIDDLE [parenMid + squareRadius] + line-to RIGHTSB [parenMid - squareRadius] + line-to SB [parenMid - squareRadius] + } + create-glyph 'blackdiamond' : glyph-construction { + assign-unicode 0x25C6 + start-from MIDDLE [parenMid + squareRadius] + line-to RIGHTSB parenMid + line-to MIDDLE [parenMid - squareRadius] + line-to SB parenMid + } + create-glyph 'blacktriangledown' : glyph-construction { + assign-unicode 0x25BC + start-from MIDDLE [parenMid - squareRadius] + line-to SB [parenMid + squareRadius] + line-to RIGHTSB [parenMid + squareRadius] + } + create-glyph 'blackcircle' : glyph-construction { + assign-unicode 0x25CF + include : list : Ring [parenMid + squareRadius] [parenMid - squareRadius] SB RIGHTSB + } + create-glyph 'dottedcircle' : glyph-construction { + assign-unicode 0x25CC + local n 12 + local fine : [adviceBlackness 5] / 2 + foreach j [range 0 n] : begin { + local angle : Math.PI * 2 * j / n + local cx : MIDDLE + [RIGHTSB - MIDDLE] * [Math.cos angle] + 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 ) + } + } + + 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]] + hollow 'whitediamond' 0x25C7 'blackdiamond' } -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]] -hollow 'whitediamond' 0x25C7 'blackdiamond' - ### Blocks -create-glyph 'fullblock' : glyph-construction { - assign-unicode 0x2588 - start-from 0 font.hhea.ascent - line-to WIDTH font.hhea.ascent - line-to WIDTH font.hhea.descent - line-to 0 font.hhea.descent -} -define [Shade fn] : glyph-construction { - local top font.hhea.ascent - local bottom font.hhea.descent - local segx 6 - local segy 16 - 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]] - } -} -create-glyph 'lightshade' : glyph-construction { - assign-unicode 0x2591 - include : Shade [[j k] -> [[k % 2] && [j + [k - 1] / 2] % 2]] -} -create-glyph 'mediumshade' : glyph-construction { - assign-unicode 0x2592 - include : Shade [[j k] -> [[j + k] % 2]] -} -create-glyph 'heavyshade' : glyph-construction { - assign-unicode 0x2593 - include : Shade [[j k] -> [[k % 2] || [j + k / 2] % 2]] -} -let : foreach fill [range 1 8] : begin { - create-glyph ['vfill' + fill] : glyph-construction { - assign-unicode [0x2580 + fill] - start-from 0 [mix font.hhea.descent font.hhea.ascent [fill / 8]] - line-to WIDTH [mix font.hhea.descent font.hhea.ascent [fill / 8]] +let : begin { + create-glyph 'fullblock' : glyph-construction { + assign-unicode 0x2588 + start-from 0 font.hhea.ascent + line-to WIDTH font.hhea.ascent line-to WIDTH font.hhea.descent line-to 0 font.hhea.descent } - create-glyph ['hfill' + fill] : glyph-construction { - assign-unicode [0x2590 - fill] + define [Shade fn] : glyph-construction { + local top font.hhea.ascent + local bottom font.hhea.descent + local segx 6 + local segy 16 + 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]] + } + } + create-glyph 'lightshade' : glyph-construction { + assign-unicode 0x2591 + include : Shade [[j k] -> [[k % 2] && [j + [k - 1] / 2] % 2]] + } + create-glyph 'mediumshade' : glyph-construction { + assign-unicode 0x2592 + include : Shade [[j k] -> [[j + k] % 2]] + } + create-glyph 'heavyshade' : glyph-construction { + assign-unicode 0x2593 + include : Shade [[j k] -> [[k % 2] || [j + k / 2] % 2]] + } + let : foreach fill [range 1 8] : begin { + create-glyph ['vfill' + fill] : glyph-construction { + assign-unicode [0x2580 + fill] + start-from 0 [mix font.hhea.descent font.hhea.ascent [fill / 8]] + line-to WIDTH [mix font.hhea.descent font.hhea.ascent [fill / 8]] + line-to WIDTH font.hhea.descent + line-to 0 font.hhea.descent + } + create-glyph ['hfill' + fill] : glyph-construction { + assign-unicode [0x2590 - fill] + start-from 0 font.hhea.ascent + line-to [WIDTH * fill / 8] font.hhea.ascent + line-to [WIDTH * fill / 8] font.hhea.descent + line-to 0 font.hhea.descent + } + } + create-glyph 'upHalfblock' : glyph-construction { + assign-unicode 0x2580 start-from 0 font.hhea.ascent - line-to [WIDTH * fill / 8] font.hhea.ascent - line-to [WIDTH * fill / 8] font.hhea.descent - line-to 0 font.hhea.descent + line-to WIDTH font.hhea.ascent + line-to WIDTH [mix font.hhea.descent font.hhea.ascent 0.5] + line-to 0 [mix font.hhea.descent font.hhea.ascent 0.5] + } + create-glyph 'rightHalfBlock' : glyph-construction { + assign-unicode 0x2590 + start-from [WIDTH * 0.5] font.hhea.ascent + line-to WIDTH font.hhea.ascent + line-to WIDTH font.hhea.descent + line-to [WIDTH * 0.5] font.hhea.descent } } -create-glyph 'upHalfblock' : glyph-construction { - assign-unicode 0x2580 - start-from 0 font.hhea.ascent - line-to WIDTH font.hhea.ascent - line-to WIDTH [mix font.hhea.descent font.hhea.ascent 0.5] - line-to 0 [mix font.hhea.descent font.hhea.ascent 0.5] -} -create-glyph 'rightHalfBlock' : glyph-construction { - assign-unicode 0x2590 - start-from [WIDTH * 0.5] font.hhea.ascent - line-to WIDTH font.hhea.ascent - line-to WIDTH font.hhea.descent - line-to [WIDTH * 0.5] font.hhea.descent -} - ### Box drawing glyphs let : begin { local light : adviceBlackness 3.5 diff --git a/makefile b/makefile index 03af49b..1d28df9 100644 --- a/makefile +++ b/makefile @@ -1,5 +1,5 @@ SUPPORT_FILES = support/glyph.js support/stroke.js parameters.js generate.js empty.json -GLYPH_SEGMENTS = glyphs/common-shapes.patel glyphs/overmarks.patel glyphs/latin-basic-capital.patel glyphs/latin-basic-lower.patel glyphs/greek.patel glyphs/cyrillic-basic.patel glyphs/latin-extend.patel glyphs/cyrillic-extended.patel glyphs/numbers.patel glyphs/symbol-ascii.patel glyphs/symbol-punctuation.patel glyphs/symbol-math.patel glyphs/symbol-geometric.patel glyphs/symbol-letter.patel glyphs/autobuilds.patel +GLYPH_SEGMENTS = glyphs/common-shapes.patel glyphs/overmarks.patel glyphs/latin-basic-capital.patel glyphs/latin-basic-lower.patel glyphs/greek.patel glyphs/cyrillic-basic.patel glyphs/latin-extend.patel glyphs/cyrillic-extended.patel glyphs/numbers.patel glyphs/symbol-ascii.patel glyphs/symbol-punctuation.patel glyphs/symbol-math.patel glyphs/symbol-geometric.patel glyphs/symbol-other.patel glyphs/symbol-letter.patel glyphs/autobuilds.patel OBJDIR = build SUPPRESS_ERRORS = 2> /dev/null diff --git a/parameters.patel b/parameters.patel index a95cf27..84aae67 100644 --- a/parameters.patel +++ b/parameters.patel @@ -40,7 +40,7 @@ define regular ( .family 'Iosevka' .style 'Regular' .weight 400 - .version 'r0.0.16' + .version 'r0.0.17' .variantSelector (.) .copyright 'Copyright (c) 2015 Belleve Invis.' )