picopilot 0.1.4 → 0.1.5
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/commands/cart-includes.d.ts +11 -0
- package/dist/commands/cart-includes.d.ts.map +1 -0
- package/dist/commands/cart-includes.js +26 -0
- package/dist/commands/cart-includes.js.map +1 -0
- package/dist/commands/export.d.ts.map +1 -1
- package/dist/commands/export.js +62 -77
- package/dist/commands/export.js.map +1 -1
- package/dist/commands/label-cart.d.ts +72 -0
- package/dist/commands/label-cart.d.ts.map +1 -0
- package/dist/commands/label-cart.js +228 -0
- package/dist/commands/label-cart.js.map +1 -0
- package/dist/commands/playtest.d.ts.map +1 -1
- package/dist/commands/playtest.js +2 -23
- package/dist/commands/playtest.js.map +1 -1
- package/dist/commands/serve.d.ts.map +1 -1
- package/dist/commands/serve.js +61 -10
- package/dist/commands/serve.js.map +1 -1
- package/dist/engine/gfx/label.d.ts +15 -9
- package/dist/engine/gfx/label.d.ts.map +1 -1
- package/dist/engine/gfx/label.js +130 -38
- package/dist/engine/gfx/label.js.map +1 -1
- package/dist/engine/pico8/session-daemon-entry.d.ts +1 -1
- package/dist/engine/pico8/session-daemon-entry.js +1 -1
- package/dist/engine/pico8/session-daemon-main.d.ts +1 -1
- package/dist/engine/pico8/session-daemon-main.js +1 -1
- package/dist/engine/pico8/session-daemon.d.ts +1 -1
- package/dist/engine/pico8/session-daemon.d.ts.map +1 -1
- package/dist/engine/pico8/session-daemon.js +19 -19
- package/dist/engine/pico8/session-daemon.js.map +1 -1
- package/dist/engine/pico8/session.d.ts +1 -1
- package/dist/engine/pico8/session.js +1 -1
- package/dist/engine/pico8/supervisor.d.ts +1 -1
- package/dist/engine/pico8/supervisor.js +1 -1
- package/dist/engine/shrinko/adapter.d.ts +1 -1
- package/package.json +2 -1
- package/src/commands/audio.test.ts +12 -0
- package/src/commands/cart-includes.ts +27 -0
- package/src/commands/export.test.ts +327 -3
- package/src/commands/export.ts +72 -86
- package/src/commands/label-cart.ts +304 -0
- package/src/commands/lint.test.ts +6 -0
- package/src/commands/minify.test.ts +6 -0
- package/src/commands/playtest.test.ts +3 -0
- package/src/commands/playtest.ts +2 -23
- package/src/commands/run.test.ts +6 -0
- package/src/commands/serve.test.ts +138 -2
- package/src/commands/serve.ts +72 -10
- package/src/commands/tokens.test.ts +19 -0
- package/src/commands/verify.test.ts +12 -0
- package/src/engine/gfx/fixtures/pico8-screenshot-384.png +0 -0
- package/src/engine/gfx/label.test.ts +467 -1
- package/src/engine/gfx/label.ts +147 -41
- package/src/engine/pico8/session-daemon-entry.ts +1 -1
- package/src/engine/pico8/session-daemon-main.ts +1 -1
- package/src/engine/pico8/session-daemon.test.ts +32 -1
- package/src/engine/pico8/session-daemon.ts +25 -17
- package/src/engine/pico8/session.test.ts +1 -1
- package/src/engine/pico8/session.ts +1 -1
- package/src/engine/pico8/shell.test.ts +1 -1
- package/src/engine/pico8/supervisor.ts +1 -1
- package/src/engine/shrinko/adapter.ts +1 -1
- package/src/engine/skills/skills.test.ts +10 -0
- package/src/skills/picopilot-debug/SKILL.md +18 -1
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { existsSync, mkdirSync, mkdtempSync, readFileSync, writeFileSync, } from 'node:fs';
|
|
2
2
|
import { tmpdir } from 'node:os';
|
|
3
|
-
import {
|
|
3
|
+
import { isAbsolute, join, resolve } from 'node:path';
|
|
4
4
|
import { Cli as IncurCli, z } from 'incur';
|
|
5
5
|
import { buildDriveHarness, DEFAULT_ACK_TIMEOUT_MS, DEFAULT_IDLE_TIMEOUT_MS, DONE_SENTINEL, DriveError, PICO8_NOT_FOUND_MARKER, parseButtons, parseInputScript, SessionClient, SessionRegistry, sessionExists, SHOT_BASENAME, ShellPico8Adapter, spawnSessionDaemon, } from '../engine/pico8/index.js';
|
|
6
|
+
import { makeReadInclude } from './cart-includes.js';
|
|
6
7
|
const defaultAdapterFactory = (env) => new ShellPico8Adapter({ env });
|
|
7
8
|
/**
|
|
8
9
|
* The default backstop: kill a driven cart that never signals/exits after this
|
|
@@ -18,28 +19,6 @@ const START_POLL_MS = 50;
|
|
|
18
19
|
function resolvePath(p) {
|
|
19
20
|
return isAbsolute(p) ? p : resolve(process.cwd(), p);
|
|
20
21
|
}
|
|
21
|
-
/**
|
|
22
|
-
* A `#include` resolver for the drive-transform, bound to the SOURCE cart's dir:
|
|
23
|
-
* picopilot's standard scaffold is `main.p8` = `#include main.lua`, and the
|
|
24
|
-
* driven cart runs from a throwaway temp dir where `main.lua` is absent, so the
|
|
25
|
-
* transform inlines includes to be self-contained. Reads the included file
|
|
26
|
-
* relative to the cart (absolute paths honoured); returns `undefined` if it
|
|
27
|
-
* cannot be read (the directive is then left verbatim).
|
|
28
|
-
*/
|
|
29
|
-
function makeReadInclude(cartPath) {
|
|
30
|
-
const base = dirname(cartPath);
|
|
31
|
-
return (includePath) => {
|
|
32
|
-
const full = isAbsolute(includePath)
|
|
33
|
-
? includePath
|
|
34
|
-
: join(base, includePath);
|
|
35
|
-
try {
|
|
36
|
-
return readFileSync(full, 'utf8');
|
|
37
|
-
}
|
|
38
|
-
catch {
|
|
39
|
-
return undefined;
|
|
40
|
-
}
|
|
41
|
-
};
|
|
42
|
-
}
|
|
43
22
|
/** A small sleep for the `start` readiness poll. */
|
|
44
23
|
function sleep(ms) {
|
|
45
24
|
return new Promise((r) => setTimeout(r, ms));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"playtest.js","sourceRoot":"","sources":["../../src/commands/playtest.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"playtest.js","sourceRoot":"","sources":["../../src/commands/playtest.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../../src/commands/serve.ts"],"names":[],"mappings":"AAOA,OAAO,EAAe,KAAK,MAAM,EAAC,MAAM,WAAW,CAAC;AAGpD,OAAO,EAAC,KAAK,GAAG,EAAI,MAAM,OAAO,CAAC;AAClC,OAAO,EAEN,KAAK,YAAY,
|
|
1
|
+
{"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../../src/commands/serve.ts"],"names":[],"mappings":"AAOA,OAAO,EAAe,KAAK,MAAM,EAAC,MAAM,WAAW,CAAC;AAGpD,OAAO,EAAC,KAAK,GAAG,EAAI,MAAM,OAAO,CAAC;AAClC,OAAO,EAEN,KAAK,YAAY,EAGjB,MAAM,0BAA0B,CAAC;AAGlC;;;;GAIG;AACH,MAAM,MAAM,mBAAmB,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,UAAU,KAAK,YAAY,CAAC;AAK3E;;;;;GAKG;AACH,MAAM,MAAM,aAAa,GAAG,CAC3B,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,KACR,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAC,CAAC,CAAC;AAiB7C;;;;;;GAMG;AACH,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,EAAE,MAAM,IAAI,KAAK,IAAI,CAAC;AA6E7D;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,aAAa,CAC5B,GAAG,EAAE,GAAG,CAAC,GAAG,EACZ,cAAc,GAAE,mBAA2C,EAC3D,aAAa,GAAE,aAAoC,EACnD,eAAe,GAAE,gBAA0C,GACzD,IAAI,CAwKN"}
|
package/dist/commands/serve.js
CHANGED
|
@@ -4,6 +4,7 @@ import { tmpdir } from 'node:os';
|
|
|
4
4
|
import { extname, isAbsolute, join, normalize, resolve } from 'node:path';
|
|
5
5
|
import { z } from 'incur';
|
|
6
6
|
import { EXPORT_HTML_NAME, ShellPico8Adapter, } from '../engine/pico8/index.js';
|
|
7
|
+
import { prepareLabeledCart } from './label-cart.js';
|
|
7
8
|
const defaultAdapterFactory = (env) => new ShellPico8Adapter({ env });
|
|
8
9
|
const DEFAULT_PORT = 5858;
|
|
9
10
|
const DEFAULT_BACKSTOP_MS = 30_000;
|
|
@@ -121,6 +122,16 @@ export function registerServe(cli, adapterFactory = defaultAdapterFactory, serve
|
|
|
121
122
|
.describe('The .p8 cart to export and serve. Defaults to main.p8 in the current folder.'),
|
|
122
123
|
}),
|
|
123
124
|
options: z.object({
|
|
125
|
+
label: z
|
|
126
|
+
.string()
|
|
127
|
+
.optional()
|
|
128
|
+
.describe('PNG to bake in as the __label__ (the export splash) for a cart that has none: a `run`/`playtest` screenshot as-is, or any 128x128 PNG. The cart itself is not modified. Ignored if the cart already has a label.'),
|
|
129
|
+
labelFrame: z
|
|
130
|
+
.number()
|
|
131
|
+
.int()
|
|
132
|
+
.min(0)
|
|
133
|
+
.optional()
|
|
134
|
+
.describe('Capture the label from the game itself: run the cart headlessly with NO input and use frame N (0-based: 0 = the first drawn frame, usually the title screen) as the __label__. Needs PICO-8; the cart need not cooperate. Exclusive with --label; ignored if the cart already has a label.'),
|
|
124
135
|
port: z
|
|
125
136
|
.number()
|
|
126
137
|
.int()
|
|
@@ -133,7 +144,7 @@ export function registerServe(cli, adapterFactory = defaultAdapterFactory, serve
|
|
|
133
144
|
.int()
|
|
134
145
|
.positive()
|
|
135
146
|
.default(DEFAULT_BACKSTOP_MS)
|
|
136
|
-
.describe('Safety backstop for the export step.'),
|
|
147
|
+
.describe('Safety backstop for the export step (and the --label-frame capture run).'),
|
|
137
148
|
}),
|
|
138
149
|
env: z.object({
|
|
139
150
|
PICO8_PATH: z
|
|
@@ -157,6 +168,16 @@ export function registerServe(cli, adapterFactory = defaultAdapterFactory, serve
|
|
|
157
168
|
args: { cart: 'game.p8' },
|
|
158
169
|
options: { port: 8080 },
|
|
159
170
|
},
|
|
171
|
+
{
|
|
172
|
+
description: 'Serve a labelless cart, using a `run` screenshot as the splash',
|
|
173
|
+
args: { cart: 'game.p8' },
|
|
174
|
+
options: { label: './shots/<name>.png' },
|
|
175
|
+
},
|
|
176
|
+
{
|
|
177
|
+
description: 'Serve a labelless cart, using its title screen (frame 0) as the splash',
|
|
178
|
+
args: { cart: 'game.p8' },
|
|
179
|
+
options: { labelFrame: 0 },
|
|
180
|
+
},
|
|
160
181
|
],
|
|
161
182
|
async run({ args, options, env, error, ok }) {
|
|
162
183
|
const cartPath = isAbsolute(args.cart)
|
|
@@ -169,16 +190,46 @@ export function registerServe(cli, adapterFactory = defaultAdapterFactory, serve
|
|
|
169
190
|
exitCode: 1,
|
|
170
191
|
});
|
|
171
192
|
}
|
|
172
|
-
//
|
|
173
|
-
//
|
|
174
|
-
|
|
193
|
+
// --label / --label-frame: export a labeled throwaway copy (shared with
|
|
194
|
+
// `export`; the cart is never mutated). A bad image or a failed capture
|
|
195
|
+
// fails before anything is exported.
|
|
175
196
|
const adapter = adapterFactory(env);
|
|
176
|
-
const
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
htmlName: EXPORT_HTML_NAME,
|
|
197
|
+
const labeled = await prepareLabeledCart(cartPath, {
|
|
198
|
+
label: options.label,
|
|
199
|
+
labelFrame: options.labelFrame,
|
|
180
200
|
backstopMs: options.backstopMs,
|
|
181
|
-
});
|
|
201
|
+
}, (o) => adapter.drive(o));
|
|
202
|
+
if (!labeled.ok) {
|
|
203
|
+
return error({
|
|
204
|
+
code: labeled.code,
|
|
205
|
+
message: labeled.message,
|
|
206
|
+
exitCode: 1,
|
|
207
|
+
...(labeled.cta ? { cta: labeled.cta } : {}),
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
// Always export first, into an isolated temp dir (never a user path or
|
|
211
|
+
// ~/Desktop). The bundle is the standalone pair the static server plays.
|
|
212
|
+
// The labeled copy (in the user's cart dir) is removed on every path; a
|
|
213
|
+
// throw also reaps the temp dir, since nothing will be served from it.
|
|
214
|
+
let result;
|
|
215
|
+
let serveDir;
|
|
216
|
+
try {
|
|
217
|
+
serveDir = mkdtempSync(join(tmpdir(), 'picopilot-serve-'));
|
|
218
|
+
result = await adapter.export({
|
|
219
|
+
cartPath: labeled.cartPath,
|
|
220
|
+
outDir: serveDir,
|
|
221
|
+
htmlName: EXPORT_HTML_NAME,
|
|
222
|
+
backstopMs: options.backstopMs,
|
|
223
|
+
});
|
|
224
|
+
}
|
|
225
|
+
catch (e) {
|
|
226
|
+
if (serveDir !== undefined)
|
|
227
|
+
removeDir(serveDir);
|
|
228
|
+
throw e;
|
|
229
|
+
}
|
|
230
|
+
finally {
|
|
231
|
+
labeled.cleanup();
|
|
232
|
+
}
|
|
182
233
|
if (!result.ok) {
|
|
183
234
|
// Nothing is being served: remove the temp dir now, not on exit.
|
|
184
235
|
removeDir(serveDir);
|
|
@@ -193,7 +244,7 @@ export function registerServe(cli, adapterFactory = defaultAdapterFactory, serve
|
|
|
193
244
|
return error({
|
|
194
245
|
code: 'export-failed',
|
|
195
246
|
message: result.value.labelWarning
|
|
196
|
-
? 'PICO-8 produced no bundle: this cart has no __label__ (the export splash), which the browser export needs. To just SEE your own build work, use `picopilot run` or `picopilot playtest` (no label needed) instead of serve. If you genuinely want a browser build to SHARE,
|
|
247
|
+
? 'PICO-8 produced no bundle: this cart has no __label__ (the export splash), which the browser export needs. To just SEE your own build work, use `picopilot run` or `picopilot playtest` (no label needed) instead of serve. If you genuinely want a browser build to SHARE, give it a splash: `picopilot serve <cart> --label-frame 0` captures the title screen for you, or `picopilot serve <cart> --label <screenshot.png>` takes any path `run`/`playtest` lists under `screenshots` as-is (do NOT hand-edit main.p8).'
|
|
197
248
|
: 'PICO-8 produced no export bundle. Check the cart runs without a boot error (via `picopilot run`).',
|
|
198
249
|
exitCode: 1,
|
|
199
250
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"serve.js","sourceRoot":"","sources":["../../src/commands/serve.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,gBAAgB,EAChB,UAAU,EACV,WAAW,EACX,MAAM,EACN,QAAQ,GACR,MAAM,SAAS,CAAC;AACjB,OAAO,EAAC,YAAY,EAAc,MAAM,WAAW,CAAC;AACpD,OAAO,EAAC,MAAM,EAAC,MAAM,SAAS,CAAC;AAC/B,OAAO,EAAC,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAC,MAAM,WAAW,CAAC;AACxE,OAAO,EAAW,CAAC,EAAC,MAAM,OAAO,CAAC;AAClC,OAAO,EACN,gBAAgB,
|
|
1
|
+
{"version":3,"file":"serve.js","sourceRoot":"","sources":["../../src/commands/serve.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,gBAAgB,EAChB,UAAU,EACV,WAAW,EACX,MAAM,EACN,QAAQ,GACR,MAAM,SAAS,CAAC;AACjB,OAAO,EAAC,YAAY,EAAc,MAAM,WAAW,CAAC;AACpD,OAAO,EAAC,MAAM,EAAC,MAAM,SAAS,CAAC;AAC/B,OAAO,EAAC,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAC,MAAM,WAAW,CAAC;AACxE,OAAO,EAAW,CAAC,EAAC,MAAM,OAAO,CAAC;AAClC,OAAO,EACN,gBAAgB,EAGhB,iBAAiB,GACjB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAC,kBAAkB,EAAC,MAAM,iBAAiB,CAAC;AASnD,MAAM,qBAAqB,GAAwB,CAAC,GAAG,EAAE,EAAE,CAC1D,IAAI,iBAAiB,CAAC,EAAC,GAAG,EAAC,CAAC,CAAC;AAa9B,MAAM,YAAY,GAAG,IAAI,CAAC;AAC1B,MAAM,mBAAmB,GAAG,MAAM,CAAC;AAEnC;;;GAGG;AACH,SAAS,SAAS,CAAC,GAAW;IAC7B,IAAI,CAAC;QACJ,MAAM,CAAC,GAAG,EAAE,EAAC,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAC,CAAC,CAAC;IAC7C,CAAC;IAAC,MAAM,CAAC;QACR,gEAAgE;IACjE,CAAC;AACF,CAAC;AAWD,MAAM,uBAAuB,GAAqB,CAAC,OAAO,EAAE,EAAE;IAC7D,IAAI,IAAI,GAAG,KAAK,CAAC;IACjB,MAAM,IAAI,GAAG,GAAS,EAAE;QACvB,IAAI,IAAI;YAAE,OAAO;QACjB,IAAI,GAAG,IAAI,CAAC;QACZ,OAAO,EAAE,CAAC;IACX,CAAC,CAAC;IACF,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC3B,gFAAgF;IAChF,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE;QAC3B,IAAI,EAAE,CAAC;QACP,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACnB,CAAC,CAAC,CAAC;IACH,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE;QAC5B,IAAI,EAAE,CAAC;QACP,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACnB,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC;AAEF,sFAAsF;AACtF,MAAM,IAAI,GAA2B;IACpC,OAAO,EAAE,0BAA0B;IACnC,KAAK,EAAE,gCAAgC;IACvC,OAAO,EAAE,kBAAkB;IAC3B,MAAM,EAAE,WAAW;IACnB,OAAO,EAAE,iCAAiC;IAC1C,MAAM,EAAE,yBAAyB;CACjC,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,oBAAoB,GAAkB,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,CAC7D,IAAI,OAAO,CAAC,CAAC,cAAc,EAAE,MAAM,EAAE,EAAE;IACtC,MAAM,MAAM,GAAG,YAAY,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;QACxC,MAAM,OAAO,GAAG,kBAAkB,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC;QACpE,wEAAwE;QACxE,0CAA0C;QAC1C,MAAM,GAAG,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC;QAC5D,IAAI,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QAClC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YACnC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;YACpC,OAAO;QACR,CAAC;QACD,IAAI,CAAC;YACJ,IAAI,UAAU,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;gBAC9D,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;YACzC,CAAC;YACD,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC3B,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;gBACpC,OAAO;YACR,CAAC;YACD,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE;gBAClB,cAAc,EACb,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC,IAAI,0BAA0B;aACpE,CAAC,CAAC;YACH,gBAAgB,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACtC,CAAC;QAAC,MAAM,CAAC;YACR,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QACxC,CAAC;IACF,CAAC,CAAC,CAAC;IACH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC3B,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE;QACrC,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;QAC9B,MAAM,KAAK,GACV,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;QAC9D,cAAc,CAAC,EAAC,MAAM,EAAE,IAAI,EAAE,KAAK,EAAC,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC;AAEJ;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,UAAU,aAAa,CAC5B,GAAY,EACZ,iBAAsC,qBAAqB,EAC3D,gBAA+B,oBAAoB,EACnD,kBAAoC,uBAAuB;IAE3D,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE;QACpB,WAAW,EACV,2RAA2R;QAC5R,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;YACd,IAAI,EAAE,CAAC;iBACL,MAAM,EAAE;iBACR,OAAO,CAAC,SAAS,CAAC;iBAClB,QAAQ,CACR,8EAA8E,CAC9E;SACF,CAAC;QACF,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC;YACjB,KAAK,EAAE,CAAC;iBACN,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CACR,kNAAkN,CAClN;YACF,UAAU,EAAE,CAAC;iBACX,MAAM,EAAE;iBACR,GAAG,EAAE;iBACL,GAAG,CAAC,CAAC,CAAC;iBACN,QAAQ,EAAE;iBACV,QAAQ,CACR,4RAA4R,CAC5R;YACF,IAAI,EAAE,CAAC;iBACL,MAAM,EAAE;iBACR,GAAG,EAAE;iBACL,GAAG,CAAC,CAAC,CAAC;iBACN,GAAG,CAAC,KAAK,CAAC;iBACV,OAAO,CAAC,YAAY,CAAC;iBACrB,QAAQ,CAAC,kDAAkD,CAAC;YAC9D,UAAU,EAAE,CAAC;iBACX,MAAM,EAAE;iBACR,GAAG,EAAE;iBACL,QAAQ,EAAE;iBACV,OAAO,CAAC,mBAAmB,CAAC;iBAC5B,QAAQ,CACR,0EAA0E,CAC1E;SACF,CAAC;QACF,GAAG,EAAE,CAAC,CAAC,MAAM,CAAC;YACb,UAAU,EAAE,CAAC;iBACX,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,4DAA4D,CAAC;YACxE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC;SAC/D,CAAC;QACF,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;YAChB,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,qCAAqC,CAAC;YAC/D,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,+BAA+B,CAAC;YAC1D,QAAQ,EAAE,CAAC;iBACT,MAAM,EAAE;iBACR,QAAQ,CAAC,iDAAiD,CAAC;SAC7D,CAAC;QACF,QAAQ,EAAE;YACT,EAAC,WAAW,EAAE,0BAA0B,EAAC;YACzC,EAAC,WAAW,EAAE,uBAAuB,EAAE,IAAI,EAAE,EAAC,IAAI,EAAE,SAAS,EAAC,EAAC;YAC/D;gBACC,WAAW,EAAE,wBAAwB;gBACrC,IAAI,EAAE,EAAC,IAAI,EAAE,SAAS,EAAC;gBACvB,OAAO,EAAE,EAAC,IAAI,EAAE,IAAI,EAAC;aACrB;YACD;gBACC,WAAW,EACV,gEAAgE;gBACjE,IAAI,EAAE,EAAC,IAAI,EAAE,SAAS,EAAC;gBACvB,OAAO,EAAE,EAAC,KAAK,EAAE,oBAAoB,EAAC;aACtC;YACD;gBACC,WAAW,EACV,wEAAwE;gBACzE,IAAI,EAAE,EAAC,IAAI,EAAE,SAAS,EAAC;gBACvB,OAAO,EAAE,EAAC,UAAU,EAAE,CAAC,EAAC;aACxB;SACD;QACD,KAAK,CAAC,GAAG,CAAC,EAAC,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAC;YACxC,MAAM,QAAQ,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC;gBACrC,CAAC,CAAC,IAAI,CAAC,IAAI;gBACX,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YAErC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC3B,OAAO,KAAK,CAAC;oBACZ,IAAI,EAAE,gBAAgB;oBACtB,OAAO,EAAE,cAAc,QAAQ,EAAE;oBACjC,QAAQ,EAAE,CAAC;iBACX,CAAC,CAAC;YACJ,CAAC;YAED,wEAAwE;YACxE,wEAAwE;YACxE,qCAAqC;YACrC,MAAM,OAAO,GAAG,cAAc,CAAC,GAAwB,CAAC,CAAC;YACzD,MAAM,OAAO,GAAG,MAAM,kBAAkB,CACvC,QAAQ,EACR;gBACC,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,UAAU,EAAE,OAAO,CAAC,UAAU;gBAC9B,UAAU,EAAE,OAAO,CAAC,UAAU;aAC9B,EACD,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CACvB,CAAC;YACF,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC;gBACjB,OAAO,KAAK,CAAC;oBACZ,IAAI,EAAE,OAAO,CAAC,IAAI;oBAClB,OAAO,EAAE,OAAO,CAAC,OAAO;oBACxB,QAAQ,EAAE,CAAC;oBACX,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAC,GAAG,EAAE,OAAO,CAAC,GAAG,EAAC,CAAC,CAAC,CAAC,EAAE,CAAC;iBAC1C,CAAC,CAAC;YACJ,CAAC;YAED,uEAAuE;YACvE,yEAAyE;YACzE,wEAAwE;YACxE,uEAAuE;YACvE,IAAI,MAAyB,CAAC;YAC9B,IAAI,QAA4B,CAAC;YACjC,IAAI,CAAC;gBACJ,QAAQ,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,kBAAkB,CAAC,CAAC,CAAC;gBAC3D,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC;oBAC7B,QAAQ,EAAE,OAAO,CAAC,QAAQ;oBAC1B,MAAM,EAAE,QAAQ;oBAChB,QAAQ,EAAE,gBAAgB;oBAC1B,UAAU,EAAE,OAAO,CAAC,UAAU;iBAC9B,CAAC,CAAC;YACJ,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACZ,IAAI,QAAQ,KAAK,SAAS;oBAAE,SAAS,CAAC,QAAQ,CAAC,CAAC;gBAChD,MAAM,CAAC,CAAC;YACT,CAAC;oBAAS,CAAC;gBACV,OAAO,CAAC,OAAO,EAAE,CAAC;YACnB,CAAC;YAED,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;gBAChB,iEAAiE;gBACjE,SAAS,CAAC,QAAQ,CAAC,CAAC;gBACpB,OAAO,KAAK,CAAC;oBACZ,IAAI,EAAE,MAAM,CAAC,MAAM;oBACnB,OAAO,EAAE,4BAA4B,MAAM,CAAC,MAAM,YAAY,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;oBACxF,QAAQ,EAAE,CAAC;iBACX,CAAC,CAAC;YACJ,CAAC;YAED,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;gBACvC,SAAS,CAAC,QAAQ,CAAC,CAAC;gBACpB,OAAO,KAAK,CAAC;oBACZ,IAAI,EAAE,eAAe;oBACrB,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,YAAY;wBACjC,CAAC,CAAC,4fAA4f;wBAC9f,CAAC,CAAC,mGAAmG;oBACtG,QAAQ,EAAE,CAAC;iBACX,CAAC,CAAC;YACJ,CAAC;YAED,MAAM,EAAC,MAAM,EAAE,IAAI,EAAC,GAAG,MAAM,aAAa,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;YACnE,MAAM,GAAG,GAAG,oBAAoB,IAAI,GAAG,CAAC;YAExC,4EAA4E;YAC5E,yEAAyE;YACzE,yEAAyE;YACzE,kCAAkC;YAClC,eAAe,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC;YAC3C,KAAK,MAAM,CAAC;YAEZ,OAAO,EAAE,CAAC,EAAC,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAC,CAAC,CAAC;QAClC,CAAC;KACD,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* The `__label__` builder: turn a 128x128 image
|
|
2
|
+
* The `__label__` builder: turn a 128x128 image (or a PICO-8 screenshot, an
|
|
3
|
+
* integer upscale of one) into the hex a `.p8` cart's
|
|
3
4
|
* label section holds, so `picopilot export --label <png>` can give a labelless
|
|
4
5
|
* cart a loading splash WITHOUT an interactive PICO-8 (F7) capture.
|
|
5
6
|
*
|
|
@@ -9,10 +10,13 @@
|
|
|
9
10
|
* palette colour, and emits that hex. It is the inverse direction of the
|
|
10
11
|
* palette-accurate PNG RENDER in `render.ts`/`png.ts` (which goes indices -> RGB).
|
|
11
12
|
*
|
|
12
|
-
* It
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
13
|
+
* It accepts what a caller realistically hands it: a PICO-8 screenshot exactly as
|
|
14
|
+
* `picopilot run`/`playtest` captured it (384x384 8-bit RGB by default; any
|
|
15
|
+
* square integer multiple of 128 is sampled back down), or a 128x128 image from
|
|
16
|
+
* any tool, including palette-indexed (1/2/4/8-bit, the form image tools write
|
|
17
|
+
* when shrinking a screenshot) and greyscale PNGs. Interlaced PNGs, sizes that
|
|
18
|
+
* are not a square multiple of 128, and malformed files are rejected, loud, with
|
|
19
|
+
* a structured {@link LabelError}.
|
|
16
20
|
*/
|
|
17
21
|
/** The fixed PICO-8 label dimensions: a 128x128 image. */
|
|
18
22
|
export declare const LABEL_SIZE = 128;
|
|
@@ -25,10 +29,12 @@ export declare class LabelError extends Error {
|
|
|
25
29
|
export declare function nearestPaletteIndex(r: number, g: number, b: number): number;
|
|
26
30
|
/**
|
|
27
31
|
* Builds the `__label__` hex body (128 rows of 128 nibbles, newline-joined, with
|
|
28
|
-
* a trailing newline) from a
|
|
29
|
-
*
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
+
* a trailing newline) from a PNG. Each pixel is mapped to its nearest PICO-8
|
|
33
|
+
* palette colour. The PNG must be 128x128 ({@link LABEL_SIZE}) or an exact square
|
|
34
|
+
* integer multiple of it (256x256, 384x384, ...: a PICO-8 screenshot), which is
|
|
35
|
+
* downscaled by nearest-neighbour sampling (the centre of each `k x k` block).
|
|
36
|
+
* Any other size is a {@link LabelError} (`wrong-size`) so a mis-sized image
|
|
37
|
+
* fails loud instead of being silently cropped or stretched.
|
|
32
38
|
*/
|
|
33
39
|
export declare function labelHexFromPng(pngBytes: Uint8Array): string;
|
|
34
40
|
//# sourceMappingURL=label.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"label.d.ts","sourceRoot":"","sources":["../../../src/engine/gfx/label.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"label.d.ts","sourceRoot":"","sources":["../../../src/engine/gfx/label.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAKH,0DAA0D;AAC1D,eAAO,MAAM,UAAU,MAAM,CAAC;AAE9B,kFAAkF;AAClF,qBAAa,UAAW,SAAQ,KAAK;IAEnC,QAAQ,CAAC,IAAI,EACZ,WAAW,GAAG,iBAAiB,GAAG,YAAY,GAAG,eAAe;gBADxD,IAAI,EACZ,WAAW,GAAG,iBAAiB,GAAG,YAAY,GAAG,eAAe,EACjE,OAAO,EAAE,MAAM;CAKhB;AAwOD,oFAAoF;AACpF,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAe3E;AAkBD;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,UAAU,GAAG,MAAM,CAsB5D"}
|
package/dist/engine/gfx/label.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* The `__label__` builder: turn a 128x128 image
|
|
2
|
+
* The `__label__` builder: turn a 128x128 image (or a PICO-8 screenshot, an
|
|
3
|
+
* integer upscale of one) into the hex a `.p8` cart's
|
|
3
4
|
* label section holds, so `picopilot export --label <png>` can give a labelless
|
|
4
5
|
* cart a loading splash WITHOUT an interactive PICO-8 (F7) capture.
|
|
5
6
|
*
|
|
@@ -9,10 +10,13 @@
|
|
|
9
10
|
* palette colour, and emits that hex. It is the inverse direction of the
|
|
10
11
|
* palette-accurate PNG RENDER in `render.ts`/`png.ts` (which goes indices -> RGB).
|
|
11
12
|
*
|
|
12
|
-
* It
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
13
|
+
* It accepts what a caller realistically hands it: a PICO-8 screenshot exactly as
|
|
14
|
+
* `picopilot run`/`playtest` captured it (384x384 8-bit RGB by default; any
|
|
15
|
+
* square integer multiple of 128 is sampled back down), or a 128x128 image from
|
|
16
|
+
* any tool, including palette-indexed (1/2/4/8-bit, the form image tools write
|
|
17
|
+
* when shrinking a screenshot) and greyscale PNGs. Interlaced PNGs, sizes that
|
|
18
|
+
* are not a square multiple of 128, and malformed files are rejected, loud, with
|
|
19
|
+
* a structured {@link LabelError}.
|
|
16
20
|
*/
|
|
17
21
|
import { inflateSync } from 'node:zlib';
|
|
18
22
|
import { PICO8_PALETTE } from './palette.js';
|
|
@@ -28,12 +32,32 @@ export class LabelError extends Error {
|
|
|
28
32
|
}
|
|
29
33
|
}
|
|
30
34
|
const PNG_SIGNATURE = [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a];
|
|
35
|
+
/** Samples per pixel for each PNG colour type we decode. */
|
|
36
|
+
const CHANNELS = {
|
|
37
|
+
0: 1, // greyscale
|
|
38
|
+
2: 3, // RGB
|
|
39
|
+
3: 1, // palette index
|
|
40
|
+
4: 2, // greyscale + alpha
|
|
41
|
+
6: 4, // RGBA
|
|
42
|
+
};
|
|
43
|
+
/** The bit depths the PNG spec allows per colour type. */
|
|
44
|
+
const ALLOWED_DEPTHS = {
|
|
45
|
+
0: [1, 2, 4, 8, 16],
|
|
46
|
+
2: [8, 16],
|
|
47
|
+
3: [1, 2, 4, 8],
|
|
48
|
+
4: [8, 16],
|
|
49
|
+
6: [8, 16],
|
|
50
|
+
};
|
|
31
51
|
/**
|
|
32
|
-
* Decodes
|
|
52
|
+
* Decodes a non-interlaced PNG of any standard colour type and bit depth to
|
|
53
|
+
* RGBA: truecolour (2) and truecolour+alpha (6) at 8/16 bits, palette-indexed (3)
|
|
54
|
+
* at 1/2/4/8 bits via its PLTE chunk, and greyscale (0) / greyscale+alpha (4).
|
|
33
55
|
* Uses `node:zlib` inflate for the IDAT stream and applies the five PNG scanline
|
|
34
|
-
* filters.
|
|
56
|
+
* filters. `checkSize` runs on the IHDR dimensions before any pixel work. 16-bit samples keep their high byte (a label is quantised to 16
|
|
57
|
+
* colours anyway). Interlaced (Adam7) PNGs are rejected: PICO-8 never writes them.
|
|
58
|
+
* Throws {@link LabelError} for anything outside this set.
|
|
35
59
|
*/
|
|
36
|
-
function decodePng(bytes) {
|
|
60
|
+
function decodePng(bytes, checkSize = () => { }) {
|
|
37
61
|
for (let i = 0; i < PNG_SIGNATURE.length; i++) {
|
|
38
62
|
if (bytes[i] !== PNG_SIGNATURE[i]) {
|
|
39
63
|
throw new LabelError('not-a-png', 'not a PNG file (bad signature)');
|
|
@@ -45,6 +69,7 @@ function decodePng(bytes) {
|
|
|
45
69
|
let bitDepth = 0;
|
|
46
70
|
let colourType = 0;
|
|
47
71
|
let interlace = 0;
|
|
72
|
+
let palette;
|
|
48
73
|
const idat = [];
|
|
49
74
|
const readU32 = (p) => ((bytes[p] << 24) |
|
|
50
75
|
(bytes[p + 1] << 16) |
|
|
@@ -66,6 +91,9 @@ function decodePng(bytes) {
|
|
|
66
91
|
colourType = bytes[dataStart + 9];
|
|
67
92
|
interlace = bytes[dataStart + 12];
|
|
68
93
|
}
|
|
94
|
+
else if (type === 'PLTE') {
|
|
95
|
+
palette = bytes.subarray(dataStart, dataEnd);
|
|
96
|
+
}
|
|
69
97
|
else if (type === 'IDAT') {
|
|
70
98
|
idat.push(bytes.subarray(dataStart, dataEnd));
|
|
71
99
|
}
|
|
@@ -74,12 +102,18 @@ function decodePng(bytes) {
|
|
|
74
102
|
}
|
|
75
103
|
off = dataEnd + 4; // skip the 4-byte CRC
|
|
76
104
|
}
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
(
|
|
80
|
-
|
|
105
|
+
const channels = CHANNELS[colourType];
|
|
106
|
+
if (channels === undefined ||
|
|
107
|
+
!ALLOWED_DEPTHS[colourType].includes(bitDepth) ||
|
|
108
|
+
interlace !== 0) {
|
|
109
|
+
throw new LabelError('unsupported-png', `unsupported PNG: need a non-interlaced greyscale, RGB, RGBA or palette-indexed image (got bitDepth=${bitDepth}, colourType=${colourType}, interlace=${interlace})`);
|
|
110
|
+
}
|
|
111
|
+
if (colourType === 3 && (palette === undefined || palette.length < 3)) {
|
|
112
|
+
throw new LabelError('unsupported-png', 'palette-indexed PNG has no PLTE chunk');
|
|
81
113
|
}
|
|
82
|
-
|
|
114
|
+
// Reject a wrong-sized image from its header alone, before inflating and
|
|
115
|
+
// decoding pixels we would throw away.
|
|
116
|
+
checkSize(width, height);
|
|
83
117
|
const compressed = Buffer.concat(idat.map((c) => Buffer.from(c)));
|
|
84
118
|
let raw;
|
|
85
119
|
try {
|
|
@@ -88,49 +122,88 @@ function decodePng(bytes) {
|
|
|
88
122
|
catch (e) {
|
|
89
123
|
throw new LabelError('truncated-png', `could not inflate PNG image data: ${e.message}`);
|
|
90
124
|
}
|
|
91
|
-
const
|
|
125
|
+
const bitsPerPixel = channels * bitDepth;
|
|
126
|
+
const stride = Math.ceil((width * bitsPerPixel) / 8);
|
|
127
|
+
// Filter byte distance: bytes per complete pixel, at least 1 (sub-byte depths).
|
|
128
|
+
const bpp = Math.max(1, bitsPerPixel >> 3);
|
|
129
|
+
if (raw.length < height * (stride + 1)) {
|
|
130
|
+
throw new LabelError('truncated-png', `PNG image data too short for ${width}x${height}`);
|
|
131
|
+
}
|
|
132
|
+
// Reads sample `i` (0-based within the scanline) scaled to 0..255.
|
|
133
|
+
const maxSample = (1 << Math.min(bitDepth, 8)) - 1;
|
|
134
|
+
const sampleAt = (line, i) => {
|
|
135
|
+
if (bitDepth === 16)
|
|
136
|
+
return line[i * 2];
|
|
137
|
+
if (bitDepth === 8)
|
|
138
|
+
return line[i];
|
|
139
|
+
const bit = i * bitDepth;
|
|
140
|
+
const v = (line[bit >> 3] >> (8 - bitDepth - (bit & 7))) & maxSample;
|
|
141
|
+
return v;
|
|
142
|
+
};
|
|
143
|
+
// Palette indices must stay raw; greyscale samples are scaled to 0..255.
|
|
144
|
+
const scaleGrey = (v) => bitDepth >= 8 ? v : Math.round((v * 255) / maxSample);
|
|
92
145
|
const rgba = new Uint8Array(width * height * 4);
|
|
93
|
-
|
|
146
|
+
let prev = new Uint8Array(stride);
|
|
147
|
+
let line = new Uint8Array(stride);
|
|
94
148
|
let src = 0;
|
|
95
149
|
for (let y = 0; y < height; y++) {
|
|
96
150
|
const filter = raw[src++];
|
|
97
|
-
const line = new Uint8Array(stride);
|
|
98
151
|
for (let x = 0; x < stride; x++) {
|
|
99
152
|
const rawByte = raw[src++];
|
|
100
|
-
const a = x >=
|
|
153
|
+
const a = x >= bpp ? line[x - bpp] : 0; // left
|
|
101
154
|
const b = prev[x]; // up
|
|
102
|
-
const c = x >=
|
|
103
|
-
let val
|
|
155
|
+
const c = x >= bpp ? prev[x - bpp] : 0; // up-left
|
|
156
|
+
let val;
|
|
104
157
|
switch (filter) {
|
|
105
158
|
case 0:
|
|
159
|
+
val = rawByte;
|
|
106
160
|
break; // None
|
|
107
161
|
case 1:
|
|
108
|
-
val =
|
|
162
|
+
val = rawByte + a;
|
|
109
163
|
break; // Sub
|
|
110
164
|
case 2:
|
|
111
|
-
val =
|
|
165
|
+
val = rawByte + b;
|
|
112
166
|
break; // Up
|
|
113
167
|
case 3:
|
|
114
|
-
val =
|
|
168
|
+
val = rawByte + ((a + b) >> 1);
|
|
115
169
|
break; // Average
|
|
116
170
|
case 4:
|
|
117
|
-
val =
|
|
171
|
+
val = rawByte + paeth(a, b, c);
|
|
118
172
|
break; // Paeth
|
|
119
173
|
default:
|
|
120
174
|
throw new LabelError('unsupported-png', `unsupported PNG scanline filter ${filter}`);
|
|
121
175
|
}
|
|
122
|
-
line[x] = val;
|
|
176
|
+
line[x] = val & 0xff;
|
|
123
177
|
}
|
|
124
178
|
// Expand this decoded scanline into RGBA.
|
|
125
179
|
for (let x = 0; x < width; x++) {
|
|
126
180
|
const s = x * channels;
|
|
127
181
|
const d = (y * width + x) * 4;
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
182
|
+
if (colourType === 3) {
|
|
183
|
+
const p = sampleAt(line, s) * 3;
|
|
184
|
+
if (p + 2 >= palette.length) {
|
|
185
|
+
throw new LabelError('unsupported-png', `palette index ${p / 3} is outside the PLTE chunk`);
|
|
186
|
+
}
|
|
187
|
+
rgba[d] = palette[p];
|
|
188
|
+
rgba[d + 1] = palette[p + 1];
|
|
189
|
+
rgba[d + 2] = palette[p + 2];
|
|
190
|
+
rgba[d + 3] = 255;
|
|
191
|
+
}
|
|
192
|
+
else if (colourType === 0 || colourType === 4) {
|
|
193
|
+
const g = scaleGrey(sampleAt(line, s));
|
|
194
|
+
rgba[d] = g;
|
|
195
|
+
rgba[d + 1] = g;
|
|
196
|
+
rgba[d + 2] = g;
|
|
197
|
+
rgba[d + 3] = colourType === 4 ? sampleAt(line, s + 1) : 255;
|
|
198
|
+
}
|
|
199
|
+
else {
|
|
200
|
+
rgba[d] = sampleAt(line, s);
|
|
201
|
+
rgba[d + 1] = sampleAt(line, s + 1);
|
|
202
|
+
rgba[d + 2] = sampleAt(line, s + 2);
|
|
203
|
+
rgba[d + 3] = colourType === 6 ? sampleAt(line, s + 3) : 255;
|
|
204
|
+
}
|
|
132
205
|
}
|
|
133
|
-
prev
|
|
206
|
+
[prev, line] = [line, prev];
|
|
134
207
|
}
|
|
135
208
|
return { width, height, rgba };
|
|
136
209
|
}
|
|
@@ -164,23 +237,42 @@ export function nearestPaletteIndex(r, g, b) {
|
|
|
164
237
|
return best;
|
|
165
238
|
}
|
|
166
239
|
const HEX = '0123456789abcdef';
|
|
240
|
+
/**
|
|
241
|
+
* The integer scale of a PICO-8-shaped screenshot: `k` when the image is exactly
|
|
242
|
+
* `(128*k)x(128*k)` (128x128 is `k = 1`), else `undefined`. PICO-8's
|
|
243
|
+
* `extcmd("screen")` writes a pixel-exact upscale (3x by default, 384x384; the
|
|
244
|
+
* factor follows its `screenshot_scale` config), so any square integer multiple
|
|
245
|
+
* is a screenshot we can sample straight back down.
|
|
246
|
+
*/
|
|
247
|
+
function labelScale(width, height) {
|
|
248
|
+
if (width !== height || width < LABEL_SIZE || width % LABEL_SIZE !== 0) {
|
|
249
|
+
return undefined;
|
|
250
|
+
}
|
|
251
|
+
return width / LABEL_SIZE;
|
|
252
|
+
}
|
|
167
253
|
/**
|
|
168
254
|
* Builds the `__label__` hex body (128 rows of 128 nibbles, newline-joined, with
|
|
169
|
-
* a trailing newline) from a
|
|
170
|
-
*
|
|
171
|
-
*
|
|
172
|
-
*
|
|
255
|
+
* a trailing newline) from a PNG. Each pixel is mapped to its nearest PICO-8
|
|
256
|
+
* palette colour. The PNG must be 128x128 ({@link LABEL_SIZE}) or an exact square
|
|
257
|
+
* integer multiple of it (256x256, 384x384, ...: a PICO-8 screenshot), which is
|
|
258
|
+
* downscaled by nearest-neighbour sampling (the centre of each `k x k` block).
|
|
259
|
+
* Any other size is a {@link LabelError} (`wrong-size`) so a mis-sized image
|
|
260
|
+
* fails loud instead of being silently cropped or stretched.
|
|
173
261
|
*/
|
|
174
262
|
export function labelHexFromPng(pngBytes) {
|
|
175
|
-
const { width, height, rgba } = decodePng(pngBytes)
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
263
|
+
const { width, height, rgba } = decodePng(pngBytes, (w, h) => {
|
|
264
|
+
if (labelScale(w, h) === undefined) {
|
|
265
|
+
throw new LabelError('wrong-size', `label image must be ${LABEL_SIZE}x${LABEL_SIZE} or an exact multiple of it (256x256, 384x384, 512x512, ...), got ${w}x${h}`);
|
|
266
|
+
}
|
|
267
|
+
});
|
|
268
|
+
const scale = labelScale(width, height);
|
|
269
|
+
const centre = scale >> 1;
|
|
179
270
|
const rows = [];
|
|
180
271
|
for (let y = 0; y < LABEL_SIZE; y++) {
|
|
181
272
|
let row = '';
|
|
273
|
+
const sy = y * scale + centre;
|
|
182
274
|
for (let x = 0; x < LABEL_SIZE; x++) {
|
|
183
|
-
const d = (
|
|
275
|
+
const d = (sy * width + x * scale + centre) * 4;
|
|
184
276
|
row += HEX[nearestPaletteIndex(rgba[d], rgba[d + 1], rgba[d + 2])];
|
|
185
277
|
}
|
|
186
278
|
rows.push(row);
|