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