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:
parent
178c951902
commit
78094dd541
10 changed files with 298 additions and 211 deletions
|
@ -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).
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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' }
|
||||
|
|
|
@ -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)
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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++) {
|
||||
|
|
|
@ -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"
|
||||
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue