-
Notifications
You must be signed in to change notification settings - Fork 0
/
convertSurfaceToStandardPng.js
100 lines (91 loc) · 2.94 KB
/
convertSurfaceToStandardPng.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
// @ts-check
const Jimp = require("jimp");
const fs = require("fs");
const path = require("path");
/**
*
* @param {Buffer} data
* @param {number} index
* @param {{r: number; g: number; b: number, a: number}} color
*/
function isBitmapColorSame(data, index, color) {
return data[index] === color.r && data[index + 1] === color.g && data[index + 2] === color.b;
}
/**
*
* @param {Buffer} data
* @param {number} index
*/
function paintWhite(data, index) {
// eslint-disable-next-line no-param-reassign
data[index] = 255;
// eslint-disable-next-line no-param-reassign
data[index + 1] = 255;
// eslint-disable-next-line no-param-reassign
data[index + 2] = 255;
}
/**
*
* @param {import("jimp")} shell
* @param {import("jimp")} [pna]
*/
async function convertSurfaceDataToStandardPngData(shell, pna) {
const shellData = shell.bitmap.data;
if (pna) {
const pnaData = pna.bitmap.data;
if (pna.bitmap.width !== shell.bitmap.width || pna.bitmap.height !== shell.bitmap.height) {
throw new Error(
`shell size [${shell.bitmap.width}x${shell.bitmap.height}] !== pna size [${pna.bitmap.width}x${pna.bitmap.height}]`,
);
}
shell.scan(0, 0, shell.bitmap.width, shell.bitmap.height, (_x, _y, index) => {
shellData[index + 3] = pnaData[index];
});
}
const transparentTargetColor = Jimp.intToRGBA(shell.getPixelColor(0, 0));
shell.scan(0, 0, shell.bitmap.width, shell.bitmap.height, (_x, _y, index) => {
if (isBitmapColorSame(shellData, index, transparentTargetColor)) {
shellData[index + 3] = 0;
}
if (shellData[index + 3] === 0) paintWhite(shellData, index);
});
}
/**
*
* @param {string} shellPath
*/
async function convertSurfaceToStandardPngData(shellPath) {
if (!fs.existsSync(shellPath)) throw new Error(`Cannot find file [${shellPath}]`);
const shell = await Jimp.read(shellPath);
const pnaPath = shellPath.replace(/\.png$/, ".pna");
const pna = fs.existsSync(pnaPath) ? await Jimp.read(pnaPath) : undefined;
convertSurfaceDataToStandardPngData(shell, pna);
return shell;
}
/**
*
* @param {string} shellPath
* @param {string} destinationPath
*/
async function convertSurfaceToStandardPng(shellPath, destinationPath) {
await (await convertSurfaceToStandardPngData(shellPath)).writeAsync(destinationPath);
}
/**
*
* @param {string} shellDir
* @param {string} destinationDir
*/
function convertSurfacesToStandardPngs(shellDir, destinationDir) {
const filenames = fs.readdirSync(shellDir).filter(f => path.extname(f) === ".png");
return Promise.all(
filenames.map(filename =>
convertSurfaceToStandardPng(path.join(shellDir, filename), path.join(destinationDir, filename)),
),
);
}
module.exports = {
convertSurfaceDataToStandardPngData,
convertSurfaceToStandardPngData,
convertSurfaceToStandardPng,
convertSurfacesToStandardPngs,
};