diff --git a/font-src/glyphs/auto-build/accents.ptl b/font-src/glyphs/auto-build/accents.ptl index a1eee988b..7d16fb13d 100644 --- a/font-src/glyphs/auto-build/accents.ptl +++ b/font-src/glyphs/auto-build/accents.ptl @@ -1,7 +1,7 @@ ###### Automatic builds $$include '../../meta/macros.ptl' -import [Dotless AnyDerivingCv DotlessOrNot getGrTree CvDecompose] from "../../support/gr" +import [Dotless AnyDerivingCv DotlessOrNot getGrTree CvDecompose ZReduced] from "../../support/gr" import [fallback] from '../../support/utils' glyph-module @@ -32,10 +32,14 @@ glyph-block AutoBuild-Accents : begin set parts.(j) [query-glyph 'ogonekTR'] define [subParts parts] : begin + # Reduce Z variants + if [ZReduced.get parts.0] : begin + local reduced : query-glyph : ZReduced.get parts.0 + if reduced : set parts.0 reduced + + # Handle dotless local hasMarkAbove false foreach p [items-of parts] : if [isAboveMark p] : set hasMarkAbove true - - # replace dotted-i and dotted-j with dotless equalivents if (hasMarkAbove && [Dotless.get parts.0]) : begin local dotless [query-glyph : Dotless.get parts.0] if dotless : set parts.0 dotless @@ -117,6 +121,7 @@ glyph-block AutoBuild-Accents : begin define construction : glyph-proc include s_parts.0 AS_BASE ALSO_METRICS local nonTrivial : AnyDerivingCv.hasNonDerivingVariants s_parts.0 + if nonTrivial : console.log s_parts.0 foreach part [items-of : s_parts.slice 1] : if part : begin include part if (part.markAnchors && part.markAnchors.bottomright) : begin diff --git a/font-src/glyphs/auto-build/transformed.ptl b/font-src/glyphs/auto-build/transformed.ptl index 9eeda6911..0aad14075 100644 --- a/font-src/glyphs/auto-build/transformed.ptl +++ b/font-src/glyphs/auto-build/transformed.ptl @@ -482,6 +482,7 @@ glyph-block Autobuild-Transformed-Mathematical : begin local forked : Fork pendingGlyphs [para.reinit tfm] foreach {unicode glyphid} [items-of records] : if [not : query-glyph targetNameMap.(glyphid)] create-glyph targetNameMap.(glyphid) unicode : glyph-proc + if [not : forked.queryByName glyphid] : console.log glyphid include [forked.queryByName glyphid] AS_BASE ALSO_METRICS link-relations relSets diff --git a/font-src/glyphs/common/derivatives.ptl b/font-src/glyphs/common/derivatives.ptl index e117a763e..2cb3090ba 100644 --- a/font-src/glyphs/common/derivatives.ptl +++ b/font-src/glyphs/common/derivatives.ptl @@ -12,11 +12,11 @@ glyph-module glyph-block Common-Derivatives : begin glyph-block-import CommonShapes : FlipAround - define [ApplyCv g follow para name] : begin + define [ApplyCv g shapeFrom follow para] : begin foreach { kPrime prime } para.variants.primes : foreach h [prime.variants.values] : begin local suffix : h.resolveFor para follow if suffix : begin - local dstName : [fallback name follow] + '.' + suffix + local dstName : shapeFrom + '.' + suffix local dst : glyphStore.queryByName dstName if dst : g.dependsOn dst if (h.tag && h.rank) : begin @@ -24,14 +24,14 @@ glyph-block Common-Derivatives : begin if h.nonDeriving : [Cv h.tag h.rank].setPreventDeriving g define [select-variant] : params [name unicode [shapeFrom name] [follow name]] : begin - if [not : glyph-is-needed shapeFrom] : return nothing + if [not : glyph-is-needed name] : return nothing local variant para.variantSelector.(follow) if [not variant] : throw : new Error "Variant for \(name) is not assigned." create-glyph name unicode : glyph-proc include [refer-glyph (shapeFrom + '.' + variant)] AS_BASE ALSO_METRICS - ApplyCv currentGlyph follow para shapeFrom + ApplyCv currentGlyph shapeFrom follow para set this.autoRefPriority [query-glyph (shapeFrom + '.' + variant)].autoRefPriority define [orthographic-italic name unicode] : if para.isItalic diff --git a/font-src/glyphs/letter/latin/z.ptl b/font-src/glyphs/letter/latin/z.ptl index 92e6bec2d..8d8bbb421 100644 --- a/font-src/glyphs/letter/latin/z.ptl +++ b/font-src/glyphs/letter/latin/z.ptl @@ -2,7 +2,7 @@ $$include '../../../meta/macros.ptl' import [mix linreg clamp fallback] from '../../../support/utils' import [DesignParameters] from '../../../meta/aesthetics' -import [Dotless CvDecompose] from "../../../support/gr" +import [ZReduced] from "../../../support/gr" glyph-module @@ -132,17 +132,19 @@ glyph-block Letter-Latin-Z : begin select-variant 'Z' 'Z' select-variant 'z' 'z' + select-variant 'ZReduced' (shapeFrom -- 'Z') + select-variant 'zReduced' (shapeFrom -- 'z') + select-variant 'grek/Zeta' 0x396 (shapeFrom -- 'Z') (follow -- 'ZReduced') + # if recursive : console.log recursive [query-glyph 'grek/Zeta'] + if [query-glyph 'Z'] : ZReduced.set [query-glyph 'Z'] 'ZReduced' + if [query-glyph 'z'] : ZReduced.set [query-glyph 'z'] 'zReduced' - alias 'grek/Zeta.standard' null 'Z.standard' - alias 'grek/Zeta.curly' null 'Z.curly' - alias 'grek/Zeta.motionSerifed' null 'Z.motionSerifed' - alias 'grek/Zeta.curlyMotionSerifed' null 'Z.curlyMotionSerifed' - alias 'grek/Zeta.topMotionSerifed' null 'Z.topMotionSerifed' - alias 'grek/Zeta.curlyTopMotionSerifed' null 'Z.curlyTopMotionSerifed' - select-variant 'grek/Zeta' 0x396 - - alias 'Zbar' 0x1B5 'Z.withHorizontalCrossBar' - alias 'zbar' 0x1B6 'z.withHorizontalCrossBar' + with-related-glyphs 'ZBar' 0x1B5 'ZReduced' : lambda [src sel] : composite-proc + refer-glyph src + refer-glyph 'barOver' + with-related-glyphs 'zBar' 0x1B6 'zReduced' : lambda [src sel] : composite-proc + refer-glyph src + refer-glyph 'barOver' define [BBZShape top] : glyph-proc include : HBarTop SB RightSB top BBS @@ -183,8 +185,8 @@ glyph-block Letter-Latin-Z : begin archv straight.down.end RightSB (-Hook) [widths.heading 0 Stroke Downward] - with-related-glyphs 'Zdtail' 0x224 'Z' ZDownTailCtor - with-related-glyphs 'zdtail' 0x225 'z' ZDownTailCtor + with-related-glyphs 'Zdtail' 0x224 'ZReduced' ZDownTailCtor + with-related-glyphs 'zdtail' 0x225 'zReduced' ZDownTailCtor create-glyph 'Zswash' 0x2C7F : glyph-proc include : MarkSet.if @@ -233,10 +235,10 @@ glyph-block Letter-Latin-Z : begin eject-contour 'serifRB' include : VBarRight [mix SB RightSB 1.05] (HalfStroke - LongJut) Stroke - with-related-glyphs 'Zdesc' 0x2C6B 'Z' ZDescCtor - with-related-glyphs 'zdesc' 0x2C6C 'z' ZDescCtor + with-related-glyphs 'Zdesc' 0x2C6B 'ZReduced' ZDescCtor + with-related-glyphs 'zdesc' 0x2C6C 'zReduced' ZDescCtor - with-related-glyphs 'zCurlyTail' 0x291 'z' : lambda [src sel] : glyph-proc + with-related-glyphs 'zCurlyTail' 0x291 'zReduced' : lambda [src sel] : glyph-proc include [refer-glyph src] AS_BASE ALSO_METRICS local fine : AdviceStroke2 5 4 XH diff --git a/font-src/support/gr.js b/font-src/support/gr.js index f4c1180f1..409308fde 100644 --- a/font-src/support/gr.js +++ b/font-src/support/gr.js @@ -16,6 +16,18 @@ const Dotless = { } }; +const ZReduced = { + get(glyph) { + if (glyph && glyph.related) return glyph.related.zReduced; + else return null; + }, + set(glyph, toGid) { + if (typeof toGid !== "string") throw new Error("Must supply a GID instead of a glyph"); + if (!glyph.related) glyph.related = {}; + glyph.related.zReduced = toGid; + } +}; + const CvDecompose = { get(glyph) { if (glyph && glyph.related) return glyph.related.CvDecompose; @@ -319,6 +331,7 @@ function queryCvFeatureTagsOf(gid, glyph, variantAssignmentSet) { } exports.Dotless = Dotless; +exports.ZReduced = ZReduced; exports.Cv = Cv; exports.AnyCv = AnyCv; exports.DotlessOrNot = DotlessOrNot; diff --git a/params/variants.toml b/params/variants.toml index c060bea8a..ccb46dfda 100644 --- a/params/variants.toml +++ b/params/variants.toml @@ -949,65 +949,61 @@ tag = "cv25" rank = 1 description = "Standard `Z`" selector.Z = "standard" -selector."grek/Zeta" = "standard" +selector."ZReduced" = "standard" [prime.capital-z.variants.with-crossbar] rank = 2 -nonDeriving = true description = "Standard `Z` with a diagonal cross bar for better dsitinction with `2`" selector.Z = "withCrossBar" -selector."grek/Zeta" = "standard" +selector."ZReduced" = "standard" [prime.capital-z.variants.with-horizontal-crossbar] rank = 3 -nonDeriving = true description = "Standard `Z` with a horizontal cross bar for better dsitinction with `2`" selector.Z = "withHorizontalCrossBar" -selector."grek/Zeta" = "standard" +selector."ZReduced" = "standard" [prime.capital-z.variants.curly] rank = 4 description = "Curly `Z`" selector.Z = "curly" -selector."grek/Zeta" = "curly" +selector."ZReduced" = "curly" [prime.capital-z.variants.curly-with-crossbar] rank = 5 -nonDeriving = true description = "Curly `Z` with a diagonal cross bar for better dsitinction with `2`" selector.Z = "curlyWithCrossBar" -selector."grek/Zeta" = "curly" +selector."ZReduced" = "curly" [prime.capital-z.variants.curly-with-horizontal-crossbar] rank = 6 -nonDeriving = true description = "Curly `Z` with a horizontal cross bar for better dsitinction with `2`" selector.Z = "curlyWithHorizontalCrossBar" -selector."grek/Zeta" = "curly" +selector."ZReduced" = "curly" [prime.capital-z.variants.motion-serifed] rank = 7 description = "Standard `Z` with motion serifs at bottom" selector.Z = "motionSerifed" -selector."grek/Zeta" = "motionSerifed" +selector."ZReduced" = "motionSerifed" [prime.capital-z.variants.curly-motion-serifed] rank = 8 description = "Curly `Z` with motion serifs at bottom" selector.Z = "curlyMotionSerifed" -selector."grek/Zeta" = "curlyMotionSerifed" +selector."ZReduced" = "curlyMotionSerifed" [prime.capital-z.variants.top-motion-serifed] rank = 9 description = "Standard `Z` with motion serifs at top" selector.Z = "topMotionSerifed" -selector."grek/Zeta" = "topMotionSerifed" +selector."ZReduced" = "topMotionSerifed" [prime.capital-z.variants.curly-top-motion-serifed] rank = 10 description = "Curly `Z` with motion serifs at top" selector.Z = "curlyTopMotionSerifed" -selector."grek/Zeta" = "curlyTopMotionSerifed" +selector."ZReduced" = "curlyTopMotionSerifed" @@ -2448,55 +2444,61 @@ tag = "cv50" rank = 1 description = "Standard `z`" selector.z = "standard" +selector."zReduced" = "standard" [prime.z.variants.with-crossbar] rank = 2 -nonDeriving = true description = "Standard `z` with a diagonal cross bar for better dsitinction with `2`" selector.z = "withCrossBar" +selector."zReduced" = "standard" [prime.z.variants.with-horizontal-crossbar] rank = 3 -nonDeriving = true description = "Standard `z` with a horizontal cross bar for better dsitinction with `2`" selector.z = "withHorizontalCrossBar" +selector."zReduced" = "standard" [prime.z.variants.curly] rank = 4 description = "Curly `z`" selector.z = "curly" +selector."zReduced" = "curly" [prime.z.variants.curly-with-crossbar] rank = 5 -nonDeriving = true description = "Curly `z` with a diagonal cross bar for better dsitinction with `2`" selector.z = "curlyWithCrossBar" +selector."zReduced" = "curly" [prime.z.variants.curly-with-horizontal-crossbar] rank = 6 -nonDeriving = true description = "Curly `z` with a horizontal cross bar for better dsitinction with `2`" selector.z = "curlyWithHorizontalCrossBar" +selector."zReduced" = "curly" [prime.z.variants.motion-serifed] rank = 7 description = "Standard `z` with motion serifs at bottom" selector.z = "motionSerifed" +selector."zReduced" = "motionSerifed" [prime.z.variants.curly-motion-serifed] rank = 8 description = "Curly `z` with motion serifs at bottom" selector.z = "curlyMotionSerifed" +selector."zReduced" = "curlyMotionSerifed" [prime.z.variants.top-motion-serifed] rank = 9 description = "Standard `z` with motion serifs at top" selector.z = "topMotionSerifed" +selector."zReduced" = "topMotionSerifed" [prime.z.variants.curly-top-motion-serifed] rank = 10 description = "Curly `z` with motion serifs at top" selector.z = "curlyTopMotionSerifed" +selector."zReduced" = "curlyTopMotionSerifed"