-
Notifications
You must be signed in to change notification settings - Fork 0
/
ttf.js
115 lines (94 loc) · 2.78 KB
/
ttf.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
const svg2ttf = require("svg2ttf");
const ImageTracer = require("./imagetracer_v1.2.1");
const PNG = require("pngjs").PNG;
const fs = require("graceful-fs"); // EMFILE 에러 해결을 위한 fs 라이브러리
const SVGIcons2SVGFontStream = require("svgicons2svgfont");
const save_dir = "./save_dir";
console.log("\nStart converting into ttf...\n");
let fontStream = new SVGIcons2SVGFontStream({
fontName: "myFont",
});
// 폴더 에러 방지
try {
fs.statSync("svg_font");
} catch (err) {
if (err.code === "ENOENT") {
fs.mkdirSync("svg_font");
}
}
try {
fs.statSync("svgs");
} catch (err) {
if (err.code === "ENOENT") {
fs.mkdirSync("svgs");
}
}
try {
fs.statSync("fonts");
} catch (err) {
if (err.code === "ENOENT") {
fs.mkdirSync("fonts");
}
}
let fileNames = fs.readdirSync(save_dir);
let sources = [];
// 원본 파일 이름으로부터 유니코드명 및 svg 파일 이름 추출
for (let i = 0; i < fileNames.length; i++) {
sources[i] = "0x" + fileNames[i].substring(0, 4);
}
// 각각의 이미지로부터 각각의 SVG 파일 생성
for (let i = 0; i < fileNames.length; i++) {
let j = i;
let data = fs.readFileSync(`${save_dir}/${fileNames[j]}`);
let png = PNG.sync.read(data);
let imageData = {
width: 225,
height: 225,
data: png.data,
};
// 벡터화 옵션 (폰트 스타일)
// 왠진 모르겠는데 옵션이 안 먹힘
let options = {
ltres: 1.0,
qtres: 1.0,
strokewidth: 1.0,
pathomit: 1.0,
blurradius: 1.0,
blurdelta: 1.0,
};
options.pal = [
{ r: 0, g: 0, b: 0, a: 255 },
{ r: 255, g: 255, b: 255, a: 255 },
];
options.linefilter = true;
let svgString = ImageTracer.imagedataToSVG(imageData, options);
fs.writeFileSync(`svgs/${fileNames[j].replace(".png", "")}.svg`, svgString);
console.log(`Made : svgs/${fileNames[j].replace(".png", "")}.svg`);
}
// 폰트 이벤트리스너
fontStream
.pipe(fs.createWriteStream("svg_font/font.svg"))
.on("finish", () => {
let svgdata = fs.readFileSync("svg_font/font.svg", "utf8");
console.log("Changing svg into ttf...");
let ttf = svg2ttf(svgdata, {});
console.log("Writing ttf data into .ttf file...");
fs.writeFileSync("fonts/customfont.ttf", Buffer.from(ttf.buffer));
})
.on("error", (err) => {
console.log(err);
});
// 여러 SVG 파일들을 하나의 SVG 파일로 생성
for (let i = 0; i < sources.length; i++) {
let glyph = fs.createReadStream(
`svgs/${fileNames[i].replace(".png", "")}.svg`
);
glyph.metadata = {
unicode: [String.fromCharCode(sources[i].toString(10))],
name: `glyph${sources[i]}`,
};
console.log(`Writing into svg_font.svg -> ${String.fromCharCode(sources[i].toString(10))}`);
fontStream.write(glyph);
}
fontStream.end();
console.log("\nDone converting into ttf!\n");