Skip to main content

tex_packer_core/
export.rs

1use crate::export_manifest::ExportManifest;
2use crate::model::Atlas;
3use serde::Serialize;
4use serde_json::{Value, json};
5
6/// Serialize the whole `Atlas` as a JSON object `{ pages, meta }` (array-of-pages style).
7/// Suitable for generic tooling and simple consumption.
8pub fn to_json_array<K: ToString + Clone + Serialize>(atlas: &Atlas<K>) -> Value {
9    let manifest = ExportManifest::from_atlas(atlas);
10    let pages_val = manifest
11        .pages
12        .iter()
13        .map(|page| {
14            let frames_val: Vec<Value> = page
15                .frames
16                .iter()
17                .map(|frame| {
18                    json!({
19                        "key": frame.key,
20                        "frame": frame.frame_value(),
21                        "rotated": frame.rotated,
22                        "trimmed": frame.trimmed,
23                        "spriteSourceSize": frame.sprite_source_size_value(),
24                        "sourceSize": frame.source_size_value(),
25                        "pivot": frame.pivot_value()
26                    })
27                })
28                .collect();
29            json!({
30                "id": page.id,
31                "width": page.width,
32                "height": page.height,
33                "frames": frames_val,
34            })
35        })
36        .collect::<Vec<_>>();
37    json!({"pages": pages_val, "meta": &manifest.meta})
38}
39
40/// Flatten frames keyed by name, include page id/size hints.
41/// Shape: `{ frames: { name: { frame, rotated, trimmed, spriteSourceSize, sourceSize, pivot, page, pageSize } }, meta }`.
42/// Compatible with many engine pipelines expecting TexturePacker-like JSON hash.
43pub fn to_json_hash<K: ToString + Clone>(atlas: &Atlas<K>) -> Value {
44    let manifest = ExportManifest::from_atlas(atlas);
45    let mut frames = serde_json::Map::new();
46    for page in &manifest.pages {
47        for frame in &page.frames {
48            frames.insert(
49                frame.key.clone(),
50                json!({
51                    "frame": frame.frame_value(),
52                    "rotated": frame.rotated,
53                    "trimmed": frame.trimmed,
54                    "spriteSourceSize": frame.sprite_source_size_value(),
55                    "sourceSize": frame.source_size_value(),
56                    "pivot": frame.pivot_value(),
57                    "page": frame.page,
58                    "pageSize": frame.page_size_value(),
59                }),
60            );
61        }
62    }
63    json!({ "frames": frames, "meta": &manifest.meta })
64}