Fix the design of the ESTIMATED SYMBOL (U+212E
) to match its spec; Refine design of POWER SYMBOL (U+23FB
) and HEAVY CHECK MARK (U+2714
) (#2245)
* Make estimated sign match its spec * Refine power standby symbol * Check mark refinement * Doc * fmt
This commit is contained in:
parent
f28a26504a
commit
733f56fe79
33 changed files with 225 additions and 177 deletions
|
@ -1,4 +1,6 @@
|
|||
* Fix height of block quadrants (`U+2596`..`U+259F`) (#2240).
|
||||
* Fix the design of the ESTIMATED SYMBOL (`U+212E`) to match its spec (#2243).
|
||||
* Refine design of POWER SYMBOL (`U+23FB`) and HEAVY CHECK MARK (`U+2714`) (#2243).
|
||||
* Make LATIN {CAPITAL|SMALL} LETTER GHA (`U+01A2`..`U+01A3`) respond to variants of `q` (`cv41`).
|
||||
* Make the behavior of serifs of `U+027F` automatic.
|
||||
* Fix side bearings of `U+29E2` under Quasi-Proportional.
|
||||
|
|
80
package-lock.json
generated
80
package-lock.json
generated
|
@ -1,12 +1,12 @@
|
|||
{
|
||||
"name": "@iosevka/monorepo",
|
||||
"version": "29.0.2",
|
||||
"version": "29.0.3",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "@iosevka/monorepo",
|
||||
"version": "29.0.2",
|
||||
"version": "29.0.3",
|
||||
"workspaces": [
|
||||
"packages/*",
|
||||
"tools/*"
|
||||
|
@ -4310,16 +4310,16 @@
|
|||
},
|
||||
"packages/font": {
|
||||
"name": "@iosevka/font",
|
||||
"version": "29.0.2",
|
||||
"version": "29.0.3",
|
||||
"dependencies": {
|
||||
"@iarna/toml": "^2.2.5",
|
||||
"@iosevka/font-glyphs": "29.0.2",
|
||||
"@iosevka/font-otl": "29.0.2",
|
||||
"@iosevka/geometry": "29.0.2",
|
||||
"@iosevka/geometry-cache": "29.0.2",
|
||||
"@iosevka/glyph": "29.0.2",
|
||||
"@iosevka/param": "29.0.2",
|
||||
"@iosevka/util": "29.0.2",
|
||||
"@iosevka/font-glyphs": "29.0.3",
|
||||
"@iosevka/font-otl": "29.0.3",
|
||||
"@iosevka/geometry": "29.0.3",
|
||||
"@iosevka/geometry-cache": "29.0.3",
|
||||
"@iosevka/glyph": "29.0.3",
|
||||
"@iosevka/param": "29.0.3",
|
||||
"@iosevka/util": "29.0.3",
|
||||
"harfbuzzjs": "^0.3.4",
|
||||
"ot-builder": "^1.7.3",
|
||||
"semver": "^7.6.0"
|
||||
|
@ -4327,100 +4327,100 @@
|
|||
},
|
||||
"packages/font-glyphs": {
|
||||
"name": "@iosevka/font-glyphs",
|
||||
"version": "29.0.2",
|
||||
"version": "29.0.3",
|
||||
"dependencies": {
|
||||
"@iosevka/font-kits": "29.0.2",
|
||||
"@iosevka/geometry": "29.0.2",
|
||||
"@iosevka/geometry-cache": "29.0.2",
|
||||
"@iosevka/glyph": "29.0.2",
|
||||
"@iosevka/util": "29.0.2",
|
||||
"@iosevka/font-kits": "29.0.3",
|
||||
"@iosevka/geometry": "29.0.3",
|
||||
"@iosevka/geometry-cache": "29.0.3",
|
||||
"@iosevka/glyph": "29.0.3",
|
||||
"@iosevka/util": "29.0.3",
|
||||
"typo-geom": "^0.15.1"
|
||||
}
|
||||
},
|
||||
"packages/font-kits": {
|
||||
"name": "@iosevka/font-kits",
|
||||
"version": "29.0.2",
|
||||
"version": "29.0.3",
|
||||
"dependencies": {
|
||||
"@iosevka/geometry": "29.0.2",
|
||||
"@iosevka/glyph": "29.0.2",
|
||||
"@iosevka/util": "29.0.2"
|
||||
"@iosevka/geometry": "29.0.3",
|
||||
"@iosevka/glyph": "29.0.3",
|
||||
"@iosevka/util": "29.0.3"
|
||||
}
|
||||
},
|
||||
"packages/font-otl": {
|
||||
"name": "@iosevka/font-otl",
|
||||
"version": "29.0.2",
|
||||
"version": "29.0.3",
|
||||
"dependencies": {
|
||||
"@iosevka/font-glyphs": "29.0.2",
|
||||
"@iosevka/glyph": "29.0.2",
|
||||
"@iosevka/font-glyphs": "29.0.3",
|
||||
"@iosevka/glyph": "29.0.3",
|
||||
"toposort": "^2.0.2"
|
||||
}
|
||||
},
|
||||
"packages/geometry": {
|
||||
"name": "@iosevka/geometry",
|
||||
"version": "29.0.2",
|
||||
"version": "29.0.3",
|
||||
"dependencies": {
|
||||
"@iosevka/util": "29.0.2",
|
||||
"@iosevka/util": "29.0.3",
|
||||
"spiro": "^3.0.0",
|
||||
"typo-geom": "^0.15.1"
|
||||
}
|
||||
},
|
||||
"packages/geometry-cache": {
|
||||
"name": "@iosevka/geometry-cache",
|
||||
"version": "29.0.2",
|
||||
"version": "29.0.3",
|
||||
"dependencies": {
|
||||
"@iosevka/geometry": "29.0.2",
|
||||
"@iosevka/geometry": "29.0.3",
|
||||
"@msgpack/msgpack": "^2.8.0"
|
||||
}
|
||||
},
|
||||
"packages/glyph": {
|
||||
"name": "@iosevka/glyph",
|
||||
"version": "29.0.2",
|
||||
"version": "29.0.3",
|
||||
"dependencies": {
|
||||
"@iosevka/geometry": "29.0.2"
|
||||
"@iosevka/geometry": "29.0.3"
|
||||
}
|
||||
},
|
||||
"packages/param": {
|
||||
"name": "@iosevka/param",
|
||||
"version": "29.0.2",
|
||||
"version": "29.0.3",
|
||||
"dependencies": {
|
||||
"@iosevka/util": "29.0.2"
|
||||
"@iosevka/util": "29.0.3"
|
||||
}
|
||||
},
|
||||
"packages/util": {
|
||||
"name": "@iosevka/util",
|
||||
"version": "29.0.2"
|
||||
"version": "29.0.3"
|
||||
},
|
||||
"tools/amend-readme": {
|
||||
"name": "@iosevka/amend-readme",
|
||||
"version": "29.0.2",
|
||||
"version": "29.0.3",
|
||||
"dependencies": {
|
||||
"@iarna/toml": "^2.2.5",
|
||||
"@iosevka/param": "29.0.2",
|
||||
"@iosevka/param": "29.0.3",
|
||||
"@unicode/unicode-15.1.0": "^1.5.2"
|
||||
}
|
||||
},
|
||||
"tools/data-export": {
|
||||
"name": "@iosevka/data-export",
|
||||
"version": "29.0.2",
|
||||
"version": "29.0.3",
|
||||
"dependencies": {
|
||||
"@iarna/toml": "^2.2.5",
|
||||
"@iosevka/param": "29.0.2",
|
||||
"@iosevka/param": "29.0.3",
|
||||
"@unicode/unicode-15.1.0": "^1.5.2",
|
||||
"cldr": "^7.5.0"
|
||||
}
|
||||
},
|
||||
"tools/generate-samples": {
|
||||
"name": "@iosevka/generate-samples",
|
||||
"version": "29.0.2",
|
||||
"version": "29.0.3",
|
||||
"dependencies": {
|
||||
"@iosevka/data-export": "29.0.2"
|
||||
"@iosevka/data-export": "29.0.3"
|
||||
}
|
||||
},
|
||||
"tools/misc": {
|
||||
"name": "@iosevka/misc",
|
||||
"version": "29.0.2",
|
||||
"version": "29.0.3",
|
||||
"dependencies": {
|
||||
"@iosevka/util": "29.0.2",
|
||||
"@iosevka/util": "29.0.3",
|
||||
"semver": "^7.6.0",
|
||||
"wawoff2": "^2.0.1"
|
||||
}
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"name": "@iosevka/monorepo",
|
||||
"version": "29.0.2",
|
||||
"version": "29.0.3",
|
||||
"workspaces": [
|
||||
"packages/*",
|
||||
"tools/*"
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"name": "@iosevka/font-glyphs",
|
||||
"version": "29.0.2",
|
||||
"version": "29.0.3",
|
||||
"private": true,
|
||||
"exports": {
|
||||
".": "./src/index.mjs",
|
||||
|
@ -8,11 +8,11 @@
|
|||
"./unicode-knowledge": "./src/meta/unicode-knowledge.mjs"
|
||||
},
|
||||
"dependencies": {
|
||||
"@iosevka/font-kits": "29.0.2",
|
||||
"@iosevka/geometry": "29.0.2",
|
||||
"@iosevka/geometry-cache": "29.0.2",
|
||||
"@iosevka/glyph": "29.0.2",
|
||||
"@iosevka/util": "29.0.2",
|
||||
"@iosevka/font-kits": "29.0.3",
|
||||
"@iosevka/geometry": "29.0.3",
|
||||
"@iosevka/geometry-cache": "29.0.3",
|
||||
"@iosevka/glyph": "29.0.3",
|
||||
"@iosevka/util": "29.0.3",
|
||||
"typo-geom": "^0.15.1"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -160,8 +160,16 @@ glyph-block CommonShapes : begin
|
|||
glyph-block-export DotStrokeAt
|
||||
define [DotStrokeAt x y r s] : RingStroke (y + r) (y - r) (x - r) (x + r) s true
|
||||
|
||||
glyph-block-export CircleRing
|
||||
define [CircleRing u d l r transformShiftOnly] : glyph-proc
|
||||
glyph-block-export Circle
|
||||
define Circle : namespace
|
||||
export : define Outline : namespace
|
||||
export : define [At x y r] : Ellipse.Outline.AtDimens (y + r) (y - r) (x - r) (x + r)
|
||||
export : define [DotAt x y r] : Ellipse.Outline.AtDimens (y + r) (y - r) (x - r) (x + r) true
|
||||
|
||||
glyph-block-export Ellipse
|
||||
define Ellipse : namespace
|
||||
export : define Outline : namespace
|
||||
export : define [AtDimens u d l r transformShiftOnly] : glyph-proc
|
||||
local giz currentGlyph.gizmo
|
||||
include : new-glyph : glyph-proc
|
||||
local my ((u + d) / 2)
|
||||
|
@ -181,12 +189,9 @@ glyph-block CommonShapes : begin
|
|||
if transformShiftOnly : begin
|
||||
local {.x mx1 .y my1} : giz.apply {.x mx .y my}
|
||||
include : Translate (mx1 - mx) (my1 - my)
|
||||
glyph-block-export CircleRingAt
|
||||
define [CircleRingAt x y r] : CircleRing (y + r) (y - r) (x - r) (x + r)
|
||||
glyph-block-export CircleDotAt
|
||||
define [CircleDotAt x y r] : CircleRing (y + r) (y - r) (x - r) (x + r) true
|
||||
glyph-block-export RoundStrokeTerminalAt
|
||||
define [RoundStrokeTerminalAt x y r] : CircleRing (y + r) (y - r) (x - [HSwToV r]) (x + [HSwToV r]) true
|
||||
export : define [At x y rx ry] : AtDimens (y + ry) (y - ry) (x - rx) (x + rx)
|
||||
export : define [DotAt x y rx ry] : AtDimens (y + ry) (y - ry) (x - rx) (x + rx) true
|
||||
export : define [RoundStrokeTerminalAt x y r] : AtDimens (y + r) (y - r) (x - [HSwToV r]) (x + [HSwToV r]) true
|
||||
|
||||
glyph-block-export OShapeT
|
||||
define [OShapeT sink u d l r _width _ada _adb] : begin
|
||||
|
|
|
@ -194,7 +194,7 @@ define-macro glyph-block-import : syntax-rules
|
|||
derive-multi-part-glyphs DeriveMeshT link-gr]
|
||||
|
||||
CommonShapes `[no-shape tagged KnotAdj Rect SquareAt Ring RingAt DotAt RingStroke
|
||||
RingStrokeAt DotStrokeAt CircleRing CircleRingAt CircleDotAt RoundStrokeTerminalAt
|
||||
RingStrokeAt DotStrokeAt Circle Ellipse
|
||||
OShapeT OShape OShapeOutline OShapeFlatTB HSerif VSerif NeedSlab NeedNotItalic HBar
|
||||
HOverlayBar VBar FlatSlashShape hookstart hookend Ungizmo Regizmo FlipAround ScaleAround
|
||||
Realign ForceUpright DiagCor NameUni PointingTo with-transform clear-geometry
|
||||
|
|
|
@ -362,7 +362,7 @@ glyph-block Symbol-Arrow : for-width-kinds WideWidth1
|
|||
SemiHookArrowBar x1 y1 x2 y2 halfBarWidth halfTerminal (-headWidth) 2
|
||||
|
||||
define RoundArrow : namespace
|
||||
define [Blob x y sw] : RoundStrokeTerminalAt x y (sw / 2)
|
||||
define [Blob x y sw] : Ellipse.Outline.RoundStrokeTerminalAt x y (sw / 2)
|
||||
|
||||
define [Bar x1 y1 x2 y2 sw] : begin
|
||||
return : PointingTo x1 y1 x2 y2 : lambda [mag] : union
|
||||
|
|
|
@ -35,7 +35,7 @@ glyph-block Symbol-Geometric-Dice : for-width-kinds WideWidth1
|
|||
define yBottom : mix yBottomEx yTopEx (1 / 5)
|
||||
define yTop : mix yBottomEx yTopEx (4 / 5)
|
||||
foreach { px py } [items-of dots] : begin
|
||||
include : CircleDotAt
|
||||
include : Circle.Outline.DotAt
|
||||
mix xLeft xRight (px / 2)
|
||||
mix yBottom yTop (py / 2)
|
||||
begin dr
|
||||
|
@ -43,7 +43,7 @@ glyph-block Symbol-Geometric-Dice : for-width-kinds WideWidth1
|
|||
create-glyph [MangleName 'dottedWhiteTriangle'] [MangleUnicode 0x25EC] : glyph-proc
|
||||
set-width Geom.Width
|
||||
include : refer-glyph : MangleName 'whiteTriangleUp'
|
||||
include : CircleDotAt Geom.MidX (Geom.MidY - Geom.Size / 3) [Math.min (Geom.Width / 8 ) PeriodRadius]
|
||||
include : Circle.Outline.DotAt Geom.MidX (Geom.MidY - Geom.Size / 3) [Math.min (Geom.Width / 8 ) PeriodRadius]
|
||||
|
||||
glyph-block Symbol-Geometric-Dotted : for-width-kinds WideWidth4
|
||||
glyph-block-import CommonShapes
|
||||
|
@ -62,7 +62,7 @@ glyph-block Symbol-Geometric-Dotted : for-width-kinds WideWidth4
|
|||
local angle : Math.PI * 2 * j / n
|
||||
local cx : Geom.MidX + (Geom.Right - Geom.MidX) * [Math.cos angle]
|
||||
local cy : Geom.MidY + (Geom.Right - Geom.MidX) * [Math.sin angle]
|
||||
include : CircleRingAt cx cy fine
|
||||
include : Circle.Outline.At cx cy fine
|
||||
|
||||
create-glyph [MangleName 'dottedSquare'] [MangleUnicode 0x2B1A] : glyph-proc
|
||||
set-width Geom.Width
|
||||
|
@ -76,7 +76,7 @@ glyph-block Symbol-Geometric-Dotted : for-width-kinds WideWidth4
|
|||
Bot : Geom.Bot + fine
|
||||
foreach j [range 0 n] : begin
|
||||
local t : j / n
|
||||
include : CircleRingAt box.Left [mix box.Bot box.Top t] fine
|
||||
include : CircleRingAt [mix box.Left box.Right t] box.Top fine
|
||||
include : CircleRingAt box.Right [mix box.Top box.Bot t] fine
|
||||
include : CircleRingAt [mix box.Right box.Left t] box.Bot fine
|
||||
include : Circle.Outline.At box.Left [mix box.Bot box.Top t] fine
|
||||
include : Circle.Outline.At [mix box.Left box.Right t] box.Top fine
|
||||
include : Circle.Outline.At box.Right [mix box.Top box.Bot t] fine
|
||||
include : Circle.Outline.At [mix box.Right box.Left t] box.Bot fine
|
||||
|
|
|
@ -2,7 +2,10 @@
|
|||
|
||||
$$include '../meta/macros.ptl'
|
||||
|
||||
import [TransformedGeometry ContourSetGeometry] from "@iosevka/geometry"
|
||||
import [Point] from "@iosevka/geometry/point"
|
||||
import [Box] from "@iosevka/geometry/box"
|
||||
import [Transform] from "@iosevka/geometry/transform"
|
||||
import [mix linreg clamp fallback] from "@iosevka/util"
|
||||
import [DesignParameters] from "../meta/aesthetics.mjs"
|
||||
|
||||
|
@ -161,26 +164,63 @@ glyph-block Symbol-Letter : begin
|
|||
|
||||
alias 'letterLike/kelvinSign' 0x212A 'K'
|
||||
|
||||
create-glyph 'estimated' 0x212E : glyph-proc
|
||||
include : MarkSet.capital
|
||||
local fineArc : CAP * 0.0300
|
||||
local fineBar : CAP * 0.0278
|
||||
local thickBarWidth : (0.183 / [Math.sqrt 0.9]) * [Math.sqrt (CAP * (RightSB - SB))]
|
||||
define smA : ArchDepthAOf (ArchDepth * (CAP / XH)) Width
|
||||
define smB : ArchDepthBOf (ArchDepth * (CAP / XH)) Width
|
||||
include : union
|
||||
HBar.b SB RightSB (CAP * 0.5) fineBar
|
||||
difference
|
||||
union
|
||||
difference
|
||||
OShapeOutline CAP 0 SB RightSB fineArc smA smB
|
||||
OShapeOutline (CAP - fineArc) (0 + fineArc) [mix SB RightSB 0.077] [mix RightSB SB 0.077] fineArc (smA - fineArc) (smB - fineArc)
|
||||
intersection
|
||||
OShapeOutline.NoOvershoot CAP 0 SB RightSB fineArc smA smB
|
||||
union
|
||||
Rect CAP 0 SB (SB + thickBarWidth)
|
||||
Rect CAP (CAP * 0.5) (RightSB - thickBarWidth) RightSB
|
||||
Rect (CAP * 0.5) (CAP * 0.208) Middle Width
|
||||
for-width-kinds WideWidth1 : begin
|
||||
create-glyph [MangleName 'estimated'] [MangleUnicode 0x212E] : glyph-proc
|
||||
set-width MosaicWidth
|
||||
|
||||
local cx 500
|
||||
local cy 450
|
||||
local r1 (846 / 2)
|
||||
local yGapSize 263
|
||||
local sw 183
|
||||
local r2 85
|
||||
local r3 13
|
||||
local swCenter 25
|
||||
|
||||
# Scale and transform
|
||||
local desiredHeight : if FMosaicWide CAP XH
|
||||
local s : Math.min (desiredHeight / (2 * cy)) ((MosaicWidth - SB) / (2 * cx))
|
||||
local glyphCenter : currentGlyph.gizmo.applyXY (MosaicWidth / 2) (desiredHeight / 2)
|
||||
local tfm : Transform.Combine
|
||||
Transform.Translate (-cx) (-cy)
|
||||
Transform.Scale s s
|
||||
Transform.Translate glyphCenter.x glyphCenter.y
|
||||
|
||||
# Center of inner round corner, as well as the limit X for the inner circle edge
|
||||
local xLargeRc : sw + r2
|
||||
local yLargeRc : cy - [Math.sqrt ((r1 - r2) * (r1 - r2) - (cx - sw - r2) * (cx - sw - r2))]
|
||||
local xInnerCircleLimit : cx - (cx - xLargeRc) * (r1 / (r1 - r2))
|
||||
|
||||
include : ForceUpright
|
||||
include : difference [Ellipse.Outline.At cx cy cx cy]
|
||||
# Inner arcs
|
||||
intersection [Circle.Outline.At cx cy r1] : union
|
||||
Rect (2 * cy) (2 * cy - yLargeRc) xInnerCircleLimit (2 * cx - xInnerCircleLimit)
|
||||
Rect yLargeRc (-1) xInnerCircleLimit cx
|
||||
Rect (cy - yGapSize) (-1) (cx - 1) (2 * cx)
|
||||
|
||||
# Large round corners
|
||||
Circle.Outline.At xLargeRc yLargeRc r2
|
||||
Circle.Outline.At xLargeRc (2 * cy - yLargeRc) r2
|
||||
Circle.Outline.At (2 * cx - xLargeRc) (2 * cy - yLargeRc) r2
|
||||
|
||||
# Small round corners
|
||||
Circle.Outline.At (sw + r3) (cy + swCenter + r3) r3
|
||||
Circle.Outline.At (2 * cx - sw - r3) (cy + swCenter + r3) r3
|
||||
Circle.Outline.At (sw + r3) (cy - r3) r3
|
||||
|
||||
# Top inner opening
|
||||
Rect (2 * cy - yLargeRc) (cy + swCenter + r3) sw (2 * cx - sw)
|
||||
Rect (cy + swCenter + r3 + 1) (cy + swCenter) (sw + r3) (2 * cx - sw - r3)
|
||||
|
||||
# Bottom-left opening
|
||||
Rect (cy - r3) yLargeRc sw cx
|
||||
Rect cy (cy - r3 - 1) (sw + r3) cx
|
||||
|
||||
# Bottom-right opening
|
||||
Rect cy (cy - yGapSize) (cx - 1) (2 * cx)
|
||||
|
||||
include tfm
|
||||
|
||||
create-glyph 'mathAleph' 0x2135 : glyph-proc
|
||||
include : MarkSet.capital
|
||||
|
|
|
@ -30,7 +30,7 @@ glyph-block Symbol-Pictograph-Checking-Marks : begin
|
|||
set-width MosaicWidth
|
||||
include : dispiro
|
||||
widths.center sw
|
||||
g4 ptSB [mix ptBot ptTop 0.46]
|
||||
g4 ptSB ([mix ptBot ptTop 0.46] + 0.5 * sw)
|
||||
alsoThru 0.5 0.4
|
||||
g4 [mix ptSB ptRSB 0.4] [mix ptBot ptTop 0.05] [heading Downward]
|
||||
include : dispiro
|
||||
|
|
|
@ -24,7 +24,7 @@ glyph-block Symbol-Geometric-Clock : for-width-kinds WideWidth1
|
|||
set-width MosaicWidth
|
||||
|
||||
include : RingStrokeAt Geom.MidX Geom.MidY Geom.Size mediumSw
|
||||
include : CircleRingAt Geom.MidX Geom.MidY [Math.max (0.6 * mediumSw) (0.1 * Geom.Size)]
|
||||
include : Circle.Outline.At Geom.MidX Geom.MidY [Math.max (0.6 * mediumSw) (0.1 * Geom.Size)]
|
||||
local minAngle : 2 * Math.PI * (min / 60)
|
||||
include : dispiro
|
||||
corner Geom.MidX Geom.MidY [widths.center lightSw]
|
||||
|
|
|
@ -45,10 +45,10 @@ glyph-block Symbol-Pictograph-IEC-Power-And-Playback : for-width-kinds WideWidth
|
|||
refer-glyph [MangleName 'powerOff']
|
||||
spiro-outline
|
||||
corner df.middle SymbolMid
|
||||
corner (df.middle - gap * 2 - [HSwToV GeometryStroke]) (SymbolMid + squareRadiusFW * 2)
|
||||
corner (df.middle + gap * 2 + [HSwToV GeometryStroke]) (SymbolMid + squareRadiusFW * 2)
|
||||
corner (df.middle - gap * 4 - [HSwToV GeometryStroke]) (SymbolMid + squareRadiusFW * 2)
|
||||
corner (df.middle + gap * 4 + [HSwToV GeometryStroke]) (SymbolMid + squareRadiusFW * 2)
|
||||
Rect
|
||||
SymbolMid + 1.5 * squareRadiusFW
|
||||
SymbolMid + 1.125 * squareRadiusFW
|
||||
SymbolMid - 0.0 * squareRadiusFW
|
||||
df.middle - [HSwToV : 0.5 * GeometryStroke]
|
||||
df.middle + [HSwToV : 0.5 * GeometryStroke]
|
||||
|
@ -56,8 +56,8 @@ glyph-block Symbol-Pictograph-IEC-Power-And-Playback : for-width-kinds WideWidth
|
|||
create-glyph [MangleName 'powerSleep'] [MangleUnicode 0x23FE] : glyph-proc
|
||||
set-width df.width
|
||||
include : difference
|
||||
CircleRingAt df.middle SymbolMid squareRadiusFW
|
||||
CircleRingAt
|
||||
Circle.Outline.At df.middle SymbolMid squareRadiusFW
|
||||
Circle.Outline.At
|
||||
df.middle + squareRadiusFW * 0.5
|
||||
SymbolMid + squareRadiusFW * 0.35
|
||||
squareRadiusFW * 1.1
|
||||
|
|
|
@ -37,8 +37,8 @@ glyph-block Symbol-Pictograph-Stick-Figure : begin
|
|||
corner z1.x z1.y
|
||||
corner z2.x z2.y
|
||||
|
||||
if cl : include : CircleDotAt z1.x z1.y (sw / 2)
|
||||
if cr : include : CircleDotAt z2.x z2.y (sw / 2)
|
||||
if cl : include : Circle.Outline.DotAt z1.x z1.y (sw / 2)
|
||||
if cr : include : Circle.Outline.DotAt z2.x z2.y (sw / 2)
|
||||
|
||||
define [ArcImpl mode h1 v1 h2 v2 cl cr] : glyph-proc
|
||||
local z1 : tfm.applyXY [mix box.left box.right h1] [mix box.bottom box.top v1]
|
||||
|
@ -67,8 +67,8 @@ glyph-block Symbol-Pictograph-Stick-Figure : begin
|
|||
flat [mix z2.x zc.x 0.001] [mix z2.y zc.y 0.001]
|
||||
curl z2.x z2.y
|
||||
|
||||
if cl : include : CircleDotAt z1.x z1.y (sw / 2)
|
||||
if cr : include : CircleDotAt z2.x z2.y (sw / 2)
|
||||
if cl : include : Circle.Outline.DotAt z1.x z1.y (sw / 2)
|
||||
if cr : include : Circle.Outline.DotAt z2.x z2.y (sw / 2)
|
||||
|
||||
export : define [ArcVH h1 v1 h2 v2 cl cr] : ArcImpl 1 h1 v1 h2 v2 cl cr
|
||||
export : define [ArcHV h1 v1 h2 v2 cl cr] : ArcImpl 0 h1 v1 h2 v2 cl cr
|
||||
|
|
|
@ -1,14 +1,14 @@
|
|||
{
|
||||
"name": "@iosevka/font-kits",
|
||||
"version": "29.0.2",
|
||||
"version": "29.0.3",
|
||||
"private": true,
|
||||
"exports": {
|
||||
"./boole-kit": "./src/boole-kit.mjs",
|
||||
"./spiro-kit": "./src/spiro-kit.mjs"
|
||||
},
|
||||
"dependencies": {
|
||||
"@iosevka/geometry": "29.0.2",
|
||||
"@iosevka/glyph": "29.0.2",
|
||||
"@iosevka/util": "29.0.2"
|
||||
"@iosevka/geometry": "29.0.3",
|
||||
"@iosevka/glyph": "29.0.3",
|
||||
"@iosevka/util": "29.0.3"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -17,12 +17,12 @@ class BooleImpl {
|
|||
const g1 = new Glyph();
|
||||
g1.gizmo = forwardGizmo;
|
||||
g1.include(operand);
|
||||
operandGeometries.push(new TransformedGeometry(g1.geometry, backwardGizmo));
|
||||
operandGeometries.push(new TransformedGeometry(backwardGizmo, g1.geometry));
|
||||
}
|
||||
return glyph.includeGeometry(
|
||||
new TransformedGeometry(
|
||||
new BooleanGeometry(this.operator, operandGeometries),
|
||||
forwardGizmo,
|
||||
new BooleanGeometry(this.operator, operandGeometries),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
|
|
@ -1,13 +1,13 @@
|
|||
{
|
||||
"name": "@iosevka/font-otl",
|
||||
"version": "29.0.2",
|
||||
"version": "29.0.3",
|
||||
"private": true,
|
||||
"exports": {
|
||||
".": "./src/index.mjs"
|
||||
},
|
||||
"dependencies": {
|
||||
"@iosevka/font-glyphs": "29.0.2",
|
||||
"@iosevka/glyph": "29.0.2",
|
||||
"@iosevka/font-glyphs": "29.0.3",
|
||||
"@iosevka/glyph": "29.0.3",
|
||||
"toposort": "^2.0.2"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"name": "@iosevka/font",
|
||||
"version": "29.0.2",
|
||||
"version": "29.0.3",
|
||||
"private": true,
|
||||
"exports": {
|
||||
".": "./src/index.mjs",
|
||||
|
@ -10,13 +10,13 @@
|
|||
},
|
||||
"dependencies": {
|
||||
"@iarna/toml": "^2.2.5",
|
||||
"@iosevka/font-glyphs": "29.0.2",
|
||||
"@iosevka/font-otl": "29.0.2",
|
||||
"@iosevka/geometry": "29.0.2",
|
||||
"@iosevka/geometry-cache": "29.0.2",
|
||||
"@iosevka/glyph": "29.0.2",
|
||||
"@iosevka/param": "29.0.2",
|
||||
"@iosevka/util": "29.0.2",
|
||||
"@iosevka/font-glyphs": "29.0.3",
|
||||
"@iosevka/font-otl": "29.0.3",
|
||||
"@iosevka/geometry": "29.0.3",
|
||||
"@iosevka/geometry-cache": "29.0.3",
|
||||
"@iosevka/glyph": "29.0.3",
|
||||
"@iosevka/param": "29.0.3",
|
||||
"@iosevka/util": "29.0.3",
|
||||
"harfbuzzjs": "^0.3.4",
|
||||
"ot-builder": "^1.7.3",
|
||||
"semver": "^7.6.0"
|
||||
|
|
|
@ -318,8 +318,8 @@ function alterGeometryAndOptimize(collection) {
|
|||
}
|
||||
|
||||
cluster.representative.glyph.geometry = new Geometry.TransformedGeometry(
|
||||
gT.geometry,
|
||||
Transform.Translate(cluster.representative.x, cluster.representative.y),
|
||||
gT.geometry,
|
||||
);
|
||||
|
||||
for (const [g, tf] of cluster.aliases) {
|
||||
|
|
|
@ -64,8 +64,8 @@ function flattenSimpleGlyph(cache, skew, g) {
|
|||
const tfBack = g.gizmo ? g.gizmo.inverse() : new Transform(1, -skew, 0, 1, 0, 0);
|
||||
const tfForward = g.gizmo ? g.gizmo : new Transform(1, +skew, 0, 1, 0, 0);
|
||||
gSimplified = new Geom.TransformedGeometry(
|
||||
new Geom.SimplifyGeometry(new Geom.TransformedGeometry(g.geometry, tfBack)),
|
||||
tfForward,
|
||||
new Geom.SimplifyGeometry(new Geom.TransformedGeometry(tfBack, g.geometry)),
|
||||
);
|
||||
} else {
|
||||
gSimplified = new Geom.SimplifyGeometry(g.geometry);
|
||||
|
|
|
@ -1,12 +1,12 @@
|
|||
{
|
||||
"name": "@iosevka/geometry-cache",
|
||||
"version": "29.0.2",
|
||||
"version": "29.0.3",
|
||||
"private": true,
|
||||
"exports": {
|
||||
".": "./src/index.mjs"
|
||||
},
|
||||
"dependencies": {
|
||||
"@iosevka/geometry": "29.0.2",
|
||||
"@iosevka/geometry": "29.0.3",
|
||||
"@msgpack/msgpack": "^2.8.0"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -4,7 +4,7 @@ import zlib from "zlib";
|
|||
import * as CurveUtil from "@iosevka/geometry/curve-util";
|
||||
import { encode, decode } from "@msgpack/msgpack";
|
||||
|
||||
const Edition = 36;
|
||||
const Edition = 37;
|
||||
const MAX_AGE = 16;
|
||||
class GfEntry {
|
||||
constructor(age, value) {
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"name": "@iosevka/geometry",
|
||||
"version": "29.0.2",
|
||||
"version": "29.0.3",
|
||||
"private": true,
|
||||
"exports": {
|
||||
".": "./src/index.mjs",
|
||||
|
@ -13,7 +13,7 @@
|
|||
"./spiro-control": "./src/spiro-control.mjs"
|
||||
},
|
||||
"dependencies": {
|
||||
"@iosevka/util": "29.0.2",
|
||||
"@iosevka/util": "29.0.3",
|
||||
"spiro": "^3.0.0",
|
||||
"typo-geom": "^0.15.1"
|
||||
}
|
||||
|
|
|
@ -23,8 +23,8 @@ function convertContourToArcs(contour) {
|
|||
switch (z.type) {
|
||||
case Point.Type.CubicStart: {
|
||||
const z1 = z;
|
||||
const z2 = contour[j + 1];
|
||||
const z3 = contour[j + 2];
|
||||
const z2 = contour[(j + 1) % contour.length];
|
||||
const z3 = contour[(j + 2) % contour.length];
|
||||
newContour.push(
|
||||
new TypoGeom.Arcs.Bez3(
|
||||
z0,
|
||||
|
@ -39,7 +39,7 @@ function convertContourToArcs(contour) {
|
|||
}
|
||||
case Point.Type.Quadratic: {
|
||||
const zc = z;
|
||||
let zf = contour[j + 1] || contour[0];
|
||||
let zf = contour[(j + 1) % contour.length];
|
||||
const zfIsCorner = zf.type === Point.Type.contour;
|
||||
if (!zfIsCorner) zf = Point.from(Point.Type.Corner, zc).mix(0.5, zf);
|
||||
newContour.push(
|
||||
|
|
|
@ -202,8 +202,8 @@ export class ReferenceGeometry extends GeometryBase {
|
|||
}
|
||||
unwrap() {
|
||||
return new TransformedGeometry(
|
||||
this.m_glyph.geometry,
|
||||
Transform.Translate(this.m_x, this.m_y),
|
||||
this.m_glyph.geometry,
|
||||
);
|
||||
}
|
||||
toContours() {
|
||||
|
@ -267,11 +267,16 @@ export class TaggedGeometry extends GeometryBase {
|
|||
}
|
||||
|
||||
export class TransformedGeometry extends GeometryBase {
|
||||
constructor(g, tfm) {
|
||||
constructor(tfm, g) {
|
||||
super();
|
||||
this.m_geom = g;
|
||||
this.m_transform = tfm;
|
||||
this.m_geom = g;
|
||||
}
|
||||
|
||||
withTransform(tfm) {
|
||||
return new TransformedGeometry(Transform.Combine(this.m_transform, tfm), this.m_geom);
|
||||
}
|
||||
|
||||
toContours() {
|
||||
let result = [];
|
||||
for (const c of this.m_geom.toContours()) {
|
||||
|
@ -296,7 +301,7 @@ export class TransformedGeometry extends GeometryBase {
|
|||
filterTag(fn) {
|
||||
const e = this.m_geom.filterTag(fn);
|
||||
if (!e) return null;
|
||||
return new TransformedGeometry(e, this.m_transform);
|
||||
return new TransformedGeometry(this.m_transform, e);
|
||||
}
|
||||
measureComplexity() {
|
||||
return (
|
||||
|
@ -308,26 +313,16 @@ export class TransformedGeometry extends GeometryBase {
|
|||
const unwrapped = this.m_geom.unlinkReferences();
|
||||
if (Transform.isIdentity(this.m_transform)) {
|
||||
return unwrapped;
|
||||
} else if (
|
||||
unwrapped instanceof TransformedGeometry &&
|
||||
Transform.isTranslate(this.m_transform) &&
|
||||
Transform.isTranslate(unwrapped.m_transform)
|
||||
) {
|
||||
return new TransformedGeometry(
|
||||
unwrapped.m_geom,
|
||||
Transform.Translate(
|
||||
this.m_transform.tx + unwrapped.m_transform.tx,
|
||||
this.m_transform.ty + unwrapped.m_transform.ty,
|
||||
),
|
||||
);
|
||||
} else if (unwrapped instanceof TransformedGeometry) {
|
||||
return unwrapped.withTransform(this.m_transform);
|
||||
} else {
|
||||
return new TransformedGeometry(unwrapped, this.m_transform);
|
||||
return new TransformedGeometry(this.m_transform, unwrapped);
|
||||
}
|
||||
}
|
||||
toShapeStringOrNull() {
|
||||
const sTarget = this.m_geom.toShapeStringOrNull();
|
||||
if (!sTarget) return null;
|
||||
return Format.struct("TransformedGeometry", sTarget, Format.gizmo(this.m_transform));
|
||||
return Format.struct("TransformedGeometry", Format.gizmo(this.m_transform), sTarget);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -544,7 +539,7 @@ export class StrokeGeometry extends GeometryBase {
|
|||
|
||||
toContours() {
|
||||
// Produce simplified arcs
|
||||
const nonTransformedGeometry = new TransformedGeometry(this.m_geom, this.m_gizmo.inverse());
|
||||
const nonTransformedGeometry = new TransformedGeometry(this.m_gizmo.inverse(), this.m_geom);
|
||||
let arcs = TypoGeom.Boolean.removeOverlap(
|
||||
CurveUtil.convertShapeToArcs(nonTransformedGeometry.toContours()),
|
||||
TypoGeom.Boolean.PolyFillType.pftNonZero,
|
||||
|
|
|
@ -83,6 +83,11 @@ export class Transform {
|
|||
static isPositive(tfm) {
|
||||
return tfm.xx * tfm.yy - tfm.xy * tfm.yx > 0;
|
||||
}
|
||||
static Scale(sx, sy) {
|
||||
return new Transform(sx, 0, 0, sy, 0, 0);
|
||||
}
|
||||
|
||||
/** Combine the transfoems, in application order */
|
||||
static Combine(...tfms) {
|
||||
let z00 = new Vec2(0, 0);
|
||||
let z10 = new Vec2(1, 0);
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"name": "@iosevka/glyph",
|
||||
"version": "29.0.2",
|
||||
"version": "29.0.3",
|
||||
"private": true,
|
||||
"exports": {
|
||||
".": "./src/glyph.mjs",
|
||||
|
@ -9,6 +9,6 @@
|
|||
"./relation": "./src/relation.mjs"
|
||||
},
|
||||
"dependencies": {
|
||||
"@iosevka/geometry": "29.0.2"
|
||||
"@iosevka/geometry": "29.0.3"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -4,6 +4,7 @@ import * as Geom from "@iosevka/geometry";
|
|||
import { Anchor } from "@iosevka/geometry/anchor";
|
||||
import { Vec2 } from "@iosevka/geometry/point";
|
||||
import { Transform } from "@iosevka/geometry/transform";
|
||||
|
||||
import { ScheduleLeaningMark } from "./relation.mjs";
|
||||
|
||||
export class Glyph {
|
||||
|
@ -124,7 +125,7 @@ export class Glyph {
|
|||
this.includeGeometry(new Geom.ReferenceGeometry(g, shiftX, shiftY));
|
||||
} else {
|
||||
this.includeGeometry(
|
||||
new Geom.TransformedGeometry(g.geometry, Transform.Translate(shiftX, shiftY)),
|
||||
new Geom.TransformedGeometry(Transform.Translate(shiftX, shiftY), g.geometry),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
@ -138,7 +139,7 @@ export class Glyph {
|
|||
this.includeGeometry(new Geom.ContourSetGeometry(cs));
|
||||
}
|
||||
applyTransform(tfm, alsoAnchors) {
|
||||
this.geometry = new Geom.TransformedGeometry(this.geometry, tfm);
|
||||
this.geometry = new Geom.TransformedGeometry(tfm, this.geometry);
|
||||
if (alsoAnchors) {
|
||||
for (const k in this.baseAnchors)
|
||||
this.baseAnchors[k] = Anchor.transform(tfm, this.baseAnchors[k]);
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"name": "@iosevka/param",
|
||||
"version": "29.0.2",
|
||||
"version": "29.0.3",
|
||||
"private": true,
|
||||
"exports": {
|
||||
".": "./src/index.mjs",
|
||||
|
@ -9,6 +9,6 @@
|
|||
"./metric-override": "./src/metric-override.mjs"
|
||||
},
|
||||
"dependencies": {
|
||||
"@iosevka/util": "29.0.2"
|
||||
"@iosevka/util": "29.0.3"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"name": "@iosevka/util",
|
||||
"version": "29.0.2",
|
||||
"version": "29.0.3",
|
||||
"private": true,
|
||||
"exports": {
|
||||
".": "./src/index.mjs",
|
||||
|
|
|
@ -1,13 +1,13 @@
|
|||
{
|
||||
"name": "@iosevka/amend-readme",
|
||||
"version": "29.0.2",
|
||||
"version": "29.0.3",
|
||||
"private": true,
|
||||
"exports": {
|
||||
".": "./src/index.mjs"
|
||||
},
|
||||
"dependencies": {
|
||||
"@iarna/toml": "^2.2.5",
|
||||
"@iosevka/param": "29.0.2",
|
||||
"@iosevka/param": "29.0.3",
|
||||
"@unicode/unicode-15.1.0": "^1.5.2"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"name": "@iosevka/data-export",
|
||||
"version": "29.0.2",
|
||||
"version": "29.0.3",
|
||||
"private": true,
|
||||
"exports": {
|
||||
".": "./src/index.mjs",
|
||||
|
@ -10,7 +10,7 @@
|
|||
},
|
||||
"dependencies": {
|
||||
"@iarna/toml": "^2.2.5",
|
||||
"@iosevka/param": "29.0.2",
|
||||
"@iosevka/param": "29.0.3",
|
||||
"@unicode/unicode-15.1.0": "^1.5.2",
|
||||
"cldr": "^7.5.0"
|
||||
}
|
||||
|
|
|
@ -1,11 +1,11 @@
|
|||
{
|
||||
"name": "@iosevka/generate-samples",
|
||||
"version": "29.0.2",
|
||||
"version": "29.0.3",
|
||||
"private": true,
|
||||
"exports": {
|
||||
".": "./src/index.mjs"
|
||||
},
|
||||
"dependencies": {
|
||||
"@iosevka/data-export": "29.0.2"
|
||||
"@iosevka/data-export": "29.0.3"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,10 +1,10 @@
|
|||
{
|
||||
"name": "@iosevka/misc",
|
||||
"version": "29.0.2",
|
||||
"version": "29.0.3",
|
||||
"private": true,
|
||||
"dependencies": {
|
||||
"semver": "^7.6.0",
|
||||
"wawoff2": "^2.0.1",
|
||||
"@iosevka/util": "29.0.2"
|
||||
"@iosevka/util": "29.0.3"
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue