@flighthq/spritesheet-formats 0.1.0
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/asepriteParse.d.ts +18 -0
- package/dist/asepriteParse.d.ts.map +1 -0
- package/dist/asepriteParse.js +87 -0
- package/dist/asepriteParse.js.map +1 -0
- package/dist/asepriteSchema.d.ts +64 -0
- package/dist/asepriteSchema.d.ts.map +1 -0
- package/dist/asepriteSchema.js +6 -0
- package/dist/asepriteSchema.js.map +1 -0
- package/dist/asepriteSerialize.d.ts +14 -0
- package/dist/asepriteSerialize.d.ts.map +1 -0
- package/dist/asepriteSerialize.js +86 -0
- package/dist/asepriteSerialize.js.map +1 -0
- package/dist/cocosPlistParse.d.ts +15 -0
- package/dist/cocosPlistParse.d.ts.map +1 -0
- package/dist/cocosPlistParse.js +157 -0
- package/dist/cocosPlistParse.js.map +1 -0
- package/dist/cocosPlistSchema.d.ts +31 -0
- package/dist/cocosPlistSchema.d.ts.map +1 -0
- package/dist/cocosPlistSchema.js +6 -0
- package/dist/cocosPlistSchema.js.map +1 -0
- package/dist/cocosPlistSerialize.d.ts +8 -0
- package/dist/cocosPlistSerialize.d.ts.map +1 -0
- package/dist/cocosPlistSerialize.js +86 -0
- package/dist/cocosPlistSerialize.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -0
- package/dist/libgdxAtlasParse.d.ts +13 -0
- package/dist/libgdxAtlasParse.d.ts.map +1 -0
- package/dist/libgdxAtlasParse.js +209 -0
- package/dist/libgdxAtlasParse.js.map +1 -0
- package/dist/libgdxAtlasSchema.d.ts +38 -0
- package/dist/libgdxAtlasSchema.d.ts.map +1 -0
- package/dist/libgdxAtlasSchema.js +6 -0
- package/dist/libgdxAtlasSchema.js.map +1 -0
- package/dist/spritesheetDetect.d.ts +41 -0
- package/dist/spritesheetDetect.d.ts.map +1 -0
- package/dist/spritesheetDetect.js +101 -0
- package/dist/spritesheetDetect.js.map +1 -0
- package/dist/starlingParse.d.ts +20 -0
- package/dist/starlingParse.d.ts.map +1 -0
- package/dist/starlingParse.js +138 -0
- package/dist/starlingParse.js.map +1 -0
- package/dist/starlingSchema.d.ts +32 -0
- package/dist/starlingSchema.d.ts.map +1 -0
- package/dist/starlingSchema.js +6 -0
- package/dist/starlingSchema.js.map +1 -0
- package/dist/starlingSerialize.d.ts +8 -0
- package/dist/starlingSerialize.d.ts.map +1 -0
- package/dist/starlingSerialize.js +67 -0
- package/dist/starlingSerialize.js.map +1 -0
- package/dist/texturePackerParse.d.ts +15 -0
- package/dist/texturePackerParse.d.ts.map +1 -0
- package/dist/texturePackerParse.js +70 -0
- package/dist/texturePackerParse.js.map +1 -0
- package/dist/texturePackerSchema.d.ts +52 -0
- package/dist/texturePackerSchema.d.ts.map +1 -0
- package/dist/texturePackerSchema.js +5 -0
- package/dist/texturePackerSchema.js.map +1 -0
- package/dist/texturePackerSerialize.d.ts +14 -0
- package/dist/texturePackerSerialize.d.ts.map +1 -0
- package/dist/texturePackerSerialize.js +74 -0
- package/dist/texturePackerSerialize.js.map +1 -0
- package/package.json +41 -0
- package/src/asepriteParse.test.ts +235 -0
- package/src/asepriteSerialize.test.ts +218 -0
- package/src/cocosPlistParse.test.ts +131 -0
- package/src/cocosPlistSerialize.test.ts +56 -0
- package/src/libgdxAtlasParse.test.ts +100 -0
- package/src/spritesheetDetect.test.ts +217 -0
- package/src/starlingParse.test.ts +176 -0
- package/src/starlingSerialize.test.ts +117 -0
- package/src/texturePackerParse.test.ts +237 -0
- package/src/texturePackerSerialize.test.ts +200 -0
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { SpritesheetData } from '@flighthq/spritesheet';
|
|
2
|
+
import type { AsepriteDocument } from './asepriteSchema';
|
|
3
|
+
export interface AsepriteParsed {
|
|
4
|
+
data: SpritesheetData;
|
|
5
|
+
document: AsepriteDocument;
|
|
6
|
+
}
|
|
7
|
+
/** Parse an Aseprite JSON string directly to a SpritesheetData.
|
|
8
|
+
*
|
|
9
|
+
* Single-pass: no intermediate document object is allocated.
|
|
10
|
+
* Use `parseAsepriteSpritesheetDocument` instead when you need round-trip serialisation.
|
|
11
|
+
*
|
|
12
|
+
* Per-frame durations from Aseprite are preserved in `animation.frameDurations`
|
|
13
|
+
* when frames within a tag have varying durations. */
|
|
14
|
+
export declare function parseAsepriteSpritesheet(json: string): SpritesheetData;
|
|
15
|
+
/** Parse an Aseprite JSON string and preserve the full document for round-trip
|
|
16
|
+
* serialisation via `serializeAsepriteSpritesheet`. */
|
|
17
|
+
export declare function parseAsepriteSpritesheetDocument(json: string): AsepriteParsed;
|
|
18
|
+
//# sourceMappingURL=asepriteParse.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"asepriteParse.d.ts","sourceRoot":"","sources":["../src/asepriteParse.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAA4B,eAAe,EAAwB,MAAM,uBAAuB,CAAC;AAU7G,OAAO,KAAK,EAAsB,gBAAgB,EAAkC,MAAM,kBAAkB,CAAC;AAE7G,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,eAAe,CAAC;IACtB,QAAQ,EAAE,gBAAgB,CAAC;CAC5B;AAgFD;;;;;;uDAMuD;AACvD,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,CAEtE;AAED;wDACwD;AACxD,wBAAgB,gCAAgC,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,CAG7E"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { createSpritesheetAnimationData, createSpritesheetData, createSpritesheetFrameData, } from '@flighthq/spritesheet';
|
|
2
|
+
import { createTextureAtlas } from '@flighthq/textureatlas';
|
|
3
|
+
import { parseTextureAtlasAsepriteDocument } from '@flighthq/textureatlas-formats';
|
|
4
|
+
// ─── Internal helpers ────────────────────────────────────────────────────────
|
|
5
|
+
// Maps an atlas region (geometry owned by @flighthq/textureatlas-formats) to a spritesheet frame.
|
|
6
|
+
// Aseprite carries no pivot; per-frame durations are layered on separately from the document.
|
|
7
|
+
function frameFromRegion(region) {
|
|
8
|
+
return createSpritesheetFrameData({
|
|
9
|
+
height: region.height,
|
|
10
|
+
name: region.name ?? '',
|
|
11
|
+
offsetX: region.sourceX,
|
|
12
|
+
offsetY: region.sourceY,
|
|
13
|
+
pivotX: region.pivotX,
|
|
14
|
+
pivotY: region.pivotY,
|
|
15
|
+
rotated: region.rotated,
|
|
16
|
+
sourceHeight: region.originalHeight ?? region.height,
|
|
17
|
+
sourceWidth: region.originalWidth ?? region.width,
|
|
18
|
+
width: region.width,
|
|
19
|
+
x: region.x,
|
|
20
|
+
y: region.y,
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
function metaScale(meta) {
|
|
24
|
+
if (typeof meta.scale === 'string')
|
|
25
|
+
return parseFloat(meta.scale) || 1;
|
|
26
|
+
return meta.scale;
|
|
27
|
+
}
|
|
28
|
+
function animationFromTag(tag, frameNames, durationMap) {
|
|
29
|
+
const tagFrameNames = frameNames.slice(tag.from, tag.to + 1);
|
|
30
|
+
const durations = tagFrameNames.map((n) => durationMap.get(n) ?? 100);
|
|
31
|
+
const firstDuration = durations[0] ?? 100;
|
|
32
|
+
const uniform = durations.every((d) => d === firstDuration);
|
|
33
|
+
return createSpritesheetAnimationData({
|
|
34
|
+
direction: tag.direction ?? 'forward',
|
|
35
|
+
frameDuration: firstDuration,
|
|
36
|
+
frameDurations: uniform ? null : durations,
|
|
37
|
+
frameNames: tagFrameNames,
|
|
38
|
+
loop: true,
|
|
39
|
+
name: tag.name,
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
function documentToData(doc) {
|
|
43
|
+
// Region geometry is delegated to the atlas-formats parser (shared Aseprite document shape); this
|
|
44
|
+
// package adds the per-frame durations and tag-based animations, which the atlas layer does not model.
|
|
45
|
+
const regions = parseTextureAtlasAsepriteDocument(doc, createTextureAtlas()).regions;
|
|
46
|
+
const frames = regions.map(frameFromRegion);
|
|
47
|
+
const frameNames = regions.map((region) => region.name ?? '');
|
|
48
|
+
const durationMap = new Map();
|
|
49
|
+
if (Array.isArray(doc.frames)) {
|
|
50
|
+
for (const entry of doc.frames)
|
|
51
|
+
durationMap.set(entry.filename, entry.duration);
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
for (const [name, entry] of Object.entries(doc.frames))
|
|
55
|
+
durationMap.set(name, entry.duration);
|
|
56
|
+
}
|
|
57
|
+
const { meta } = doc;
|
|
58
|
+
const animations = meta.frameTags && meta.frameTags.length > 0
|
|
59
|
+
? meta.frameTags.map((tag) => animationFromTag(tag, frameNames, durationMap))
|
|
60
|
+
: [];
|
|
61
|
+
return createSpritesheetData({
|
|
62
|
+
animations,
|
|
63
|
+
frames,
|
|
64
|
+
imageFile: meta.image,
|
|
65
|
+
imageHeight: meta.size.h,
|
|
66
|
+
imageWidth: meta.size.w,
|
|
67
|
+
scale: metaScale(meta),
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
// ─── Public API ──────────────────────────────────────────────────────────────
|
|
71
|
+
/** Parse an Aseprite JSON string directly to a SpritesheetData.
|
|
72
|
+
*
|
|
73
|
+
* Single-pass: no intermediate document object is allocated.
|
|
74
|
+
* Use `parseAsepriteSpritesheetDocument` instead when you need round-trip serialisation.
|
|
75
|
+
*
|
|
76
|
+
* Per-frame durations from Aseprite are preserved in `animation.frameDurations`
|
|
77
|
+
* when frames within a tag have varying durations. */
|
|
78
|
+
export function parseAsepriteSpritesheet(json) {
|
|
79
|
+
return documentToData(JSON.parse(json));
|
|
80
|
+
}
|
|
81
|
+
/** Parse an Aseprite JSON string and preserve the full document for round-trip
|
|
82
|
+
* serialisation via `serializeAsepriteSpritesheet`. */
|
|
83
|
+
export function parseAsepriteSpritesheetDocument(json) {
|
|
84
|
+
const document = JSON.parse(json);
|
|
85
|
+
return { data: documentToData(document), document };
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=asepriteParse.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"asepriteParse.js","sourceRoot":"","sources":["../src/asepriteParse.ts"],"names":[],"mappings":"AACA,OAAO,EACL,8BAA8B,EAC9B,qBAAqB,EACrB,0BAA0B,GAC3B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,iCAAiC,EAAE,MAAM,gCAAgC,CAAC;AAUnF,gFAAgF;AAEhF,kGAAkG;AAClG,8FAA8F;AAC9F,SAAS,eAAe,CAAC,MAAoC;IAC3D,OAAO,0BAA0B,CAAC;QAChC,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,EAAE;QACvB,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,YAAY,EAAE,MAAM,CAAC,cAAc,IAAI,MAAM,CAAC,MAAM;QACpD,WAAW,EAAE,MAAM,CAAC,aAAa,IAAI,MAAM,CAAC,KAAK;QACjD,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,CAAC,EAAE,MAAM,CAAC,CAAC;QACX,CAAC,EAAE,MAAM,CAAC,CAAC;KACZ,CAAC,CAAC;AACL,CAAC;AAED,SAAS,SAAS,CAAC,IAAkB;IACnC,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ;QAAE,OAAO,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACvE,OAAO,IAAI,CAAC,KAAK,CAAC;AACpB,CAAC;AAED,SAAS,gBAAgB,CACvB,GAAqB,EACrB,UAAoB,EACpB,WAAgC;IAEhC,MAAM,aAAa,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;IAC7D,MAAM,SAAS,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC;IACtE,MAAM,aAAa,GAAG,SAAS,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC;IAC1C,MAAM,OAAO,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,aAAa,CAAC,CAAC;IAE5D,OAAO,8BAA8B,CAAC;QACpC,SAAS,EAAE,GAAG,CAAC,SAAS,IAAI,SAAS;QACrC,aAAa,EAAE,aAAa;QAC5B,cAAc,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;QAC1C,UAAU,EAAE,aAAa;QACzB,IAAI,EAAE,IAAI;QACV,IAAI,EAAE,GAAG,CAAC,IAAI;KACf,CAAC,CAAC;AACL,CAAC;AAED,SAAS,cAAc,CAAC,GAAqB;IAC3C,kGAAkG;IAClG,uGAAuG;IACvG,MAAM,OAAO,GAAG,iCAAiC,CAAC,GAAG,EAAE,kBAAkB,EAAE,CAAC,CAAC,OAAO,CAAC;IACrF,MAAM,MAAM,GAA2B,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IACpE,MAAM,UAAU,GAAa,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;IAExE,MAAM,WAAW,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC9C,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;QAC9B,KAAK,MAAM,KAAK,IAAI,GAAG,CAAC,MAA8B;YAAE,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC1G,CAAC;SAAM,CAAC;QACN,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC;YAAE,WAAW,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;IAChG,CAAC;IAED,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC;IACrB,MAAM,UAAU,GACd,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC;QACzC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,gBAAgB,CAAC,GAAG,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;QAC7E,CAAC,CAAC,EAAE,CAAC;IAET,OAAO,qBAAqB,CAAC;QAC3B,UAAU;QACV,MAAM;QACN,SAAS,EAAE,IAAI,CAAC,KAAK;QACrB,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QACxB,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QACvB,KAAK,EAAE,SAAS,CAAC,IAAI,CAAC;KACvB,CAAC,CAAC;AACL,CAAC;AAED,gFAAgF;AAEhF;;;;;;uDAMuD;AACvD,MAAM,UAAU,wBAAwB,CAAC,IAAY;IACnD,OAAO,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAqB,CAAC,CAAC;AAC9D,CAAC;AAED;wDACwD;AACxD,MAAM,UAAU,gCAAgC,CAAC,IAAY;IAC3D,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAqB,CAAC;IACtD,OAAO,EAAE,IAAI,EAAE,cAAc,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,CAAC;AACtD,CAAC"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
export interface AsepriteRect {
|
|
2
|
+
h: number;
|
|
3
|
+
w: number;
|
|
4
|
+
x: number;
|
|
5
|
+
y: number;
|
|
6
|
+
}
|
|
7
|
+
export interface AsepriteSize {
|
|
8
|
+
h: number;
|
|
9
|
+
w: number;
|
|
10
|
+
}
|
|
11
|
+
export interface AsepriteFrameTag {
|
|
12
|
+
/** Playback direction for this tag range. */
|
|
13
|
+
direction: 'forward' | 'pingpong' | 'pingpong_reverse' | 'reverse';
|
|
14
|
+
/** Index of last frame in this tag (inclusive). */
|
|
15
|
+
from: number;
|
|
16
|
+
name: string;
|
|
17
|
+
/** Index of first frame in this tag (inclusive). */
|
|
18
|
+
to: number;
|
|
19
|
+
/** Optional hex colour label assigned in Aseprite. */
|
|
20
|
+
color?: string;
|
|
21
|
+
}
|
|
22
|
+
export interface AsepriteLayer {
|
|
23
|
+
blendMode: string;
|
|
24
|
+
name: string;
|
|
25
|
+
opacity: number;
|
|
26
|
+
}
|
|
27
|
+
export interface AsepriteBaseFrame {
|
|
28
|
+
/** Per-frame display duration in milliseconds — key difference from Texture Packer. */
|
|
29
|
+
duration: number;
|
|
30
|
+
frame: AsepriteRect;
|
|
31
|
+
rotated: boolean;
|
|
32
|
+
sourceSize: AsepriteSize;
|
|
33
|
+
spriteSourceSize: AsepriteRect;
|
|
34
|
+
trimmed: boolean;
|
|
35
|
+
}
|
|
36
|
+
/** Hash variant: each value in the `frames` dict is one of these. */
|
|
37
|
+
export type AsepriteHashFrame = AsepriteBaseFrame;
|
|
38
|
+
/** Array variant: each element of the `frames` array is one of these. */
|
|
39
|
+
export interface AsepriteArrayFrame extends AsepriteBaseFrame {
|
|
40
|
+
filename: string;
|
|
41
|
+
}
|
|
42
|
+
export interface AsepriteMeta {
|
|
43
|
+
app: string;
|
|
44
|
+
format: string;
|
|
45
|
+
frameTags: AsepriteFrameTag[];
|
|
46
|
+
image: string;
|
|
47
|
+
layers?: AsepriteLayer[];
|
|
48
|
+
scale: number | string;
|
|
49
|
+
size: AsepriteSize;
|
|
50
|
+
slices?: unknown[];
|
|
51
|
+
version: string;
|
|
52
|
+
}
|
|
53
|
+
/** Hash-keyed variant: `frames` is a plain object whose keys are frame names. */
|
|
54
|
+
export interface AsepriteHashDocument {
|
|
55
|
+
frames: Record<string, AsepriteHashFrame>;
|
|
56
|
+
meta: AsepriteMeta;
|
|
57
|
+
}
|
|
58
|
+
/** Array variant: `frames` is an array and each entry carries a `filename` field. */
|
|
59
|
+
export interface AsepriteArrayDocument {
|
|
60
|
+
frames: AsepriteArrayFrame[];
|
|
61
|
+
meta: AsepriteMeta;
|
|
62
|
+
}
|
|
63
|
+
export type AsepriteDocument = AsepriteArrayDocument | AsepriteHashDocument;
|
|
64
|
+
//# sourceMappingURL=asepriteSchema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"asepriteSchema.d.ts","sourceRoot":"","sources":["../src/asepriteSchema.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,YAAY;IAC3B,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX;AAED,MAAM,WAAW,YAAY;IAC3B,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX;AAED,MAAM,WAAW,gBAAgB;IAC/B,6CAA6C;IAC7C,SAAS,EAAE,SAAS,GAAG,UAAU,GAAG,kBAAkB,GAAG,SAAS,CAAC;IACnE,mDAAmD;IACnD,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,oDAAoD;IACpD,EAAE,EAAE,MAAM,CAAC;IACX,sDAAsD;IACtD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,iBAAiB;IAChC,uFAAuF;IACvF,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,YAAY,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,YAAY,CAAC;IACzB,gBAAgB,EAAE,YAAY,CAAC;IAC/B,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,qEAAqE;AACrE,MAAM,MAAM,iBAAiB,GAAG,iBAAiB,CAAC;AAElD,yEAAyE;AACzE,MAAM,WAAW,kBAAmB,SAAQ,iBAAiB;IAC3D,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,gBAAgB,EAAE,CAAC;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,aAAa,EAAE,CAAC;IACzB,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,IAAI,EAAE,YAAY,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,iFAAiF;AACjF,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;IAC1C,IAAI,EAAE,YAAY,CAAC;CACpB;AAED,qFAAqF;AACrF,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,kBAAkB,EAAE,CAAC;IAC7B,IAAI,EAAE,YAAY,CAAC;CACpB;AAED,MAAM,MAAM,gBAAgB,GAAG,qBAAqB,GAAG,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
// Aseprite JSON export schema — field names as they appear in the exported file.
|
|
2
|
+
// Reference: https://www.aseprite.org/docs/cli/#sheet-json
|
|
3
|
+
// Aseprite exports either a Hash variant (frames is a dict keyed by name) or
|
|
4
|
+
// an Array variant (frames is an array with a filename field per entry).
|
|
5
|
+
export {};
|
|
6
|
+
//# sourceMappingURL=asepriteSchema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"asepriteSchema.js","sourceRoot":"","sources":["../src/asepriteSchema.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,2DAA2D;AAC3D,6EAA6E;AAC7E,yEAAyE"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { SpritesheetData } from '@flighthq/spritesheet';
|
|
2
|
+
import type { AsepriteDocument } from './asepriteSchema';
|
|
3
|
+
export interface AsepriteSerializeOptions {
|
|
4
|
+
/** Override the output format variant. Defaults to the variant of `existing`, or `'hash'`. */
|
|
5
|
+
variant?: 'array' | 'hash';
|
|
6
|
+
}
|
|
7
|
+
/** Serialise a SpritesheetData to an Aseprite JSON string.
|
|
8
|
+
*
|
|
9
|
+
* Pass the `document` returned by `parseAsepriteSpritesheetDocument` to preserve any fields that
|
|
10
|
+
* don't round-trip through the data (app name, layer list, tag colours).
|
|
11
|
+
* Per-frame durations in `animation.frameDurations` are written back to each
|
|
12
|
+
* frame's `duration` field so they survive a reload. */
|
|
13
|
+
export declare function serializeAsepriteSpritesheet(data: Readonly<SpritesheetData>, existing?: Partial<AsepriteDocument>, options?: AsepriteSerializeOptions): string;
|
|
14
|
+
//# sourceMappingURL=asepriteSerialize.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"asepriteSerialize.d.ts","sourceRoot":"","sources":["../src/asepriteSerialize.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAE7D,OAAO,KAAK,EAIV,gBAAgB,EAGjB,MAAM,kBAAkB,CAAC;AAE1B,MAAM,WAAW,wBAAwB;IACvC,8FAA8F;IAC9F,OAAO,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;CAC5B;AAoFD;;;;;yDAKyD;AACzD,wBAAgB,4BAA4B,CAC1C,IAAI,EAAE,QAAQ,CAAC,eAAe,CAAC,EAC/B,QAAQ,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,EACpC,OAAO,CAAC,EAAE,wBAAwB,GACjC,MAAM,CAWR"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
// ─── Internal helpers ────────────────────────────────────────────────────────
|
|
2
|
+
function dataToMeta(data, existing) {
|
|
3
|
+
const tags = data.animations.map((anim, i) => {
|
|
4
|
+
const firstIdx = data.frames.findIndex((f) => f.name === anim.frameNames[0]);
|
|
5
|
+
const lastIdx = data.frames.findIndex((f) => f.name === anim.frameNames[anim.frameNames.length - 1]);
|
|
6
|
+
return {
|
|
7
|
+
direction: anim.direction,
|
|
8
|
+
from: firstIdx >= 0 ? firstIdx : 0,
|
|
9
|
+
name: anim.name,
|
|
10
|
+
to: lastIdx >= 0 ? lastIdx : 0,
|
|
11
|
+
...(existing.frameTags?.[i]?.color !== undefined ? { color: existing.frameTags[i].color } : {}),
|
|
12
|
+
};
|
|
13
|
+
});
|
|
14
|
+
return {
|
|
15
|
+
app: existing.app ?? 'https://www.aseprite.org/',
|
|
16
|
+
format: existing.format ?? 'RGBA8888',
|
|
17
|
+
frameTags: tags,
|
|
18
|
+
image: data.imageFile || existing.image || '',
|
|
19
|
+
...(existing.layers !== undefined ? { layers: existing.layers } : {}),
|
|
20
|
+
scale: data.scale !== 1 ? String(data.scale) : (existing.scale ?? '1'),
|
|
21
|
+
size: { h: data.imageHeight, w: data.imageWidth },
|
|
22
|
+
version: existing.version ?? '1.3',
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
function frameToEntry(frame, durationMs) {
|
|
26
|
+
const trimmed = frame.offsetX !== 0 ||
|
|
27
|
+
frame.offsetY !== 0 ||
|
|
28
|
+
frame.sourceWidth !== frame.width ||
|
|
29
|
+
frame.sourceHeight !== frame.height;
|
|
30
|
+
return {
|
|
31
|
+
duration: durationMs,
|
|
32
|
+
frame: { h: frame.height, w: frame.width, x: frame.x, y: frame.y },
|
|
33
|
+
rotated: frame.rotated,
|
|
34
|
+
sourceSize: { h: frame.sourceHeight, w: frame.sourceWidth },
|
|
35
|
+
spriteSourceSize: {
|
|
36
|
+
h: frame.height,
|
|
37
|
+
w: frame.width,
|
|
38
|
+
x: frame.offsetX,
|
|
39
|
+
y: frame.offsetY,
|
|
40
|
+
},
|
|
41
|
+
trimmed,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
function resolveFrameDuration(data, frameName) {
|
|
45
|
+
for (const anim of data.animations) {
|
|
46
|
+
const idx = anim.frameNames.indexOf(frameName);
|
|
47
|
+
if (idx === -1)
|
|
48
|
+
continue;
|
|
49
|
+
if (anim.frameDurations !== null)
|
|
50
|
+
return anim.frameDurations[idx] ?? anim.frameDuration;
|
|
51
|
+
return anim.frameDuration;
|
|
52
|
+
}
|
|
53
|
+
return 100;
|
|
54
|
+
}
|
|
55
|
+
function dataToHashDocument(data, existing) {
|
|
56
|
+
const frames = {};
|
|
57
|
+
for (const frame of data.frames) {
|
|
58
|
+
frames[frame.name] = frameToEntry(frame, resolveFrameDuration(data, frame.name));
|
|
59
|
+
}
|
|
60
|
+
return { frames, meta: dataToMeta(data, existing.meta ?? {}) };
|
|
61
|
+
}
|
|
62
|
+
function dataToArrayDocument(data, existing) {
|
|
63
|
+
const frames = data.frames.map((frame) => ({
|
|
64
|
+
filename: frame.name,
|
|
65
|
+
...frameToEntry(frame, resolveFrameDuration(data, frame.name)),
|
|
66
|
+
}));
|
|
67
|
+
return { frames, meta: dataToMeta(data, existing.meta ?? {}) };
|
|
68
|
+
}
|
|
69
|
+
// ─── Public API ──────────────────────────────────────────────────────────────
|
|
70
|
+
/** Serialise a SpritesheetData to an Aseprite JSON string.
|
|
71
|
+
*
|
|
72
|
+
* Pass the `document` returned by `parseAsepriteSpritesheetDocument` to preserve any fields that
|
|
73
|
+
* don't round-trip through the data (app name, layer list, tag colours).
|
|
74
|
+
* Per-frame durations in `animation.frameDurations` are written back to each
|
|
75
|
+
* frame's `duration` field so they survive a reload. */
|
|
76
|
+
export function serializeAsepriteSpritesheet(data, existing, options) {
|
|
77
|
+
const existingIsArray = existing !== undefined && Array.isArray(existing.frames);
|
|
78
|
+
const variant = options?.variant ?? (existingIsArray ? 'array' : 'hash');
|
|
79
|
+
if (variant === 'array') {
|
|
80
|
+
const doc = dataToArrayDocument(data, existing ?? {});
|
|
81
|
+
return JSON.stringify(doc, null, 2);
|
|
82
|
+
}
|
|
83
|
+
const doc = dataToHashDocument(data, existing ?? {});
|
|
84
|
+
return JSON.stringify(doc, null, 2);
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=asepriteSerialize.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"asepriteSerialize.js","sourceRoot":"","sources":["../src/asepriteSerialize.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { SpritesheetData } from '@flighthq/spritesheet';
|
|
2
|
+
import type { CocosPlistDocument } from './cocosPlistSchema';
|
|
3
|
+
export interface CocosPlistParsed {
|
|
4
|
+
data: SpritesheetData;
|
|
5
|
+
document: CocosPlistDocument;
|
|
6
|
+
}
|
|
7
|
+
/** Parse a Cocos Creator / Cocos2d-x plist XML atlas string directly to a SpritesheetData.
|
|
8
|
+
*
|
|
9
|
+
* Single-pass: no intermediate document object is allocated.
|
|
10
|
+
* Use `parseCocosPlistSpritesheetDocument` instead when you need round-trip serialisation. */
|
|
11
|
+
export declare function parseCocosPlistSpritesheet(xml: string): SpritesheetData;
|
|
12
|
+
/** Parse a Cocos Creator / Cocos2d-x plist XML atlas string and preserve the full document
|
|
13
|
+
* for round-trip serialisation via `serializeCocosPlistSpritesheet`. */
|
|
14
|
+
export declare function parseCocosPlistSpritesheetDocument(xml: string): CocosPlistParsed;
|
|
15
|
+
//# sourceMappingURL=cocosPlistParse.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cocosPlistParse.d.ts","sourceRoot":"","sources":["../src/cocosPlistParse.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAwB,MAAM,uBAAuB,CAAC;AAKnF,OAAO,KAAK,EAAE,kBAAkB,EAAuC,MAAM,oBAAoB,CAAC;AAElG,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,eAAe,CAAC;IACtB,QAAQ,EAAE,kBAAkB,CAAC;CAC9B;AAsKD;;;+FAG+F;AAC/F,wBAAgB,0BAA0B,CAAC,GAAG,EAAE,MAAM,GAAG,eAAe,CAEvE;AAED;yEACyE;AACzE,wBAAgB,kCAAkC,CAAC,GAAG,EAAE,MAAM,GAAG,gBAAgB,CAGhF"}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import { createSpritesheetData, createSpritesheetFrameData } from '@flighthq/spritesheet';
|
|
2
|
+
import { parseXmlDocument } from '@flighthq/xml';
|
|
3
|
+
// ─── plist structural helpers ─────────────────────────────────────────────────
|
|
4
|
+
/** Parse a Cocos plist size/offset string of the form "{w,h}" or "{x,y}". */
|
|
5
|
+
function parsePlistPair(s) {
|
|
6
|
+
const m = s.match(/{?\s*([-\d.]+)\s*,\s*([-\d.]+)\s*}?/);
|
|
7
|
+
return [parseFloat(m?.[1] ?? '0'), parseFloat(m?.[2] ?? '0')];
|
|
8
|
+
}
|
|
9
|
+
/** Parse a Cocos plist rect string of the form "{{x,y},{w,h}}". */
|
|
10
|
+
function parsePlistRect(s) {
|
|
11
|
+
const m = s.match(/\{\s*\{\s*([-\d.]+)\s*,\s*([-\d.]+)\s*\}\s*,\s*\{\s*([-\d.]+)\s*,\s*([-\d.]+)\s*\}\s*\}/);
|
|
12
|
+
return {
|
|
13
|
+
h: parseFloat(m?.[4] ?? '0'),
|
|
14
|
+
w: parseFloat(m?.[3] ?? '0'),
|
|
15
|
+
x: parseFloat(m?.[1] ?? '0'),
|
|
16
|
+
y: parseFloat(m?.[2] ?? '0'),
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
/** Walk a plist <dict> element and return a key→value map, values still as XmlElement. */
|
|
20
|
+
function dictToMap(el) {
|
|
21
|
+
const map = new Map();
|
|
22
|
+
const children = el.children;
|
|
23
|
+
for (let i = 0; i < children.length; i += 2) {
|
|
24
|
+
const keyEl = children[i];
|
|
25
|
+
const valEl = children[i + 1];
|
|
26
|
+
if (keyEl?.name === 'key' && valEl) {
|
|
27
|
+
map.set(keyEl.text, valEl);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return map;
|
|
31
|
+
}
|
|
32
|
+
function getTextValue(el) {
|
|
33
|
+
return el?.text ?? '';
|
|
34
|
+
}
|
|
35
|
+
function getBoolValue(el) {
|
|
36
|
+
return el?.name === 'true';
|
|
37
|
+
}
|
|
38
|
+
function getIntValue(el) {
|
|
39
|
+
return parseInt(el?.text ?? '0', 10);
|
|
40
|
+
}
|
|
41
|
+
// ─── Internal parser ─────────────────────────────────────────────────────────
|
|
42
|
+
function parseCocosPlistXml(xml) {
|
|
43
|
+
const root = parseXmlDocument(xml);
|
|
44
|
+
// Locate the root <dict> (may be under <plist>)
|
|
45
|
+
let rootDict = null;
|
|
46
|
+
if (root?.name === 'plist') {
|
|
47
|
+
rootDict = root.children.find((c) => c.name === 'dict') ?? null;
|
|
48
|
+
}
|
|
49
|
+
else if (root?.name === 'dict') {
|
|
50
|
+
rootDict = root;
|
|
51
|
+
}
|
|
52
|
+
if (!rootDict)
|
|
53
|
+
return { frames: {}, metadata: { format: 0, size: '{0,0}', textureFileName: '' } };
|
|
54
|
+
const rootMap = dictToMap(rootDict);
|
|
55
|
+
// Parse metadata
|
|
56
|
+
const metaEl = rootMap.get('metadata');
|
|
57
|
+
let metadata = { format: 0, size: '{0,0}', textureFileName: '' };
|
|
58
|
+
if (metaEl?.name === 'dict') {
|
|
59
|
+
const metaMap = dictToMap(metaEl);
|
|
60
|
+
metadata = {
|
|
61
|
+
format: getIntValue(metaMap.get('format')),
|
|
62
|
+
size: getTextValue(metaMap.get('size')),
|
|
63
|
+
textureFileName: getTextValue(metaMap.get('textureFileName')) || getTextValue(metaMap.get('realTextureFileName')),
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
// Parse frames
|
|
67
|
+
const framesEl = rootMap.get('frames');
|
|
68
|
+
const frames = {};
|
|
69
|
+
if (framesEl?.name === 'dict') {
|
|
70
|
+
const framesMap = dictToMap(framesEl);
|
|
71
|
+
for (const [frameName, frameEl] of framesMap) {
|
|
72
|
+
if (frameEl.name !== 'dict')
|
|
73
|
+
continue;
|
|
74
|
+
const fm = dictToMap(frameEl);
|
|
75
|
+
// Detect format version from available keys
|
|
76
|
+
const hasSpriteFields = fm.has('spriteOffset');
|
|
77
|
+
const hasFrame = fm.has('frame') || fm.has('textureRect');
|
|
78
|
+
if (!hasFrame && !hasSpriteFields)
|
|
79
|
+
continue;
|
|
80
|
+
// Support both old-style (frame) and new-style (textureRect) keys
|
|
81
|
+
const rectStr = getTextValue(fm.get('frame') ?? fm.get('textureRect'));
|
|
82
|
+
const rotated = getBoolValue(fm.get('textureRotated') ?? fm.get('rotated'));
|
|
83
|
+
const offsetStr = getTextValue(fm.get('spriteOffset') ?? fm.get('offset'));
|
|
84
|
+
const sourceSizeStr = getTextValue(fm.get('spriteSourceSize') ?? fm.get('sourceSize'));
|
|
85
|
+
const sizeStr = getTextValue(fm.get('spriteSize') ?? fm.get('size'));
|
|
86
|
+
const trimmed = getBoolValue(fm.get('spriteTrimmed') ?? fm.get('trimmed'));
|
|
87
|
+
const aliasEl = fm.get('aliases');
|
|
88
|
+
const aliases = [];
|
|
89
|
+
if (aliasEl?.name === 'array') {
|
|
90
|
+
for (const child of aliasEl.children) {
|
|
91
|
+
if (child.name === 'string')
|
|
92
|
+
aliases.push(child.text);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
frames[frameName] = {
|
|
96
|
+
aliases: aliases.length > 0 ? aliases : undefined,
|
|
97
|
+
frame: rectStr,
|
|
98
|
+
spriteOffset: offsetStr,
|
|
99
|
+
spriteSize: sizeStr,
|
|
100
|
+
spriteSourceSize: sourceSizeStr,
|
|
101
|
+
spriteTrimmed: trimmed,
|
|
102
|
+
textureRotated: rotated,
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
return { frames, metadata };
|
|
107
|
+
}
|
|
108
|
+
// ─── Internal conversion ─────────────────────────────────────────────────────
|
|
109
|
+
function plistFrameToData(name, pf) {
|
|
110
|
+
const rect = parsePlistRect(pf.frame);
|
|
111
|
+
const [offsetX, offsetY] = parsePlistPair(pf.spriteOffset);
|
|
112
|
+
const [sourceWidth, sourceHeight] = parsePlistPair(pf.spriteSourceSize);
|
|
113
|
+
// Rotated frames in plist have swapped w/h in the atlas rect
|
|
114
|
+
const atlasWidth = pf.textureRotated ? rect.h : rect.w;
|
|
115
|
+
const atlasHeight = pf.textureRotated ? rect.w : rect.h;
|
|
116
|
+
return createSpritesheetFrameData({
|
|
117
|
+
height: atlasHeight,
|
|
118
|
+
name,
|
|
119
|
+
offsetX,
|
|
120
|
+
offsetY,
|
|
121
|
+
pivotX: null,
|
|
122
|
+
pivotY: null,
|
|
123
|
+
rotated: pf.textureRotated,
|
|
124
|
+
sourceHeight: sourceHeight > 0 ? sourceHeight : atlasHeight,
|
|
125
|
+
sourceWidth: sourceWidth > 0 ? sourceWidth : atlasWidth,
|
|
126
|
+
width: atlasWidth,
|
|
127
|
+
x: rect.x,
|
|
128
|
+
y: rect.y,
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
function documentToData(doc) {
|
|
132
|
+
const frames = Object.entries(doc.frames).map(([name, pf]) => plistFrameToData(name, pf));
|
|
133
|
+
const [imageWidth, imageHeight] = parsePlistPair(doc.metadata.size);
|
|
134
|
+
return createSpritesheetData({
|
|
135
|
+
animations: [],
|
|
136
|
+
frames,
|
|
137
|
+
imageFile: doc.metadata.textureFileName,
|
|
138
|
+
imageHeight,
|
|
139
|
+
imageWidth,
|
|
140
|
+
scale: 1,
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
// ─── Public API ──────────────────────────────────────────────────────────────
|
|
144
|
+
/** Parse a Cocos Creator / Cocos2d-x plist XML atlas string directly to a SpritesheetData.
|
|
145
|
+
*
|
|
146
|
+
* Single-pass: no intermediate document object is allocated.
|
|
147
|
+
* Use `parseCocosPlistSpritesheetDocument` instead when you need round-trip serialisation. */
|
|
148
|
+
export function parseCocosPlistSpritesheet(xml) {
|
|
149
|
+
return documentToData(parseCocosPlistXml(xml));
|
|
150
|
+
}
|
|
151
|
+
/** Parse a Cocos Creator / Cocos2d-x plist XML atlas string and preserve the full document
|
|
152
|
+
* for round-trip serialisation via `serializeCocosPlistSpritesheet`. */
|
|
153
|
+
export function parseCocosPlistSpritesheetDocument(xml) {
|
|
154
|
+
const document = parseCocosPlistXml(xml);
|
|
155
|
+
return { data: documentToData(document), document };
|
|
156
|
+
}
|
|
157
|
+
//# sourceMappingURL=cocosPlistParse.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cocosPlistParse.js","sourceRoot":"","sources":["../src/cocosPlistParse.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
export interface CocosPlistFrame {
|
|
2
|
+
/** Rect of this frame in the atlas, as a plist string "{{x,y},{w,h}}". */
|
|
3
|
+
frame: string;
|
|
4
|
+
/** Pixel offset of the trimmed sprite within its original bounds, as a plist string "{x,y}". */
|
|
5
|
+
spriteOffset: string;
|
|
6
|
+
/** Trimmed size of this frame in the atlas, as a plist string "{w,h}". */
|
|
7
|
+
spriteSize: string;
|
|
8
|
+
/** Original (untrimmed) size of the source sprite, as a plist string "{w,h}". */
|
|
9
|
+
spriteSourceSize: string;
|
|
10
|
+
/** Whether the sprite was trimmed to remove transparent borders. */
|
|
11
|
+
spriteTrimmed: boolean;
|
|
12
|
+
/** Whether the frame is rotated 90 degrees clockwise in the atlas. */
|
|
13
|
+
textureRotated: boolean;
|
|
14
|
+
/** Optional aliases (alternate names) for this frame. */
|
|
15
|
+
aliases?: string[];
|
|
16
|
+
}
|
|
17
|
+
export interface CocosPlistMetadata {
|
|
18
|
+
/** Plist format version (2 = old-style, 3 = new-style sprite-prefixed keys). */
|
|
19
|
+
format: number;
|
|
20
|
+
/** Size of the atlas texture, as a plist string "{w,h}". */
|
|
21
|
+
size: string;
|
|
22
|
+
/** File name of the atlas texture image. */
|
|
23
|
+
textureFileName: string;
|
|
24
|
+
}
|
|
25
|
+
export interface CocosPlistDocument {
|
|
26
|
+
/** Map of frame name to frame descriptor. */
|
|
27
|
+
frames: Record<string, CocosPlistFrame>;
|
|
28
|
+
/** Atlas metadata. */
|
|
29
|
+
metadata: CocosPlistMetadata;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=cocosPlistSchema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cocosPlistSchema.d.ts","sourceRoot":"","sources":["../src/cocosPlistSchema.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,eAAe;IAC9B,0EAA0E;IAC1E,KAAK,EAAE,MAAM,CAAC;IACd,gGAAgG;IAChG,YAAY,EAAE,MAAM,CAAC;IACrB,0EAA0E;IAC1E,UAAU,EAAE,MAAM,CAAC;IACnB,iFAAiF;IACjF,gBAAgB,EAAE,MAAM,CAAC;IACzB,oEAAoE;IACpE,aAAa,EAAE,OAAO,CAAC;IACvB,sEAAsE;IACtE,cAAc,EAAE,OAAO,CAAC;IACxB,yDAAyD;IACzD,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,kBAAkB;IACjC,gFAAgF;IAChF,MAAM,EAAE,MAAM,CAAC;IACf,4DAA4D;IAC5D,IAAI,EAAE,MAAM,CAAC;IACb,4CAA4C;IAC5C,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,kBAAkB;IACjC,6CAA6C;IAC7C,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IACxC,sBAAsB;IACtB,QAAQ,EAAE,kBAAkB,CAAC;CAC9B"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
// Cocos Creator / Cocos2d-x plist atlas schema — field names as they appear in the plist file.
|
|
2
|
+
// Supports both old-style keys (frame, offset, sourceSize, size, rotated, trimmed) and
|
|
3
|
+
// new-style sprite-prefixed keys (textureRect, spriteOffset, spriteSourceSize, spriteSize,
|
|
4
|
+
// textureRotated, spriteTrimmed). The parser normalises both variants into this shape.
|
|
5
|
+
export {};
|
|
6
|
+
//# sourceMappingURL=cocosPlistSchema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cocosPlistSchema.js","sourceRoot":"","sources":["../src/cocosPlistSchema.ts"],"names":[],"mappings":"AAAA,+FAA+F;AAC/F,uFAAuF;AACvF,2FAA2F;AAC3F,uFAAuF"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { SpritesheetData } from '@flighthq/spritesheet';
|
|
2
|
+
import type { CocosPlistDocument } from './cocosPlistSchema';
|
|
3
|
+
/** Serialise a SpritesheetData to a Cocos Creator / Cocos2d-x plist XML atlas string.
|
|
4
|
+
*
|
|
5
|
+
* Pass the `document` returned by `parseCocosPlistSpritesheetDocument` to preserve any
|
|
6
|
+
* fields that don't round-trip through the data (format version, metadata). */
|
|
7
|
+
export declare function serializeCocosPlistSpritesheet(data: Readonly<SpritesheetData>, existing?: Partial<CocosPlistDocument>): string;
|
|
8
|
+
//# sourceMappingURL=cocosPlistSerialize.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cocosPlistSerialize.d.ts","sourceRoot":"","sources":["../src/cocosPlistSerialize.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAwB,MAAM,uBAAuB,CAAC;AAEnF,OAAO,KAAK,EAAE,kBAAkB,EAAmB,MAAM,oBAAoB,CAAC;AAE9E;;;gFAGgF;AAChF,wBAAgB,8BAA8B,CAC5C,IAAI,EAAE,QAAQ,CAAC,eAAe,CAAC,EAC/B,QAAQ,CAAC,EAAE,OAAO,CAAC,kBAAkB,CAAC,GACrC,MAAM,CAcR"}
|