@city41/gba-convertpng 0.0.26 → 0.0.28
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/background.js +13 -6
- package/dist/main.js +60 -0
- package/dist/palette.d.ts +4 -1
- package/dist/palette.js +25 -0
- package/dist/types.d.ts +11 -0
- package/package.json +1 -1
package/dist/background.js
CHANGED
|
@@ -110,12 +110,19 @@ async function processBackground(bg) {
|
|
|
110
110
|
const tilePalette = [];
|
|
111
111
|
let palettes = [];
|
|
112
112
|
// first, determine the palettes
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
113
|
+
if (bg.forcePalette) {
|
|
114
|
+
const forcedPaletteCanvas = await (0, canvas_1.createCanvasFromPath)(bg.forcePalette);
|
|
115
|
+
canvas = await (0, canvas_1.forceCanvasToPalette)(canvas, forcedPaletteCanvas);
|
|
116
|
+
palettes.push((0, palette_1.getForcedPalette)(forcedPaletteCanvas));
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
for (let y = 0; y < canvas.height; y += 8) {
|
|
120
|
+
for (let x = 0; x < canvas.width; x += 8) {
|
|
121
|
+
const rawTile = Array.from(ctx.getImageData(x, y, 8, 8).data);
|
|
122
|
+
const data15 = convertTileTo15Bit(rawTile);
|
|
123
|
+
const palette = (0, palette_1.extractPalette15)(data15, false);
|
|
124
|
+
palettes = combinePalettes(palettes.concat([palette]));
|
|
125
|
+
}
|
|
119
126
|
}
|
|
120
127
|
}
|
|
121
128
|
// now with palettes in hand, do the rest
|
package/dist/main.js
CHANGED
|
@@ -41,6 +41,7 @@ const background_1 = require("./background");
|
|
|
41
41
|
const c_1 = require("./c");
|
|
42
42
|
const asm_1 = require("./asm");
|
|
43
43
|
const bitmap_1 = require("./bitmap");
|
|
44
|
+
const palette_1 = require("./palette");
|
|
44
45
|
/**
|
|
45
46
|
* Loads the json spec from the file path and converts all file paths
|
|
46
47
|
* inside to absolute paths so the rest of the tool doesn't have to think about it
|
|
@@ -81,6 +82,9 @@ function hydrateJsonSpec(jsonSpecPath) {
|
|
|
81
82
|
return {
|
|
82
83
|
...bg,
|
|
83
84
|
file: path.resolve(rootDir, bg.file),
|
|
85
|
+
forcePalette: bg.forcePalette
|
|
86
|
+
? path.resolve(rootDir, bg.forcePalette)
|
|
87
|
+
: undefined,
|
|
84
88
|
};
|
|
85
89
|
}),
|
|
86
90
|
bitmaps: (initialSpec.bitmaps ?? []).map((bmp) => {
|
|
@@ -89,6 +93,12 @@ function hydrateJsonSpec(jsonSpecPath) {
|
|
|
89
93
|
file: path.resolve(rootDir, bmp.file),
|
|
90
94
|
};
|
|
91
95
|
}),
|
|
96
|
+
palettes: (initialSpec.palettes ?? []).map(p => {
|
|
97
|
+
return {
|
|
98
|
+
...p,
|
|
99
|
+
file: path.resolve(rootDir, p.file)
|
|
100
|
+
};
|
|
101
|
+
})
|
|
92
102
|
};
|
|
93
103
|
}
|
|
94
104
|
function getBitmapDefines(result) {
|
|
@@ -130,6 +140,9 @@ function toSrcFiles(result, format) {
|
|
|
130
140
|
else if ((0, bitmap_1.isProcessBitmapResult)(result)) {
|
|
131
141
|
file = result.bitmap.file;
|
|
132
142
|
}
|
|
143
|
+
else if ((0, palette_1.isProcessPaletteResult)(result)) {
|
|
144
|
+
file = result.palette.file;
|
|
145
|
+
}
|
|
133
146
|
else {
|
|
134
147
|
throw new Error(`toSrcFiles: unexpected object: ${JSON.stringify(result)}`);
|
|
135
148
|
}
|
|
@@ -216,6 +229,48 @@ function toSrcFiles(result, format) {
|
|
|
216
229
|
throw new Error('gba-convertpng does not support "bin"');
|
|
217
230
|
}
|
|
218
231
|
}
|
|
232
|
+
else if ((0, palette_1.isProcessPaletteResult)(result)) {
|
|
233
|
+
switch (format) {
|
|
234
|
+
case "C":
|
|
235
|
+
return {
|
|
236
|
+
tile: [],
|
|
237
|
+
palette: [
|
|
238
|
+
{
|
|
239
|
+
src: (0, c_1.toCc)(result.data, "w", 8, fileRoot + "_palette", fileRoot + ".palette"),
|
|
240
|
+
extension: "c",
|
|
241
|
+
},
|
|
242
|
+
{
|
|
243
|
+
src: (0, c_1.toCh)(result.data, "w", fileRoot + "_palette"),
|
|
244
|
+
extension: "h",
|
|
245
|
+
},
|
|
246
|
+
],
|
|
247
|
+
map: [],
|
|
248
|
+
bitmap: [],
|
|
249
|
+
};
|
|
250
|
+
case "C.inc":
|
|
251
|
+
return {
|
|
252
|
+
tile: [],
|
|
253
|
+
palette: [
|
|
254
|
+
{ src: (0, c_1.toCinc)(result.data, "w", 8), extension: "c.inc" },
|
|
255
|
+
],
|
|
256
|
+
map: [],
|
|
257
|
+
bitmap: [],
|
|
258
|
+
};
|
|
259
|
+
case "asz80":
|
|
260
|
+
case "z80":
|
|
261
|
+
case "pyz80":
|
|
262
|
+
return {
|
|
263
|
+
tile: [],
|
|
264
|
+
palette: [
|
|
265
|
+
{ src: (0, asm_1.toAsm)(result.data, "w", 8, format), extension: "asm" },
|
|
266
|
+
],
|
|
267
|
+
map: [],
|
|
268
|
+
bitmap: [],
|
|
269
|
+
};
|
|
270
|
+
case "bin":
|
|
271
|
+
throw new Error('gba-convertpng does not support "bin"');
|
|
272
|
+
}
|
|
273
|
+
}
|
|
219
274
|
else {
|
|
220
275
|
switch (format) {
|
|
221
276
|
case "C":
|
|
@@ -348,6 +403,11 @@ async function main(jsonSpec) {
|
|
|
348
403
|
const srcFiles = toSrcFiles(processResult, jsonSpec.format);
|
|
349
404
|
await writeFiles(srcFiles, bmp, jsonSpec.outputDir);
|
|
350
405
|
}
|
|
406
|
+
for (const palette of jsonSpec.palettes) {
|
|
407
|
+
const processResult = await (0, palette_1.processPalette)(palette);
|
|
408
|
+
const srcFiles = toSrcFiles(processResult, jsonSpec.format);
|
|
409
|
+
await writeFiles(srcFiles, palette, jsonSpec.outputDir);
|
|
410
|
+
}
|
|
351
411
|
}
|
|
352
412
|
if (require.main === module) {
|
|
353
413
|
const [_tsNode, _convertpng, jsonSpecPath] = process.argv;
|
package/dist/palette.d.ts
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { Canvas } from "canvas";
|
|
2
|
+
import { PaletteSpec, ProcessPaletteResult } from "./types";
|
|
2
3
|
declare const MAGENTA_15: number;
|
|
4
|
+
declare function isProcessPaletteResult(obj: unknown): obj is ProcessPaletteResult;
|
|
3
5
|
declare function getForcedPalette(c: Canvas): number[];
|
|
4
6
|
declare function extractPalette(c: Canvas, pad?: boolean): number[];
|
|
5
7
|
declare function extractPalette15(data15: number[], pad?: boolean): number[];
|
|
@@ -7,4 +9,5 @@ declare function reduceCanvases(canvases: Canvas[]): {
|
|
|
7
9
|
palette: number[];
|
|
8
10
|
canvas: Canvas;
|
|
9
11
|
};
|
|
10
|
-
|
|
12
|
+
declare function processPalette(palette: PaletteSpec): Promise<ProcessPaletteResult>;
|
|
13
|
+
export { processPalette, isProcessPaletteResult, extractPalette, extractPalette15, getForcedPalette, reduceCanvases, MAGENTA_15 };
|
package/dist/palette.js
CHANGED
|
@@ -1,15 +1,26 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.MAGENTA_15 = void 0;
|
|
4
|
+
exports.processPalette = processPalette;
|
|
5
|
+
exports.isProcessPaletteResult = isProcessPaletteResult;
|
|
4
6
|
exports.extractPalette = extractPalette;
|
|
5
7
|
exports.extractPalette15 = extractPalette15;
|
|
6
8
|
exports.getForcedPalette = getForcedPalette;
|
|
7
9
|
exports.reduceCanvases = reduceCanvases;
|
|
8
10
|
const canvas_1 = require("canvas");
|
|
9
11
|
const colors_1 = require("./colors");
|
|
12
|
+
const canvas_2 = require("./canvas");
|
|
10
13
|
const MAGENTA_24 = [255, 0, 255, 255];
|
|
11
14
|
const MAGENTA_15 = (0, colors_1.rgbToGBA15)(255, 0, 255);
|
|
12
15
|
exports.MAGENTA_15 = MAGENTA_15;
|
|
16
|
+
function isProcessPaletteResult(obj) {
|
|
17
|
+
return (obj !== null &&
|
|
18
|
+
typeof obj === "object" &&
|
|
19
|
+
"palette" in obj &&
|
|
20
|
+
typeof obj.palette === "object" &&
|
|
21
|
+
obj.palette !== null &&
|
|
22
|
+
"file" in obj.palette);
|
|
23
|
+
}
|
|
13
24
|
function is24BitMagenta(color) {
|
|
14
25
|
return (color.length === MAGENTA_24.length &&
|
|
15
26
|
color.every((channel, i) => channel === MAGENTA_24[i]));
|
|
@@ -103,4 +114,18 @@ function reduceCanvases(canvases) {
|
|
|
103
114
|
canvas: paletteCanvas,
|
|
104
115
|
};
|
|
105
116
|
}
|
|
117
|
+
async function processPalette(palette) {
|
|
118
|
+
const paletteCanvas = await (0, canvas_2.createCanvasFromPath)(palette.file);
|
|
119
|
+
let paletteData;
|
|
120
|
+
if (palette.forcePalette) {
|
|
121
|
+
paletteData = getForcedPalette(paletteCanvas);
|
|
122
|
+
}
|
|
123
|
+
else {
|
|
124
|
+
paletteData = extractPalette(paletteCanvas, !palette.trimPalette);
|
|
125
|
+
}
|
|
126
|
+
return {
|
|
127
|
+
palette,
|
|
128
|
+
data: paletteData
|
|
129
|
+
};
|
|
130
|
+
}
|
|
106
131
|
//# sourceMappingURL=palette.js.map
|
package/dist/types.d.ts
CHANGED
|
@@ -8,6 +8,11 @@ export type BasicSpriteSpec = {
|
|
|
8
8
|
forcePalette?: string;
|
|
9
9
|
transparentColor?: number;
|
|
10
10
|
};
|
|
11
|
+
export type PaletteSpec = {
|
|
12
|
+
file: string;
|
|
13
|
+
trimPalette?: boolean;
|
|
14
|
+
forcePalette?: boolean;
|
|
15
|
+
};
|
|
11
16
|
export type SharedPaletteSpriteSpec = {
|
|
12
17
|
name: string;
|
|
13
18
|
trimPalette?: boolean;
|
|
@@ -21,6 +26,7 @@ export type BackgroundSpec = {
|
|
|
21
26
|
trimPalette?: boolean;
|
|
22
27
|
transparentColor?: number;
|
|
23
28
|
reduceColors?: boolean;
|
|
29
|
+
forcePalette?: string;
|
|
24
30
|
};
|
|
25
31
|
export type BitmapSpec = {
|
|
26
32
|
file: string;
|
|
@@ -31,6 +37,7 @@ export type ImportedJsonSpec = {
|
|
|
31
37
|
sprites?: SpriteSpec[];
|
|
32
38
|
backgrounds?: BackgroundSpec[];
|
|
33
39
|
bitmaps?: BitmapSpec[];
|
|
40
|
+
palettes?: PaletteSpec[];
|
|
34
41
|
};
|
|
35
42
|
export type JsonSpec = Required<ImportedJsonSpec>;
|
|
36
43
|
export type ProcessBasicSpriteResult = {
|
|
@@ -58,3 +65,7 @@ export type ProcessBitmapResult = {
|
|
|
58
65
|
height: number;
|
|
59
66
|
pixels: number[];
|
|
60
67
|
};
|
|
68
|
+
export type ProcessPaletteResult = {
|
|
69
|
+
palette: PaletteSpec;
|
|
70
|
+
data: number[];
|
|
71
|
+
};
|