Skip to content

packages/core/src/features/sprites/formats/texture-packer.ts

Read as Markdown

This is the source snapshot used to build these API details. View this revision on GitHub.

Back to reference

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 built with @pibbl/core 0.0.2, revision 272a94a. ALPHA — NOT FOR PRODUCTION USE.