@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.
@@ -110,12 +110,19 @@ async function processBackground(bg) {
110
110
  const tilePalette = [];
111
111
  let palettes = [];
112
112
  // first, determine the palettes
113
- for (let y = 0; y < canvas.height; y += 8) {
114
- for (let x = 0; x < canvas.width; x += 8) {
115
- const rawTile = Array.from(ctx.getImageData(x, y, 8, 8).data);
116
- const data15 = convertTileTo15Bit(rawTile);
117
- const palette = (0, palette_1.extractPalette15)(data15, false);
118
- palettes = combinePalettes(palettes.concat([palette]));
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
- export { extractPalette, extractPalette15, getForcedPalette, reduceCanvases, MAGENTA_15 };
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
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@city41/gba-convertpng",
3
- "version": "0.0.26",
3
+ "version": "0.0.28",
4
4
  "description": "Converts png images to GBA tile format",
5
5
  "main": "index.js",
6
6
  "repository": "github.com/city41/gba-convertpng",