feat(nitro): convert imported SWF bundles to WebP Lossless
Gitea Actions Runner Test / test-job (push) Successful in 1s
CI / check (push) Successful in 31s
CI / tests-unit (push) Successful in 1m59s
CI / tests-integration (push) Successful in 2m19s
CI / tests-ui (push) Successful in 2m56s
CI / preflight (push) Skipped
CI / deploy (push) Successful in 2m18s
Gitea Actions Runner Test / test-job (push) Successful in 1s
CI / check (push) Successful in 31s
CI / tests-unit (push) Successful in 1m59s
CI / tests-integration (push) Successful in 2m19s
CI / tests-ui (push) Successful in 2m56s
CI / preflight (push) Skipped
CI / deploy (push) Successful in 2m18s
Newly converted .nitro bundles now store their spritesheet as WebP VP8L instead of PNG, so imports land much smaller without changing a single pixel. The texture member and spritesheet.meta.image are both labelled from the actual bytes, never from a caller's assumption. - encode through sharp with lossless and exact, so colour hidden under alpha 0 survives; this mirrors ImageSharp's TransparentColorMode.Preserve - detect PNG/WebP by magic bytes and reject anything the client cannot render, on create, download and upload paths - keep the source format when deriving size-32 sheets, scaling composites and editing metadata, so existing bundles are never silently rewritten - report fidelity in the studio: the compression panel re-encodes with the same options the importer uses, so it cannot drift and invent false warnings, and shows PNG/WebP size estimates convertSwfToNitro and buildSpritesheet are now async, so the worker, the main-thread fallback and every import call site await them. PNG stays supported for existing bundles and icon sidecars are untouched.
This commit is contained in:
1 parent
420210ffa0
commit
17de94d984
22 files changed
+1118
-125
No files matched your search
@@ -1,6 +1,9 @@
|
||||
import { promises as fs } from "node:fs";
|
||||
import { getByparrCookies } from "@/lib/services/byparr";
|
||||
import { parseNitroBundle } from "../../swf/nitro-builder";
|
||||
import {
|
||||
detectNitroTextureFormat,
|
||||
parseNitroBundle,
|
||||
} from "../../swf/nitro-builder";
|
||||
import { browserHeaders } from "./browser-headers";
|
||||
import { curlDownload } from "./curl-fetch";
|
||||
|
||||
@@ -27,7 +30,9 @@ export function validateNitroBytes(buffer: Buffer): boolean {
|
||||
!!bundle.json &&
|
||||
typeof bundle.json === "object" &&
|
||||
!Array.isArray(bundle.json) &&
|
||||
validatePngBytes(bundle.png)
|
||||
// parseNitroBundle already rejects non-PNG/WebP textures, so this
|
||||
// is a cheap re-assertion rather than the real gate.
|
||||
detectNitroTextureFormat(bundle.texture) !== null
|
||||
);
|
||||
} catch {
|
||||
return false;
|
||||
|
||||
Reference in new issue
Block a user