1 // Aseprite Document Library
2 // Copyright (c) 2017 David Capello
3 //
4 // This file is released under the terms of the MIT license.
5 // Read LICENSE.txt for more information.
6
7 #ifdef HAVE_CONFIG_H
8 #include "config.h"
9 #endif
10
11 #include "doc/slice_io.h"
12
13 #include "base/serialization.h"
14 #include "base/unique_ptr.h"
15 #include "doc/slice.h"
16 #include "doc/string_io.h"
17 #include "doc/user_data_io.h"
18
19 #include <iostream>
20
21 namespace doc {
22
23 using namespace base::serialization;
24 using namespace base::serialization::little_endian;
25
write_slice(std::ostream & os,const Slice * slice)26 void write_slice(std::ostream& os, const Slice* slice)
27 {
28 write32(os, slice->id());
29 write_string(os, slice->name());
30 write_user_data(os, slice->userData());
31
32 // Number of keys
33 write32(os, slice->size());
34 for (const auto& key : *slice) {
35 write32(os, key.frame());
36 write_slicekey(os, *key.value());
37 }
38 }
39
read_slice(std::istream & is,bool setId)40 Slice* read_slice(std::istream& is, bool setId)
41 {
42 ObjectId id = read32(is);
43 std::string name = read_string(is);
44 UserData userData = read_user_data(is);
45 size_t nkeys = read32(is);
46
47 base::UniquePtr<Slice> slice(new Slice);
48 slice->setName(name);
49 slice->setUserData(userData);
50 while (nkeys--) {
51 frame_t fr = read32(is);
52 slice->insert(fr, read_slicekey(is));
53 }
54
55 if (setId)
56 slice->setId(id);
57 return slice.release();
58 }
59
write_slicekey(std::ostream & os,const SliceKey & sliceKey)60 void write_slicekey(std::ostream& os, const SliceKey& sliceKey)
61 {
62 write32(os, sliceKey.bounds().x);
63 write32(os, sliceKey.bounds().y);
64 write32(os, sliceKey.bounds().w);
65 write32(os, sliceKey.bounds().h);
66 write32(os, sliceKey.center().x);
67 write32(os, sliceKey.center().y);
68 write32(os, sliceKey.center().w);
69 write32(os, sliceKey.center().h);
70 write32(os, sliceKey.pivot().x);
71 write32(os, sliceKey.pivot().y);
72 }
73
read_slicekey(std::istream & is)74 SliceKey read_slicekey(std::istream& is)
75 {
76 gfx::Rect bounds, center;
77 gfx::Point pivot;
78 bounds.x = read32(is);
79 bounds.y = read32(is);
80 bounds.w = read32(is);
81 bounds.h = read32(is);
82 center.x = read32(is);
83 center.y = read32(is);
84 center.w = read32(is);
85 center.h = read32(is);
86 pivot.x = read32(is);
87 pivot.y = read32(is);
88 return SliceKey(bounds, center, pivot);
89 }
90
91 }
92