22
33const introFont = require ( "../common/intro-font" ) ;
44const buildFont = require ( "../common/build-font" ) ;
5- const {
6- isIdeograph,
7- isWestern,
8- isWS,
9- isKorean,
10- isLongDash,
11- filterUnicodeRange
12- } = require ( "../common/unicode-kind" ) ;
13- const { sanitizeSymbols, removeUnusedFeatures, toPWID, removeDashCcmp } = require ( "./common" ) ;
5+ const { isWestern, isWS, isLongDash, filterUnicodeRange } = require ( "../common/unicode-kind" ) ;
146const gc = require ( "../common/gc" ) ;
15- const createFinder = require ( "../common/glyph-finder" ) ;
7+
8+ const { sanitizeSymbols, toPWID } = require ( "./sanitize-symbols" ) ;
9+ const { removeUnusedFeatures } = require ( "./remove-unused-features" ) ;
10+ const { transferMonoGeometry, unlinkRefsOfSymbols, populatePwidOfMono } = require ( "./lgc-handler" ) ;
1611
1712module . exports = async function makeFont ( argv ) {
18- const a = await introFont ( { from : argv . main , prefix : "a" , ignoreHints : true } ) ;
19- const b = await introFont ( { from : argv . lgc , prefix : "b" , ignoreHints : true } ) ;
20- a . cmap_uvs = null ;
13+ const main = await introFont ( { from : argv . main , prefix : "a" , ignoreHints : true } ) ;
14+ const lgc = await introFont ( { from : argv . lgc , prefix : "b" , ignoreHints : true } ) ;
15+ main . cmap_uvs = null ;
2116 filterUnicodeRange (
22- a ,
23- c =>
24- ! isIdeograph ( c - 0 ) &&
25- ! isWestern ( c - 0 ) &&
26- ! isKorean ( c - 0 ) &&
27- ! isLongDash ( c - 0 , argv . term ) &&
28- ! isWS ( c - 0 )
17+ main ,
18+ c => ! isWestern ( c - 0 ) && ! isLongDash ( c - 0 , argv . term ) && ! isWS ( c - 0 )
2919 ) ;
3020
31- if ( argv . pwid ) toPWID ( a ) ;
32-
21+ if ( argv . pwid ) toPWID ( main ) ;
3322 if ( argv . mono ) {
34- unlinkRefsOfSymbols ( b , argv . term ) ;
35- transferMonoGeometry ( a , b ) ;
36- populatePwidOfMono ( a ) ;
23+ unlinkRefsOfSymbols ( lgc , argv . term ) ;
24+ transferMonoGeometry ( main , lgc ) ;
25+ populatePwidOfMono ( main ) ;
3726 }
38- if ( ! argv . pwid ) sanitizeSymbols ( a , argv . goth , ! argv . pwid && ! argv . term ) ;
39- if ( argv . mono ) removeDashCcmp ( a , argv . mono ) ;
27+ if ( ! argv . pwid ) sanitizeSymbols ( main , argv . goth , ! argv . pwid && ! argv . term ) ;
28+ if ( argv . mono ) removeDashCcmp ( main , argv . mono ) ;
4029
41- removeUnusedFeatures ( a , "AS" , argv . mono ) ;
42- aliasFeatMap ( a , "vert" , [ [ 0x2014 , 0x2015 ] ] ) ;
43- gc ( a ) ;
30+ removeUnusedFeatures ( main , "AS" , argv . mono ) ;
31+ aliasFeatMap ( main , "vert" , [ [ 0x2014 , 0x2015 ] ] ) ;
32+ gc ( main ) ;
4433
45- await buildFont ( a , { to : argv . o , optimize : true } ) ;
34+ await buildFont ( main , { to : argv . o , optimize : true } ) ;
4635} ;
4736
48- // Monospace punctuation transferring
49- function unlinkRefsOfSymbols ( font , isTerm ) {
50- const find = createFinder ( font ) ;
51- for ( let u = 0x2000 ; u < 0x20a0 ; u ++ ) {
52- let gn = find . gname . unicode ( u ) ;
53- if ( ! gn ) continue ;
54- let gnT = gn ;
55- if ( ! isTerm ) gnT = find . gname . subst ( "WWID" , gn ) ;
56- if ( ! gnT ) continue ;
57- const g = find . glyph ( gn ) ;
58- const g$ = find . glyph$ ( gnT ) ;
59- HCopy ( g , g$ ) ;
60- }
61- }
62- function transferMonoGeometry ( main , lgc ) {
63- for ( let u = 0x2000 ; u < 0x20a0 ; u ++ ) {
64- let gnSrc = main . cmap [ u ] ,
65- gnDst = lgc . cmap [ u ] ;
66- if ( gnSrc && gnDst ) {
67- HCopy ( main . glyf [ gnSrc ] , lgc . glyf [ gnDst ] ) ;
68- }
69- }
70- }
71- function populatePwidOfMono ( font ) {
72- const find = createFinder ( font ) ;
73- for ( let u = 0x2000 ; u < 0x20a0 ; u ++ ) {
74- const gn = find . gname . unicode ( u ) ;
75- if ( ! gn ) continue ;
76- const gnPwid = find . gname . subst ( "pwid" , gn ) ;
77- if ( ! gnPwid ) continue ;
78- const g = find . glyph ( gnPwid ) ;
79- const g$ = find . glyph$ ( gn ) ;
80- HCopy ( g , g$ ) ;
81- }
82- }
83-
84- function HCopy ( g , g1 ) {
85- g . contours = g1 . contours ;
86- g . references = g1 . references ;
87- g . advanceWidth = g1 . advanceWidth ;
88- }
89-
9037// Feature mapping
9138function aliasFeatMap ( a , feat , aliases ) {
9239 if ( ! a . GSUB || ! a . GSUB . features || ! a . GSUB . lookups ) return ;
@@ -113,3 +60,36 @@ function aliasFeatMap(a, feat, aliases) {
11360 }
11461 }
11562}
63+
64+ // Dash CCMP removal
65+ function removeDashCcmp ( a ) {
66+ if ( ! a . GSUB || ! a . GSUB . features || ! a . GSUB . lookups ) return ;
67+
68+ let affectedLookups = new Set ( ) ;
69+ for ( const fid in a . GSUB . features ) {
70+ if ( fid . slice ( 0 , 4 ) === "ccmp" ) {
71+ const feature = a . GSUB . features [ fid ] ;
72+ if ( ! feature ) continue ;
73+ for ( const lid of feature ) affectedLookups . add ( lid ) ;
74+ }
75+ }
76+
77+ for ( const lid of affectedLookups ) {
78+ const lookup = a . GSUB . lookups [ lid ] ;
79+ removeDashCcmpLookup ( lookup , a . cmap ) ;
80+ }
81+ }
82+ function removeDashCcmpLookup ( lookup , cmap ) {
83+ if ( ! lookup || lookup . type !== "gsub_ligature" ) return ;
84+ for ( const st of lookup . subtables ) {
85+ let st1 = [ ] ;
86+ for ( const subst of st . substitutions ) {
87+ let valid = true ;
88+ for ( const gid of subst . from ) {
89+ if ( cmap [ 0x2014 ] === gid || cmap [ 0x2015 ] === gid ) valid = false ;
90+ }
91+ if ( valid ) st1 . push ( subst ) ;
92+ }
93+ st . substitutions = st1 ;
94+ }
95+ }
0 commit comments