Cleanup of enclosure code repeations

This commit is contained in:
be5invis 2020-10-18 18:31:35 -07:00
parent fcdb492e71
commit 44a6c1cb2d
2 changed files with 211 additions and 188 deletions

View file

@ -10,6 +10,7 @@ glyph-module
define DECOMPOSABLE true define DECOMPOSABLE true
define NON-DECOMPOSABLE false define NON-DECOMPOSABLE false
define SLOPE-INHERIT nothing
glyph-block Autobuild-Enclosure-Shared : begin glyph-block Autobuild-Enclosure-Shared : begin
glyph-block-import CommonShapes glyph-block-import CommonShapes
@ -195,28 +196,29 @@ glyph-block AutoBuild-Enclosure : begin
define smoothB : SmoothBOf (SmallSmooth * (right - left) / (RightSB - SB)) width define smoothB : SmoothBOf (SmallSmooth * (right - left) / (RightSB - SB)) width
return : object width mockInnerWidth dscale sw0 sw top bot left right mosaicTop mosaicBot mosaicLeft mosaicRight smoothA smoothB return : object width mockInnerWidth dscale sw0 sw top bot left right mosaicTop mosaicBot mosaicLeft mosaicRight smoothA smoothB
define [CircledMiniatureFont digits width] : lambda [gs] : Miniature define [CircledMiniatureFont slopeAngle digits width] : lambda [gs] : Miniature
glyphs -- gs glyphs -- gs
crowd -- [CircCrowd digits width] crowd -- [CircCrowd digits width]
scale -- [CircScale digits width] scale -- [CircScale digits width]
sbscale -- 1 sbscale -- 1
slopeAngle -- [fallback slopeAngle para.slopeAngle]
define [EnclosureT prefix globallyDecomposable digits demands fnEnclosure fn] : begin define [EnclosureT prefix builder slopeAngle digits demands fnEnclosure] : begin
foreach {suffix ww gap} [items-of circleWidthClasses] : do foreach {suffix ww gap} [items-of circleWidthClasses] : do
define jobs : CollectJobs globallyDecomposable (prefix + digits) suffix demands define jobs : CollectJobs builder.decomposable (prefix + digits) suffix demands
define miniatureFont : CreateDerivedFontFromJobs jobs {} : CircledMiniatureFont digits ww define miniatureFont : CreateDerivedFontFromJobs jobs {} : CircledMiniatureFont slopeAngle digits ww
define gnEnclosure : CircName null (prefix + digits + '.enclosure') {} suffix define gnEnclosure : CircName null (prefix + digits + '.enclosure') {} suffix
if [not : query-glyph gnEnclosure] : create-glyph gnEnclosure : fnEnclosure ww gap if [not : query-glyph gnEnclosure] : create-glyph gnEnclosure : fnEnclosure digits ww gap
foreach job [items-of jobs.decomposableJobs] : fn (prefix + digits) ww gap job miniatureFont gnEnclosure true foreach job [items-of jobs.decomposableJobs] : begin
foreach job [items-of jobs.nonDecomposable] : fn (prefix + digits) ww gap job miniatureFont gnEnclosure false builder.build (prefix + digits) digits ww gap job miniatureFont gnEnclosure true
foreach job [items-of jobs.nonDecomposable] : begin
builder.build (prefix + digits) digits ww gap job miniatureFont gnEnclosure false
applyRelations jobs.relApplications applyRelations jobs.relApplications
define [createCircledGlyphs digits demands] : EnclosureT 'circle' DECOMPOSABLE digits demands # Builders and Enclosure Shapes
lambda [ww gap] : glyph-proc define CircledBuilder : object
define [object width sw top bot left right smoothA smoothB] : circleDimens digits ww decomposable true
set-width width build : lambda [prefix digits ww gap job miniatureFont gnEnclosure decomposable] : begin
include : OShape top bot left right sw smoothA smoothB
lambda [prefix ww gap job miniatureFont gnEnclosure decomposable] : begin
define { gn unicode parts w bal baly } job define { gn unicode parts w bal baly } job
define dimens : circleDimens digits ww define dimens : circleDimens digits ww
define [object width mockInnerWidth dscale] dimens define [object width mockInnerWidth dscale] dimens
@ -225,8 +227,30 @@ glyph-block AutoBuild-Enclosure : begin
include : EnclosureInner [if decomposable gnEnclosure null] miniatureFont prefix job dimens include : EnclosureInner [if decomposable gnEnclosure null] miniatureFont prefix job dimens
include : refer-glyph gnEnclosure include : refer-glyph gnEnclosure
define [createBoxedGlyphs digits demands] : EnclosureT 'boxed' DECOMPOSABLE digits demands define InsetBuilder : object
lambda [ww gap] : glyph-proc decomposable false
build : lambda [prefix digits ww gap job miniatureFont gnEnclosure decomposable] : begin
define { gn unicode parts w bal baly } job
define dimens : circleDimens digits ww
define [object width mockInnerWidth dscale] dimens
if [not : query-glyph gn] : create-glyph gn [if (w == ww) unicode null] : glyph-proc
set-width width
include : difference
refer-glyph gnEnclosure
EnclosureInner [if decomposable gnEnclosure null] miniatureFont prefix job dimens
define [createCircledGlyphs digits demands]
EnclosureT "circle" CircledBuilder SLOPE-INHERIT digits demands CircleEnclosureShape
define [createItalicCircledGlyphs digits demands]
EnclosureT "circle-italic" CircledBuilder para.derivedSlopeAngle digits demands CircleEnclosureShape
define [CircleEnclosureShape digits ww gap] : glyph-proc
define [object width sw top bot left right smoothA smoothB] : circleDimens digits ww
set-width width
include : OShape top bot left right sw smoothA smoothB
define [createBoxedGlyphs digits demands]
EnclosureT 'boxed' CircledBuilder SLOPE-INHERIT digits demands BoxEnclosureShape
define [BoxEnclosureShape digits ww gap] : glyph-proc
define [object width mockInnerWidth sw top bot left right] : circleDimens digits ww define [object width mockInnerWidth sw top bot left right] : circleDimens digits ww
set-width width set-width width
include : union include : union
@ -234,17 +258,10 @@ glyph-block AutoBuild-Enclosure : begin
HBarBottom left right bot sw HBarBottom left right bot sw
VBarLeft left bot top sw VBarLeft left bot top sw
VBarRight right bot top sw VBarRight right bot top sw
lambda [prefix ww gap job miniatureFont gnEnclosure decomposable] : begin
define { gn unicode parts w bal baly } job
define dimens : circleDimens digits ww
define [object width mockInnerWidth dscale] dimens
if [not : query-glyph gn] : create-glyph gn [if (w == ww) unicode null] : glyph-proc
set-width width
include : EnclosureInner [if decomposable gnEnclosure null] miniatureFont prefix job dimens
include : refer-glyph gnEnclosure
define [createDashedBoxedGlyphs digits demands] : EnclosureT 'dashed-boxed' DECOMPOSABLE digits demands define [createDashedBoxedGlyphs digits demands]
lambda [ww gap] : glyph-proc EnclosureT 'dashed-boxed' CircledBuilder SLOPE-INHERIT digits demands DashedBoxEnclosureShape
define [DashedBoxEnclosureShape digits ww cap] : glyph-proc
define [object width mockInnerWidth sw top bot left right] : circleDimens digits ww define [object width mockInnerWidth sw top bot left right] : circleDimens digits ww
set-width width set-width width
include : difference include : difference
@ -260,32 +277,17 @@ glyph-block AutoBuild-Enclosure : begin
HBar left right [mix bot top 0.25] sw HBar left right [mix bot top 0.25] sw
HBar left right [mix bot top 0.50] sw HBar left right [mix bot top 0.50] sw
HBar left right [mix bot top 0.75] sw HBar left right [mix bot top 0.75] sw
lambda [prefix ww gap job miniatureFont gnEnclosure decomposable] : begin
define { gn unicode parts w bal baly } job
define dimens : circleDimens digits ww
define [object width mockInnerWidth dscale] dimens
if [not : query-glyph gn] : create-glyph gn [if (w == ww) unicode null] : glyph-proc
set-width width
include : EnclosureInner [if decomposable gnEnclosure null] miniatureFont prefix job dimens
include : refer-glyph gnEnclosure
define [createInsetCircledGlyphs digits demands] : EnclosureT 'inset-circle' NON-DECOMPOSABLE digits demands define [createInsetCircledGlyphs digits demands]
lambda [ww gap] : glyph-proc EnclosureT 'inset-circle' InsetBuilder SLOPE-INHERIT digits demands InsetCircleEnclosureShape
define [InsetCircleEnclosureShape digits ww gap] : glyph-proc
define [object width sw top bot left right smoothA smoothB] : circleDimens digits ww define [object width sw top bot left right smoothA smoothB] : circleDimens digits ww
set-width width set-width width
include : OShapeOutline top bot left right sw smoothA smoothB include : OShapeOutline top bot left right sw smoothA smoothB
lambda [prefix ww gap job miniatureFont gnEnclosure decomposable] : begin
define { gn unicode parts w bal baly } job
define dimens : circleDimens digits ww
define [object width mockInnerWidth dscale] dimens
if [not : query-glyph gn] : create-glyph gn [if (w == ww) unicode null] : glyph-proc
set-width width
include : difference
refer-glyph gnEnclosure
EnclosureInner [if decomposable gnEnclosure null] miniatureFont prefix job dimens
define [createInsetBoxedGlyphs digits demands] : EnclosureT 'inset-boxed' NON-DECOMPOSABLE digits demands define [createInsetBoxedGlyphs digits demands]
lambda [ww gap] : glyph-proc EnclosureT 'inset-boxed' InsetBuilder SLOPE-INHERIT digits demands InsetBoxEnclosureShape
define [InsetBoxEnclosureShape digits ww gap] : glyph-proc
define [object width top bot left right] : circleDimens digits ww define [object width top bot left right] : circleDimens digits ww
set-width width set-width width
include : spiro-outline include : spiro-outline
@ -294,18 +296,10 @@ glyph-block AutoBuild-Enclosure : begin
corner right bot corner right bot
corner right top corner right top
close close
lambda [prefix ww gap job miniatureFont gnEnclosure decomposable] : begin
define { gn unicode parts w bal baly } job
define dimens : circleDimens digits ww
define [object width mockInnerWidth dscale] dimens
if [not : query-glyph gn] : create-glyph gn [if (w == ww) unicode null] : glyph-proc
set-width width
include : difference
refer-glyph gnEnclosure
EnclosureInner [if decomposable gnEnclosure null] miniatureFont prefix job dimens
define [createInsetDiamondGlyphs digits demands] : EnclosureT 'inset-diamond' NON-DECOMPOSABLE digits demands define [createInsetDiamondGlyphs digits demands]
lambda [ww gap] : glyph-proc EnclosureT 'inset-diamond' InsetBuilder SLOPE-INHERIT digits demands InsetDiamondEnclosureShape
define [InsetDiamondEnclosureShape digits ww gap] : glyph-proc
define [object width top bot left right] : circleDimens digits ww define [object width top bot left right] : circleDimens digits ww
set-width width set-width width
include : spiro-outline include : spiro-outline
@ -314,18 +308,10 @@ glyph-block AutoBuild-Enclosure : begin
corner (right - O) [mix bot top 0.5] corner (right - O) [mix bot top 0.5]
corner [mix left right 0.5] (top - O) corner [mix left right 0.5] (top - O)
close close
lambda [prefix ww gap job miniatureFont gnEnclosure decomposable] : begin
define { gn unicode parts w bal baly } job
define dimens : circleDimens digits ww
define [object width mockInnerWidth dscale] dimens
if [not : query-glyph gn] : create-glyph gn [if (w == ww) unicode null] : glyph-proc
set-width width
include : difference
refer-glyph gnEnclosure
EnclosureInner [if decomposable gnEnclosure null] miniatureFont prefix job dimens
define [createInsetMosaicGlyphs digits demands] : EnclosureT 'inset-mosaic' NON-DECOMPOSABLE digits demands define [createInsetMosaicGlyphs digits demands]
lambda [ww gap] : glyph-proc EnclosureT 'inset-mosaic' InsetBuilder SLOPE-INHERIT digits demands InsetMosaicEnclosureShape
define [InsetMosaicEnclosureShape digits ww gap] : glyph-proc
define [object width mockInnerWidth mosaicTop mosaicBot mosaicLeft mosaicRight] : circleDimens digits ww define [object width mockInnerWidth mosaicTop mosaicBot mosaicLeft mosaicRight] : circleDimens digits ww
set-width width set-width width
include : ForceUpright include : ForceUpright
@ -335,18 +321,10 @@ glyph-block AutoBuild-Enclosure : begin
corner mosaicRight mosaicBot corner mosaicRight mosaicBot
corner mosaicRight mosaicTop corner mosaicRight mosaicTop
close close
lambda [prefix ww gap job miniatureFont gnEnclosure decomposable] : begin
define { gn unicode parts w bal baly } job
define dimens : circleDimens digits ww
define [object width mockInnerWidth dscale] dimens
if [not : query-glyph gn] : create-glyph gn [if (w == ww) unicode null] : glyph-proc
set-width width
include : difference
refer-glyph gnEnclosure
EnclosureInner [if decomposable gnEnclosure null] miniatureFont prefix job dimens
define [createDoubleCircledGlyphs digits demands] : EnclosureT 'double-circle' DECOMPOSABLE digits demands define [createDoubleCircledGlyphs digits demands]
lambda [ww gap] : glyph-proc EnclosureT 'double-circle' CircledBuilder SLOPE-INHERIT digits demands DoubleCircledEnclosureShape
define [DoubleCircledEnclosureShape digits ww gap] : glyph-proc
define [object width mockInnerWidth sw0 sw top bot left right smoothA smoothB] : circleDimens digits ww (ww * gap) define [object width mockInnerWidth sw0 sw top bot left right smoothA smoothB] : circleDimens digits ww (ww * gap)
set-width width set-width width
define sw1 : Math.min sw0 (sw / 3) define sw1 : Math.min sw0 (sw / 3)
@ -359,14 +337,6 @@ glyph-block AutoBuild-Enclosure : begin
begin sw1 begin sw1
smoothA - sw + sw1 smoothA - sw + sw1
smoothB - sw + sw1 smoothB - sw + sw1
lambda [prefix ww gap job miniatureFont gnEnclosure decomposable] : begin
define { gn unicode parts w bal baly } job
define dimens : circleDimens digits ww (ww * gap)
define [object width mockInnerWidth dscale] dimens
if [not : query-glyph gn] : create-glyph gn [if (w == ww) unicode null] : glyph-proc
set-width width
include : EnclosureInner [if decomposable gnEnclosure null] miniatureFont prefix job dimens
include : refer-glyph gnEnclosure
define [BraceCrowd digits width] : 2.75 + [AdjustDigitCount digits width] define [BraceCrowd digits width] : 2.75 + [AdjustDigitCount digits width]
define [BraceScale digits width] : 0.65 / [Math.pow [AdjustDigitCount digits width] 0.5] define [BraceScale digits width] : 0.65 / [Math.pow [AdjustDigitCount digits width] 0.5]
@ -380,9 +350,8 @@ glyph-block AutoBuild-Enclosure : begin
define mockInnerWidth : width + 2 * (Stroke - sw) * dscale define mockInnerWidth : width + 2 * (Stroke - sw) * dscale
return : object width sw dscale pscale l r mockInnerWidth return : object width sw dscale pscale l r mockInnerWidth
define [createBracedGlyphs digits demands] : begin define [BracedT rawPrefix digits demands fnBraceShape] : foreach {suffix ww} [items-of circleWidthClasses] : do
foreach {suffix ww} [items-of circleWidthClasses] : do define prefix : rawPrefix + digits
define prefix ('braced' + digits)
define jobs : CollectJobs DECOMPOSABLE prefix suffix demands define jobs : CollectJobs DECOMPOSABLE prefix suffix demands
define miniatureFont : CreateDerivedFontFromJobs jobs {} : lambda [gs] : Miniature define miniatureFont : CreateDerivedFontFromJobs jobs {} : lambda [gs] : Miniature
glyphs -- gs glyphs -- gs
@ -390,8 +359,24 @@ glyph-block AutoBuild-Enclosure : begin
scale -- [BraceScale digits ww] scale -- [BraceScale digits ww]
sbscale -- 1 sbscale -- 1
define gnb : CircName null ('.braced-brace' + digits) {} suffix define gnb : CircName prefix ('.braced-brace' + digits) {} suffix
if [not : query-glyph gnb] : create-glyph gnb : glyph-proc if [not : query-glyph gnb] : create-glyph gnb : fnBraceShape digits ww
define [CreateGlyphImpl jobDecomposable job] : begin
local {gn unicode parts w bal baly} job
if [not : query-glyph gn] : create-glyph gn [if (w == ww) unicode null] : glyph-proc
define dimens : bracedDottdeDimens digits ww
define [object width mockInnerWidth dscale] dimens
set-width width
include : EnclosureInner [if jobDecomposable gnb null] miniatureFont prefix job dimens
include : refer-glyph gnb
foreach job [items-of jobs.decomposableJobs] : CreateGlyphImpl true job
foreach job [items-of jobs.nonDecomposable] : CreateGlyphImpl false job
applyRelations jobs.relApplications
define [createBracedGlyphs digits demands] : BracedT 'braced' digits demands BraceShape
define [BraceShape digits ww] : glyph-proc
define [object width dscale pscale sw l r] : bracedDottdeDimens digits ww define [object width dscale pscale sw l r] : bracedDottdeDimens digits ww
local s : TanSlope * SymbolMid / 2 local s : TanSlope * SymbolMid / 2
local p : 0.1 * [Math.sqrt : Math.min 1 (width / (digits * Width))] local p : 0.1 * [Math.sqrt : Math.min 1 (width / (digits * Width))]
@ -412,19 +397,46 @@ glyph-block AutoBuild-Enclosure : begin
include : Translate 0 (SymbolMid - SymbolMid * pscale) include : Translate 0 (SymbolMid - SymbolMid * pscale)
include : Italify include : Italify
define [CreateGlyphImpl jobDecomposable job] : begin define [createHexBracedGlyphs digits demands] : BracedT 'hex-braced' digits demands HexBracedShape
local {gn unicode parts w bal baly} job define [HexBracedShape digits ww] : glyph-proc
if [not : query-glyph gn] : create-glyph gn [if (w == ww) unicode null] : glyph-proc define [object width dscale pscale sw l r] : bracedDottdeDimens digits ww
define dimens : bracedDottdeDimens digits ww local s : TanSlope * SymbolMid / 2
define [object width mockInnerWidth dscale] dimens local p : (1 / 6) * [Math.sqrt : Math.min 1 (width / (digits * Width))]
set-width width set-width width
include : EnclosureInner [if jobDecomposable gnb null] miniatureFont prefix job dimens
include : refer-glyph gnb
foreach job [items-of jobs.decomposableJobs] : CreateGlyphImpl true job include : dispiro
foreach job [items-of jobs.nonDecomposable] : CreateGlyphImpl false job widths.lhs sw
corner ([mix l r p] - s) (ParenTop * pscale)
corner (l - s + O) (ParenTop * pscale - p * (r - l))
applyRelations jobs.relApplications include : dispiro
widths.lhs sw
corner (l - s + O) (ParenTop * pscale - p * (r - l))
corner (l - s + O) (ParenBot * pscale + p * (r - l))
include : dispiro
widths.lhs sw
corner (l - s + O) (ParenBot * pscale + p * (r - l))
corner ([mix l r p] - s) (ParenBot * pscale)
include : dispiro
widths.rhs sw
corner ([mix r l p] + s) (ParenTop * pscale)
corner (r + s - O) (ParenTop * pscale - p * (r - l))
include : dispiro
widths.rhs sw
corner (r + s - O) (ParenTop * pscale - p * (r - l))
corner (r + s - O) (ParenBot * pscale + p * (r - l))
include : dispiro
widths.rhs sw
corner (r + s - O) (ParenBot * pscale + p * (r - l))
corner ([mix r l p] + s) (ParenBot * pscale)
include : Upright
include : Translate 0 (SymbolMid - SymbolMid * pscale)
include : Italify
define [DottedCrowd digits width] : 2 + [AdjustDigitCount digits width] define [DottedCrowd digits width] : 2 + [AdjustDigitCount digits width]
define [DottedScale digits width] : 1 / [Math.pow [AdjustDigitCount digits width] 0.5] define [DottedScale digits width] : 1 / [Math.pow [AdjustDigitCount digits width] 0.5]
@ -498,6 +510,7 @@ glyph-block AutoBuild-Enclosure : begin
list 0xA9 {'C'} WideWidth2 list 0xA9 {'C'} WideWidth2
list 0x1F12F {'turnC'} WideWidth2 list 0x1F12F {'turnC'} WideWidth2
list 0x2117 {'P'} WideWidth2 list 0x2117 {'P'} WideWidth2
list 0x1F1AD {'M'} WideWidth2
list 0x24EA {'zero.lnum'} WideWidth1 list 0x24EA {'zero.lnum'} WideWidth1
foreach [j : range 1 till 9] : compositions.push : list foreach [j : range 1 till 9] : compositions.push : list
0x2460 + j - 1 0x2460 + j - 1
@ -507,6 +520,11 @@ glyph-block AutoBuild-Enclosure : begin
foreach [j : range 0 26] : compositions.push {(0x24D0 + j) {[glyphStore.queryNameOfUnicode (['a'.charCodeAt 0] + j)]} WideWidth1 0.5 (XH/2)} foreach [j : range 0 26] : compositions.push {(0x24D0 + j) {[glyphStore.queryNameOfUnicode (['a'.charCodeAt 0] + j)]} WideWidth1 0.5 (XH/2)}
createCircledGlyphs 1 compositions createCircledGlyphs 1 compositions
if [not recursive] : do "Single-digit italic circled"
createItalicCircledGlyphs 1 : list
list 0x1F12B {'C'} WideWidth1
list 0x1F12C {'R'} WideWidth1
if [not recursive] : do "Double-digit circled" if [not recursive] : do "Double-digit circled"
local compositions : list local compositions : list
list null {'markBaseSpace'} WideWidth1 list null {'markBaseSpace'} WideWidth1
@ -648,6 +666,10 @@ glyph-block AutoBuild-Enclosure : begin
begin WideWidth1 begin WideWidth1
createBracedGlyphs 2 compositions createBracedGlyphs 2 compositions
if [not recursive] : do "Single-digit hex braced"
createHexBracedGlyphs 1 : list
list 0x1F12A {'S'} WideWidth1
if [not recursive] : do "Single-digit dotted" if [not recursive] : do "Single-digit dotted"
local compositions : list local compositions : list
list 0x1F100 {'zero.lnum'} WideWidth1 list 0x1F100 {'zero.lnum'} WideWidth1

View file

@ -29,6 +29,7 @@ arrowHeight = 1.50 # Height of arrows
contrast = 1.11111 # Stroke width contrast. contrast = 1.11111 # Stroke width contrast.
slopeAngle = 0 # slope angle, in degrees. slopeAngle = 0 # slope angle, in degrees.
derivedSlopeAngle = 10 # Slope angle of derived letters requiring italics
accent = 155 # Height of accent marks. accent = 155 # Height of accent marks.
accentx = 200 # Width of accent marks. accentx = 200 # Width of accent marks.