tileset/grids/rpg_maker_vx/
to_complete.rs

1use super::*;
2use crate::GridAtlas;
3
4impl From<GridCornerRMVX> for GridCompleteAtlas {
5    fn from(rpg: GridCornerRMVX) -> Self {
6        rpg.as_complete()
7    }
8}
9
10impl GridCornerRMVX {
11    /// Returns a new `GridCompleteAtlas` from the current `GridCornerRMVX`.
12    ///
13    /// # Examples
14    ///
15    /// ```no_run
16    /// # use tileset::{GridAtlas, GridCornerRMVX};
17    /// let rpg = GridCornerRMVX::load("assets/rpg4x6.png").unwrap();
18    /// rpg.as_complete().save("assets/rpg4x6-std.png").unwrap();
19    /// ```
20    pub fn as_complete(&self) -> GridCompleteAtlas {
21        const C: u32 = 24;
22        const L: u32 = 8;
23        let (w, h) = self.get_cell_size();
24        let mut output = RgbaImage::new(w * C, h * L);
25        for i in 0..C {
26            for j in 0..L {
27                let (x, y) = rpg4x6_to_complete(i, j);
28                let view = self.image.view(x * w, y * h, w, h);
29                output.copy_from(&*view, i * w, j * h).ok();
30            }
31        }
32        // SAFETY: output image definitely has the correct size
33        unsafe { GridCompleteAtlas::new(output) }
34    }
35}
36
37fn rpg4x6_to_complete(x: u32, y: u32) -> (u32, u32) {
38    match (x, y) {
39        //
40        (0, 0) => (0, 2),
41        (0, 1) => (0, 3),
42        (0, 2) => (0, 4),
43        (0, 3) => (0, 3),
44        (0, 4) => (0, 4),
45        (0, 5) => (0, 5),
46        (0, 6) => (0, 2),
47        (0, 7) => (0, 5),
48        //
49        (1, 0) => (3, 2),
50        (1, 1) => (3, 3),
51        (1, 2) => (3, 4),
52        (1, 3) => (3, 3),
53        (1, 4) => (3, 4),
54        (1, 5) => (3, 5),
55        (1, 6) => (3, 2),
56        (1, 7) => (3, 5),
57        //
58        (2, 0) => (0, 2),
59        (2, 1) => (0, 3),
60        (2, 2) => (0, 4),
61        (2, 3) => (0, 3),
62        (2, 4) => (0, 4),
63        (2, 5) => (0, 5),
64        (2, 6) => (0, 2),
65        (2, 7) => (0, 5),
66        //
67        (3, 0) => (1, 2),
68        (3, 1) => (3, 1),
69        (3, 2) => (3, 0),
70        (3, 3) => (3, 1),
71        (3, 4) => (3, 0),
72        (3, 5) => (1, 5),
73        (3, 6) => (1, 2),
74        (3, 7) => (1, 5),
75        //
76        (4, 0) => (2, 2),
77        (4, 1) => (2, 1),
78        (4, 2) => (2, 0),
79        (4, 3) => (2, 1),
80        (4, 4) => (2, 0),
81        (4, 5) => (2, 5),
82        (4, 6) => (2, 2),
83        (4, 7) => (2, 5),
84        //
85        (5, 0) => (1, 2),
86        (5, 1) => (3, 1),
87        (5, 2) => (3, 0),
88        (5, 3) => (3, 1),
89        (5, 4) => (3, 0),
90        (5, 5) => (1, 5),
91        (5, 6) => (1, 2),
92        (5, 7) => (1, 5),
93        //
94        (6, 0) => (2, 2),
95        (6, 1) => (2, 1),
96        (6, 2) => (2, 0),
97        (6, 3) => (2, 1),
98        (6, 4) => (2, 0),
99        (6, 5) => (2, 5),
100        (6, 6) => (2, 2),
101        (6, 7) => (2, 5),
102        //
103        (7, 0) => (3, 2),
104        (7, 1) => (3, 3),
105        (7, 2) => (3, 4),
106        (7, 3) => (3, 3),
107        (7, 4) => (3, 4),
108        (7, 5) => (3, 5),
109        (7, 6) => (3, 2),
110        (7, 7) => (3, 5),
111        //
112        (8, 0) => (2, 4),
113        (8, 1) => (2, 1),
114        (8, 2) => (0, 4),
115        (8, 3) => (0, 3),
116        (8, 4) => (0, 4),
117        (8, 5) => (0, 3),
118        (8, 6) => (2, 0),
119        (8, 7) => (2, 3),
120        //
121        (9, 0) => (3, 0),
122        (9, 1) => (3, 1),
123        (9, 2) => (3, 0),
124        (9, 3) => (1, 3),
125        (9, 4) => (1, 4),
126        (9, 5) => (3, 1),
127        (9, 6) => (3, 0),
128        (9, 7) => (3, 1),
129        //
130        (10, 0) => (2, 2),
131        (10, 1) => (2, 1),
132        (10, 2) => (2, 0),
133        (10, 3) => (2, 3),
134        (10, 4) => (2, 4),
135        (10, 5) => (2, 1),
136        (10, 6) => (2, 0),
137        (10, 7) => (2, 5),
138        //
139        (11, 0) => (1, 2),
140        (11, 1) => (1, 3),
141        (11, 2) => (1, 4),
142        (11, 3) => (1, 3),
143        (11, 4) => (1, 4),
144        (11, 5) => (1, 3),
145        (11, 6) => (1, 4),
146        (11, 7) => (1, 5),
147        //
148        (12, 0) => (2, 2),
149        (12, 1) => (2, 3),
150        (12, 2) => (2, 4),
151        (12, 3) => (2, 3),
152        (12, 4) => (2, 4),
153        (12, 5) => (2, 3),
154        (12, 6) => (2, 4),
155        (12, 7) => (2, 5),
156        //
157        (13, 0) => (1, 2),
158        (13, 1) => (3, 1),
159        (13, 2) => (3, 0),
160        (13, 3) => (1, 3),
161        (13, 4) => (1, 4),
162        (13, 5) => (3, 1),
163        (13, 6) => (3, 0),
164        (13, 7) => (1, 5),
165        //
166        (14, 0) => (2, 0),
167        (14, 1) => (2, 1),
168        (14, 2) => (2, 0),
169        (14, 3) => (2, 3),
170        (14, 4) => (2, 4),
171        (14, 5) => (2, 1),
172        (14, 6) => (2, 0),
173        (14, 7) => (2, 1),
174        //
175        (15, 0) => (1, 4),
176        (15, 1) => (3, 1),
177        (15, 2) => (3, 4),
178        (15, 3) => (3, 3),
179        (15, 4) => (3, 4),
180        (15, 5) => (3, 3),
181        (15, 6) => (3, 0),
182        (15, 7) => (1, 3),
183        //
184        (16, 0) => (0, 2),
185        (16, 1) => (0, 3),
186        (16, 2) => (0, 4),
187        (16, 3) => (0, 3),
188        (16, 4) => (2, 0),
189        (16, 5) => (2, 1),
190        (16, 6) => (0, 4),
191        (16, 7) => (0, 5),
192        //
193        (17, 0) => (1, 2),
194        (17, 1) => (1, 3),
195        (17, 2) => (1, 4),
196        (17, 3) => (1, 3),
197        (17, 4) => (1, 4),
198        (17, 5) => (1, 3),
199        (17, 6) => (1, 4),
200        (17, 7) => (1, 5),
201        //
202        (18, 0) => (2, 0),
203        (18, 1) => (2, 3),
204        (18, 2) => (2, 0),
205        (18, 3) => (2, 3),
206        (18, 4) => (2, 4),
207        (18, 5) => (2, 3),
208        (18, 6) => (2, 4),
209        (18, 7) => (2, 5),
210        //
211        (19, 0) => (3, 0),
212        (19, 1) => (1, 3),
213        (19, 2) => (1, 4),
214        (19, 3) => (3, 1),
215        (19, 4) => (1, 4),
216        (19, 5) => (1, 3),
217        (19, 6) => (1, 4),
218        (19, 7) => (1, 5),
219        //
220        (20, 0) => (2, 2),
221        (20, 1) => (2, 3),
222        (20, 2) => (0, 0),
223        (20, 3) => (0, 1),
224        (20, 4) => (2, 4),
225        (20, 5) => (2, 1),
226        (20, 6) => (2, 4),
227        (20, 7) => (2, 1),
228        //
229        (21, 0) => (1, 2),
230        (21, 1) => (1, 3),
231        (21, 2) => (1, 0),
232        (21, 3) => (1, 1),
233        (21, 4) => (3, 0),
234        (21, 5) => (1, 3),
235        (21, 6) => (1, 4),
236        (21, 7) => (3, 1),
237        //
238        (22, 0) => (2, 2),
239        (22, 1) => (2, 3),
240        (22, 2) => (2, 4),
241        (22, 3) => (2, 3),
242        (22, 4) => (2, 4),
243        (22, 5) => (2, 3),
244        (22, 6) => (2, 4),
245        (22, 7) => (2, 5),
246        //
247        (23, 0) => (3, 2),
248        (23, 1) => (3, 3),
249        (23, 2) => (3, 0),
250        (23, 3) => (3, 1),
251        (23, 4) => (3, 4),
252        (23, 5) => (3, 3),
253        (23, 6) => (3, 4),
254        (23, 7) => (3, 5),
255        _ => unreachable!(),
256    }
257}
258
259/// ```js
260/// 0b0000 <- [(1, 1), (2, 1), (1, 2), (2, 2)]
261/// 0b0001 <- [(4, 6), (2, 1), (1, 2), (2, 2)]
262/// 0b0010 <- [(1, 1), (1, 6), (1, 2), (2, 2)]
263/// 0b0011 <- [(2, 6), (3, 6), (1, 2), (2, 2)]
264/// 0b0100 <- [(1, 1), (2, 1), (4, 3), (2, 2)]
265/// 0b0101 <- [(4, 4), (2, 1), (4, 3), (2, 2)]
266/// 0b0110 <- [(1, 1), (2, 1), (3, 4), (2, 2)]
267/// 0b0111 <- [(2, 4), (3, 4), (4, 3), (2, 2)]
268/// 0b1000 <- [(1, 1), (2, 1), (1, 2), (1, 3)]
269/// 0b1001 <- [(4, 6), (2, 1), (1, 2), (1, 3)]
270/// 0b1010 <- [(1, 1), (1, 6), (1, 2), (1, 5)]
271/// 0b1011 <- [(2, 6), (3, 6), (1, 2), (1, 5)]
272/// 0b1100 <- [(1, 1), (2, 1), (4, 3), (3, 3)]
273/// 0b1101 <- [(4, 4), (2, 1), (4, 3), (3, 3)]
274/// 0b1110 <- [(1, 1), (2, 1), (3, 4), (3, 1)]
275/// 0b1111 <- [(2, 4), (3, 4), (4, 3), (3, 5)]
276/// ```
277#[allow(unused)]
278fn rpg4x6_to_wang(raw: &RgbaImage, mask: u8) -> ImageResult<RgbaImage> {
279    let width = raw.width() / 4;
280    let height = raw.height() / 6;
281    let xs = match mask {
282        0b0000 => [(0, 0), (1, 0), (0, 1), (1, 1)],
283        0b0001 => [(3, 5), (1, 0), (0, 1), (1, 1)],
284        0b0010 => [(0, 0), (0, 5), (0, 1), (1, 1)],
285        0b0011 => [(1, 5), (2, 5), (0, 1), (1, 1)],
286        0b0100 => [(0, 0), (1, 0), (3, 2), (1, 1)],
287        0b0101 => [(3, 3), (1, 0), (3, 4), (1, 1)],
288        0b0110 => [(0, 0), (0, 5), (3, 2), (1, 1)],
289        0b0111 => [(3, 1), (2, 5), (3, 4), (1, 1)],
290        0b1000 => [(0, 0), (1, 0), (0, 1), (0, 2)],
291        0b1001 => [(3, 5), (1, 0), (0, 1), (0, 2)],
292        0b1010 => [(0, 0), (0, 3), (0, 1), (0, 4)],
293        0b1011 => [(1, 5), (2, 1), (0, 1), (0, 4)],
294        0b1100 => [(0, 0), (1, 0), (1, 2), (2, 2)],
295        0b1101 => [(3, 3), (1, 0), (3, 0), (2, 2)],
296        0b1110 => [(0, 0), (0, 3), (1, 2), (2, 0)],
297        0b1111 => [(1, 3), (2, 3), (1, 4), (2, 4)],
298        _ => unreachable!(),
299    };
300    let mut out = RgbaImage::new(width * 2, height * 2);
301    for (i, (x, y)) in xs.iter().enumerate() {
302        let view = raw.view(*x * width, *y * height, width, height);
303        let x = (i as u32 % 2) * width;
304        let y = (i as u32 / 2) * height;
305        out.copy_from(&view.to_image(), x, y)?;
306    }
307    Ok(out)
308}