* Fix serifs of certain letters (#1458):

- LATIN CAPITAL LETTER GAMMA (`U+0194`);
  - LATIN CAPITAL LETTER OU (`U+0222`);
  - LATIN SMALL LETTER OU (`U+0223`);
  - LATIN SMALL LETTER ALPHA (`U+0251`);
  - LATIN SMALL LETTER GAMMA (`U+0263`);
  - LATIN SMALL LETTER RAMS HORN (`U+0264`);
  - LATIN SMALL LETTER TURNED OPEN E (`U+1D08`);
  - LATIN LETTER SMALL CAPITAL OU (`U+1D15`);
  - LATIN LETTER AIN (`U+1D25`);
This commit is contained in:
be5invis 2022-12-09 19:04:09 -08:00
parent 2ca7513f3e
commit 60cccc4ef1
9 changed files with 132 additions and 71 deletions

View file

@ -1,2 +1,12 @@
* Fix metrics of ASCII single quotes under Aile (#1454).
* Fix overshoot of oval-shaped `0`, and open `6`/`9` (#1455).
* Fix serifs of certain letters (#1458):
- LATIN CAPITAL LETTER GAMMA (`U+0194`);
- LATIN CAPITAL LETTER OU (`U+0222`);
- LATIN SMALL LETTER OU (`U+0223`);
- LATIN SMALL LETTER ALPHA (`U+0251`);
- LATIN SMALL LETTER GAMMA (`U+0263`);
- LATIN SMALL LETTER RAMS HORN (`U+0264`);
- LATIN SMALL LETTER TURNED OPEN E (`U+1D08`);
- LATIN LETTER SMALL CAPITAL OU (`U+1D15`);
- LATIN LETTER AIN (`U+1D25`);

View file

@ -10,6 +10,9 @@ glyph-module
glyph-block CommonShapes : begin
glyph-block-import Common-Derivatives
glyph-block-export no-shape
define [no-shape] { .__isNoShape true }
glyph-block-export Rect
define [Rect u d l r transformShiftOnly] : glyph-proc
local giz currentGlyph.gizmo

View file

@ -191,7 +191,7 @@ glyph-block Letter-Greek-Lower-Epsilon : begin
alias 'grek/epsilon' 0x3B5 'latn/epsilon.serifless'
select-variant 'latn/Epsilon' 0x190
select-variant 'latn/epsilon' 0x25B
turned 'turnepsilon' 0x1D08 'grek/epsilon' Middle (XH / 2)
turned 'turnepsilon' 0x1D08 'latn/epsilon' Middle (XH / 2)
alias 'cyrl/ZeRev' 0x510 'latn/Epsilon'
alias 'cyrl/zeRev' 0x511 'latn/epsilon'

View file

@ -9,36 +9,31 @@ glyph-block Letter-Latin-OU : begin
glyph-block-import CommonShapes
glyph-block-import Common-Derivatives
define [UpperOuShape top] : glyph-proc
include : OShape (top * HBarPos + HalfStroke) 0 SB RightSB nothing ArchDepthA ArchDepthB
define [OuShape top yBar gapL gapR] : glyph-proc
include : OShape (yBar + HalfStroke) 0 SB RightSB nothing ArchDepthA ArchDepthB
local xLeft : clamp (SB + 1.25 * HVContrast * Stroke) [mix SB RightSB 0.4] (Middle - Width * 0.05)
local d : 0.25 * TanSlope * (RightSB - SB)
include : dispiro
widths.lhs
flat SB top [heading Downward]
curl SB (top * HBarPos - O - HalfStroke + ArchDepthB)
arcvh
g4 (Middle + CorrectionOMidS) (top * HBarPos - O - HalfStroke + (Stroke * (1 - CThin))) [widths.lhs (Stroke * CThin)]
g4.left.start (xLeft - CorrectionOMidS) (top - gapL)
archv
flat RightSB (top * HBarPos - O - HalfStroke + ArchDepthA) [widths.lhs]
curl RightSB top [heading Upward]
g4.down.mid SB ([mix (yBar - HalfStroke) (top - gapL) 0.5] + d)
arcvh
g4 (Middle + CorrectionOMidS) (yBar - O - HalfStroke + (Stroke * (1 - CThin))) [widths.lhs (Stroke * CThin)]
archv
g4.up.mid RightSB ([mix (yBar - HalfStroke) (top - gapR) 0.5] - d) [widths.lhs]
arcvh
g4.left.end (Width - xLeft - CorrectionOMidS) (top - gapR)
create-glyph 'OU' 0x222 : glyph-proc
include : MarkSet.capital
include : UpperOuShape CAP
include : OuShape CAP (CAP * HBarPos) (CAP * 0.05) 0
create-glyph 'smcpOU' 0x1D15 : glyph-proc
include : MarkSet.e
include : UpperOuShape XH
include : OuShape XH (XH * HBarPos) 0 0
create-glyph 'ou' 0x223 : glyph-proc
include : MarkSet.b
local bar : StrokeWidthBlend (XH * 0.9) XH
include : OShape bar 0 SB RightSB
include : dispiro
widths.lhs
flat SB Ascender [heading Downward]
curl SB (bar - O - Stroke + ArchDepthB)
arcvh
g4 (Middle + CorrectionOMidS) (bar - O - Stroke + (Stroke * (1 - CThin))) [widths.lhs (Stroke * CThin)]
archv
flat RightSB (bar - O - Stroke + ArchDepthA) [widths.lhs]
curl RightSB Ascender [heading Upward]
include : OuShape Ascender (Ascender * [mix HBarPos (XH / CAP) 0.5]) 0 0

View file

@ -8,8 +8,9 @@ glyph-module
glyph-block Letter-Latin-Rams-Horn : begin
glyph-block-import CommonShapes
glyph-block-import Common-Derivatives
glyph-block-import Letter-Shared-Shapes : SerifFrame
define [RamsHornShape bottom top] : glyph-proc
define [LatinGammaShape bottom top] : glyph-proc
local hf : [AdviceStroke 4] / 2
local d : hf * 2 + Width * 0.05
@ -27,38 +28,60 @@ glyph-block Letter-Latin-Rams-Horn : begin
create-glyph 'latn/gamma' 0x263 : glyph-proc
include : MarkSet.p
include : RamsHornShape Descender XH
include : LatinGammaShape Descender XH
if SLAB : begin
local sf : SerifFrame XH Descender SB RightSB
include : composite-proc sf.lt.full sf.rt.full
create-glyph 'latn/Gamma' 0x194 : glyph-proc
include : MarkSet.capDesc
include : RamsHornShape Descender Ascender
include : LatinGammaShape Descender CAP
if SLAB : begin
local sf : SerifFrame CAP Descender SB RightSB
include : composite-proc sf.lt.full sf.rt.full
define [RamsHornShape fFill bottom top] : glyph-proc
local k1 0.625
local k2 0.7
local kIntersection 0.15
local d : 0.25 * (RightSB - SB) * k1 * TanSlope
local sw : AdviceStroke : if SLAB 3 2.75
local fine : AdviceStroke : if SLAB 3.75 3.5
local coFine : mix sw fine (kIntersection / k2)
local fillOffset : sw * 0.25
include : union
dispiro
widths.rhs sw
straight.right.start SB top [heading Rightward]
g4 Middle [mix top bottom kIntersection] [widths.rhs coFine]
g4.down.mid [mix Middle RightSB k1] ([mix top bottom k2] - d) [widths.rhs fine]
arcvh
g4.left.mid (Middle + CorrectionOMidX * fine) (bottom + O)
archv
g4.up.mid [mix Middle SB k1] ([mix top bottom k2] + d)
g4 Middle [mix top bottom kIntersection] [widths.rhs coFine]
straight.right.end RightSB top [widths.rhs.heading sw Rightward]
if fFill
then : spiro-outline
corner Middle ([mix top bottom kIntersection] - fillOffset)
g4.down.mid ([mix Middle RightSB k1] - fillOffset) ([mix top bottom k2] - d)
g4.left.mid (Middle + CorrectionOMidX * fine) (bottom + fillOffset)
g4.up.mid ([mix Middle SB k1] + fillOffset) ([mix top bottom k2] + d)
close
else : no-shape
if SLAB : begin
include : DownwardLeftSerif SB (top - sw) (VJut * (sw / Stroke) - sw) fine
include : DownwardRightSerif RightSB (top - sw) (VJut * (sw / Stroke) - sw) fine
create-glyph 'ramshorn' 0x264 : glyph-proc
include : MarkSet.e
include : RamsHornShape 0 XH
include : RamsHornShape false 0 XH
### Ayin
create-glyph 'latinAyin' 0x1D25 : glyph-proc
include : MarkSet.e
local k1 0.65
local k2 0.7
local zmidy (XH * 0.15)
local offset : Stroke * 0.25
include : union
dispiro
widths.lhs
g4.right.start SB 0 [heading Rightward]
g4 Middle zmidy
g4.up.mid [mix Middle RightSB k1] (XH * k2) [heading Upward]
arcvh
g4.left.mid Middle (XH - O) [heading Leftward]
archv
g4.down.mid [mix Middle SB k1] (XH * k2) [heading Downward]
g4 Middle zmidy
g4.right.end RightSB 0 [heading Rightward]
spiro-outline
corner Middle (zmidy + offset)
g4.up.mid ([mix Middle RightSB k1] - offset) (XH * k2)
g4.left.mid Middle (XH - offset)
g4.down.mid ([mix Middle SB k1] + offset) (XH * k2)
close
include : RamsHornShape true 0 XH
include : FlipAround Middle (XH / 2)

View file

@ -202,17 +202,31 @@ glyph-block Letter-Latin-Lower-A : begin
corner (RightSB - Stroke * HVContrast) (CAP - Stroke / 2)
corner RightSB (CAP - O)
create-glyph 'scripta' 0x0251 : glyph-proc
include : MarkSet.e
include : union
OBarRightShape
spiro-outline
corner RightSB 0
corner (RightSB - Stroke * HVContrast) 0
corner (RightSB - Stroke * HVContrast) (XH - Stroke / 2)
corner RightSB (XH - O)
if SLAB : include : tagged 'serifRB' RightwardBottomSerif RightSB 0 SideJut
define [CutRightStroke g] : difference g : spiro-outline
corner RightSB XH
corner (RightSB - Stroke * HVContrast) XH
corner (RightSB - Stroke * HVContrast) (XH - Stroke / 2)
create-glyph 'scripta.serifless' : glyph-proc
include : MarkSet.e
set-base-anchor 'trailing' RightSB 0
include : OBarRightShape
include : CutRightStroke : VBarRight RightSB 0 XH
create-glyph 'scripta.serifed' : glyph-proc
include : MarkSet.e
set-base-anchor 'trailing' (RightSB + SideJut) 0
include : OBarRightShape
include : VBarRight RightSB 0 XH
include : tagged 'serifRB' : CutRightStroke : RightwardBottomSerif RightSB 0 SideJut
create-glyph 'scripta.tailed' : glyph-proc
include : MarkSet.e
set-base-anchor 'trailing' (RightSB + SideJut) 0
include : OBarRightShape
include : CutRightStroke : RightwardTailedBar RightSB 0 XH
select-variant 'scripta' 0x0251
turned 'turnlargescripta' 0x2C70 'largescripta' Middle (CAP / 2)
turned 'turnscripta' 0x252 'scripta' Middle (XH / 2)

View file

@ -133,19 +133,19 @@ define-macro glyph-block-import : syntax-rules
derive-composites link-reduced-variant alias-reduced-variant glyph-is-needed
HalfAdvance TurnMarks derive-multi-part-glyphs DeriveMeshT]
CommonShapes `[Rect SquareAt Ring RingAt DotAt RingStroke RingStrokeAt DotStrokeAt
CircleRing CircleRingAt CircleDotAt RoundStrokeTerminalAt OShapeT OShape OShapeOutline
OShapeFlatTB OBarLeftShape OBarRightShape LeftwardTopSerif LeftwardBottomSerif
RightwardTopSerif RightwardBottomSerif CenterTopSerif CenterTopSerifAsymmetric
CenterBottomSerif CenterBottomSerifAsymmetric DownwardRightSerif UpwardRightSerif
DownwardLeftSerif UpwardLeftSerif NeedSlab NeedNotItalic HBar HBarTop HBarBottom
HOverlayBar VBar VBarLeft VBarRight VerticalHook LeftHook FlatSlashShape hookstart
hookend Ungizmo Regizmo FlipAround ScaleAround Realign ForceUpright DiagCor NameUni
PointingTo WithTransform clear-anchors OBarLeftToothlessShape OBarLeftRoundedShape
OBarRightToothlessShape OBarRightRoundedShape AsRadical ExtLineCenter ExtLineLhs
ExtLineRhs DiagCorDs HCrossBar VERY-FAR MaskAbove MaskBelow MaskLeft MaskRight
HalfRectTriangle MaskAboveLine MaskBelowLine MaskLeftLine MaskRightLine DotVariants
WithDotVariants]
CommonShapes `[no-shape Rect SquareAt Ring RingAt DotAt RingStroke RingStrokeAt
DotStrokeAt CircleRing CircleRingAt CircleDotAt RoundStrokeTerminalAt OShapeT OShape
OShapeOutline OShapeFlatTB OBarLeftShape OBarRightShape LeftwardTopSerif
LeftwardBottomSerif RightwardTopSerif RightwardBottomSerif CenterTopSerif
CenterTopSerifAsymmetric CenterBottomSerif CenterBottomSerifAsymmetric
DownwardRightSerif UpwardRightSerif DownwardLeftSerif UpwardLeftSerif NeedSlab
NeedNotItalic HBar HBarTop HBarBottom HOverlayBar VBar VBarLeft VBarRight VerticalHook
LeftHook FlatSlashShape hookstart hookend Ungizmo Regizmo FlipAround ScaleAround Realign
ForceUpright DiagCor NameUni PointingTo WithTransform clear-anchors
OBarLeftToothlessShape OBarLeftRoundedShape OBarRightToothlessShape
OBarRightRoundedShape AsRadical ExtLineCenter ExtLineLhs ExtLineRhs DiagCorDs HCrossBar
VERY-FAR MaskAbove MaskBelow MaskLeft MaskRight HalfRectTriangle MaskAboveLine
MaskBelowLine MaskLeftLine MaskRightLine DotVariants WithDotVariants]
define vartiableFilter : if externEnv.$glyphBlockVariableUsage$
lambda [x] externEnv.$glyphBlockVariableUsage$.(x)

View file

@ -63,6 +63,8 @@ export class Glyph {
return this.applyTransform(component, copyAnchors);
} else if (component instanceof Glyph) {
return this.includeGlyph(component, copyAnchors, copyWidth);
} else if (component.__isNoShape) {
// Do nothing. By design.
} else {
throw new Error("Invalid component to be introduced.");
}

View file

@ -1785,6 +1785,7 @@ selector.a = "doubleStoreySerifless"
selector."a/sansSerif" = "doubleStoreySerifless"
selector."a/rtailBase" = "doubleStoreySerifless"
selector."a/turnABase" = "doubleStoreySerifless"
selector.scripta = "serifless"
[prime.a.variants.double-storey-tailed]
rank = 2
@ -1793,6 +1794,7 @@ selector.a = "doubleStoreyTailed"
selector."a/sansSerif" = "doubleStoreyTailed"
selector."a/rtailBase" = "doubleStoreySerifless"
selector."a/turnABase" = "doubleStoreyTailed"
selector.scripta = "tailed"
[prime.a.variants.double-storey-toothless-corner]
rank = 3
@ -1801,6 +1803,7 @@ selector.a = "doubleStoreyToothlessCorner"
selector."a/sansSerif" = "doubleStoreyToothlessCorner"
selector."a/rtailBase" = "doubleStoreySerifless"
selector."a/turnABase" = "doubleStoreyToothlessCorner"
selector.scripta = "serifless"
[prime.a.variants.double-storey-toothless-rounded]
rank = 4
@ -1809,6 +1812,7 @@ selector.a = "doubleStoreyToothlessRounded"
selector."a/sansSerif" = "doubleStoreyToothlessRounded"
selector."a/rtailBase" = "doubleStoreySerifless"
selector."a/turnABase" = "doubleStoreyToothlessRounded"
selector.scripta = "serifless"
[prime.a.variants.double-storey-serifed]
rank = 5
@ -1817,6 +1821,7 @@ selector.a = "doubleStoreySerifed"
selector."a/sansSerif" = "doubleStoreySerifless"
selector."a/rtailBase" = "doubleStoreySerifless"
selector."a/turnABase" = "doubleStoreySerifed"
selector.scripta = "serifed"
[prime.a.variants.single-storey-serifless]
rank = 6
@ -1825,6 +1830,7 @@ selector.a = "singleStoreySerifless"
selector."a/sansSerif" = "singleStoreySerifless"
selector."a/rtailBase" = "singleStoreySerifless"
selector."a/turnABase" = "doubleStoreySerifless"
selector.scripta = "serifless"
[prime.a.variants.single-storey-earless-corner-serifless]
rank = 7
@ -1833,6 +1839,7 @@ selector.a = "singleStoreyEarlessCornerSerifless"
selector."a/sansSerif" = "singleStoreyEarlessCornerSerifless"
selector."a/rtailBase" = "singleStoreyEarlessCornerSerifless"
selector."a/turnABase" = "doubleStoreySerifless"
selector.scripta = "serifless"
[prime.a.variants.single-storey-earless-rounded-serifless]
rank = 8
@ -1841,6 +1848,7 @@ selector.a = "singleStoreyEarlessRoundedSerifless"
selector."a/sansSerif" = "singleStoreyEarlessRoundedSerifless"
selector."a/rtailBase" = "singleStoreyEarlessRoundedSerifless"
selector."a/turnABase" = "doubleStoreySerifless"
selector.scripta = "serifless"
[prime.a.variants.single-storey-tailed]
rank = 9
@ -1849,6 +1857,7 @@ selector.a = "singleStoreyTailed"
selector."a/sansSerif" = "singleStoreyTailed"
selector."a/rtailBase" = "singleStoreySerifless"
selector."a/turnABase" = "doubleStoreyTailed"
selector.scripta = "tailed"
[prime.a.variants.single-storey-earless-corner-tailed]
rank = 10
@ -1857,6 +1866,7 @@ selector.a = "singleStoreyEarlessCornerTailed"
selector."a/sansSerif" = "singleStoreyEarlessCornerTailed"
selector."a/rtailBase" = "singleStoreyEarlessCornerSerifless"
selector."a/turnABase" = "doubleStoreyTailed"
selector.scripta = "tailed"
[prime.a.variants.single-storey-earless-rounded-tailed]
rank = 11
@ -1865,6 +1875,7 @@ selector.a = "singleStoreyEarlessRoundedTailed"
selector."a/sansSerif" = "singleStoreyEarlessRoundedTailed"
selector."a/rtailBase" = "singleStoreyEarlessRoundedSerifless"
selector."a/turnABase" = "doubleStoreyTailed"
selector.scripta = "tailed"
[prime.a.variants.single-storey-serifed]
rank = 12
@ -1873,6 +1884,7 @@ selector.a = "singleStoreySerifed"
selector."a/sansSerif" = "singleStoreySerifless"
selector."a/rtailBase" = "singleStoreySerifless"
selector."a/turnABase" = "doubleStoreySerifed"
selector.scripta = "serifed"
[prime.a.variants.single-storey-earless-corner-serifed]
rank = 13
@ -1881,6 +1893,7 @@ selector.a = "singleStoreyEarlessCornerSerifed"
selector."a/sansSerif" = "singleStoreyEarlessCornerSerifless"
selector."a/rtailBase" = "singleStoreyEarlessCornerSerifless"
selector."a/turnABase" = "doubleStoreySerifed"
selector.scripta = "serifed"
[prime.a.variants.single-storey-earless-rounded-serifed]
rank = 14
@ -1889,6 +1902,7 @@ selector.a = "singleStoreyEarlessRoundedSerifed"
selector."a/sansSerif" = "singleStoreyEarlessRoundedSerifless"
selector."a/rtailBase" = "singleStoreyEarlessRoundedSerifless"
selector."a/turnABase" = "doubleStoreySerifed"
selector.scripta = "serifed"
[prime.b]