├── .gitignore
├── .gitmodules
├── .npmrc
├── Makefile
├── README.md
├── common.py
├── configure.py
├── fix-metrics-ttc.py
├── fix-metrics.py
├── merge.py
├── package.json
└── src
├── cjk
└── placeholder
└── latin
├── NotoSerif-Bold.ttf
├── NotoSerif-BoldItalic.ttf
├── NotoSerif-Italic.ttf
├── NotoSerif-Regular.ttf
├── Roboto-Black.ttf
├── Roboto-BlackItalic.ttf
├── Roboto-Bold.ttf
├── Roboto-BoldItalic.ttf
├── Roboto-Italic.ttf
├── Roboto-Light.ttf
├── Roboto-LightItalic.ttf
├── Roboto-Medium.ttf
├── Roboto-MediumItalic.ttf
├── Roboto-Regular.ttf
├── Roboto-Thin.ttf
├── Roboto-ThinItalic.ttf
├── RobotoCondensed-Bold.ttf
├── RobotoCondensed-BoldItalic.ttf
├── RobotoCondensed-Italic.ttf
├── RobotoCondensed-Light.ttf
├── RobotoCondensed-LightItalic.ttf
├── RobotoCondensed-Medium.ttf
├── RobotoCondensed-MediumItalic.ttf
└── RobotoCondensed-Regular.ttf
/.gitignore:
--------------------------------------------------------------------------------
1 | __pycache__/
2 | node_modules/
3 | /build/
4 | /out/
5 | /src/cjk/*.otf
6 |
--------------------------------------------------------------------------------
/.gitmodules:
--------------------------------------------------------------------------------
1 | [submodule "libotd"]
2 | path = libotd
3 | url = https://github.com/nowar-fonts/libotd.git
4 |
--------------------------------------------------------------------------------
/.npmrc:
--------------------------------------------------------------------------------
1 | package-lock=false
2 |
--------------------------------------------------------------------------------
/Makefile:
--------------------------------------------------------------------------------
1 | .PHONY: all ttc ttf
2 | all: ttc ttf
3 | clean:
4 | -rm -rf build/
5 | ttc: out/ttc/Roboto-Thin.ttf out/ttc/Roboto-Light.ttf out/ttc/Roboto-Regular.ttf out/ttc/Roboto-Medium.ttf out/ttc/Roboto-Bold.ttf out/ttc/Roboto-Black.ttf out/ttc/NotoSerif-Regular.ttf out/ttc/NotoSerif-Bold.ttf
6 | ttf: out/ttf/Roboto-Thin.ttf out/ttf/Roboto-ThinItalic.ttf out/ttf/Roboto-Light.ttf out/ttf/Roboto-LightItalic.ttf out/ttf/RobotoCondensed-Light.ttf out/ttf/RobotoCondensed-LightItalic.ttf out/ttf/Roboto-Regular.ttf out/ttf/Roboto-Italic.ttf out/ttf/RobotoCondensed-Regular.ttf out/ttf/RobotoCondensed-Italic.ttf out/ttf/Roboto-Medium.ttf out/ttf/Roboto-MediumItalic.ttf out/ttf/RobotoCondensed-Medium.ttf out/ttf/RobotoCondensed-MediumItalic.ttf out/ttf/Roboto-Bold.ttf out/ttf/Roboto-BoldItalic.ttf out/ttf/RobotoCondensed-Bold.ttf out/ttf/RobotoCondensed-BoldItalic.ttf out/ttf/Roboto-Black.ttf out/ttf/Roboto-BlackItalic.ttf out/ttf/NotoSerif-Regular.ttf out/ttf/NotoSerif-Italic.ttf out/ttf/NotoSerif-Bold.ttf out/ttf/NotoSerif-BoldItalic.ttf
7 | out/ttc/Roboto-Thin.ttf: build/ttc/Roboto-Thin.ttc src/latin/Roboto-Thin.ttf
8 | mkdir -p out/ttc/
9 | python fix-metrics-ttc.py eyJmb250IjoiYnVpbGQvdHRjL1JvYm90by1UaGluLnR0YyIsInJlZmVyZW5jZSI6InNyYy9sYXRpbi9Sb2JvdG8tVGhpbi50dGYiLCJvdXQiOiJvdXQvdHRjL1JvYm90by1UaGluLnR0ZiJ9
10 | build/ttc/Roboto-Thin.ttc: build/ttf/Roboto-Thin.ttf build/c2q/NotoSansCJKjp-Thin.ttf build/c2q/NotoSansCJKkr-Thin.ttf build/c2q/NotoSansCJKsc-Thin.ttf build/c2q/NotoSansCJKtc-Thin.ttf build/c2q/NotoSansCJKhk-Thin.ttf build/c2q/SourceHanSans-ExtraLight.ttf build/c2q/SourceHanSansK-ExtraLight.ttf build/c2q/SourceHanSansSC-ExtraLight.ttf build/c2q/SourceHanSansTC-ExtraLight.ttf build/c2q/SourceHanSansHC-ExtraLight.ttf
11 | mkdir -p build/ttc/
12 | node node_modules/otfcc-ttcize/bin/_startup -x -o $@ $^
13 | out/ttc/Roboto-Light.ttf: build/ttc/Roboto-Light.ttc src/latin/Roboto-Light.ttf
14 | mkdir -p out/ttc/
15 | python fix-metrics-ttc.py eyJmb250IjoiYnVpbGQvdHRjL1JvYm90by1MaWdodC50dGMiLCJyZWZlcmVuY2UiOiJzcmMvbGF0aW4vUm9ib3RvLUxpZ2h0LnR0ZiIsIm91dCI6Im91dC90dGMvUm9ib3RvLUxpZ2h0LnR0ZiJ9
16 | build/ttc/Roboto-Light.ttc: build/ttf/Roboto-Light.ttf build/c2q/NotoSansCJKjp-Light.ttf build/c2q/NotoSansCJKkr-Light.ttf build/c2q/NotoSansCJKsc-Light.ttf build/c2q/NotoSansCJKtc-Light.ttf build/c2q/NotoSansCJKhk-Light.ttf build/c2q/SourceHanSans-Light.ttf build/c2q/SourceHanSansK-Light.ttf build/c2q/SourceHanSansSC-Light.ttf build/c2q/SourceHanSansTC-Light.ttf build/c2q/SourceHanSansHC-Light.ttf
17 | mkdir -p build/ttc/
18 | node node_modules/otfcc-ttcize/bin/_startup -x -o $@ $^
19 | out/ttc/Roboto-Regular.ttf: build/ttc/Roboto-Regular.ttc src/latin/Roboto-Regular.ttf
20 | mkdir -p out/ttc/
21 | python fix-metrics-ttc.py eyJmb250IjoiYnVpbGQvdHRjL1JvYm90by1SZWd1bGFyLnR0YyIsInJlZmVyZW5jZSI6InNyYy9sYXRpbi9Sb2JvdG8tUmVndWxhci50dGYiLCJvdXQiOiJvdXQvdHRjL1JvYm90by1SZWd1bGFyLnR0ZiJ9
22 | build/ttc/Roboto-Regular.ttc: build/ttf/Roboto-Regular.ttf build/c2q/NotoSansCJKjp-Regular.ttf build/c2q/NotoSansCJKkr-Regular.ttf build/c2q/NotoSansCJKsc-Regular.ttf build/c2q/NotoSansCJKtc-Regular.ttf build/c2q/NotoSansCJKhk-Regular.ttf build/c2q/NotoSansMonoCJKjp-Regular.ttf build/c2q/NotoSansMonoCJKkr-Regular.ttf build/c2q/NotoSansMonoCJKsc-Regular.ttf build/c2q/NotoSansMonoCJKtc-Regular.ttf build/c2q/NotoSansMonoCJKhk-Regular.ttf build/c2q/SourceHanSans-Regular.ttf build/c2q/SourceHanSansK-Regular.ttf build/c2q/SourceHanSansSC-Regular.ttf build/c2q/SourceHanSansTC-Regular.ttf build/c2q/SourceHanSansHC-Regular.ttf
23 | mkdir -p build/ttc/
24 | node node_modules/otfcc-ttcize/bin/_startup -x -o $@ $^
25 | out/ttc/Roboto-Medium.ttf: build/ttc/Roboto-Medium.ttc src/latin/Roboto-Medium.ttf
26 | mkdir -p out/ttc/
27 | python fix-metrics-ttc.py eyJmb250IjoiYnVpbGQvdHRjL1JvYm90by1NZWRpdW0udHRjIiwicmVmZXJlbmNlIjoic3JjL2xhdGluL1JvYm90by1NZWRpdW0udHRmIiwib3V0Ijoib3V0L3R0Yy9Sb2JvdG8tTWVkaXVtLnR0ZiJ9
28 | build/ttc/Roboto-Medium.ttc: build/ttf/Roboto-Medium.ttf build/c2q/NotoSansCJKjp-Medium.ttf build/c2q/NotoSansCJKkr-Medium.ttf build/c2q/NotoSansCJKsc-Medium.ttf build/c2q/NotoSansCJKtc-Medium.ttf build/c2q/NotoSansCJKhk-Medium.ttf build/c2q/SourceHanSans-Medium.ttf build/c2q/SourceHanSansK-Medium.ttf build/c2q/SourceHanSansSC-Medium.ttf build/c2q/SourceHanSansTC-Medium.ttf build/c2q/SourceHanSansHC-Medium.ttf
29 | mkdir -p build/ttc/
30 | node node_modules/otfcc-ttcize/bin/_startup -x -o $@ $^
31 | out/ttc/Roboto-Bold.ttf: build/ttc/Roboto-Bold.ttc src/latin/Roboto-Bold.ttf
32 | mkdir -p out/ttc/
33 | python fix-metrics-ttc.py eyJmb250IjoiYnVpbGQvdHRjL1JvYm90by1Cb2xkLnR0YyIsInJlZmVyZW5jZSI6InNyYy9sYXRpbi9Sb2JvdG8tQm9sZC50dGYiLCJvdXQiOiJvdXQvdHRjL1JvYm90by1Cb2xkLnR0ZiJ9
34 | build/ttc/Roboto-Bold.ttc: build/ttf/Roboto-Bold.ttf build/c2q/NotoSansCJKjp-Bold.ttf build/c2q/NotoSansCJKkr-Bold.ttf build/c2q/NotoSansCJKsc-Bold.ttf build/c2q/NotoSansCJKtc-Bold.ttf build/c2q/NotoSansCJKhk-Bold.ttf build/c2q/NotoSansMonoCJKjp-Bold.ttf build/c2q/NotoSansMonoCJKkr-Bold.ttf build/c2q/NotoSansMonoCJKsc-Bold.ttf build/c2q/NotoSansMonoCJKtc-Bold.ttf build/c2q/NotoSansMonoCJKhk-Bold.ttf build/c2q/SourceHanSans-Bold.ttf build/c2q/SourceHanSansK-Bold.ttf build/c2q/SourceHanSansSC-Bold.ttf build/c2q/SourceHanSansTC-Bold.ttf build/c2q/SourceHanSansHC-Bold.ttf
35 | mkdir -p build/ttc/
36 | node node_modules/otfcc-ttcize/bin/_startup -x -o $@ $^
37 | out/ttc/Roboto-Black.ttf: build/ttc/Roboto-Black.ttc src/latin/Roboto-Black.ttf
38 | mkdir -p out/ttc/
39 | python fix-metrics-ttc.py eyJmb250IjoiYnVpbGQvdHRjL1JvYm90by1CbGFjay50dGMiLCJyZWZlcmVuY2UiOiJzcmMvbGF0aW4vUm9ib3RvLUJsYWNrLnR0ZiIsIm91dCI6Im91dC90dGMvUm9ib3RvLUJsYWNrLnR0ZiJ9
40 | build/ttc/Roboto-Black.ttc: build/ttf/Roboto-Black.ttf build/c2q/NotoSansCJKjp-Black.ttf build/c2q/NotoSansCJKkr-Black.ttf build/c2q/NotoSansCJKsc-Black.ttf build/c2q/NotoSansCJKtc-Black.ttf build/c2q/NotoSansCJKhk-Black.ttf build/c2q/SourceHanSans-Heavy.ttf build/c2q/SourceHanSansK-Heavy.ttf build/c2q/SourceHanSansSC-Heavy.ttf build/c2q/SourceHanSansTC-Heavy.ttf build/c2q/SourceHanSansHC-Heavy.ttf
41 | mkdir -p build/ttc/
42 | node node_modules/otfcc-ttcize/bin/_startup -x -o $@ $^
43 | out/ttc/NotoSerif-Regular.ttf: build/ttc/NotoSerif-Regular.ttc src/latin/NotoSerif-Regular.ttf
44 | mkdir -p out/ttc/
45 | python fix-metrics-ttc.py eyJmb250IjoiYnVpbGQvdHRjL05vdG9TZXJpZi1SZWd1bGFyLnR0YyIsInJlZmVyZW5jZSI6InNyYy9sYXRpbi9Ob3RvU2VyaWYtUmVndWxhci50dGYiLCJvdXQiOiJvdXQvdHRjL05vdG9TZXJpZi1SZWd1bGFyLnR0ZiJ9
46 | build/ttc/NotoSerif-Regular.ttc: build/ttf/NotoSerif-Regular.ttf build/c2q/NotoSerifCJKjp-Regular.ttf build/c2q/NotoSerifCJKkr-Regular.ttf build/c2q/NotoSerifCJKsc-Regular.ttf build/c2q/NotoSerifCJKtc-Regular.ttf build/c2q/SourceHanSerif-Regular.ttf build/c2q/SourceHanSerifK-Regular.ttf build/c2q/SourceHanSerifSC-Regular.ttf build/c2q/SourceHanSerifTC-Regular.ttf
47 | mkdir -p build/ttc/
48 | node node_modules/otfcc-ttcize/bin/_startup -x -o $@ $^
49 | out/ttc/NotoSerif-Bold.ttf: build/ttc/NotoSerif-Bold.ttc src/latin/NotoSerif-Bold.ttf
50 | mkdir -p out/ttc/
51 | python fix-metrics-ttc.py eyJmb250IjoiYnVpbGQvdHRjL05vdG9TZXJpZi1Cb2xkLnR0YyIsInJlZmVyZW5jZSI6InNyYy9sYXRpbi9Ob3RvU2VyaWYtQm9sZC50dGYiLCJvdXQiOiJvdXQvdHRjL05vdG9TZXJpZi1Cb2xkLnR0ZiJ9
52 | build/ttc/NotoSerif-Bold.ttc: build/ttf/NotoSerif-Bold.ttf build/c2q/NotoSerifCJKjp-Bold.ttf build/c2q/NotoSerifCJKkr-Bold.ttf build/c2q/NotoSerifCJKsc-Bold.ttf build/c2q/NotoSerifCJKtc-Bold.ttf build/c2q/SourceHanSerif-Bold.ttf build/c2q/SourceHanSerifK-Bold.ttf build/c2q/SourceHanSerifSC-Bold.ttf build/c2q/SourceHanSerifTC-Bold.ttf
53 | mkdir -p build/ttc/
54 | node node_modules/otfcc-ttcize/bin/_startup -x -o $@ $^
55 | out/ttf/Roboto-Thin.ttf: build/ttf/Roboto-Thin.ttf src/latin/Roboto-Thin.ttf
56 | mkdir -p out/ttf/
57 | python fix-metrics.py eyJmb250IjoiYnVpbGQvdHRmL1JvYm90by1UaGluLnR0ZiIsInJlZmVyZW5jZSI6InNyYy9sYXRpbi9Sb2JvdG8tVGhpbi50dGYiLCJvdXQiOiJvdXQvdHRmL1JvYm90by1UaGluLnR0ZiJ9
58 | build/ttf/Roboto-Thin.ttf: src/latin/Roboto-Thin.ttf build/c2q/NotoSansCJKsc-Thin.ttf
59 | mkdir -p build/ttf/
60 | python merge.py eyJsYXRpbiI6InNyYy9sYXRpbi9Sb2JvdG8tVGhpbi50dGYiLCJjamsiOiJidWlsZC9jMnEvTm90b1NhbnNDSktzYy1UaGluLnR0ZiIsIm91dCI6ImJ1aWxkL3R0Zi9Sb2JvdG8tVGhpbi50dGYiLCJpdGFsaXplIjowLCJjb25kZW5zZSI6MX0=
61 | out/ttf/Roboto-ThinItalic.ttf: build/ttf/Roboto-ThinItalic.ttf src/latin/Roboto-ThinItalic.ttf
62 | mkdir -p out/ttf/
63 | python fix-metrics.py eyJmb250IjoiYnVpbGQvdHRmL1JvYm90by1UaGluSXRhbGljLnR0ZiIsInJlZmVyZW5jZSI6InNyYy9sYXRpbi9Sb2JvdG8tVGhpbkl0YWxpYy50dGYiLCJvdXQiOiJvdXQvdHRmL1JvYm90by1UaGluSXRhbGljLnR0ZiJ9
64 | build/ttf/Roboto-ThinItalic.ttf: src/latin/Roboto-ThinItalic.ttf build/c2q/NotoSansCJKsc-Thin.ttf
65 | mkdir -p build/ttf/
66 | python merge.py eyJsYXRpbiI6InNyYy9sYXRpbi9Sb2JvdG8tVGhpbkl0YWxpYy50dGYiLCJjamsiOiJidWlsZC9jMnEvTm90b1NhbnNDSktzYy1UaGluLnR0ZiIsIm91dCI6ImJ1aWxkL3R0Zi9Sb2JvdG8tVGhpbkl0YWxpYy50dGYiLCJpdGFsaXplIjowLjE3MzMsImNvbmRlbnNlIjoxfQ==
67 | out/ttf/Roboto-Light.ttf: build/ttf/Roboto-Light.ttf src/latin/Roboto-Light.ttf
68 | mkdir -p out/ttf/
69 | python fix-metrics.py eyJmb250IjoiYnVpbGQvdHRmL1JvYm90by1MaWdodC50dGYiLCJyZWZlcmVuY2UiOiJzcmMvbGF0aW4vUm9ib3RvLUxpZ2h0LnR0ZiIsIm91dCI6Im91dC90dGYvUm9ib3RvLUxpZ2h0LnR0ZiJ9
70 | build/ttf/Roboto-Light.ttf: src/latin/Roboto-Light.ttf build/c2q/NotoSansCJKsc-Light.ttf
71 | mkdir -p build/ttf/
72 | python merge.py eyJsYXRpbiI6InNyYy9sYXRpbi9Sb2JvdG8tTGlnaHQudHRmIiwiY2prIjoiYnVpbGQvYzJxL05vdG9TYW5zQ0pLc2MtTGlnaHQudHRmIiwib3V0IjoiYnVpbGQvdHRmL1JvYm90by1MaWdodC50dGYiLCJpdGFsaXplIjowLCJjb25kZW5zZSI6MX0=
73 | out/ttf/Roboto-LightItalic.ttf: build/ttf/Roboto-LightItalic.ttf src/latin/Roboto-LightItalic.ttf
74 | mkdir -p out/ttf/
75 | python fix-metrics.py eyJmb250IjoiYnVpbGQvdHRmL1JvYm90by1MaWdodEl0YWxpYy50dGYiLCJyZWZlcmVuY2UiOiJzcmMvbGF0aW4vUm9ib3RvLUxpZ2h0SXRhbGljLnR0ZiIsIm91dCI6Im91dC90dGYvUm9ib3RvLUxpZ2h0SXRhbGljLnR0ZiJ9
76 | build/ttf/Roboto-LightItalic.ttf: src/latin/Roboto-LightItalic.ttf build/c2q/NotoSansCJKsc-Light.ttf
77 | mkdir -p build/ttf/
78 | python merge.py eyJsYXRpbiI6InNyYy9sYXRpbi9Sb2JvdG8tTGlnaHRJdGFsaWMudHRmIiwiY2prIjoiYnVpbGQvYzJxL05vdG9TYW5zQ0pLc2MtTGlnaHQudHRmIiwib3V0IjoiYnVpbGQvdHRmL1JvYm90by1MaWdodEl0YWxpYy50dGYiLCJpdGFsaXplIjowLjE3MzMsImNvbmRlbnNlIjoxfQ==
79 | out/ttf/RobotoCondensed-Light.ttf: build/ttf/RobotoCondensed-Light.ttf src/latin/RobotoCondensed-Light.ttf
80 | mkdir -p out/ttf/
81 | python fix-metrics.py eyJmb250IjoiYnVpbGQvdHRmL1JvYm90b0NvbmRlbnNlZC1MaWdodC50dGYiLCJyZWZlcmVuY2UiOiJzcmMvbGF0aW4vUm9ib3RvQ29uZGVuc2VkLUxpZ2h0LnR0ZiIsIm91dCI6Im91dC90dGYvUm9ib3RvQ29uZGVuc2VkLUxpZ2h0LnR0ZiJ9
82 | build/ttf/RobotoCondensed-Light.ttf: src/latin/RobotoCondensed-Light.ttf build/c2q/NotoSansCJKsc-Light.ttf
83 | mkdir -p build/ttf/
84 | python merge.py eyJsYXRpbiI6InNyYy9sYXRpbi9Sb2JvdG9Db25kZW5zZWQtTGlnaHQudHRmIiwiY2prIjoiYnVpbGQvYzJxL05vdG9TYW5zQ0pLc2MtTGlnaHQudHRmIiwib3V0IjoiYnVpbGQvdHRmL1JvYm90b0NvbmRlbnNlZC1MaWdodC50dGYiLCJpdGFsaXplIjowLCJjb25kZW5zZSI6MC44OH0=
85 | out/ttf/RobotoCondensed-LightItalic.ttf: build/ttf/RobotoCondensed-LightItalic.ttf src/latin/RobotoCondensed-LightItalic.ttf
86 | mkdir -p out/ttf/
87 | python fix-metrics.py eyJmb250IjoiYnVpbGQvdHRmL1JvYm90b0NvbmRlbnNlZC1MaWdodEl0YWxpYy50dGYiLCJyZWZlcmVuY2UiOiJzcmMvbGF0aW4vUm9ib3RvQ29uZGVuc2VkLUxpZ2h0SXRhbGljLnR0ZiIsIm91dCI6Im91dC90dGYvUm9ib3RvQ29uZGVuc2VkLUxpZ2h0SXRhbGljLnR0ZiJ9
88 | build/ttf/RobotoCondensed-LightItalic.ttf: src/latin/RobotoCondensed-LightItalic.ttf build/c2q/NotoSansCJKsc-Light.ttf
89 | mkdir -p build/ttf/
90 | python merge.py eyJsYXRpbiI6InNyYy9sYXRpbi9Sb2JvdG9Db25kZW5zZWQtTGlnaHRJdGFsaWMudHRmIiwiY2prIjoiYnVpbGQvYzJxL05vdG9TYW5zQ0pLc2MtTGlnaHQudHRmIiwib3V0IjoiYnVpbGQvdHRmL1JvYm90b0NvbmRlbnNlZC1MaWdodEl0YWxpYy50dGYiLCJpdGFsaXplIjowLjE3MzMsImNvbmRlbnNlIjowLjg4fQ==
91 | out/ttf/Roboto-Regular.ttf: build/ttf/Roboto-Regular.ttf src/latin/Roboto-Regular.ttf
92 | mkdir -p out/ttf/
93 | python fix-metrics.py eyJmb250IjoiYnVpbGQvdHRmL1JvYm90by1SZWd1bGFyLnR0ZiIsInJlZmVyZW5jZSI6InNyYy9sYXRpbi9Sb2JvdG8tUmVndWxhci50dGYiLCJvdXQiOiJvdXQvdHRmL1JvYm90by1SZWd1bGFyLnR0ZiJ9
94 | build/ttf/Roboto-Regular.ttf: src/latin/Roboto-Regular.ttf build/c2q/NotoSansCJKsc-Regular.ttf
95 | mkdir -p build/ttf/
96 | python merge.py eyJsYXRpbiI6InNyYy9sYXRpbi9Sb2JvdG8tUmVndWxhci50dGYiLCJjamsiOiJidWlsZC9jMnEvTm90b1NhbnNDSktzYy1SZWd1bGFyLnR0ZiIsIm91dCI6ImJ1aWxkL3R0Zi9Sb2JvdG8tUmVndWxhci50dGYiLCJpdGFsaXplIjowLCJjb25kZW5zZSI6MX0=
97 | out/ttf/Roboto-Italic.ttf: build/ttf/Roboto-Italic.ttf src/latin/Roboto-Italic.ttf
98 | mkdir -p out/ttf/
99 | python fix-metrics.py eyJmb250IjoiYnVpbGQvdHRmL1JvYm90by1JdGFsaWMudHRmIiwicmVmZXJlbmNlIjoic3JjL2xhdGluL1JvYm90by1JdGFsaWMudHRmIiwib3V0Ijoib3V0L3R0Zi9Sb2JvdG8tSXRhbGljLnR0ZiJ9
100 | build/ttf/Roboto-Italic.ttf: src/latin/Roboto-Italic.ttf build/c2q/NotoSansCJKsc-Regular.ttf
101 | mkdir -p build/ttf/
102 | python merge.py eyJsYXRpbiI6InNyYy9sYXRpbi9Sb2JvdG8tSXRhbGljLnR0ZiIsImNqayI6ImJ1aWxkL2MycS9Ob3RvU2Fuc0NKS3NjLVJlZ3VsYXIudHRmIiwib3V0IjoiYnVpbGQvdHRmL1JvYm90by1JdGFsaWMudHRmIiwiaXRhbGl6ZSI6MC4xNzMzLCJjb25kZW5zZSI6MX0=
103 | out/ttf/RobotoCondensed-Regular.ttf: build/ttf/RobotoCondensed-Regular.ttf src/latin/RobotoCondensed-Regular.ttf
104 | mkdir -p out/ttf/
105 | python fix-metrics.py eyJmb250IjoiYnVpbGQvdHRmL1JvYm90b0NvbmRlbnNlZC1SZWd1bGFyLnR0ZiIsInJlZmVyZW5jZSI6InNyYy9sYXRpbi9Sb2JvdG9Db25kZW5zZWQtUmVndWxhci50dGYiLCJvdXQiOiJvdXQvdHRmL1JvYm90b0NvbmRlbnNlZC1SZWd1bGFyLnR0ZiJ9
106 | build/ttf/RobotoCondensed-Regular.ttf: src/latin/RobotoCondensed-Regular.ttf build/c2q/NotoSansCJKsc-Regular.ttf
107 | mkdir -p build/ttf/
108 | python merge.py eyJsYXRpbiI6InNyYy9sYXRpbi9Sb2JvdG9Db25kZW5zZWQtUmVndWxhci50dGYiLCJjamsiOiJidWlsZC9jMnEvTm90b1NhbnNDSktzYy1SZWd1bGFyLnR0ZiIsIm91dCI6ImJ1aWxkL3R0Zi9Sb2JvdG9Db25kZW5zZWQtUmVndWxhci50dGYiLCJpdGFsaXplIjowLCJjb25kZW5zZSI6MC44OH0=
109 | out/ttf/RobotoCondensed-Italic.ttf: build/ttf/RobotoCondensed-Italic.ttf src/latin/RobotoCondensed-Italic.ttf
110 | mkdir -p out/ttf/
111 | python fix-metrics.py eyJmb250IjoiYnVpbGQvdHRmL1JvYm90b0NvbmRlbnNlZC1JdGFsaWMudHRmIiwicmVmZXJlbmNlIjoic3JjL2xhdGluL1JvYm90b0NvbmRlbnNlZC1JdGFsaWMudHRmIiwib3V0Ijoib3V0L3R0Zi9Sb2JvdG9Db25kZW5zZWQtSXRhbGljLnR0ZiJ9
112 | build/ttf/RobotoCondensed-Italic.ttf: src/latin/RobotoCondensed-Italic.ttf build/c2q/NotoSansCJKsc-Regular.ttf
113 | mkdir -p build/ttf/
114 | python merge.py eyJsYXRpbiI6InNyYy9sYXRpbi9Sb2JvdG9Db25kZW5zZWQtSXRhbGljLnR0ZiIsImNqayI6ImJ1aWxkL2MycS9Ob3RvU2Fuc0NKS3NjLVJlZ3VsYXIudHRmIiwib3V0IjoiYnVpbGQvdHRmL1JvYm90b0NvbmRlbnNlZC1JdGFsaWMudHRmIiwiaXRhbGl6ZSI6MC4xNzMzLCJjb25kZW5zZSI6MC44OH0=
115 | out/ttf/Roboto-Medium.ttf: build/ttf/Roboto-Medium.ttf src/latin/Roboto-Medium.ttf
116 | mkdir -p out/ttf/
117 | python fix-metrics.py eyJmb250IjoiYnVpbGQvdHRmL1JvYm90by1NZWRpdW0udHRmIiwicmVmZXJlbmNlIjoic3JjL2xhdGluL1JvYm90by1NZWRpdW0udHRmIiwib3V0Ijoib3V0L3R0Zi9Sb2JvdG8tTWVkaXVtLnR0ZiJ9
118 | build/ttf/Roboto-Medium.ttf: src/latin/Roboto-Medium.ttf build/c2q/NotoSansCJKsc-Medium.ttf
119 | mkdir -p build/ttf/
120 | python merge.py eyJsYXRpbiI6InNyYy9sYXRpbi9Sb2JvdG8tTWVkaXVtLnR0ZiIsImNqayI6ImJ1aWxkL2MycS9Ob3RvU2Fuc0NKS3NjLU1lZGl1bS50dGYiLCJvdXQiOiJidWlsZC90dGYvUm9ib3RvLU1lZGl1bS50dGYiLCJpdGFsaXplIjowLCJjb25kZW5zZSI6MX0=
121 | out/ttf/Roboto-MediumItalic.ttf: build/ttf/Roboto-MediumItalic.ttf src/latin/Roboto-MediumItalic.ttf
122 | mkdir -p out/ttf/
123 | python fix-metrics.py eyJmb250IjoiYnVpbGQvdHRmL1JvYm90by1NZWRpdW1JdGFsaWMudHRmIiwicmVmZXJlbmNlIjoic3JjL2xhdGluL1JvYm90by1NZWRpdW1JdGFsaWMudHRmIiwib3V0Ijoib3V0L3R0Zi9Sb2JvdG8tTWVkaXVtSXRhbGljLnR0ZiJ9
124 | build/ttf/Roboto-MediumItalic.ttf: src/latin/Roboto-MediumItalic.ttf build/c2q/NotoSansCJKsc-Medium.ttf
125 | mkdir -p build/ttf/
126 | python merge.py eyJsYXRpbiI6InNyYy9sYXRpbi9Sb2JvdG8tTWVkaXVtSXRhbGljLnR0ZiIsImNqayI6ImJ1aWxkL2MycS9Ob3RvU2Fuc0NKS3NjLU1lZGl1bS50dGYiLCJvdXQiOiJidWlsZC90dGYvUm9ib3RvLU1lZGl1bUl0YWxpYy50dGYiLCJpdGFsaXplIjowLjE3MzMsImNvbmRlbnNlIjoxfQ==
127 | out/ttf/RobotoCondensed-Medium.ttf: build/ttf/RobotoCondensed-Medium.ttf src/latin/RobotoCondensed-Medium.ttf
128 | mkdir -p out/ttf/
129 | python fix-metrics.py eyJmb250IjoiYnVpbGQvdHRmL1JvYm90b0NvbmRlbnNlZC1NZWRpdW0udHRmIiwicmVmZXJlbmNlIjoic3JjL2xhdGluL1JvYm90b0NvbmRlbnNlZC1NZWRpdW0udHRmIiwib3V0Ijoib3V0L3R0Zi9Sb2JvdG9Db25kZW5zZWQtTWVkaXVtLnR0ZiJ9
130 | build/ttf/RobotoCondensed-Medium.ttf: src/latin/RobotoCondensed-Medium.ttf build/c2q/NotoSansCJKsc-Medium.ttf
131 | mkdir -p build/ttf/
132 | python merge.py eyJsYXRpbiI6InNyYy9sYXRpbi9Sb2JvdG9Db25kZW5zZWQtTWVkaXVtLnR0ZiIsImNqayI6ImJ1aWxkL2MycS9Ob3RvU2Fuc0NKS3NjLU1lZGl1bS50dGYiLCJvdXQiOiJidWlsZC90dGYvUm9ib3RvQ29uZGVuc2VkLU1lZGl1bS50dGYiLCJpdGFsaXplIjowLCJjb25kZW5zZSI6MC44OH0=
133 | out/ttf/RobotoCondensed-MediumItalic.ttf: build/ttf/RobotoCondensed-MediumItalic.ttf src/latin/RobotoCondensed-MediumItalic.ttf
134 | mkdir -p out/ttf/
135 | python fix-metrics.py eyJmb250IjoiYnVpbGQvdHRmL1JvYm90b0NvbmRlbnNlZC1NZWRpdW1JdGFsaWMudHRmIiwicmVmZXJlbmNlIjoic3JjL2xhdGluL1JvYm90b0NvbmRlbnNlZC1NZWRpdW1JdGFsaWMudHRmIiwib3V0Ijoib3V0L3R0Zi9Sb2JvdG9Db25kZW5zZWQtTWVkaXVtSXRhbGljLnR0ZiJ9
136 | build/ttf/RobotoCondensed-MediumItalic.ttf: src/latin/RobotoCondensed-MediumItalic.ttf build/c2q/NotoSansCJKsc-Medium.ttf
137 | mkdir -p build/ttf/
138 | python merge.py eyJsYXRpbiI6InNyYy9sYXRpbi9Sb2JvdG9Db25kZW5zZWQtTWVkaXVtSXRhbGljLnR0ZiIsImNqayI6ImJ1aWxkL2MycS9Ob3RvU2Fuc0NKS3NjLU1lZGl1bS50dGYiLCJvdXQiOiJidWlsZC90dGYvUm9ib3RvQ29uZGVuc2VkLU1lZGl1bUl0YWxpYy50dGYiLCJpdGFsaXplIjowLjE3MzMsImNvbmRlbnNlIjowLjg4fQ==
139 | out/ttf/Roboto-Bold.ttf: build/ttf/Roboto-Bold.ttf src/latin/Roboto-Bold.ttf
140 | mkdir -p out/ttf/
141 | python fix-metrics.py eyJmb250IjoiYnVpbGQvdHRmL1JvYm90by1Cb2xkLnR0ZiIsInJlZmVyZW5jZSI6InNyYy9sYXRpbi9Sb2JvdG8tQm9sZC50dGYiLCJvdXQiOiJvdXQvdHRmL1JvYm90by1Cb2xkLnR0ZiJ9
142 | build/ttf/Roboto-Bold.ttf: src/latin/Roboto-Bold.ttf build/c2q/NotoSansCJKsc-Bold.ttf
143 | mkdir -p build/ttf/
144 | python merge.py eyJsYXRpbiI6InNyYy9sYXRpbi9Sb2JvdG8tQm9sZC50dGYiLCJjamsiOiJidWlsZC9jMnEvTm90b1NhbnNDSktzYy1Cb2xkLnR0ZiIsIm91dCI6ImJ1aWxkL3R0Zi9Sb2JvdG8tQm9sZC50dGYiLCJpdGFsaXplIjowLCJjb25kZW5zZSI6MX0=
145 | out/ttf/Roboto-BoldItalic.ttf: build/ttf/Roboto-BoldItalic.ttf src/latin/Roboto-BoldItalic.ttf
146 | mkdir -p out/ttf/
147 | python fix-metrics.py eyJmb250IjoiYnVpbGQvdHRmL1JvYm90by1Cb2xkSXRhbGljLnR0ZiIsInJlZmVyZW5jZSI6InNyYy9sYXRpbi9Sb2JvdG8tQm9sZEl0YWxpYy50dGYiLCJvdXQiOiJvdXQvdHRmL1JvYm90by1Cb2xkSXRhbGljLnR0ZiJ9
148 | build/ttf/Roboto-BoldItalic.ttf: src/latin/Roboto-BoldItalic.ttf build/c2q/NotoSansCJKsc-Bold.ttf
149 | mkdir -p build/ttf/
150 | python merge.py eyJsYXRpbiI6InNyYy9sYXRpbi9Sb2JvdG8tQm9sZEl0YWxpYy50dGYiLCJjamsiOiJidWlsZC9jMnEvTm90b1NhbnNDSktzYy1Cb2xkLnR0ZiIsIm91dCI6ImJ1aWxkL3R0Zi9Sb2JvdG8tQm9sZEl0YWxpYy50dGYiLCJpdGFsaXplIjowLjE3MzMsImNvbmRlbnNlIjoxfQ==
151 | out/ttf/RobotoCondensed-Bold.ttf: build/ttf/RobotoCondensed-Bold.ttf src/latin/RobotoCondensed-Bold.ttf
152 | mkdir -p out/ttf/
153 | python fix-metrics.py eyJmb250IjoiYnVpbGQvdHRmL1JvYm90b0NvbmRlbnNlZC1Cb2xkLnR0ZiIsInJlZmVyZW5jZSI6InNyYy9sYXRpbi9Sb2JvdG9Db25kZW5zZWQtQm9sZC50dGYiLCJvdXQiOiJvdXQvdHRmL1JvYm90b0NvbmRlbnNlZC1Cb2xkLnR0ZiJ9
154 | build/ttf/RobotoCondensed-Bold.ttf: src/latin/RobotoCondensed-Bold.ttf build/c2q/NotoSansCJKsc-Bold.ttf
155 | mkdir -p build/ttf/
156 | python merge.py eyJsYXRpbiI6InNyYy9sYXRpbi9Sb2JvdG9Db25kZW5zZWQtQm9sZC50dGYiLCJjamsiOiJidWlsZC9jMnEvTm90b1NhbnNDSktzYy1Cb2xkLnR0ZiIsIm91dCI6ImJ1aWxkL3R0Zi9Sb2JvdG9Db25kZW5zZWQtQm9sZC50dGYiLCJpdGFsaXplIjowLCJjb25kZW5zZSI6MC44OH0=
157 | out/ttf/RobotoCondensed-BoldItalic.ttf: build/ttf/RobotoCondensed-BoldItalic.ttf src/latin/RobotoCondensed-BoldItalic.ttf
158 | mkdir -p out/ttf/
159 | python fix-metrics.py eyJmb250IjoiYnVpbGQvdHRmL1JvYm90b0NvbmRlbnNlZC1Cb2xkSXRhbGljLnR0ZiIsInJlZmVyZW5jZSI6InNyYy9sYXRpbi9Sb2JvdG9Db25kZW5zZWQtQm9sZEl0YWxpYy50dGYiLCJvdXQiOiJvdXQvdHRmL1JvYm90b0NvbmRlbnNlZC1Cb2xkSXRhbGljLnR0ZiJ9
160 | build/ttf/RobotoCondensed-BoldItalic.ttf: src/latin/RobotoCondensed-BoldItalic.ttf build/c2q/NotoSansCJKsc-Bold.ttf
161 | mkdir -p build/ttf/
162 | python merge.py eyJsYXRpbiI6InNyYy9sYXRpbi9Sb2JvdG9Db25kZW5zZWQtQm9sZEl0YWxpYy50dGYiLCJjamsiOiJidWlsZC9jMnEvTm90b1NhbnNDSktzYy1Cb2xkLnR0ZiIsIm91dCI6ImJ1aWxkL3R0Zi9Sb2JvdG9Db25kZW5zZWQtQm9sZEl0YWxpYy50dGYiLCJpdGFsaXplIjowLjE3MzMsImNvbmRlbnNlIjowLjg4fQ==
163 | out/ttf/Roboto-Black.ttf: build/ttf/Roboto-Black.ttf src/latin/Roboto-Black.ttf
164 | mkdir -p out/ttf/
165 | python fix-metrics.py eyJmb250IjoiYnVpbGQvdHRmL1JvYm90by1CbGFjay50dGYiLCJyZWZlcmVuY2UiOiJzcmMvbGF0aW4vUm9ib3RvLUJsYWNrLnR0ZiIsIm91dCI6Im91dC90dGYvUm9ib3RvLUJsYWNrLnR0ZiJ9
166 | build/ttf/Roboto-Black.ttf: src/latin/Roboto-Black.ttf build/c2q/NotoSansCJKsc-Black.ttf
167 | mkdir -p build/ttf/
168 | python merge.py eyJsYXRpbiI6InNyYy9sYXRpbi9Sb2JvdG8tQmxhY2sudHRmIiwiY2prIjoiYnVpbGQvYzJxL05vdG9TYW5zQ0pLc2MtQmxhY2sudHRmIiwib3V0IjoiYnVpbGQvdHRmL1JvYm90by1CbGFjay50dGYiLCJpdGFsaXplIjowLCJjb25kZW5zZSI6MX0=
169 | out/ttf/Roboto-BlackItalic.ttf: build/ttf/Roboto-BlackItalic.ttf src/latin/Roboto-BlackItalic.ttf
170 | mkdir -p out/ttf/
171 | python fix-metrics.py eyJmb250IjoiYnVpbGQvdHRmL1JvYm90by1CbGFja0l0YWxpYy50dGYiLCJyZWZlcmVuY2UiOiJzcmMvbGF0aW4vUm9ib3RvLUJsYWNrSXRhbGljLnR0ZiIsIm91dCI6Im91dC90dGYvUm9ib3RvLUJsYWNrSXRhbGljLnR0ZiJ9
172 | build/ttf/Roboto-BlackItalic.ttf: src/latin/Roboto-BlackItalic.ttf build/c2q/NotoSansCJKsc-Black.ttf
173 | mkdir -p build/ttf/
174 | python merge.py eyJsYXRpbiI6InNyYy9sYXRpbi9Sb2JvdG8tQmxhY2tJdGFsaWMudHRmIiwiY2prIjoiYnVpbGQvYzJxL05vdG9TYW5zQ0pLc2MtQmxhY2sudHRmIiwib3V0IjoiYnVpbGQvdHRmL1JvYm90by1CbGFja0l0YWxpYy50dGYiLCJpdGFsaXplIjowLjE3MzMsImNvbmRlbnNlIjoxfQ==
175 | out/ttf/NotoSerif-Regular.ttf: build/ttf/NotoSerif-Regular.ttf src/latin/NotoSerif-Regular.ttf
176 | mkdir -p out/ttf/
177 | python fix-metrics.py eyJmb250IjoiYnVpbGQvdHRmL05vdG9TZXJpZi1SZWd1bGFyLnR0ZiIsInJlZmVyZW5jZSI6InNyYy9sYXRpbi9Ob3RvU2VyaWYtUmVndWxhci50dGYiLCJvdXQiOiJvdXQvdHRmL05vdG9TZXJpZi1SZWd1bGFyLnR0ZiJ9
178 | build/ttf/NotoSerif-Regular.ttf: src/latin/NotoSerif-Regular.ttf build/c2q/NotoSerifCJKsc-Regular.ttf
179 | mkdir -p build/ttf/
180 | python merge.py eyJsYXRpbiI6InNyYy9sYXRpbi9Ob3RvU2VyaWYtUmVndWxhci50dGYiLCJjamsiOiJidWlsZC9jMnEvTm90b1NlcmlmQ0pLc2MtUmVndWxhci50dGYiLCJvdXQiOiJidWlsZC90dGYvTm90b1NlcmlmLVJlZ3VsYXIudHRmIiwiaXRhbGl6ZSI6MCwiY29uZGVuc2UiOjF9
181 | out/ttf/NotoSerif-Italic.ttf: build/ttf/NotoSerif-Italic.ttf src/latin/NotoSerif-Italic.ttf
182 | mkdir -p out/ttf/
183 | python fix-metrics.py eyJmb250IjoiYnVpbGQvdHRmL05vdG9TZXJpZi1JdGFsaWMudHRmIiwicmVmZXJlbmNlIjoic3JjL2xhdGluL05vdG9TZXJpZi1JdGFsaWMudHRmIiwib3V0Ijoib3V0L3R0Zi9Ob3RvU2VyaWYtSXRhbGljLnR0ZiJ9
184 | build/ttf/NotoSerif-Italic.ttf: src/latin/NotoSerif-Italic.ttf build/c2q/NotoSerifCJKsc-Regular.ttf
185 | mkdir -p build/ttf/
186 | python merge.py eyJsYXRpbiI6InNyYy9sYXRpbi9Ob3RvU2VyaWYtSXRhbGljLnR0ZiIsImNqayI6ImJ1aWxkL2MycS9Ob3RvU2VyaWZDSktzYy1SZWd1bGFyLnR0ZiIsIm91dCI6ImJ1aWxkL3R0Zi9Ob3RvU2VyaWYtSXRhbGljLnR0ZiIsIml0YWxpemUiOjAuMjEyNSwiY29uZGVuc2UiOjF9
187 | out/ttf/NotoSerif-Bold.ttf: build/ttf/NotoSerif-Bold.ttf src/latin/NotoSerif-Bold.ttf
188 | mkdir -p out/ttf/
189 | python fix-metrics.py eyJmb250IjoiYnVpbGQvdHRmL05vdG9TZXJpZi1Cb2xkLnR0ZiIsInJlZmVyZW5jZSI6InNyYy9sYXRpbi9Ob3RvU2VyaWYtQm9sZC50dGYiLCJvdXQiOiJvdXQvdHRmL05vdG9TZXJpZi1Cb2xkLnR0ZiJ9
190 | build/ttf/NotoSerif-Bold.ttf: src/latin/NotoSerif-Bold.ttf build/c2q/NotoSerifCJKsc-Bold.ttf
191 | mkdir -p build/ttf/
192 | python merge.py eyJsYXRpbiI6InNyYy9sYXRpbi9Ob3RvU2VyaWYtQm9sZC50dGYiLCJjamsiOiJidWlsZC9jMnEvTm90b1NlcmlmQ0pLc2MtQm9sZC50dGYiLCJvdXQiOiJidWlsZC90dGYvTm90b1NlcmlmLUJvbGQudHRmIiwiaXRhbGl6ZSI6MCwiY29uZGVuc2UiOjF9
193 | out/ttf/NotoSerif-BoldItalic.ttf: build/ttf/NotoSerif-BoldItalic.ttf src/latin/NotoSerif-BoldItalic.ttf
194 | mkdir -p out/ttf/
195 | python fix-metrics.py eyJmb250IjoiYnVpbGQvdHRmL05vdG9TZXJpZi1Cb2xkSXRhbGljLnR0ZiIsInJlZmVyZW5jZSI6InNyYy9sYXRpbi9Ob3RvU2VyaWYtQm9sZEl0YWxpYy50dGYiLCJvdXQiOiJvdXQvdHRmL05vdG9TZXJpZi1Cb2xkSXRhbGljLnR0ZiJ9
196 | build/ttf/NotoSerif-BoldItalic.ttf: src/latin/NotoSerif-BoldItalic.ttf build/c2q/NotoSerifCJKsc-Bold.ttf
197 | mkdir -p build/ttf/
198 | python merge.py eyJsYXRpbiI6InNyYy9sYXRpbi9Ob3RvU2VyaWYtQm9sZEl0YWxpYy50dGYiLCJjamsiOiJidWlsZC9jMnEvTm90b1NlcmlmQ0pLc2MtQm9sZC50dGYiLCJvdXQiOiJidWlsZC90dGYvTm90b1NlcmlmLUJvbGRJdGFsaWMudHRmIiwiaXRhbGl6ZSI6MC4yMTI1LCJjb25kZW5zZSI6MX0=
199 | build/c2q/-.ttf: src/cjk/-.otf
200 | mkdir -p build/c2q/
201 | otfccdump --ignore-hints --quiet $< | node node_modules/otfcc-c2q/_c2q_startup.js | otfccbuild --quiet --short-post --keep-average-char-width -O3 -o $@
202 | build/c2q/B.ttf: src/cjk/B.otf
203 | mkdir -p build/c2q/
204 | otfccdump --ignore-hints --quiet $< | node node_modules/otfcc-c2q/_c2q_startup.js | otfccbuild --quiet --short-post --keep-average-char-width -O3 -o $@
205 | build/c2q/C.ttf: src/cjk/C.otf
206 | mkdir -p build/c2q/
207 | otfccdump --ignore-hints --quiet $< | node node_modules/otfcc-c2q/_c2q_startup.js | otfccbuild --quiet --short-post --keep-average-char-width -O3 -o $@
208 | build/c2q/J.ttf: src/cjk/J.otf
209 | mkdir -p build/c2q/
210 | otfccdump --ignore-hints --quiet $< | node node_modules/otfcc-c2q/_c2q_startup.js | otfccbuild --quiet --short-post --keep-average-char-width -O3 -o $@
211 | build/c2q/K.ttf: src/cjk/K.otf
212 | mkdir -p build/c2q/
213 | otfccdump --ignore-hints --quiet $< | node node_modules/otfcc-c2q/_c2q_startup.js | otfccbuild --quiet --short-post --keep-average-char-width -O3 -o $@
214 | build/c2q/L.ttf: src/cjk/L.otf
215 | mkdir -p build/c2q/
216 | otfccdump --ignore-hints --quiet $< | node node_modules/otfcc-c2q/_c2q_startup.js | otfccbuild --quiet --short-post --keep-average-char-width -O3 -o $@
217 | build/c2q/M.ttf: src/cjk/M.otf
218 | mkdir -p build/c2q/
219 | otfccdump --ignore-hints --quiet $< | node node_modules/otfcc-c2q/_c2q_startup.js | otfccbuild --quiet --short-post --keep-average-char-width -O3 -o $@
220 | build/c2q/N.ttf: src/cjk/N.otf
221 | mkdir -p build/c2q/
222 | otfccdump --ignore-hints --quiet $< | node node_modules/otfcc-c2q/_c2q_startup.js | otfccbuild --quiet --short-post --keep-average-char-width -O3 -o $@
223 | build/c2q/NotoSansCJKhk-Black.ttf: src/cjk/NotoSansCJKhk-Black.otf
224 | mkdir -p build/c2q/
225 | otfccdump --ignore-hints --quiet $< | node node_modules/otfcc-c2q/_c2q_startup.js | otfccbuild --quiet --short-post --keep-average-char-width -O3 -o $@
226 | build/c2q/NotoSansCJKhk-Bold.ttf: src/cjk/NotoSansCJKhk-Bold.otf
227 | mkdir -p build/c2q/
228 | otfccdump --ignore-hints --quiet $< | node node_modules/otfcc-c2q/_c2q_startup.js | otfccbuild --quiet --short-post --keep-average-char-width -O3 -o $@
229 | build/c2q/NotoSansCJKhk-Light.ttf: src/cjk/NotoSansCJKhk-Light.otf
230 | mkdir -p build/c2q/
231 | otfccdump --ignore-hints --quiet $< | node node_modules/otfcc-c2q/_c2q_startup.js | otfccbuild --quiet --short-post --keep-average-char-width -O3 -o $@
232 | build/c2q/NotoSansCJKhk-Medium.ttf: src/cjk/NotoSansCJKhk-Medium.otf
233 | mkdir -p build/c2q/
234 | otfccdump --ignore-hints --quiet $< | node node_modules/otfcc-c2q/_c2q_startup.js | otfccbuild --quiet --short-post --keep-average-char-width -O3 -o $@
235 | build/c2q/NotoSansCJKhk-Regular.ttf: src/cjk/NotoSansCJKhk-Regular.otf
236 | mkdir -p build/c2q/
237 | otfccdump --ignore-hints --quiet $< | node node_modules/otfcc-c2q/_c2q_startup.js | otfccbuild --quiet --short-post --keep-average-char-width -O3 -o $@
238 | build/c2q/NotoSansCJKhk-Thin.ttf: src/cjk/NotoSansCJKhk-Thin.otf
239 | mkdir -p build/c2q/
240 | otfccdump --ignore-hints --quiet $< | node node_modules/otfcc-c2q/_c2q_startup.js | otfccbuild --quiet --short-post --keep-average-char-width -O3 -o $@
241 | build/c2q/NotoSansCJKjp-Black.ttf: src/cjk/NotoSansCJKjp-Black.otf
242 | mkdir -p build/c2q/
243 | otfccdump --ignore-hints --quiet $< | node node_modules/otfcc-c2q/_c2q_startup.js | otfccbuild --quiet --short-post --keep-average-char-width -O3 -o $@
244 | build/c2q/NotoSansCJKjp-Bold.ttf: src/cjk/NotoSansCJKjp-Bold.otf
245 | mkdir -p build/c2q/
246 | otfccdump --ignore-hints --quiet $< | node node_modules/otfcc-c2q/_c2q_startup.js | otfccbuild --quiet --short-post --keep-average-char-width -O3 -o $@
247 | build/c2q/NotoSansCJKjp-Light.ttf: src/cjk/NotoSansCJKjp-Light.otf
248 | mkdir -p build/c2q/
249 | otfccdump --ignore-hints --quiet $< | node node_modules/otfcc-c2q/_c2q_startup.js | otfccbuild --quiet --short-post --keep-average-char-width -O3 -o $@
250 | build/c2q/NotoSansCJKjp-Medium.ttf: src/cjk/NotoSansCJKjp-Medium.otf
251 | mkdir -p build/c2q/
252 | otfccdump --ignore-hints --quiet $< | node node_modules/otfcc-c2q/_c2q_startup.js | otfccbuild --quiet --short-post --keep-average-char-width -O3 -o $@
253 | build/c2q/NotoSansCJKjp-Regular.ttf: src/cjk/NotoSansCJKjp-Regular.otf
254 | mkdir -p build/c2q/
255 | otfccdump --ignore-hints --quiet $< | node node_modules/otfcc-c2q/_c2q_startup.js | otfccbuild --quiet --short-post --keep-average-char-width -O3 -o $@
256 | build/c2q/NotoSansCJKjp-Thin.ttf: src/cjk/NotoSansCJKjp-Thin.otf
257 | mkdir -p build/c2q/
258 | otfccdump --ignore-hints --quiet $< | node node_modules/otfcc-c2q/_c2q_startup.js | otfccbuild --quiet --short-post --keep-average-char-width -O3 -o $@
259 | build/c2q/NotoSansCJKkr-Black.ttf: src/cjk/NotoSansCJKkr-Black.otf
260 | mkdir -p build/c2q/
261 | otfccdump --ignore-hints --quiet $< | node node_modules/otfcc-c2q/_c2q_startup.js | otfccbuild --quiet --short-post --keep-average-char-width -O3 -o $@
262 | build/c2q/NotoSansCJKkr-Bold.ttf: src/cjk/NotoSansCJKkr-Bold.otf
263 | mkdir -p build/c2q/
264 | otfccdump --ignore-hints --quiet $< | node node_modules/otfcc-c2q/_c2q_startup.js | otfccbuild --quiet --short-post --keep-average-char-width -O3 -o $@
265 | build/c2q/NotoSansCJKkr-Light.ttf: src/cjk/NotoSansCJKkr-Light.otf
266 | mkdir -p build/c2q/
267 | otfccdump --ignore-hints --quiet $< | node node_modules/otfcc-c2q/_c2q_startup.js | otfccbuild --quiet --short-post --keep-average-char-width -O3 -o $@
268 | build/c2q/NotoSansCJKkr-Medium.ttf: src/cjk/NotoSansCJKkr-Medium.otf
269 | mkdir -p build/c2q/
270 | otfccdump --ignore-hints --quiet $< | node node_modules/otfcc-c2q/_c2q_startup.js | otfccbuild --quiet --short-post --keep-average-char-width -O3 -o $@
271 | build/c2q/NotoSansCJKkr-Regular.ttf: src/cjk/NotoSansCJKkr-Regular.otf
272 | mkdir -p build/c2q/
273 | otfccdump --ignore-hints --quiet $< | node node_modules/otfcc-c2q/_c2q_startup.js | otfccbuild --quiet --short-post --keep-average-char-width -O3 -o $@
274 | build/c2q/NotoSansCJKkr-Thin.ttf: src/cjk/NotoSansCJKkr-Thin.otf
275 | mkdir -p build/c2q/
276 | otfccdump --ignore-hints --quiet $< | node node_modules/otfcc-c2q/_c2q_startup.js | otfccbuild --quiet --short-post --keep-average-char-width -O3 -o $@
277 | build/c2q/NotoSansCJKsc-Black.ttf: src/cjk/NotoSansCJKsc-Black.otf
278 | mkdir -p build/c2q/
279 | otfccdump --ignore-hints --quiet $< | node node_modules/otfcc-c2q/_c2q_startup.js | otfccbuild --quiet --short-post --keep-average-char-width -O3 -o $@
280 | build/c2q/NotoSansCJKsc-Bold.ttf: src/cjk/NotoSansCJKsc-Bold.otf
281 | mkdir -p build/c2q/
282 | otfccdump --ignore-hints --quiet $< | node node_modules/otfcc-c2q/_c2q_startup.js | otfccbuild --quiet --short-post --keep-average-char-width -O3 -o $@
283 | build/c2q/NotoSansCJKsc-Light.ttf: src/cjk/NotoSansCJKsc-Light.otf
284 | mkdir -p build/c2q/
285 | otfccdump --ignore-hints --quiet $< | node node_modules/otfcc-c2q/_c2q_startup.js | otfccbuild --quiet --short-post --keep-average-char-width -O3 -o $@
286 | build/c2q/NotoSansCJKsc-Medium.ttf: src/cjk/NotoSansCJKsc-Medium.otf
287 | mkdir -p build/c2q/
288 | otfccdump --ignore-hints --quiet $< | node node_modules/otfcc-c2q/_c2q_startup.js | otfccbuild --quiet --short-post --keep-average-char-width -O3 -o $@
289 | build/c2q/NotoSansCJKsc-Regular.ttf: src/cjk/NotoSansCJKsc-Regular.otf
290 | mkdir -p build/c2q/
291 | otfccdump --ignore-hints --quiet $< | node node_modules/otfcc-c2q/_c2q_startup.js | otfccbuild --quiet --short-post --keep-average-char-width -O3 -o $@
292 | build/c2q/NotoSansCJKsc-Thin.ttf: src/cjk/NotoSansCJKsc-Thin.otf
293 | mkdir -p build/c2q/
294 | otfccdump --ignore-hints --quiet $< | node node_modules/otfcc-c2q/_c2q_startup.js | otfccbuild --quiet --short-post --keep-average-char-width -O3 -o $@
295 | build/c2q/NotoSansCJKtc-Black.ttf: src/cjk/NotoSansCJKtc-Black.otf
296 | mkdir -p build/c2q/
297 | otfccdump --ignore-hints --quiet $< | node node_modules/otfcc-c2q/_c2q_startup.js | otfccbuild --quiet --short-post --keep-average-char-width -O3 -o $@
298 | build/c2q/NotoSansCJKtc-Bold.ttf: src/cjk/NotoSansCJKtc-Bold.otf
299 | mkdir -p build/c2q/
300 | otfccdump --ignore-hints --quiet $< | node node_modules/otfcc-c2q/_c2q_startup.js | otfccbuild --quiet --short-post --keep-average-char-width -O3 -o $@
301 | build/c2q/NotoSansCJKtc-Light.ttf: src/cjk/NotoSansCJKtc-Light.otf
302 | mkdir -p build/c2q/
303 | otfccdump --ignore-hints --quiet $< | node node_modules/otfcc-c2q/_c2q_startup.js | otfccbuild --quiet --short-post --keep-average-char-width -O3 -o $@
304 | build/c2q/NotoSansCJKtc-Medium.ttf: src/cjk/NotoSansCJKtc-Medium.otf
305 | mkdir -p build/c2q/
306 | otfccdump --ignore-hints --quiet $< | node node_modules/otfcc-c2q/_c2q_startup.js | otfccbuild --quiet --short-post --keep-average-char-width -O3 -o $@
307 | build/c2q/NotoSansCJKtc-Regular.ttf: src/cjk/NotoSansCJKtc-Regular.otf
308 | mkdir -p build/c2q/
309 | otfccdump --ignore-hints --quiet $< | node node_modules/otfcc-c2q/_c2q_startup.js | otfccbuild --quiet --short-post --keep-average-char-width -O3 -o $@
310 | build/c2q/NotoSansCJKtc-Thin.ttf: src/cjk/NotoSansCJKtc-Thin.otf
311 | mkdir -p build/c2q/
312 | otfccdump --ignore-hints --quiet $< | node node_modules/otfcc-c2q/_c2q_startup.js | otfccbuild --quiet --short-post --keep-average-char-width -O3 -o $@
313 | build/c2q/NotoSansMonoCJKhk-Bold.ttf: src/cjk/NotoSansMonoCJKhk-Bold.otf
314 | mkdir -p build/c2q/
315 | otfccdump --ignore-hints --quiet $< | node node_modules/otfcc-c2q/_c2q_startup.js | otfccbuild --quiet --short-post --keep-average-char-width -O3 -o $@
316 | build/c2q/NotoSansMonoCJKhk-Regular.ttf: src/cjk/NotoSansMonoCJKhk-Regular.otf
317 | mkdir -p build/c2q/
318 | otfccdump --ignore-hints --quiet $< | node node_modules/otfcc-c2q/_c2q_startup.js | otfccbuild --quiet --short-post --keep-average-char-width -O3 -o $@
319 | build/c2q/NotoSansMonoCJKjp-Bold.ttf: src/cjk/NotoSansMonoCJKjp-Bold.otf
320 | mkdir -p build/c2q/
321 | otfccdump --ignore-hints --quiet $< | node node_modules/otfcc-c2q/_c2q_startup.js | otfccbuild --quiet --short-post --keep-average-char-width -O3 -o $@
322 | build/c2q/NotoSansMonoCJKjp-Regular.ttf: src/cjk/NotoSansMonoCJKjp-Regular.otf
323 | mkdir -p build/c2q/
324 | otfccdump --ignore-hints --quiet $< | node node_modules/otfcc-c2q/_c2q_startup.js | otfccbuild --quiet --short-post --keep-average-char-width -O3 -o $@
325 | build/c2q/NotoSansMonoCJKkr-Bold.ttf: src/cjk/NotoSansMonoCJKkr-Bold.otf
326 | mkdir -p build/c2q/
327 | otfccdump --ignore-hints --quiet $< | node node_modules/otfcc-c2q/_c2q_startup.js | otfccbuild --quiet --short-post --keep-average-char-width -O3 -o $@
328 | build/c2q/NotoSansMonoCJKkr-Regular.ttf: src/cjk/NotoSansMonoCJKkr-Regular.otf
329 | mkdir -p build/c2q/
330 | otfccdump --ignore-hints --quiet $< | node node_modules/otfcc-c2q/_c2q_startup.js | otfccbuild --quiet --short-post --keep-average-char-width -O3 -o $@
331 | build/c2q/NotoSansMonoCJKsc-Bold.ttf: src/cjk/NotoSansMonoCJKsc-Bold.otf
332 | mkdir -p build/c2q/
333 | otfccdump --ignore-hints --quiet $< | node node_modules/otfcc-c2q/_c2q_startup.js | otfccbuild --quiet --short-post --keep-average-char-width -O3 -o $@
334 | build/c2q/NotoSansMonoCJKsc-Regular.ttf: src/cjk/NotoSansMonoCJKsc-Regular.otf
335 | mkdir -p build/c2q/
336 | otfccdump --ignore-hints --quiet $< | node node_modules/otfcc-c2q/_c2q_startup.js | otfccbuild --quiet --short-post --keep-average-char-width -O3 -o $@
337 | build/c2q/NotoSansMonoCJKtc-Bold.ttf: src/cjk/NotoSansMonoCJKtc-Bold.otf
338 | mkdir -p build/c2q/
339 | otfccdump --ignore-hints --quiet $< | node node_modules/otfcc-c2q/_c2q_startup.js | otfccbuild --quiet --short-post --keep-average-char-width -O3 -o $@
340 | build/c2q/NotoSansMonoCJKtc-Regular.ttf: src/cjk/NotoSansMonoCJKtc-Regular.otf
341 | mkdir -p build/c2q/
342 | otfccdump --ignore-hints --quiet $< | node node_modules/otfcc-c2q/_c2q_startup.js | otfccbuild --quiet --short-post --keep-average-char-width -O3 -o $@
343 | build/c2q/NotoSerifCJKjp-Bold.ttf: src/cjk/NotoSerifCJKjp-Bold.otf
344 | mkdir -p build/c2q/
345 | otfccdump --ignore-hints --quiet $< | node node_modules/otfcc-c2q/_c2q_startup.js | otfccbuild --quiet --short-post --keep-average-char-width -O3 -o $@
346 | build/c2q/NotoSerifCJKjp-Regular.ttf: src/cjk/NotoSerifCJKjp-Regular.otf
347 | mkdir -p build/c2q/
348 | otfccdump --ignore-hints --quiet $< | node node_modules/otfcc-c2q/_c2q_startup.js | otfccbuild --quiet --short-post --keep-average-char-width -O3 -o $@
349 | build/c2q/NotoSerifCJKkr-Bold.ttf: src/cjk/NotoSerifCJKkr-Bold.otf
350 | mkdir -p build/c2q/
351 | otfccdump --ignore-hints --quiet $< | node node_modules/otfcc-c2q/_c2q_startup.js | otfccbuild --quiet --short-post --keep-average-char-width -O3 -o $@
352 | build/c2q/NotoSerifCJKkr-Regular.ttf: src/cjk/NotoSerifCJKkr-Regular.otf
353 | mkdir -p build/c2q/
354 | otfccdump --ignore-hints --quiet $< | node node_modules/otfcc-c2q/_c2q_startup.js | otfccbuild --quiet --short-post --keep-average-char-width -O3 -o $@
355 | build/c2q/NotoSerifCJKsc-Bold.ttf: src/cjk/NotoSerifCJKsc-Bold.otf
356 | mkdir -p build/c2q/
357 | otfccdump --ignore-hints --quiet $< | node node_modules/otfcc-c2q/_c2q_startup.js | otfccbuild --quiet --short-post --keep-average-char-width -O3 -o $@
358 | build/c2q/NotoSerifCJKsc-Regular.ttf: src/cjk/NotoSerifCJKsc-Regular.otf
359 | mkdir -p build/c2q/
360 | otfccdump --ignore-hints --quiet $< | node node_modules/otfcc-c2q/_c2q_startup.js | otfccbuild --quiet --short-post --keep-average-char-width -O3 -o $@
361 | build/c2q/NotoSerifCJKtc-Bold.ttf: src/cjk/NotoSerifCJKtc-Bold.otf
362 | mkdir -p build/c2q/
363 | otfccdump --ignore-hints --quiet $< | node node_modules/otfcc-c2q/_c2q_startup.js | otfccbuild --quiet --short-post --keep-average-char-width -O3 -o $@
364 | build/c2q/NotoSerifCJKtc-Regular.ttf: src/cjk/NotoSerifCJKtc-Regular.otf
365 | mkdir -p build/c2q/
366 | otfccdump --ignore-hints --quiet $< | node node_modules/otfcc-c2q/_c2q_startup.js | otfccbuild --quiet --short-post --keep-average-char-width -O3 -o $@
367 | build/c2q/R.ttf: src/cjk/R.otf
368 | mkdir -p build/c2q/
369 | otfccdump --ignore-hints --quiet $< | node node_modules/otfcc-c2q/_c2q_startup.js | otfccbuild --quiet --short-post --keep-average-char-width -O3 -o $@
370 | build/c2q/S.ttf: src/cjk/S.otf
371 | mkdir -p build/c2q/
372 | otfccdump --ignore-hints --quiet $< | node node_modules/otfcc-c2q/_c2q_startup.js | otfccbuild --quiet --short-post --keep-average-char-width -O3 -o $@
373 | build/c2q/SourceHanSans-Bold.ttf: src/cjk/SourceHanSans-Bold.otf
374 | mkdir -p build/c2q/
375 | otfccdump --ignore-hints --quiet $< | node node_modules/otfcc-c2q/_c2q_startup.js | otfccbuild --quiet --short-post --keep-average-char-width -O3 -o $@
376 | build/c2q/SourceHanSans-ExtraLight.ttf: src/cjk/SourceHanSans-ExtraLight.otf
377 | mkdir -p build/c2q/
378 | otfccdump --ignore-hints --quiet $< | node node_modules/otfcc-c2q/_c2q_startup.js | otfccbuild --quiet --short-post --keep-average-char-width -O3 -o $@
379 | build/c2q/SourceHanSans-Heavy.ttf: src/cjk/SourceHanSans-Heavy.otf
380 | mkdir -p build/c2q/
381 | otfccdump --ignore-hints --quiet $< | node node_modules/otfcc-c2q/_c2q_startup.js | otfccbuild --quiet --short-post --keep-average-char-width -O3 -o $@
382 | build/c2q/SourceHanSans-Light.ttf: src/cjk/SourceHanSans-Light.otf
383 | mkdir -p build/c2q/
384 | otfccdump --ignore-hints --quiet $< | node node_modules/otfcc-c2q/_c2q_startup.js | otfccbuild --quiet --short-post --keep-average-char-width -O3 -o $@
385 | build/c2q/SourceHanSans-Medium.ttf: src/cjk/SourceHanSans-Medium.otf
386 | mkdir -p build/c2q/
387 | otfccdump --ignore-hints --quiet $< | node node_modules/otfcc-c2q/_c2q_startup.js | otfccbuild --quiet --short-post --keep-average-char-width -O3 -o $@
388 | build/c2q/SourceHanSans-Regular.ttf: src/cjk/SourceHanSans-Regular.otf
389 | mkdir -p build/c2q/
390 | otfccdump --ignore-hints --quiet $< | node node_modules/otfcc-c2q/_c2q_startup.js | otfccbuild --quiet --short-post --keep-average-char-width -O3 -o $@
391 | build/c2q/SourceHanSansHC-Bold.ttf: src/cjk/SourceHanSansHC-Bold.otf
392 | mkdir -p build/c2q/
393 | otfccdump --ignore-hints --quiet $< | node node_modules/otfcc-c2q/_c2q_startup.js | otfccbuild --quiet --short-post --keep-average-char-width -O3 -o $@
394 | build/c2q/SourceHanSansHC-ExtraLight.ttf: src/cjk/SourceHanSansHC-ExtraLight.otf
395 | mkdir -p build/c2q/
396 | otfccdump --ignore-hints --quiet $< | node node_modules/otfcc-c2q/_c2q_startup.js | otfccbuild --quiet --short-post --keep-average-char-width -O3 -o $@
397 | build/c2q/SourceHanSansHC-Heavy.ttf: src/cjk/SourceHanSansHC-Heavy.otf
398 | mkdir -p build/c2q/
399 | otfccdump --ignore-hints --quiet $< | node node_modules/otfcc-c2q/_c2q_startup.js | otfccbuild --quiet --short-post --keep-average-char-width -O3 -o $@
400 | build/c2q/SourceHanSansHC-Light.ttf: src/cjk/SourceHanSansHC-Light.otf
401 | mkdir -p build/c2q/
402 | otfccdump --ignore-hints --quiet $< | node node_modules/otfcc-c2q/_c2q_startup.js | otfccbuild --quiet --short-post --keep-average-char-width -O3 -o $@
403 | build/c2q/SourceHanSansHC-Medium.ttf: src/cjk/SourceHanSansHC-Medium.otf
404 | mkdir -p build/c2q/
405 | otfccdump --ignore-hints --quiet $< | node node_modules/otfcc-c2q/_c2q_startup.js | otfccbuild --quiet --short-post --keep-average-char-width -O3 -o $@
406 | build/c2q/SourceHanSansHC-Regular.ttf: src/cjk/SourceHanSansHC-Regular.otf
407 | mkdir -p build/c2q/
408 | otfccdump --ignore-hints --quiet $< | node node_modules/otfcc-c2q/_c2q_startup.js | otfccbuild --quiet --short-post --keep-average-char-width -O3 -o $@
409 | build/c2q/SourceHanSansK-Bold.ttf: src/cjk/SourceHanSansK-Bold.otf
410 | mkdir -p build/c2q/
411 | otfccdump --ignore-hints --quiet $< | node node_modules/otfcc-c2q/_c2q_startup.js | otfccbuild --quiet --short-post --keep-average-char-width -O3 -o $@
412 | build/c2q/SourceHanSansK-ExtraLight.ttf: src/cjk/SourceHanSansK-ExtraLight.otf
413 | mkdir -p build/c2q/
414 | otfccdump --ignore-hints --quiet $< | node node_modules/otfcc-c2q/_c2q_startup.js | otfccbuild --quiet --short-post --keep-average-char-width -O3 -o $@
415 | build/c2q/SourceHanSansK-Heavy.ttf: src/cjk/SourceHanSansK-Heavy.otf
416 | mkdir -p build/c2q/
417 | otfccdump --ignore-hints --quiet $< | node node_modules/otfcc-c2q/_c2q_startup.js | otfccbuild --quiet --short-post --keep-average-char-width -O3 -o $@
418 | build/c2q/SourceHanSansK-Light.ttf: src/cjk/SourceHanSansK-Light.otf
419 | mkdir -p build/c2q/
420 | otfccdump --ignore-hints --quiet $< | node node_modules/otfcc-c2q/_c2q_startup.js | otfccbuild --quiet --short-post --keep-average-char-width -O3 -o $@
421 | build/c2q/SourceHanSansK-Medium.ttf: src/cjk/SourceHanSansK-Medium.otf
422 | mkdir -p build/c2q/
423 | otfccdump --ignore-hints --quiet $< | node node_modules/otfcc-c2q/_c2q_startup.js | otfccbuild --quiet --short-post --keep-average-char-width -O3 -o $@
424 | build/c2q/SourceHanSansK-Regular.ttf: src/cjk/SourceHanSansK-Regular.otf
425 | mkdir -p build/c2q/
426 | otfccdump --ignore-hints --quiet $< | node node_modules/otfcc-c2q/_c2q_startup.js | otfccbuild --quiet --short-post --keep-average-char-width -O3 -o $@
427 | build/c2q/SourceHanSansSC-Bold.ttf: src/cjk/SourceHanSansSC-Bold.otf
428 | mkdir -p build/c2q/
429 | otfccdump --ignore-hints --quiet $< | node node_modules/otfcc-c2q/_c2q_startup.js | otfccbuild --quiet --short-post --keep-average-char-width -O3 -o $@
430 | build/c2q/SourceHanSansSC-ExtraLight.ttf: src/cjk/SourceHanSansSC-ExtraLight.otf
431 | mkdir -p build/c2q/
432 | otfccdump --ignore-hints --quiet $< | node node_modules/otfcc-c2q/_c2q_startup.js | otfccbuild --quiet --short-post --keep-average-char-width -O3 -o $@
433 | build/c2q/SourceHanSansSC-Heavy.ttf: src/cjk/SourceHanSansSC-Heavy.otf
434 | mkdir -p build/c2q/
435 | otfccdump --ignore-hints --quiet $< | node node_modules/otfcc-c2q/_c2q_startup.js | otfccbuild --quiet --short-post --keep-average-char-width -O3 -o $@
436 | build/c2q/SourceHanSansSC-Light.ttf: src/cjk/SourceHanSansSC-Light.otf
437 | mkdir -p build/c2q/
438 | otfccdump --ignore-hints --quiet $< | node node_modules/otfcc-c2q/_c2q_startup.js | otfccbuild --quiet --short-post --keep-average-char-width -O3 -o $@
439 | build/c2q/SourceHanSansSC-Medium.ttf: src/cjk/SourceHanSansSC-Medium.otf
440 | mkdir -p build/c2q/
441 | otfccdump --ignore-hints --quiet $< | node node_modules/otfcc-c2q/_c2q_startup.js | otfccbuild --quiet --short-post --keep-average-char-width -O3 -o $@
442 | build/c2q/SourceHanSansSC-Regular.ttf: src/cjk/SourceHanSansSC-Regular.otf
443 | mkdir -p build/c2q/
444 | otfccdump --ignore-hints --quiet $< | node node_modules/otfcc-c2q/_c2q_startup.js | otfccbuild --quiet --short-post --keep-average-char-width -O3 -o $@
445 | build/c2q/SourceHanSansTC-Bold.ttf: src/cjk/SourceHanSansTC-Bold.otf
446 | mkdir -p build/c2q/
447 | otfccdump --ignore-hints --quiet $< | node node_modules/otfcc-c2q/_c2q_startup.js | otfccbuild --quiet --short-post --keep-average-char-width -O3 -o $@
448 | build/c2q/SourceHanSansTC-ExtraLight.ttf: src/cjk/SourceHanSansTC-ExtraLight.otf
449 | mkdir -p build/c2q/
450 | otfccdump --ignore-hints --quiet $< | node node_modules/otfcc-c2q/_c2q_startup.js | otfccbuild --quiet --short-post --keep-average-char-width -O3 -o $@
451 | build/c2q/SourceHanSansTC-Heavy.ttf: src/cjk/SourceHanSansTC-Heavy.otf
452 | mkdir -p build/c2q/
453 | otfccdump --ignore-hints --quiet $< | node node_modules/otfcc-c2q/_c2q_startup.js | otfccbuild --quiet --short-post --keep-average-char-width -O3 -o $@
454 | build/c2q/SourceHanSansTC-Light.ttf: src/cjk/SourceHanSansTC-Light.otf
455 | mkdir -p build/c2q/
456 | otfccdump --ignore-hints --quiet $< | node node_modules/otfcc-c2q/_c2q_startup.js | otfccbuild --quiet --short-post --keep-average-char-width -O3 -o $@
457 | build/c2q/SourceHanSansTC-Medium.ttf: src/cjk/SourceHanSansTC-Medium.otf
458 | mkdir -p build/c2q/
459 | otfccdump --ignore-hints --quiet $< | node node_modules/otfcc-c2q/_c2q_startup.js | otfccbuild --quiet --short-post --keep-average-char-width -O3 -o $@
460 | build/c2q/SourceHanSansTC-Regular.ttf: src/cjk/SourceHanSansTC-Regular.otf
461 | mkdir -p build/c2q/
462 | otfccdump --ignore-hints --quiet $< | node node_modules/otfcc-c2q/_c2q_startup.js | otfccbuild --quiet --short-post --keep-average-char-width -O3 -o $@
463 | build/c2q/SourceHanSerif-Bold.ttf: src/cjk/SourceHanSerif-Bold.otf
464 | mkdir -p build/c2q/
465 | otfccdump --ignore-hints --quiet $< | node node_modules/otfcc-c2q/_c2q_startup.js | otfccbuild --quiet --short-post --keep-average-char-width -O3 -o $@
466 | build/c2q/SourceHanSerif-Regular.ttf: src/cjk/SourceHanSerif-Regular.otf
467 | mkdir -p build/c2q/
468 | otfccdump --ignore-hints --quiet $< | node node_modules/otfcc-c2q/_c2q_startup.js | otfccbuild --quiet --short-post --keep-average-char-width -O3 -o $@
469 | build/c2q/SourceHanSerifK-Bold.ttf: src/cjk/SourceHanSerifK-Bold.otf
470 | mkdir -p build/c2q/
471 | otfccdump --ignore-hints --quiet $< | node node_modules/otfcc-c2q/_c2q_startup.js | otfccbuild --quiet --short-post --keep-average-char-width -O3 -o $@
472 | build/c2q/SourceHanSerifK-Regular.ttf: src/cjk/SourceHanSerifK-Regular.otf
473 | mkdir -p build/c2q/
474 | otfccdump --ignore-hints --quiet $< | node node_modules/otfcc-c2q/_c2q_startup.js | otfccbuild --quiet --short-post --keep-average-char-width -O3 -o $@
475 | build/c2q/SourceHanSerifSC-Bold.ttf: src/cjk/SourceHanSerifSC-Bold.otf
476 | mkdir -p build/c2q/
477 | otfccdump --ignore-hints --quiet $< | node node_modules/otfcc-c2q/_c2q_startup.js | otfccbuild --quiet --short-post --keep-average-char-width -O3 -o $@
478 | build/c2q/SourceHanSerifSC-Regular.ttf: src/cjk/SourceHanSerifSC-Regular.otf
479 | mkdir -p build/c2q/
480 | otfccdump --ignore-hints --quiet $< | node node_modules/otfcc-c2q/_c2q_startup.js | otfccbuild --quiet --short-post --keep-average-char-width -O3 -o $@
481 | build/c2q/SourceHanSerifTC-Bold.ttf: src/cjk/SourceHanSerifTC-Bold.otf
482 | mkdir -p build/c2q/
483 | otfccdump --ignore-hints --quiet $< | node node_modules/otfcc-c2q/_c2q_startup.js | otfccbuild --quiet --short-post --keep-average-char-width -O3 -o $@
484 | build/c2q/SourceHanSerifTC-Regular.ttf: src/cjk/SourceHanSerifTC-Regular.otf
485 | mkdir -p build/c2q/
486 | otfccdump --ignore-hints --quiet $< | node node_modules/otfcc-c2q/_c2q_startup.js | otfccbuild --quiet --short-post --keep-average-char-width -O3 -o $@
487 | build/c2q/T.ttf: src/cjk/T.otf
488 | mkdir -p build/c2q/
489 | otfccdump --ignore-hints --quiet $< | node node_modules/otfcc-c2q/_c2q_startup.js | otfccbuild --quiet --short-post --keep-average-char-width -O3 -o $@
490 | build/c2q/a.ttf: src/cjk/a.otf
491 | mkdir -p build/c2q/
492 | otfccdump --ignore-hints --quiet $< | node node_modules/otfcc-c2q/_c2q_startup.js | otfccbuild --quiet --short-post --keep-average-char-width -O3 -o $@
493 | build/c2q/c.ttf: src/cjk/c.otf
494 | mkdir -p build/c2q/
495 | otfccdump --ignore-hints --quiet $< | node node_modules/otfcc-c2q/_c2q_startup.js | otfccbuild --quiet --short-post --keep-average-char-width -O3 -o $@
496 | build/c2q/d.ttf: src/cjk/d.otf
497 | mkdir -p build/c2q/
498 | otfccdump --ignore-hints --quiet $< | node node_modules/otfcc-c2q/_c2q_startup.js | otfccbuild --quiet --short-post --keep-average-char-width -O3 -o $@
499 | build/c2q/e.ttf: src/cjk/e.otf
500 | mkdir -p build/c2q/
501 | otfccdump --ignore-hints --quiet $< | node node_modules/otfcc-c2q/_c2q_startup.js | otfccbuild --quiet --short-post --keep-average-char-width -O3 -o $@
502 | build/c2q/f.ttf: src/cjk/f.otf
503 | mkdir -p build/c2q/
504 | otfccdump --ignore-hints --quiet $< | node node_modules/otfcc-c2q/_c2q_startup.js | otfccbuild --quiet --short-post --keep-average-char-width -O3 -o $@
505 | build/c2q/g.ttf: src/cjk/g.otf
506 | mkdir -p build/c2q/
507 | otfccdump --ignore-hints --quiet $< | node node_modules/otfcc-c2q/_c2q_startup.js | otfccbuild --quiet --short-post --keep-average-char-width -O3 -o $@
508 | build/c2q/h.ttf: src/cjk/h.otf
509 | mkdir -p build/c2q/
510 | otfccdump --ignore-hints --quiet $< | node node_modules/otfcc-c2q/_c2q_startup.js | otfccbuild --quiet --short-post --keep-average-char-width -O3 -o $@
511 | build/c2q/i.ttf: src/cjk/i.otf
512 | mkdir -p build/c2q/
513 | otfccdump --ignore-hints --quiet $< | node node_modules/otfcc-c2q/_c2q_startup.js | otfccbuild --quiet --short-post --keep-average-char-width -O3 -o $@
514 | build/c2q/k.ttf: src/cjk/k.otf
515 | mkdir -p build/c2q/
516 | otfccdump --ignore-hints --quiet $< | node node_modules/otfcc-c2q/_c2q_startup.js | otfccbuild --quiet --short-post --keep-average-char-width -O3 -o $@
517 | build/c2q/l.ttf: src/cjk/l.otf
518 | mkdir -p build/c2q/
519 | otfccdump --ignore-hints --quiet $< | node node_modules/otfcc-c2q/_c2q_startup.js | otfccbuild --quiet --short-post --keep-average-char-width -O3 -o $@
520 | build/c2q/m.ttf: src/cjk/m.otf
521 | mkdir -p build/c2q/
522 | otfccdump --ignore-hints --quiet $< | node node_modules/otfcc-c2q/_c2q_startup.js | otfccbuild --quiet --short-post --keep-average-char-width -O3 -o $@
523 | build/c2q/n.ttf: src/cjk/n.otf
524 | mkdir -p build/c2q/
525 | otfccdump --ignore-hints --quiet $< | node node_modules/otfcc-c2q/_c2q_startup.js | otfccbuild --quiet --short-post --keep-average-char-width -O3 -o $@
526 | build/c2q/o.ttf: src/cjk/o.otf
527 | mkdir -p build/c2q/
528 | otfccdump --ignore-hints --quiet $< | node node_modules/otfcc-c2q/_c2q_startup.js | otfccbuild --quiet --short-post --keep-average-char-width -O3 -o $@
529 | build/c2q/r.ttf: src/cjk/r.otf
530 | mkdir -p build/c2q/
531 | otfccdump --ignore-hints --quiet $< | node node_modules/otfcc-c2q/_c2q_startup.js | otfccbuild --quiet --short-post --keep-average-char-width -O3 -o $@
532 | build/c2q/s.ttf: src/cjk/s.otf
533 | mkdir -p build/c2q/
534 | otfccdump --ignore-hints --quiet $< | node node_modules/otfcc-c2q/_c2q_startup.js | otfccbuild --quiet --short-post --keep-average-char-width -O3 -o $@
535 | build/c2q/t.ttf: src/cjk/t.otf
536 | mkdir -p build/c2q/
537 | otfccdump --ignore-hints --quiet $< | node node_modules/otfcc-c2q/_c2q_startup.js | otfccbuild --quiet --short-post --keep-average-char-width -O3 -o $@
538 | build/c2q/u.ttf: src/cjk/u.otf
539 | mkdir -p build/c2q/
540 | otfccdump --ignore-hints --quiet $< | node node_modules/otfcc-c2q/_c2q_startup.js | otfccbuild --quiet --short-post --keep-average-char-width -O3 -o $@
541 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Android CJK Font Completion Generator
2 |
3 | Rebuild Roboto, Roboto Condensed, and Noto Serif with CJK support.
4 |
5 | ## Features
6 |
7 | ### Same metrics as original fonts
8 |
9 | Layouts will not change.
10 |
11 | ### Proportional カナ
12 |
13 | Pre-applied proportional Kana. Follow Noto CJK’s `palt` values.
14 |
15 | ### OpenType layout features
16 |
17 | #### “—” + “—” = “⸺”
18 |
19 | An extra `ccmp` lookup table is added, replacing
20 | + 2 U+2014 _EM DASH_es by U+2E3A _TWO-EM DASH_,
21 | + 3 U+2014 _EM DASH_es by U+2E3B _THREE-EM DASH_,
22 | + 2 U+2015 _HORIZENTAL BAR_s by U+2E3A _TWO-EM DASH_,
23 | + 3 U+2015 _HORIZENTAL BAR_s by U+2E3B _THREE-EM DASH_.
24 |
25 | This feature makes 破折号 (2 × U+2014 or 2 × U+2015 by most IMEs) “unbroken”.
26 |
27 | #### Adaptive regional orthographies
28 |
29 | Localized forms for Chinese characters are inherited from Noto CJK, support following languages by default (supported languages are configurable, see # How to build):
30 | + Chinese (Simplified),
31 | + Chinese (Traditional, Taiwan),
32 | + Chinese (Traditional, Hong Kong & Macau),
33 | + Japanese.
34 |
35 | Android will automatically choose proper glyphs according to system language list.
36 |
37 | #### List of OpenType layout features
38 |
39 | + All OTL features in original Roboto, Roboto Condensed, and Noto Serif are kept:
40 | + kerning pairs,
41 | + ligature,
42 | + glyph compositions,
43 | + style sets,
44 | + small capitals,
45 | + oldstyle and proportional numerals,
46 | + fractions,
47 | + localized forms for Cyrillic script.
48 | + Extra `ccmp` for em dashes, as is mentioned above.
49 | + OTL features inherited from Noto CJK:
50 | + kerning pairs,
51 | + localized forms for Han script,
52 | + glyph compositions for Hangul,
53 | + archaic Hangul syllables (if Korean support enabled).
54 |
55 | ### Noto CJK and Source Han for font-aware apps
56 |
57 | Some apps (like Firefox) are aware of system fonts. In these apps, you can specify a font name like “思源黑体” or “源ノ明朝”, instead of “sans-serif” or “serif”.
58 |
59 | In [gapped TTC](https://github.com/caryll/otfcc-ttcize#options) format, Noto CJK and Source Han families are provided at small cost (~ 40 MiB extra space).
60 |
61 | ## How to build
62 |
63 | ### Dependency
64 |
65 | + Basic Unix utils;
66 | + [Python 3](https://www.python.org/),
67 | + run `git submodule update --init --recursive` to fetch additional modules;
68 | + [fonttools](https://github.com/fonttools/fonttools) or [afdko](https://github.com/adobe-type-tools/afdko);
69 | + [Node.js](https://nodejs.org/),
70 | + run `npm install` to fetch additional modules;
71 | + [otfcc](https://github.com/caryll/otfcc),
72 | + pre-built binaries are also available at [Warcraft Font Merger repo](https://github.com/nowar-fonts/Warcraft-Font-Merger) (`bin-/`).
73 |
74 | ### Prepare CJK source
75 |
76 | Download and put these files (30 + 10 + 8 + 30 + 8 = 86) to `src/cjk/`:
77 | + `NotoSansCJK{jp,kr,sc,tc,hk}-{Thin,Light,Regular,Medium,Bold,Black}`
78 | + `NotoSansMonoCJK{jp,kr,sc,tc,hk}-{Regular,Bold}`
79 | + `NotoSerifCJK{jp,kr,sc,tc}-{Regular,Bold}`
80 | + `SourceHanSans{,K,SC,TC,HC}-{ExtraLight,Light,Regular,Medium,Bold,Heavy}`
81 | + `SourceHanSerif{,K,SC,TC,HC}-{Regular,Bold}`
82 |
83 | ### Configure
84 |
85 | To configure language, edit `configure.py`.
86 |
87 | ```python
88 | class Config:
89 |
90 | # set default language (merge with which CJK family)
91 | defaultLanguage = "sc"
92 |
93 | # keep localized form for these languages
94 | keepLanguage = [ "sc", "tc", "hc", "j" ]
95 | ```
96 |
97 | Available values for `defaultLanguage` and `keepLanguage` are:
98 | + `sc` — Chinese (Simplified),
99 | + `tc` — Chinese (Traditional, Taiwan),
100 | + `hc` — Chinese (Traditional, Hong Kong & Macau),
101 | + `j` — Japanese, and
102 | + `k` — Korean.
103 |
104 | Note:
105 | + Do not specify too many languages to `keepLanguage`. The glyph number in an OpenType font has limit of 65535.
106 | + `keepLanguage` can be an empty list. If so, localized form will be disabled.
107 |
108 | ### Build
109 |
110 | ```bash
111 | python configure.py
112 |
113 | make -j ttf
114 | make -j ttc
115 | ```
116 |
117 | Files would be in `out/ttf` and `out/ttc`.
118 |
--------------------------------------------------------------------------------
/common.py:
--------------------------------------------------------------------------------
1 | import json
2 | import base64
3 |
4 | languageTag = {
5 | "sc": "ZHS ",
6 | "tc": "ZHT ",
7 | "hc": "ZHH ",
8 | "j": "JAN ",
9 | "k": "KOR ",
10 | }
11 |
12 | languageSourceMap = {
13 | "sc": {
14 | "sans": "NotoSansCJKsc",
15 | "serif": "NotoSerifCJKsc",
16 | "mono": "NotoSansMonoCJKsc",
17 | "sourcesans": "SourceHanSansSC",
18 | "sourceserif": "SourceHanSerifSC",
19 | },
20 | "tc": {
21 | "sans": "NotoSansCJKtc",
22 | "serif": "NotoSerifCJKtc",
23 | "mono": "NotoSansMonoCJKtc",
24 | "sourcesans": "SourceHanSansTC",
25 | "sourceserif": "SourceHanSerifTC",
26 | },
27 | "hc": {
28 | "sans": "NotoSansCJKhk",
29 | "serif": "NotoSerifCJKtc",
30 | "mono": "NotoSansMonoCJKhk",
31 | "sourcesans": "SourceHanSansHC",
32 | "sourceserif": "SourceHanSerifTC",
33 | },
34 | "j": {
35 | "sans": "NotoSansCJKjp",
36 | "serif": "NotoSerifCJKjp",
37 | "mono": "NotoSansMonoCJKjp",
38 | "sourcesans": "SourceHanSans",
39 | "sourceserif": "SourceHanSerif",
40 | },
41 | "k": {
42 | "sans": "NotoSansCJKkr",
43 | "serif": "NotoSerifCJKkr",
44 | "mono": "NotoSansMonoCJKkr",
45 | "sourcesans": "SourceHanSansK",
46 | "sourceserif": "SourceHanSerifK",
47 | },
48 | }
49 |
50 | def ParamToArgument(param):
51 | js = json.dumps(param, separators=(',',':'))
52 | b64 = base64.b64encode(js.encode())
53 | return b64.decode()
54 |
55 | def ParamFromArgument(arg):
56 | js = base64.b64decode(arg).decode()
57 | return json.loads(js)
58 |
--------------------------------------------------------------------------------
/configure.py:
--------------------------------------------------------------------------------
1 | import codecs
2 |
3 | from pprint import pprint
4 |
5 | import common
6 |
7 | class Config:
8 | license = "This Font Software is licensed under the SIL Open Font License, Version 1.1. This Font Software is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the SIL Open Font License for the specific language, permissions and limitations governing your use of this Font Software."
9 | licenseUrl = "https://scripts.sil.org/OFL"
10 |
11 | # available values for `defaultLanguage` and `keepLanguage`:
12 | # sc — Simplified Chinese
13 | # tc — Traditional Chinese (Taiwan)
14 | # hc — Traditional Chinese (Hong Kong & Macau)
15 | # j — Japanese
16 | # k — Korean
17 |
18 | # as is named, “default language”
19 | defaultLanguage = "sc"
20 |
21 | # keep these lanuguages in OpenType Layout tables (`GSUB` and `GPOS`)
22 | # Android will choose the proper localized form for these languages
23 | keepLanguage = [ "sc", "tc", "hc", "j" ]
24 |
25 | ttfInstance = {
26 | "Roboto-Thin": {
27 | # "latin" is implicit to "Roboto-Thin"
28 | "cjk": "{}-Thin".format(common.languageSourceMap[defaultLanguage]["sans"]),
29 | # "italize" is implicit to 0 (tangent value of italic angle)
30 | # "condense" is implicit to 1
31 | },
32 | "Roboto-ThinItalic": {
33 | "cjk": "{}-Thin".format(common.languageSourceMap[defaultLanguage]["sans"]),
34 | "italize": 0.1733,
35 | },
36 | "Roboto-Light": {
37 | "cjk": "{}-Light".format(common.languageSourceMap[defaultLanguage]["sans"]),
38 | },
39 | "Roboto-LightItalic": {
40 | "cjk": "{}-Light".format(common.languageSourceMap[defaultLanguage]["sans"]),
41 | "italize": 0.1733,
42 | },
43 | "RobotoCondensed-Light": {
44 | "cjk": "{}-Light".format(common.languageSourceMap[defaultLanguage]["sans"]),
45 | "condense": 0.88,
46 | },
47 | "RobotoCondensed-LightItalic": {
48 | "cjk": "{}-Light".format(common.languageSourceMap[defaultLanguage]["sans"]),
49 | "italize": 0.1733,
50 | "condense": 0.88,
51 | },
52 | "Roboto-Regular": {
53 | "cjk": "{}-Regular".format(common.languageSourceMap[defaultLanguage]["sans"]),
54 | },
55 | "Roboto-Italic": {
56 | "cjk": "{}-Regular".format(common.languageSourceMap[defaultLanguage]["sans"]),
57 | "italize": 0.1733,
58 | },
59 | "RobotoCondensed-Regular": {
60 | "cjk": "{}-Regular".format(common.languageSourceMap[defaultLanguage]["sans"]),
61 | "condense": 0.88,
62 | },
63 | "RobotoCondensed-Italic": {
64 | "cjk": "{}-Regular".format(common.languageSourceMap[defaultLanguage]["sans"]),
65 | "italize": 0.1733,
66 | "condense": 0.88,
67 | },
68 | "Roboto-Medium": {
69 | "cjk": "{}-Medium".format(common.languageSourceMap[defaultLanguage]["sans"]),
70 | },
71 | "Roboto-MediumItalic": {
72 | "cjk": "{}-Medium".format(common.languageSourceMap[defaultLanguage]["sans"]),
73 | "italize": 0.1733,
74 | },
75 | "RobotoCondensed-Medium": {
76 | "cjk": "{}-Medium".format(common.languageSourceMap[defaultLanguage]["sans"]),
77 | "condense": 0.88,
78 | },
79 | "RobotoCondensed-MediumItalic": {
80 | "cjk": "{}-Medium".format(common.languageSourceMap[defaultLanguage]["sans"]),
81 | "italize": 0.1733,
82 | "condense": 0.88,
83 | },
84 | "Roboto-Bold": {
85 | "cjk": "{}-Bold".format(common.languageSourceMap[defaultLanguage]["sans"]),
86 | },
87 | "Roboto-BoldItalic": {
88 | "cjk": "{}-Bold".format(common.languageSourceMap[defaultLanguage]["sans"]),
89 | "italize": 0.1733,
90 | },
91 | "RobotoCondensed-Bold": {
92 | "cjk": "{}-Bold".format(common.languageSourceMap[defaultLanguage]["sans"]),
93 | "condense": 0.88,
94 | },
95 | "RobotoCondensed-BoldItalic": {
96 | "cjk": "{}-Bold".format(common.languageSourceMap[defaultLanguage]["sans"]),
97 | "italize": 0.1733,
98 | "condense": 0.88,
99 | },
100 | "Roboto-Black": {
101 | "cjk": "{}-Black".format(common.languageSourceMap[defaultLanguage]["sans"]),
102 | },
103 | "Roboto-BlackItalic": {
104 | "cjk": "{}-Black".format(common.languageSourceMap[defaultLanguage]["sans"]),
105 | "italize": 0.1733,
106 | },
107 | "NotoSerif-Regular": {
108 | "cjk": "{}-Regular".format(common.languageSourceMap[defaultLanguage]["serif"]),
109 | },
110 | "NotoSerif-Italic": {
111 | "cjk": "{}-Regular".format(common.languageSourceMap[defaultLanguage]["serif"]),
112 | "italize": 0.2125,
113 | },
114 | "NotoSerif-Bold": {
115 | "cjk": "{}-Bold".format(common.languageSourceMap[defaultLanguage]["serif"]),
116 | },
117 | "NotoSerif-BoldItalic": {
118 | "cjk": "{}-Bold".format(common.languageSourceMap[defaultLanguage]["serif"]),
119 | "italize": 0.2125,
120 | },
121 | }
122 |
123 | ttcInstance = {
124 | "Roboto-Thin": [
125 | # font 0 is implicit to "Roboto-Thin",
126 | "{}-Thin".format(common.languageSourceMap["j"]["sans"]),
127 | "{}-Thin".format(common.languageSourceMap["k"]["sans"]),
128 | "{}-Thin".format(common.languageSourceMap["sc"]["sans"]),
129 | "{}-Thin".format(common.languageSourceMap["tc"]["sans"]),
130 | "{}-Thin".format(common.languageSourceMap["hc"]["sans"]),
131 | "{}-ExtraLight".format(common.languageSourceMap["j"]["sourcesans"]),
132 | "{}-ExtraLight".format(common.languageSourceMap["k"]["sourcesans"]),
133 | "{}-ExtraLight".format(common.languageSourceMap["sc"]["sourcesans"]),
134 | "{}-ExtraLight".format(common.languageSourceMap["tc"]["sourcesans"]),
135 | "{}-ExtraLight".format(common.languageSourceMap["hc"]["sourcesans"]),
136 | ],
137 | "Roboto-Light": [
138 | "{}-Light".format(common.languageSourceMap["j"]["sans"]),
139 | "{}-Light".format(common.languageSourceMap["k"]["sans"]),
140 | "{}-Light".format(common.languageSourceMap["sc"]["sans"]),
141 | "{}-Light".format(common.languageSourceMap["tc"]["sans"]),
142 | "{}-Light".format(common.languageSourceMap["hc"]["sans"]),
143 | "{}-Light".format(common.languageSourceMap["j"]["sourcesans"]),
144 | "{}-Light".format(common.languageSourceMap["k"]["sourcesans"]),
145 | "{}-Light".format(common.languageSourceMap["sc"]["sourcesans"]),
146 | "{}-Light".format(common.languageSourceMap["tc"]["sourcesans"]),
147 | "{}-Light".format(common.languageSourceMap["hc"]["sourcesans"]),
148 | ],
149 | "Roboto-Regular": [
150 | "{}-Regular".format(common.languageSourceMap["j"]["sans"]),
151 | "{}-Regular".format(common.languageSourceMap["k"]["sans"]),
152 | "{}-Regular".format(common.languageSourceMap["sc"]["sans"]),
153 | "{}-Regular".format(common.languageSourceMap["tc"]["sans"]),
154 | "{}-Regular".format(common.languageSourceMap["hc"]["sans"]),
155 | "{}-Regular".format(common.languageSourceMap["j"]["mono"]),
156 | "{}-Regular".format(common.languageSourceMap["k"]["mono"]),
157 | "{}-Regular".format(common.languageSourceMap["sc"]["mono"]),
158 | "{}-Regular".format(common.languageSourceMap["tc"]["mono"]),
159 | "{}-Regular".format(common.languageSourceMap["hc"]["mono"]),
160 | "{}-Regular".format(common.languageSourceMap["j"]["sourcesans"]),
161 | "{}-Regular".format(common.languageSourceMap["k"]["sourcesans"]),
162 | "{}-Regular".format(common.languageSourceMap["sc"]["sourcesans"]),
163 | "{}-Regular".format(common.languageSourceMap["tc"]["sourcesans"]),
164 | "{}-Regular".format(common.languageSourceMap["hc"]["sourcesans"]),
165 | ],
166 | "Roboto-Medium": [
167 | "{}-Medium".format(common.languageSourceMap["j"]["sans"]),
168 | "{}-Medium".format(common.languageSourceMap["k"]["sans"]),
169 | "{}-Medium".format(common.languageSourceMap["sc"]["sans"]),
170 | "{}-Medium".format(common.languageSourceMap["tc"]["sans"]),
171 | "{}-Medium".format(common.languageSourceMap["hc"]["sans"]),
172 | "{}-Medium".format(common.languageSourceMap["j"]["sourcesans"]),
173 | "{}-Medium".format(common.languageSourceMap["k"]["sourcesans"]),
174 | "{}-Medium".format(common.languageSourceMap["sc"]["sourcesans"]),
175 | "{}-Medium".format(common.languageSourceMap["tc"]["sourcesans"]),
176 | "{}-Medium".format(common.languageSourceMap["hc"]["sourcesans"]),
177 | ],
178 | "Roboto-Bold": [
179 | "{}-Bold".format(common.languageSourceMap["j"]["sans"]),
180 | "{}-Bold".format(common.languageSourceMap["k"]["sans"]),
181 | "{}-Bold".format(common.languageSourceMap["sc"]["sans"]),
182 | "{}-Bold".format(common.languageSourceMap["tc"]["sans"]),
183 | "{}-Bold".format(common.languageSourceMap["hc"]["sans"]),
184 | "{}-Bold".format(common.languageSourceMap["j"]["mono"]),
185 | "{}-Bold".format(common.languageSourceMap["k"]["mono"]),
186 | "{}-Bold".format(common.languageSourceMap["sc"]["mono"]),
187 | "{}-Bold".format(common.languageSourceMap["tc"]["mono"]),
188 | "{}-Bold".format(common.languageSourceMap["hc"]["mono"]),
189 | "{}-Bold".format(common.languageSourceMap["j"]["sourcesans"]),
190 | "{}-Bold".format(common.languageSourceMap["k"]["sourcesans"]),
191 | "{}-Bold".format(common.languageSourceMap["sc"]["sourcesans"]),
192 | "{}-Bold".format(common.languageSourceMap["tc"]["sourcesans"]),
193 | "{}-Bold".format(common.languageSourceMap["hc"]["sourcesans"]),
194 | ],
195 | "Roboto-Black": [
196 | "{}-Black".format(common.languageSourceMap["j"]["sans"]),
197 | "{}-Black".format(common.languageSourceMap["k"]["sans"]),
198 | "{}-Black".format(common.languageSourceMap["sc"]["sans"]),
199 | "{}-Black".format(common.languageSourceMap["tc"]["sans"]),
200 | "{}-Black".format(common.languageSourceMap["hc"]["sans"]),
201 | "{}-Heavy".format(common.languageSourceMap["j"]["sourcesans"]),
202 | "{}-Heavy".format(common.languageSourceMap["k"]["sourcesans"]),
203 | "{}-Heavy".format(common.languageSourceMap["sc"]["sourcesans"]),
204 | "{}-Heavy".format(common.languageSourceMap["tc"]["sourcesans"]),
205 | "{}-Heavy".format(common.languageSourceMap["hc"]["sourcesans"]),
206 | ],
207 | "NotoSerif-Regular": [
208 | "{}-Regular".format(common.languageSourceMap["j"]["serif"]),
209 | "{}-Regular".format(common.languageSourceMap["k"]["serif"]),
210 | "{}-Regular".format(common.languageSourceMap["sc"]["serif"]),
211 | "{}-Regular".format(common.languageSourceMap["tc"]["serif"]),
212 | "{}-Regular".format(common.languageSourceMap["j"]["sourceserif"]),
213 | "{}-Regular".format(common.languageSourceMap["k"]["sourceserif"]),
214 | "{}-Regular".format(common.languageSourceMap["sc"]["sourceserif"]),
215 | "{}-Regular".format(common.languageSourceMap["tc"]["sourceserif"]),
216 | ],
217 | "NotoSerif-Bold": [
218 | "{}-Bold".format(common.languageSourceMap["j"]["serif"]),
219 | "{}-Bold".format(common.languageSourceMap["k"]["serif"]),
220 | "{}-Bold".format(common.languageSourceMap["sc"]["serif"]),
221 | "{}-Bold".format(common.languageSourceMap["tc"]["serif"]),
222 | "{}-Bold".format(common.languageSourceMap["j"]["sourceserif"]),
223 | "{}-Bold".format(common.languageSourceMap["k"]["sourceserif"]),
224 | "{}-Bold".format(common.languageSourceMap["sc"]["sourceserif"]),
225 | "{}-Bold".format(common.languageSourceMap["tc"]["sourceserif"]),
226 | ],
227 | }
228 |
229 | config = Config()
230 |
231 | if __name__ == "__main__":
232 | makefile = {
233 | 'variable': {},
234 | 'rule': {
235 | '.PHONY': {
236 | 'depend': [ 'all', 'ttc', 'ttf' ],
237 | },
238 | 'all': {
239 | 'depend': [ 'ttc', 'ttf' ],
240 | },
241 | 'clean': {
242 | 'command': [
243 | '-rm -rf build/',
244 | ],
245 | },
246 | 'ttc': {
247 | 'depend': [],
248 | },
249 | 'ttf': {
250 | 'depend': [],
251 | },
252 | },
253 | }
254 |
255 | c2q = set()
256 |
257 | for instance, detail in config.ttcInstance.items():
258 | makefile['rule']['ttc']['depend'].append('out/ttc/{}.ttf'.format(instance))
259 | makefile['rule']['out/ttc/{}.ttf'.format(instance)] = {
260 | 'depend': [ 'build/ttc/{}.ttc'.format(instance), 'src/latin/{}.ttf'.format(instance) ],
261 | 'command': [
262 | 'mkdir -p out/ttc/',
263 | 'python fix-metrics-ttc.py {}'.format(common.ParamToArgument(
264 | {
265 | 'font': 'build/ttc/{}.ttc'.format(instance),
266 | 'reference': 'src/latin/{}.ttf'.format(instance),
267 | 'out': 'out/ttc/{}.ttf'.format(instance)
268 | }
269 | )),
270 | ],
271 | }
272 | makefile['rule']['build/ttc/{}.ttc'.format(instance)] = {
273 | 'depend': [ 'build/ttf/{}.ttf'.format(instance) ] + [ 'build/c2q/{}.ttf'.format(entry) for entry in detail ],
274 | 'command': [
275 | 'mkdir -p build/ttc/',
276 | 'node node_modules/otfcc-ttcize/bin/_startup -x -o $@ $^',
277 | ],
278 | }
279 | c2q.update(detail)
280 |
281 | for instance, detail in config.ttfInstance.items():
282 | makefile['rule']['ttf']['depend'].append('out/ttf/{}.ttf'.format(instance))
283 | makefile['rule']['out/ttf/{}.ttf'.format(instance)] = {
284 | 'depend': [ 'build/ttf/{}.ttf'.format(instance), 'src/latin/{}.ttf'.format(instance) ],
285 | 'command': [
286 | 'mkdir -p out/ttf/',
287 | 'python fix-metrics.py {}'.format(common.ParamToArgument(
288 | {
289 | 'font': 'build/ttf/{}.ttf'.format(instance),
290 | 'reference': 'src/latin/{}.ttf'.format(instance),
291 | 'out': 'out/ttf/{}.ttf'.format(instance)
292 | }
293 | )),
294 | ],
295 | }
296 | makefile['rule']['build/ttf/{}.ttf'.format(instance)] = {
297 | 'depend': [ 'src/latin/{}.ttf'.format(instance), 'build/c2q/{}.ttf'.format(detail['cjk']) ],
298 | 'command': [
299 | 'mkdir -p build/ttf/',
300 | 'python merge.py {}'.format(common.ParamToArgument(
301 | {
302 | 'latin': 'src/latin/{}.ttf'.format(instance),
303 | 'cjk': 'build/c2q/{}.ttf'.format(detail['cjk']),
304 | 'out': 'build/ttf/{}.ttf'.format(instance),
305 | 'italize': detail.get('italize', 0),
306 | 'condense': detail.get('condense', 1),
307 | }
308 | )),
309 | ],
310 | }
311 | c2q.update(detail['cjk'])
312 |
313 | for font in sorted(c2q):
314 | makefile['rule']['build/c2q/{}.ttf'.format(font)] = {
315 | 'depend': [ 'src/cjk/{}.otf'.format(font) ],
316 | 'command': [
317 | 'mkdir -p build/c2q/',
318 | 'otfccdump --ignore-hints --quiet $< | node node_modules/otfcc-c2q/_c2q_startup.js | otfccbuild --quiet --short-post --keep-average-char-width -O3 -o $@',
319 | ],
320 | }
321 |
322 | # dump `makefile` dict to actual “GNU Makefile”
323 | makedump = ""
324 |
325 | for var, val in makefile["variable"].items():
326 | makedump += "{}={}\n".format(var, val)
327 |
328 | for tar, recipe in makefile["rule"].items():
329 | dep = recipe["depend"] if "depend" in recipe else []
330 | makedump += "{}: {}\n".format(tar, " ".join(dep))
331 | com = recipe["command"] if "command" in recipe else []
332 | for c in com:
333 | makedump += "\t{}\n".format(c)
334 |
335 | with codecs.open("Makefile", 'w', 'UTF-8') as mf:
336 | mf.write(makedump)
337 |
--------------------------------------------------------------------------------
/fix-metrics-ttc.py:
--------------------------------------------------------------------------------
1 | import sys
2 | from fontTools.ttLib import TTFont, TTCollection
3 |
4 | import common
5 |
6 | if __name__ == "__main__":
7 | param = common.ParamFromArgument(sys.argv[1])
8 |
9 | ttc = TTCollection(param['font'], recalcBBoxes = False)
10 | font = ttc[0]
11 | del font['vhea']
12 | del font['vmtx']
13 | font_head = font['head']
14 |
15 | ref = TTFont(param['reference'])
16 | ref_head = ref['head']
17 | scale = font_head.unitsPerEm / ref_head.unitsPerEm
18 |
19 | font_head.yMin = round(ref_head.yMin * scale)
20 | font_head.yMax = round(ref_head.yMax * scale)
21 |
22 | ttc.save(param['out'])
23 |
--------------------------------------------------------------------------------
/fix-metrics.py:
--------------------------------------------------------------------------------
1 | import sys
2 | from fontTools.ttLib import TTFont
3 |
4 | import common
5 |
6 | if __name__ == "__main__":
7 | param = common.ParamFromArgument(sys.argv[1])
8 |
9 | font = TTFont(param['font'], recalcBBoxes = False)
10 | del font['vhea']
11 | del font['vmtx']
12 | font_head = font['head']
13 |
14 | ref = TTFont(param['reference'])
15 | ref_head = ref['head']
16 | scale = font_head.unitsPerEm / ref_head.unitsPerEm
17 |
18 | font_head.yMin = round(ref_head.yMin * scale)
19 | font_head.yMax = round(ref_head.yMax * scale)
20 |
21 | font.save(param['out'])
22 |
--------------------------------------------------------------------------------
/merge.py:
--------------------------------------------------------------------------------
1 | import sys
2 | import copy
3 | import json
4 | import codecs
5 | import subprocess
6 |
7 | from libotd.merge import MergeBelow, MergeAbove
8 | from libotd.pkana import ProportionalizeKana
9 | from libotd.gc import RemoveFeature, SubsetLayoutLanguage, Gc
10 | from libotd.rebase import Rebase
11 | from libotd.condense import Condense
12 | from libotd.transform import Transform
13 |
14 | import common
15 | from configure import config
16 |
17 | def GetNameString(font, nameID):
18 | for entry in font['name']:
19 | if entry['nameID'] == nameID and entry['languageID'] == 1033 and entry['platformID'] == 3 and entry['encodingID'] == 1:
20 | return ' ' + entry['nameString']
21 | return ''
22 |
23 | def FixNameTable(latin, cjk):
24 | cjkCopyright = GetNameString(cjk, 0)
25 | for entry in latin['name']:
26 | if entry['nameID'] == 0:
27 | entry['nameString'] += cjkCopyright
28 | elif entry['nameID'] == 13:
29 | entry['nameString'] = config.license
30 | elif entry['nameID'] == 14:
31 | entry['nameString'] = config.licenseUrl
32 |
33 | def AdditionalCcmp(font):
34 | cmap_ = font['cmap']
35 | u2014 = cmap_[str(0x2014)] # EM DASH
36 | u2015 = cmap_[str(0x2015)] # HORIZONTAL BAR
37 | u2E3A = cmap_[str(0x2E3A)] # TWO-EM DASH
38 | u2E3B = cmap_[str(0x2E3B)] # THREE-EM DASH
39 |
40 | gsub_ = font['GSUB']
41 | gsub_['lookups']['lookup_ccmp_1000'] = {
42 | 'type': 'gsub_ligature',
43 | 'flags': {},
44 | 'subtables': [
45 | {
46 | 'substitutions': [
47 | { 'from': [ u2014, u2014, u2014 ], 'to': u2E3B },
48 | { 'from': [ u2014, u2014 ], 'to': u2E3A },
49 | { 'from': [ u2015, u2015, u2015 ], 'to': u2E3B },
50 | { 'from': [ u2015, u2015 ], 'to': u2E3A },
51 | ]
52 | }
53 | ]
54 | }
55 | for f in gsub_['features']:
56 | if f[0:4] != 'ccmp':
57 | continue
58 | gsub_['features'][f].append('lookup_ccmp_1000')
59 | gsub_['lookupOrder'].append('lookup_ccmp_1000')
60 |
61 | def DummyVmtx(font):
62 | font['vhea'] = {
63 | "version": 1.0625,
64 | "ascent": 500,
65 | "descent": -500,
66 | "lineGap": 0,
67 | "advanceHeightMax": 3000,
68 | "minTop": -202,
69 | "minBottom": -677,
70 | "yMaxExtent": 2928,
71 | "caretSlopeRise": 0,
72 | "caretSlopeRun": 1,
73 | "caretOffset": 0,
74 | }
75 | for _, g in font['glyf'].items():
76 | g['advanceHeight'] = 1000
77 | g['verticalOrigin'] = 880
78 |
79 | def ReadFont(filename, prefix):
80 | process = subprocess.Popen(
81 | [ 'otfccdump', '--ignore-hints', '--ugly', '--no-bom', '--quiet', '--glyph-name-prefix', prefix, filename ],
82 | stdout = subprocess.PIPE
83 | )
84 | return json.loads(process.communicate()[0].decode('utf-8', errors = 'replace'))
85 |
86 | def WriteFont(font, filename):
87 | process = subprocess.Popen(
88 | [ 'otfccbuild', '--quiet', '--short-post', '--keep-average-char-width', '-O3', '-o', filename ],
89 | stdin = subprocess.PIPE
90 | )
91 | process.communicate(json.dumps(font, ensure_ascii = False, separators=(',',':')).encode())
92 |
93 | if __name__ == '__main__':
94 | param = common.ParamFromArgument(sys.argv[1])
95 |
96 | latin = ReadFont(param['latin'], 'latn')
97 | cjk = ReadFont(param['cjk'], 'hani')
98 |
99 | if (latin['head']['unitsPerEm'] != 1000):
100 | Rebase(latin, 1000 / latin['head']['unitsPerEm'], roundToInt = True)
101 |
102 | # add dummy vertical metrics, which is requierd in `ttcize` phase
103 | # will be removed in `fix-metrics` phase
104 | DummyVmtx(latin)
105 |
106 | AdditionalCcmp(latin)
107 | ProportionalizeKana(cjk)
108 | if param['italize'] != 0:
109 | for _, g in cjk['glyf'].items():
110 | Transform(g, 1, param['italize'], 0, 1, -50, 0, roundToInt = True)
111 | if param['condense'] != 1:
112 | Condense(cjk, param['condense'], roundToInt = True)
113 |
114 | SubsetLayoutLanguage(cjk['GSUB'], [ common.languageTag[l] for l in config.keepLanguage ] + [ 'DFLT' ])
115 | SubsetLayoutLanguage(cjk['GPOS'], [ common.languageTag[l] for l in config.keepLanguage ] + [ 'DFLT' ])
116 | RemoveFeature(cjk['GSUB'], [ 'pwid', 'fwid', 'hwid', 'twid', 'qwid', 'vert', 'vrt2', 'dlig', 'aalt' ])
117 | RemoveFeature(cjk['GPOS'], [ 'palt', 'halt', 'vert', 'vpal', 'vhal', 'vkrn' ])
118 | if config.defaultLanguage != 'k' and 'k' not in config.keepLanguage:
119 | RemoveFeature(cjk['GSUB'], [ 'ljmo', 'vjmo', 'tjmo' ])
120 | Gc(cjk)
121 |
122 | MergeBelow(latin, cjk)
123 | assert len(latin['glyf']) <= 65535
124 |
125 | WriteFont(latin, param['out'])
126 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "android-cjk",
3 | "dependencies": {
4 | "otfcc-c2q": "=0.7.2",
5 | "otfcc-ttcize": "=0.9.5"
6 | }
7 | }
8 |
--------------------------------------------------------------------------------
/src/cjk/placeholder:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CyanoHao/android-cjk-font-completion-generator/a50ede1a483d90166f9fcb00de32f65a982df328/src/cjk/placeholder
--------------------------------------------------------------------------------
/src/latin/NotoSerif-Bold.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CyanoHao/android-cjk-font-completion-generator/a50ede1a483d90166f9fcb00de32f65a982df328/src/latin/NotoSerif-Bold.ttf
--------------------------------------------------------------------------------
/src/latin/NotoSerif-BoldItalic.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CyanoHao/android-cjk-font-completion-generator/a50ede1a483d90166f9fcb00de32f65a982df328/src/latin/NotoSerif-BoldItalic.ttf
--------------------------------------------------------------------------------
/src/latin/NotoSerif-Italic.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CyanoHao/android-cjk-font-completion-generator/a50ede1a483d90166f9fcb00de32f65a982df328/src/latin/NotoSerif-Italic.ttf
--------------------------------------------------------------------------------
/src/latin/NotoSerif-Regular.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CyanoHao/android-cjk-font-completion-generator/a50ede1a483d90166f9fcb00de32f65a982df328/src/latin/NotoSerif-Regular.ttf
--------------------------------------------------------------------------------
/src/latin/Roboto-Black.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CyanoHao/android-cjk-font-completion-generator/a50ede1a483d90166f9fcb00de32f65a982df328/src/latin/Roboto-Black.ttf
--------------------------------------------------------------------------------
/src/latin/Roboto-BlackItalic.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CyanoHao/android-cjk-font-completion-generator/a50ede1a483d90166f9fcb00de32f65a982df328/src/latin/Roboto-BlackItalic.ttf
--------------------------------------------------------------------------------
/src/latin/Roboto-Bold.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CyanoHao/android-cjk-font-completion-generator/a50ede1a483d90166f9fcb00de32f65a982df328/src/latin/Roboto-Bold.ttf
--------------------------------------------------------------------------------
/src/latin/Roboto-BoldItalic.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CyanoHao/android-cjk-font-completion-generator/a50ede1a483d90166f9fcb00de32f65a982df328/src/latin/Roboto-BoldItalic.ttf
--------------------------------------------------------------------------------
/src/latin/Roboto-Italic.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CyanoHao/android-cjk-font-completion-generator/a50ede1a483d90166f9fcb00de32f65a982df328/src/latin/Roboto-Italic.ttf
--------------------------------------------------------------------------------
/src/latin/Roboto-Light.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CyanoHao/android-cjk-font-completion-generator/a50ede1a483d90166f9fcb00de32f65a982df328/src/latin/Roboto-Light.ttf
--------------------------------------------------------------------------------
/src/latin/Roboto-LightItalic.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CyanoHao/android-cjk-font-completion-generator/a50ede1a483d90166f9fcb00de32f65a982df328/src/latin/Roboto-LightItalic.ttf
--------------------------------------------------------------------------------
/src/latin/Roboto-Medium.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CyanoHao/android-cjk-font-completion-generator/a50ede1a483d90166f9fcb00de32f65a982df328/src/latin/Roboto-Medium.ttf
--------------------------------------------------------------------------------
/src/latin/Roboto-MediumItalic.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CyanoHao/android-cjk-font-completion-generator/a50ede1a483d90166f9fcb00de32f65a982df328/src/latin/Roboto-MediumItalic.ttf
--------------------------------------------------------------------------------
/src/latin/Roboto-Regular.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CyanoHao/android-cjk-font-completion-generator/a50ede1a483d90166f9fcb00de32f65a982df328/src/latin/Roboto-Regular.ttf
--------------------------------------------------------------------------------
/src/latin/Roboto-Thin.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CyanoHao/android-cjk-font-completion-generator/a50ede1a483d90166f9fcb00de32f65a982df328/src/latin/Roboto-Thin.ttf
--------------------------------------------------------------------------------
/src/latin/Roboto-ThinItalic.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CyanoHao/android-cjk-font-completion-generator/a50ede1a483d90166f9fcb00de32f65a982df328/src/latin/Roboto-ThinItalic.ttf
--------------------------------------------------------------------------------
/src/latin/RobotoCondensed-Bold.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CyanoHao/android-cjk-font-completion-generator/a50ede1a483d90166f9fcb00de32f65a982df328/src/latin/RobotoCondensed-Bold.ttf
--------------------------------------------------------------------------------
/src/latin/RobotoCondensed-BoldItalic.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CyanoHao/android-cjk-font-completion-generator/a50ede1a483d90166f9fcb00de32f65a982df328/src/latin/RobotoCondensed-BoldItalic.ttf
--------------------------------------------------------------------------------
/src/latin/RobotoCondensed-Italic.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CyanoHao/android-cjk-font-completion-generator/a50ede1a483d90166f9fcb00de32f65a982df328/src/latin/RobotoCondensed-Italic.ttf
--------------------------------------------------------------------------------
/src/latin/RobotoCondensed-Light.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CyanoHao/android-cjk-font-completion-generator/a50ede1a483d90166f9fcb00de32f65a982df328/src/latin/RobotoCondensed-Light.ttf
--------------------------------------------------------------------------------
/src/latin/RobotoCondensed-LightItalic.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CyanoHao/android-cjk-font-completion-generator/a50ede1a483d90166f9fcb00de32f65a982df328/src/latin/RobotoCondensed-LightItalic.ttf
--------------------------------------------------------------------------------
/src/latin/RobotoCondensed-Medium.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CyanoHao/android-cjk-font-completion-generator/a50ede1a483d90166f9fcb00de32f65a982df328/src/latin/RobotoCondensed-Medium.ttf
--------------------------------------------------------------------------------
/src/latin/RobotoCondensed-MediumItalic.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CyanoHao/android-cjk-font-completion-generator/a50ede1a483d90166f9fcb00de32f65a982df328/src/latin/RobotoCondensed-MediumItalic.ttf
--------------------------------------------------------------------------------
/src/latin/RobotoCondensed-Regular.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CyanoHao/android-cjk-font-completion-generator/a50ede1a483d90166f9fcb00de32f65a982df328/src/latin/RobotoCondensed-Regular.ttf
--------------------------------------------------------------------------------