├── .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 --------------------------------------------------------------------------------