Fix cv44 application on certain t-derived letters (U+01AB, U+0236, U+0288, U+1DB5, and U+20A7) (#1405).

This commit is contained in:
be5invis 2022-08-23 02:30:16 -07:00
parent 178c951902
commit 78094dd541
10 changed files with 298 additions and 211 deletions

View file

@ -1 +1,2 @@
* Fix `cv99` application on ASCII single quotes and graves (#1404).
* Fix `cv44` application on certain t-derived letters (`U+01AB`, `U+0236`, `U+0288`, `U+1DB5`, and `U+20A7`) (#1405).

View file

@ -3,7 +3,7 @@ import zlib from "zlib";
import { encode, decode } from "@msgpack/msgpack";
const Edition = 20;
const Edition = 21;
const MAX_AGE = 16;
class GfEntry {
constructor(age, value) {

View file

@ -1186,7 +1186,7 @@ glyph-block Autobuild-Ligatures : begin
list 0x1F3 { 'd' 'z' }
list 0x478 { 'O' 'y' }
list 0x479 { 'o' 'y' }
list 0x20A7 { 'P' 't.flatHook' }
list 0x20A7 { 'P' 't' }
list 0x20A8 { 'R' 's' }
list 0x20AF { 'D' 'grek/rho' }
list 0x2116 { 'N' 'numeroRightHalf' }

View file

@ -18,89 +18,140 @@ glyph-block Letter-Latin-Lower-T : begin
define dfNarrowT : DivFrame para.diversityF
define [xSmallTBarLeftT df] : df.middle - TBalance * df.div * df.div - HalfStroke * HVContrast
define [xSmallTCrossRefT df] : [xSmallTBarLeftT df] + df.div * TBalance2 + HalfStroke * HVContrast
define xSmallTBarLeft : xSmallTBarLeftT : DivFrame 1
define yCrossBar XH
define yShortNeck1 : Math.max [mix XH Ascender 0.5] ([mix XH Ascender 0.875] - Stroke * 0.125)
define yShortNeck2 : Math.max [mix XH Ascender 0.5] ([mix XH Ascender 0.75] - Stroke * 0.125)
define [SmallTHookShapeT sink offset top bot sw] : begin
local hookx : xSmallTBarLeft + [Math.max ((Width - SB * 2) * 0.75 + Stroke * 0.25 * HVContrast) (Stroke * HVContrast * 2.25)]
local turn : [mix xSmallTBarLeft hookx 0.5] + CorrectionOMidS
local adb : Math.max Hook ((turn - xSmallTBarLeft) * 1.2)
define Standard : namespace
export : define [BarLeftPos df] : xSmallTBarLeftT df
export : define [HookShapeT sink df offset top bot sw] : begin
local xLeft : xSmallTBarLeftT df
local hookx : xLeft + [Math.max ((df.width - df.leftSB * 2) * 0.75 + Stroke * 0.25 * HVContrast) (Stroke * HVContrast * 2.25)]
local turn : [mix xLeft hookx 0.5] + CorrectionOMidS
local adb : Math.max Hook ((turn - xLeft) * 1.2)
return : sink
widths.lhs sw
[if (sink == spiro-outline) corner flat] (offset + xSmallTBarLeft) top [heading Downward]
curl (offset + xSmallTBarLeft) (bot + adb)
[if (sink == spiro-outline) corner flat] (offset + xLeft) top [heading Downward]
curl (offset + xLeft) (bot + adb)
hookend (bot + O + offset) (tight -- !para.isItalic)
g4 (hookx - offset) (bot + Hook)
if (sink == spiro-outline) {[corner (hookx - offset) top]} {}
define [SmallTCrossBar] : HCrossBar.top
xSmallTBarLeft + HalfStroke * HVContrast - 1.0625 * LongJut + TBalance2
xSmallTBarLeft + HalfStroke * HVContrast + 1.0625 * LongJut + TBalance2
export : define [CrossBar df] : HCrossBar.top
[xSmallTCrossRefT df] - LongJut * [Math.sqrt df.div]
[xSmallTCrossRefT df] + LongJut * [Math.sqrt df.div]
begin yCrossBar
define [StandardBody __ top bot] : glyph-proc
local g : include : SmallTHookShapeT dispiro 0 top bot Stroke
set-base-anchor 'bottomright' g.knots.(g.knots.length - 1).x g.knots.(g.knots.length - 1).y
set-base-anchor 'above' (xSmallTBarLeft + 0.5 * Stroke * HVContrast) top
set-base-anchor 'below' [mix xSmallTBarLeft g.knots.(g.knots.length - 1).x : StrokeWidthBlend 0.375 0.5] bot
###########################################################################################
export : define [Body df top bot] : glyph-proc
include : CrossBar df
local g : include : HookShapeT dispiro df 0 top bot Stroke
local gEnd g.knots.(g.knots.length - 1)
set-base-anchor 'bottomright' gEnd.x gEnd.y
local xLeft : xSmallTBarLeftT df
set-base-anchor 'above' (xLeft + 0.5 * Stroke * HVContrast) top
set-base-anchor 'below' [mix xLeft gEnd.x : StrokeWidthBlend 0.375 0.5] bot
set-base-anchor 'overlay' (g.knots.0.x + 0.625 * Stroke * HVContrast) (XH * 0.58)
include : SmallTCrossBar
export : define [Retroflex df top bot] : Flat.Retroflex df top bot
define [DiagTailedSmallTHookShape df top bot sw] : begin
define DiagTail : namespace
define [HookShape df top bot sw] : begin
local xMid : [xSmallTBarLeftT df] + HalfStroke * HVContrast
return : dispiro
flat xMid top [widths.center.heading sw Downward]
DiagonalTailR df xMid bot [DiagonalTailStdDepth [DivFrame : Math.sqrt df.div] sw] sw
define [DiagTailBody df top] : glyph-proc
local g : include : DiagTailedSmallTHookShape df top 0 Stroke
###########################################################################################
export : define [BarLeftPos df] : xSmallTBarLeftT df
export : define [Body df top] : glyph-proc
include : Standard.CrossBar df
local g : include : HookShape df top 0 Stroke
local gEnd g.rhsKnots.(g.rhsKnots.length - 1)
set-base-anchor 'bottomright' gEnd.x gEnd.y
set-base-anchor 'above' ([xSmallTBarLeftT df] + 0.5 * Stroke * HVContrast) top
set-base-anchor 'overlay' (g.knots.0.x + 0.125 * Stroke * HVContrast) (XH * 0.58)
include : HCrossBar.top
[xSmallTCrossRefT df] - LongJut * [Math.sqrt df.div]
[xSmallTCrossRefT df] + LongJut * [Math.sqrt df.div]
begin yCrossBar
export : define [Retroflex df top bot] : Flat.Retroflex df top bot
define [FlatBody df top bot] : TFlatShapeImpl false df top bot [mix 1 df.div 2] 0
define [RetroflexHookBody df top bot] : TFlatShapeImpl true df top bot [mix 1 df.div 2] 0
define [TFlatShapeImpl fRetroflex df top bot m ext] : glyph-proc
define Flat : namespace
export : define [BarLeftPos df] : xSmallTBarLeftT df
export : define [Body df top bot] : Impl false false df top bot [mix 1 df.div 2] 0
export : define [Retroflex df top bot] : Impl false true df top bot [mix 1 df.div 2] 0
export : define [CrossRTBody df top bot] : Impl true true df top bot [mix 1 df.div 2] 0
define [Impl fCross fRetroflex df top bot m ext] : glyph-proc
local xCrossLeft : mix 0 SB m
local xCrossRight : mix df.width df.rightSB m
local xBarLeft : [mix xCrossLeft xCrossRight 0.42] - Stroke * 0.375 * HVContrast
local xBarLeft : if fCross
df.middle - 0.5 * HVContrast * Stroke
[mix xCrossLeft xCrossRight 0.42] - 0.375 * HVContrast * Stroke
local hd : FlatHookDepth df
define xTailEnd : piecewise
fRetroflex : xBarLeft + HookX + HalfStroke * HVContrast
fCross : xBarLeft + hd.x
true xCrossRight
include : union
HCrossBar.top xCrossLeft (xCrossRight + ext) yCrossBar
dispiro
widths.rhs
if fRetroflex
straight.left.start (xBarLeft + HookX + HalfStroke * HVContrast) bot
if (fRetroflex || fCross)
straight.left.start xTailEnd bot
list
flat xCrossRight bot
curl [Math.min (xBarLeft + hd.x) (xCrossRight - 1)] bot
archv.superness DesignParameters.tightHookSuperness
flat xBarLeft [if fRetroflex (bot + Hook + HalfStroke) hd.y]
curl xBarLeft top [heading Upward]
set-base-anchor 'above' (xBarLeft + 0.5 * Stroke * HVContrast) top
set-base-anchor 'topright' xCrossRight Ascender
set-base-anchor 'overlay' (xBarLeft + 0.625 * Stroke * HVContrast) (XH * 0.58)
set-base-anchor 'below' (HalfStroke * HVContrast + [Math.min (xBarLeft + hd.x / 2) (xCrossRight - 1)]) bot
set-base-anchor 'bottomright' xTailEnd bot
set-base-anchor 'lTailHookAttach' xTailEnd (bot + Stroke)
define [CrossBody df top bot] : glyph-proc
define Cross : namespace
export : define [BarLeftPos df] : df.middle - 0.5 * HVContrast * Stroke
export : define [Body df top bot] : glyph-proc
include : VBar df.middle 0 top
include : HCrossBar.top (df.middle - LongJut * [Math.sqrt df.div]) (df.middle + LongJut * [Math.sqrt df.div]) yCrossBar
set-base-anchor 'overlay' df.middle (XH * 0.58)
define [CrossPLBody df top bot] : glyph-proc
include : CrossBody df top bot
export : define [Retroflex df top bot] : Flat.CrossRTBody df top bot
export : define [LTBody df top bot] : glyph-proc
include : Body df top bot
define xEnd : df.middle + 1.25 * HVContrast * Stroke
include : HBarBottom df.middle xEnd 0
set-base-anchor 'bottomright' xEnd bot
set-base-anchor 'lTailHookAttach' xEnd (bot + Stroke)
export : define [PLBody df top bot] : glyph-proc
include : Body df top bot
include : HBarBottom df.middle RightSB 0
define [HooklessAsymmetricBody df top bot] : glyph-proc
define HooklessAsymmetric : namespace
export : define [BarLeftPos df] : xSmallTBarLeftT df
export : define [Body df top bot] : glyph-proc
define xBarLeft : xSmallTBarLeftT df
include : VBarLeft xBarLeft 0 top
include : difference
@ -110,57 +161,66 @@ glyph-block Letter-Latin-Lower-T : begin
set-base-anchor 'overlay' (xBarLeft + 0.625 * Stroke * HVContrast) (XH * 0.58)
set-base-anchor 'below' (xBarLeft + HalfStroke * HVContrast) bot
define [HooklessAsymmetricPLBody df top bot] : glyph-proc
include : HooklessAsymmetricBody df top bot
export : define [LTBody df top bot] : glyph-proc
include : Body df top bot
define xBarLeft : xSmallTBarLeftT df
define xEnd : xBarLeft + 1.75 * HVContrast * Stroke
include : HBarBottom xBarLeft xEnd 0
set-base-anchor 'bottomright' xEnd bot
set-base-anchor 'lTailHookAttach' xEnd (bot + Stroke)
export : define [Retroflex df top bot] : glyph-proc
define xBarLeft : xSmallTBarLeftT df
include : dispiro
widths.rhs
straight.left.start (xBarLeft + HookX + HalfStroke * HVContrast) bot
flat xBarLeft (bot + Hook + HalfStroke)
curl xBarLeft top [heading Upward]
include : difference
HCrossBar.top xBarLeft (df.middle + df.div * LongJut) yCrossBar
MaskLeft (xBarLeft - O)
export : define [PLBody df top bot] : glyph-proc
include : Body df top bot
define xBarLeft : xSmallTBarLeftT df
include : HBarBottom xBarLeft RightSB 0
define [PhoneticLeftBody df top bot] : glyph-proc
include : TFlatShapeImpl false df top bot 1 0
define SmallTConfig : object
standard { [DivFrame 1] StandardBody Ascender }
diagonalTailed { dfNarrowT DiagTailBody Ascender }
flatHook { dfNarrowT FlatBody Ascender }
phoneticLeft { dfNarrowT FlatBody Ascender }
retroflexHookBase { dfNarrowT RetroflexHookBody Ascender }
cross { dfNarrowT CrossBody Ascender }
hooklessAsymmetric { dfNarrowT HooklessAsymmetricBody Ascender }
crossPL { dfNarrowT CrossPLBody Ascender }
hooklessAsymmetricPL { dfNarrowT HooklessAsymmetricPLBody Ascender }
standard { [DivFrame 1] Standard Ascender }
diagonalTailed { dfNarrowT DiagTail Ascender }
flatHook { dfNarrowT Flat Ascender }
cross { dfNarrowT Cross Ascender }
hooklessAsymmetric { dfNarrowT HooklessAsymmetric Ascender }
standardShortNeck { [DivFrame 1] StandardBody yShortNeck1 }
diagonalTailedShortNeck { dfNarrowT DiagTailBody yShortNeck1 }
flatHookShortNeck { dfNarrowT FlatBody yShortNeck1 }
phoneticLeftShortNeck { dfNarrowT FlatBody yShortNeck1 }
retroflexHookBaseShortNeck { dfNarrowT RetroflexHookBody yShortNeck1 }
crossShortNeck { dfNarrowT CrossBody yShortNeck1 }
hooklessAsymmetricShortNeck { dfNarrowT HooklessAsymmetricBody yShortNeck1 }
crossPLShortNeck { dfNarrowT CrossPLBody yShortNeck1 }
hooklessAsymmetricPLShortNeck { dfNarrowT HooklessAsymmetricPLBody yShortNeck1 }
standardShortNeck { [DivFrame 1] Standard yShortNeck1 }
diagonalTailedShortNeck { dfNarrowT DiagTail yShortNeck1 }
flatHookShortNeck { dfNarrowT Flat yShortNeck1 }
crossShortNeck { dfNarrowT Cross yShortNeck1 }
hooklessAsymmetricShortNeck { dfNarrowT HooklessAsymmetric yShortNeck1 }
standardShortNeck2 { [DivFrame 1] StandardBody yShortNeck2 }
diagonalTailedShortNeck2 { dfNarrowT DiagTailBody yShortNeck2 }
flatHookShortNeck2 { dfNarrowT FlatBody yShortNeck2 }
phoneticLeftShortNeck2 { dfNarrowT FlatBody yShortNeck2 }
retroflexHookBaseShortNeck2 { dfNarrowT RetroflexHookBody yShortNeck2 }
crossShortNeck2 { dfNarrowT CrossBody yShortNeck2 }
hooklessAsymmetricShortNeck2 { dfNarrowT HooklessAsymmetricBody yShortNeck2 }
crossPLShortNeck2 { dfNarrowT CrossPLBody yShortNeck2 }
hooklessAsymmetricPLShortNeck2 { dfNarrowT HooklessAsymmetricPLBody yShortNeck2 }
standardShortNeck2 { [DivFrame 1] Standard yShortNeck2 }
diagonalTailedShortNeck2 { dfNarrowT DiagTail yShortNeck2 }
flatHookShortNeck2 { dfNarrowT Flat yShortNeck2 }
crossShortNeck2 { dfNarrowT Cross yShortNeck2 }
hooklessAsymmetricShortNeck2 { dfNarrowT HooklessAsymmetric yShortNeck2 }
foreach { suffix { df body top } } [Object.entries SmallTConfig] : do
foreach { suffix { df Style top } } [Object.entries SmallTConfig] : do
create-glyph "t.\(suffix)" : glyph-proc
set-width df.width
include : df.markSet.b
include : body df top 0
include : Style.Body df top 0
create-glyph "t/phoneticLeft2.\(suffix)" : glyph-proc
set-width df.width
include : df.markSet.b
include : (Style.PLBody || Style.Body) df top 0
create-glyph "t/teshLeft.\(suffix)" : glyph-proc
define df1 : DivFrame 1
set-width df1.width
include : df1.markSet.b
include : body df1 top 0
include : Style.Body df1 top 0
include : HCrossBar.top df1.middle (df1.width + df1.middle) yCrossBar
create-glyph "tHookTop.\(suffix)" : glyph-proc
@ -168,40 +228,51 @@ glyph-block Letter-Latin-Lower-T : begin
currentGlyph.clearGeometry
local attach : currentGlyph.gizmo.unapply currentGlyph.baseAnchors.above
include : union
difference [body df top 0] [MaskAbove XH]
difference [Style.Body df top 0] [MaskAbove XH]
VerticalHook attach.x XH HookX (-Hook)
if (body === StandardBody) : create-glyph "tLTail.\(suffix)" : glyph-proc
include : MarkSet.if
include [refer-glyph "t.\(suffix)"] AS_BASE ALSO_METRICS
local attach : currentGlyph.gizmo.unapply currentGlyph.baseAnchors.bottomright
include : VBarRight attach.x 0 attach.y
create-glyph "tLTail.\(suffix)" : glyph-proc
set-width df.width
include : df.markSet.if
include : (Style.LTBody || Style.Body) df top 0
local attach : currentGlyph.gizmo.unapply (currentGlyph.baseAnchors.lTailHookAttach || currentGlyph.baseAnchors.bottomright)
if (attach.y > 0) : include : VBarRight attach.x 0 attach.y
include : VerticalHook (attach.x - HalfStroke * HVContrast) 0 (-HookX) Hook
create-glyph "tRTail.\(suffix)" : glyph-proc
set-width df.width
include : df.markSet.if
include : body df top Descender
include : Style.Retroflex df top Descender
turned "turnt.\(suffix)" nothing "t.\(suffix)" df.middle (XH / 2) [df.markSet.p]
create-glyph "tCurlyTal.\(suffix)" : glyph-proc
create-glyph "tCurlyTail.\(suffix)" : glyph-proc
include : MarkSet.b
local df : DivFrame 1
local fine : AdviceStroke 3.5
local rinner : LongJut / 2 - fine / 2
local x2 : mix SB xSmallTBarLeft 0.4
local xLeft : Style.BarLeftPos df
local x2 : mix SB xLeft 0.4
local y2 : -fine
include : HBarTop (xSmallTBarLeft + HalfStroke - LongJut + TBalance2) (xSmallTBarLeft + HalfStroke + LongJut + TBalance2) XH
include : difference
Style.Body df top 0
MaskBelow (yCrossBar - Stroke - 0.1)
include : dispiro
widths.lhs
flat xSmallTBarLeft top [heading Downward]
curl xSmallTBarLeft (fine + rinner * 2)
CurlyTail fine rinner (xSmallTBarLeft+ Stroke * HVContrast) 0 (xSmallTBarLeft + Stroke * HVContrast + LongJut) x2 y2
flat xLeft (yCrossBar - Stroke) [heading Downward]
curl xLeft (fine + rinner * 2)
CurlyTail fine rinner (xLeft + Stroke * HVContrast) 0 (xLeft + Stroke * HVContrast + LongJut) x2 y2
select-variant 't' 't'
select-variant 't/teshLeft' (follow -- 't')
select-variant 't/phoneticLeft1' (shapeFrom -- 't')
select-variant 't/phoneticLeft2' (shapeFrom -- 't')
select-variant 't/phoneticLeft2'
select-variant 'turnt' 0x287 (follow -- 't')
CreateCommaCaronComposition 'tcaron' 0x165 't'
derive-glyphs 'tCedilla' 0x163 't' ConnectedCedilla
@ -209,7 +280,7 @@ glyph-block Letter-Latin-Lower-T : begin
select-variant "tHookTop" 0x1AD
select-variant 'tLTail' 0x1AB
select-variant 'tRTail' 0x288
select-variant 'tCurlyTal' 0x236 (follow -- 'tLTail')
select-variant 'tCurlyTail' 0x236 (follow -- 'tRTail')
CreateAccentedComposition 'tTildeOver' 0x1D75 't' 'tildeOver'
@ -217,23 +288,23 @@ glyph-block Letter-Latin-Lower-T : begin
define SLAB-NONE 0
define SLAB-CLASSICAL 1
define SLAB-INWARD 2
define [TsLigStrokeShape stroke top sb] : begin
define [TsLigStrokeShape df stroke top sb] : begin
define archDepth : adviceSSmooth (XH + 0.5 * ArchDepth) (-1) stroke
return : dispiro
widths.lhs stroke
flat xSmallTBarLeft top [heading Downward]
curl xSmallTBarLeft XH [heading Downward]
flat [xSmallTBarLeftT df] top [heading Downward]
curl [xSmallTBarLeftT df] XH [heading Downward]
alsoThru.g2 0.5 0.5 [widths.center stroke]
g4 RightSB (archDepth) [widths.rhs stroke]
g4 df.rightSB (archDepth) [widths.rhs stroke]
match sb
[Just SLAB-CLASSICAL] : SerifedArcEnd_RtlRhs SB Middle 0 stroke SHook
[Just SLAB-CLASSICAL] : SerifedArcEnd_RtlRhs df.leftSB Middle 0 stroke SHook
[Just SLAB-INWARD] : list
arcvh
g4 (Middle + CorrectionOMidX * stroke) O
g4 SB DToothlessRise
g4 (df.middle + CorrectionOMidX * stroke) O
g4 df.leftSB DToothlessRise
__ : list
hookend O (sw -- stroke) (swItalicAdj -- Stroke)
g4 SB SHook
g4 df.leftSB SHook
define TSUpperConfig : object
standard { Ascender }
@ -242,11 +313,12 @@ glyph-block Letter-Latin-Lower-T : begin
foreach { suffix { yTop } } [Object.entries TSUpperConfig] : do
create-glyph "tsLig/upperHalf.\(suffix)" : glyph-proc
define df : DivFrame 1
set-base-anchor 'cvDecompose' 0 0
include : difference
TsLigStrokeShape Stroke top false
TsLigStrokeShape df Stroke top false
MaskBelow XH
include : SmallTCrossBar
include : Standard.CrossBar df
define TSLowerConfig : object
serifless { SLAB-NONE }
@ -255,10 +327,11 @@ glyph-block Letter-Latin-Lower-T : begin
foreach { suffix { doBS } } [Object.entries TSLowerConfig] : do
create-glyph "tsLig/lowerHalf.\(suffix)" : glyph-proc
include : MarkSet.b
define df : DivFrame 1
include : df.markSet.b
set-mark-anchor 'cvDecompose' 0 0
include : intersection
TsLigStrokeShape Stroke Ascender doBS
TsLigStrokeShape df Stroke Ascender doBS
MaskBelow XH
include : SAutoSlabEnd doBS 0 Stroke Hook
@ -271,15 +344,17 @@ glyph-block Letter-Latin-Lower-T : begin
CvDecompose.set currentGlyph { 'tsLig/upperHalf' 'tsLig/lowerHalf' }
create-glyph 'mathbb/t' 0x1D565 : glyph-proc
include : HBarTop xSmallTBarLeft (xSmallTBarLeft + BBD) Ascender BBS
include : SmallTHookShapeT dispiro 0 Ascender 0 BBS
define df : DivFrame 1
define xLeft : xSmallTBarLeftT df
include : HBarTop xLeft (xLeft + BBD) Ascender BBS
include : Standard.HookShapeT dispiro df 0 Ascender 0 BBS
include : intersection
VBarLeft (xSmallTBarLeft + BBD) 0 Ascender BBS
SmallTHookShapeT spiro-outline 1 Ascender 0 BBS
VBarLeft (xLeft + BBD) 0 Ascender BBS
Standard.HookShapeT spiro-outline df 1 Ascender 0 BBS
include : difference
HCrossBar.top
xSmallTBarLeft + (BBD / 2) - LongJut + TBalance2
xSmallTBarLeft + (BBD / 2) + LongJut + TBalance2
xLeft + (BBD / 2) - LongJut + TBalance2
xLeft + (BBD / 2) + LongJut + TBalance2
begin yCrossBar
begin BBS
Rect Ascender 0 xSmallTBarLeft (xSmallTBarLeft + BBD)
Rect Ascender 0 xLeft (xLeft + BBD)

View file

@ -304,7 +304,7 @@ glyph-block Letter-Latin-S : begin
include : SAutoSlabStart doTS CAP Stroke Hook
local stroke : include : SStrokeImpl CAP 0 doTS doBS [AdviceStroke2 2 3 CAP] EssUpper
local start : currentGlyph.gizmo.unapply stroke.lhsKnots.(stroke.lhsKnots.length - 1)
local start stroke.lhsKnots.(stroke.lhsKnots.length - 1)
local sw : AdviceStroke2 2 3 CAP
include : dispiro
@ -319,7 +319,7 @@ glyph-block Letter-Latin-S : begin
include : SAutoSlabStart doTS XH [AdviceStroke2 2 3 XH] Hook
local stroke : include : SmallSStrokeImpl doTS doBS [AdviceStroke2 2 3 XH] EssLower
local start : currentGlyph.gizmo.unapply stroke.lhsKnots.(stroke.lhsKnots.length - 1)
local start stroke.lhsKnots.(stroke.lhsKnots.length - 1)
local sw : AdviceStroke2 2 3 XH
include : dispiro
@ -335,7 +335,7 @@ glyph-block Letter-Latin-S : begin
include : SAutoSlabStart doTS XH [AdviceStroke2 2 3 XH] Hook
local stroke : include : SmallSStrokeImpl doTS doBS [AdviceStroke2 2 3 XH] EssLower
local start : currentGlyph.gizmo.unapply stroke.lhsKnots.(stroke.lhsKnots.length - 1)
local start stroke.lhsKnots.(stroke.lhsKnots.length - 1)
include : new-glyph : glyph-proc
local sw : AdviceStroke2 2 3 XH

View file

@ -106,7 +106,7 @@ glyph-block Letter-Latin-Upper-P : begin
set PShape.OpenGap : function [] : params [top [mul PShape.defaultMul] [bp PShape.BarPos] [sw Stroke]] : VBarLeft
SB * mul + sw * HVContrast
[PBarPosY top sw bp] - sw
[PBarPosY top sw bp] + sw + 1
Math.max ([PBarPosY top sw bp] + sw) [mix top [PBarPosY top sw bp] 0.5]
0.2 * (RightSB - SB) * ([AdviceStroke 5] / Stroke)
set RevPShape.SlabMotion : function [top sw mul] : glyph-proc
@ -119,7 +119,7 @@ glyph-block Letter-Latin-Upper-P : begin
set RevPShape.OpenGap : function [] : params [top [mul PShape.defaultMul] [bp PShape.BarPos] [sw Stroke]] : VBarRight
Width - SB * mul - sw * HVContrast
[PBarPosY top sw bp] - sw
[PBarPosY top sw bp] + sw + 1
Math.max ([PBarPosY top sw bp] + sw) [mix top [PBarPosY top sw bp] 0.5]
0.2 * (RightSB - SB) * ([AdviceStroke 5] / Stroke)
define PConfig : object

View file

@ -37,7 +37,7 @@ glyph-block Digits-Five : begin
include : difference
glyph-proc
local fiveStroke : include FiveStroke
local firstKnot : currentGlyph.gizmo.unapply fiveStroke.rhsKnots.0
local firstKnot fiveStroke.rhsKnots.0
local oblCor : Math.hypot 1 obl
local xVBar : firstKnot.x - oblCor * sw * HVContrast

View file

@ -48,10 +48,10 @@ class DiSpiroProxy {
return this.m_origKnots;
}
get lhsKnots() {
return this.geometry.expand().lhs;
return this.geometry.expand().lhsUntransformed;
}
get rhsKnots() {
return this.geometry.expand().rhs;
return this.geometry.expand().rhsUntransformed;
}
}
function prepareSpiroKnots(_knots, s) {

View file

@ -146,7 +146,18 @@ export class SpiroExpander {
rhs[j].y = knot.y - knot.d2 * dy;
}
this.interpolateUnimportantKnots(lhs, rhs);
return { lhs, rhs };
const lhsUntransformed = [],
rhsUntransformed = [];
for (const z of lhs) {
const u = this.gizmo.unapply(z);
lhsUntransformed.push({ type: z.type, x: u.x, y: u.y });
}
for (const z of rhs) {
const u = this.gizmo.unapply(z);
rhsUntransformed.push({ type: z.type, x: u.x, y: u.y });
}
return { lhs, rhs, lhsUntransformed, rhsUntransformed };
}
interpolateUnimportantKnots(lhs, rhs) {
for (let j = 0; j < this.controlKnots.length; j++) {

View file

@ -3746,10 +3746,10 @@ tag = "cv44"
rank = 1
description = "Standard `t` shape"
selector.t = "standard"
selector."t/phoneticLeft1" = "phoneticLeft"
selector."t/phoneticLeft2" = "phoneticLeft"
selector."t/phoneticLeft1" = "flatHook"
selector."t/phoneticLeft2" = "flatHook"
selector.tHookTop = "standard"
selector.tRTail = "retroflexHookBase"
selector.tRTail = "flatHook"
selector.tLTail = "standard"
selector."tsLig/upperHalf" = "standard"
@ -3757,22 +3757,22 @@ selector."tsLig/upperHalf" = "standard"
rank = 2
description = "`t` with flat hook"
selector.t = "flatHook"
selector."t/phoneticLeft1" = "phoneticLeft"
selector."t/phoneticLeft2" = "phoneticLeft"
selector."t/phoneticLeft1" = "flatHook"
selector."t/phoneticLeft2" = "flatHook"
selector.tHookTop = "flatHook"
selector.tRTail = "retroflexHookBase"
selector.tLTail = "standard"
selector.tRTail = "flatHook"
selector.tLTail = "flatHook"
selector."tsLig/upperHalf" = "standard"
[prime.t.variants.diagonal-tailed]
rank = 3
description = "`t` with diagonal tail"
selector.t = "diagonalTailed"
selector."t/phoneticLeft1" = "phoneticLeft"
selector."t/phoneticLeft2" = "phoneticLeft"
selector."t/phoneticLeft1" = "flatHook"
selector."t/phoneticLeft2" = "flatHook"
selector.tHookTop = "diagonalTailed"
selector.tRTail = "retroflexHookBase"
selector.tLTail = "standard"
selector.tRTail = "flatHook"
selector.tLTail = "diagonalTailed"
selector."tsLig/upperHalf" = "standard"
[prime.t.variants.cross]
@ -3780,10 +3780,10 @@ rank = 4
description = "Futura-like `t` shape"
selector.t = "cross"
selector."t/phoneticLeft1" = "cross"
selector."t/phoneticLeft2" = "crossPL"
selector."t/phoneticLeft2" = "cross"
selector.tHookTop = "cross"
selector.tRTail = "retroflexHookBase"
selector.tLTail = "standard"
selector.tRTail = "cross"
selector.tLTail = "cross"
selector."tsLig/upperHalf" = "standard"
[prime.t.variants.hookless-asymmetric]
@ -3791,20 +3791,20 @@ rank = 5
description = "`t` without hook and with ony half the cross bar"
selector.t = "hooklessAsymmetric"
selector."t/phoneticLeft1" = "hooklessAsymmetric"
selector."t/phoneticLeft2" = "hooklessAsymmetricPL"
selector."t/phoneticLeft2" = "hooklessAsymmetric"
selector.tHookTop = "hooklessAsymmetric"
selector.tRTail = "retroflexHookBase"
selector.tLTail = "standard"
selector.tRTail = "hooklessAsymmetric"
selector.tLTail = "hooklessAsymmetric"
selector."tsLig/upperHalf" = "standard"
[prime.t.variants.standard-short-neck]
rank = 6
description = "Standard `t` shape with a shorter neck"
selector.t = "standardShortNeck"
selector."t/phoneticLeft1" = "phoneticLeftShortNeck"
selector."t/phoneticLeft2" = "phoneticLeftShortNeck"
selector."t/phoneticLeft1" = "flatHookShortNeck"
selector."t/phoneticLeft2" = "flatHookShortNeck"
selector.tHookTop = "standard"
selector.tRTail = "retroflexHookBaseShortNeck"
selector.tRTail = "flatHookShortNeck"
selector.tLTail = "standardShortNeck"
selector."tsLig/upperHalf" = "standardShortNeck"
@ -3812,22 +3812,22 @@ selector."tsLig/upperHalf" = "standardShortNeck"
rank = 7
description = "`t` with flat hook and a slightly shorter neck"
selector.t = "flatHookShortNeck"
selector."t/phoneticLeft1" = "phoneticLeftShortNeck"
selector."t/phoneticLeft2" = "phoneticLeftShortNeck"
selector."t/phoneticLeft1" = "flatHookShortNeck"
selector."t/phoneticLeft2" = "flatHookShortNeck"
selector.tHookTop = "flatHook"
selector.tRTail = "retroflexHookBaseShortNeck"
selector.tLTail = "standardShortNeck"
selector.tRTail = "flatHookShortNeck"
selector.tLTail = "flatHookShortNeck"
selector."tsLig/upperHalf" = "standardShortNeck"
[prime.t.variants.diagonal-tailed-short-neck]
rank = 8
description = "`t` with diagonal tail and a shorter neck"
selector.t = "diagonalTailedShortNeck"
selector."t/phoneticLeft1" = "phoneticLeftShortNeck"
selector."t/phoneticLeft2" = "phoneticLeftShortNeck"
selector."t/phoneticLeft1" = "flatHookShortNeck"
selector."t/phoneticLeft2" = "flatHookShortNeck"
selector.tHookTop = "diagonalTailed"
selector.tRTail = "retroflexHookBaseShortNeck"
selector.tLTail = "standardShortNeck"
selector.tRTail = "flatHookShortNeck"
selector.tLTail = "diagonalTailedShortNeck"
selector."tsLig/upperHalf" = "standardShortNeck"
[prime.t.variants.cross-short-neck]
@ -3835,10 +3835,10 @@ rank = 9
description = "Futura-like `t` shape with a shorter neck"
selector.t = "crossShortNeck"
selector."t/phoneticLeft1" = "crossShortNeck"
selector."t/phoneticLeft2" = "crossPLShortNeck"
selector."t/phoneticLeft2" = "crossShortNeck"
selector.tHookTop = "cross"
selector.tRTail = "retroflexHookBaseShortNeck"
selector.tLTail = "standardShortNeck"
selector.tRTail = "crossShortNeck"
selector.tLTail = "crossShortNeck"
selector."tsLig/upperHalf" = "standardShortNeck"
[prime.t.variants.hookless-asymmetric-short-neck]
@ -3846,20 +3846,20 @@ rank = 10
description = "`t` without hook, with ony half the cross bar and a shorter neck"
selector.t = "hooklessAsymmetricShortNeck"
selector."t/phoneticLeft1" = "hooklessAsymmetricShortNeck"
selector."t/phoneticLeft2" = "hooklessAsymmetricPLShortNeck"
selector."t/phoneticLeft2" = "hooklessAsymmetricShortNeck"
selector.tHookTop = "hooklessAsymmetric"
selector.tRTail = "retroflexHookBaseShortNeck"
selector.tLTail = "standardShortNeck"
selector.tRTail = "hooklessAsymmetricShortNeck"
selector.tLTail = "hooklessAsymmetricShortNeck"
selector."tsLig/upperHalf" = "standardShortNeck"
[prime.t.variants.standard-short-neck2]
rank = 11
description = "Standard `t` shape with a more shorter neck"
selector.t = "standardShortNeck2"
selector."t/phoneticLeft1" = "phoneticLeftShortNeck2"
selector."t/phoneticLeft2" = "phoneticLeftShortNeck2"
selector."t/phoneticLeft1" = "flatHookShortNeck2"
selector."t/phoneticLeft2" = "flatHookShortNeck2"
selector.tHookTop = "standard"
selector.tRTail = "retroflexHookBaseShortNeck2"
selector.tRTail = "flatHookShortNeck2"
selector.tLTail = "standardShortNeck2"
selector."tsLig/upperHalf" = "standardShortNeck2"
@ -3867,22 +3867,22 @@ selector."tsLig/upperHalf" = "standardShortNeck2"
rank = 12
description = "`t` with flat hook and a more shorter neck"
selector.t = "flatHookShortNeck2"
selector."t/phoneticLeft1" = "phoneticLeftShortNeck2"
selector."t/phoneticLeft2" = "phoneticLeftShortNeck2"
selector."t/phoneticLeft1" = "flatHookShortNeck2"
selector."t/phoneticLeft2" = "flatHookShortNeck2"
selector.tHookTop = "flatHook"
selector.tRTail = "retroflexHookBaseShortNeck2"
selector.tLTail = "standardShortNeck2"
selector.tRTail = "flatHookShortNeck2"
selector.tLTail = "flatHookShortNeck2"
selector."tsLig/upperHalf" = "standardShortNeck2"
[prime.t.variants.diagonal-tailed-short-neck2]
rank = 13
description = "`t` with diagonal tail and a more shorter neck"
selector.t = "diagonalTailedShortNeck2"
selector."t/phoneticLeft1" = "phoneticLeftShortNeck2"
selector."t/phoneticLeft2" = "phoneticLeftShortNeck2"
selector."t/phoneticLeft1" = "flatHookShortNeck2"
selector."t/phoneticLeft2" = "flatHookShortNeck2"
selector.tHookTop = "diagonalTailed"
selector.tRTail = "retroflexHookBaseShortNeck2"
selector.tLTail = "standardShortNeck2"
selector.tRTail = "flatHookShortNeck2"
selector.tLTail = "diagonalTailedShortNeck2"
selector."tsLig/upperHalf" = "standardShortNeck2"
[prime.t.variants.cross-short-neck2]
@ -3890,10 +3890,10 @@ rank = 14
description = "Futura-like `t` shape with a more shorter neck"
selector.t = "crossShortNeck2"
selector."t/phoneticLeft1" = "crossShortNeck2"
selector."t/phoneticLeft2" = "crossPLShortNeck2"
selector."t/phoneticLeft2" = "crossShortNeck2"
selector.tHookTop = "cross"
selector.tRTail = "retroflexHookBaseShortNeck2"
selector.tLTail = "standardShortNeck2"
selector.tRTail = "crossShortNeck2"
selector.tLTail = "crossShortNeck2"
selector."tsLig/upperHalf" = "standardShortNeck2"
[prime.t.variants.hookless-asymmetric-short-neck2]
@ -3901,10 +3901,10 @@ rank = 15
description = "`t` without hook, with ony half the cross bar and a more shorter neck"
selector.t = "hooklessAsymmetricShortNeck2"
selector."t/phoneticLeft1" = "hooklessAsymmetricShortNeck2"
selector."t/phoneticLeft2" = "hooklessAsymmetricPLShortNeck2"
selector."t/phoneticLeft2" = "hooklessAsymmetricShortNeck2"
selector.tHookTop = "hooklessAsymmetric"
selector.tRTail = "retroflexHookBaseShortNeck2"
selector.tLTail = "standardShortNeck2"
selector.tRTail = "hooklessAsymmetricShortNeck2"
selector.tLTail = "hooklessAsymmetricShortNeck2"
selector."tsLig/upperHalf" = "standardShortNeck2"