packages/core/src/features/sprites/formats/texture-packer.ts
This is the source snapshot used to build these API details. View this revision on GitHub.
1 import type { SpriteSheetFormat } from '../model.js';
2 /** Import TexturePacker JSON hash/array rectangles with clockwise packed rotation and trim offsets. See {@link SpriteSheetFormat}.
3 * @returns An explicit atlas metadata adapter.
4 */
5 export function texturePacker(): SpriteSheetFormat {
6 return { parse(data: unknown) {
7 const value = data as { frames: Record<string, Entry> | Entry[]; meta: { image: string; scale?: string; related_multi_packs?: string[] } };
8 if (!value?.frames || typeof value.meta?.image !== 'string') throw new TypeError('Expected TexturePacker frames and meta.image.');
9 if (value.meta.related_multi_packs?.length) throw new Error('Linked TexturePacker multipacks are not supported yet.');
10 if (value.meta.scale !== undefined && Number(value.meta.scale) !== 1) throw new Error('TexturePacker scale must be 1.');
11 const entries = Array.isArray(value.frames) ? value.frames.map((entry, index) => [entry.filename ?? String(index), entry] as const) : Object.entries(value.frames);
12 return { images: [value.meta.image], frames: entries.map(([name, entry]) => ({ name, rect: { x: entry.frame.x, y: entry.frame.y, width: entry.frame.w, height: entry.frame.h }, sourceSize: entry.sourceSize && { width: entry.sourceSize.w, height: entry.sourceSize.h }, trim: entry.spriteSourceSize && { x: entry.spriteSourceSize.x, y: entry.spriteSourceSize.y }, rotated: entry.rotated })) };
13 } };
14 }
15 interface Entry { filename?: string; frame: { x: number; y: number; w: number; h: number }; rotated?: boolean; sourceSize?: { w: number; h: number }; spriteSourceSize?: { x: number; y: number } }
16
Documentation version
Section titled “Documentation version”Documentation built with @pibbl/core 0.0.2, revision 272a94a. ALPHA — NOT FOR PRODUCTION USE.