1// Aseprite Document Library
2// Copyright (c) 2001-2018 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/mask_io.h"
12
13#include "base/serialization.h"
14#include "doc/mask.h"
15
16#include <iostream>
17#include <memory>
18
19namespace doc {
20
21using namespace base::serialization;
22using namespace base::serialization::little_endian;
23
24// Serialized Mask data:
25//
26// WORD[4] x, y, w, h
27// for each line ("h" times)
28// for each packet ("((w+7)/8)" times)
29// BYTE 8 pixels of the mask
30// BYTE for Indexed images
31
32void write_mask(std::ostream& os, const Mask* mask)
33{
34 const gfx::Rect& bounds = mask->bounds();
35
36 write16(os, bounds.x); // Xpos
37 write16(os, bounds.y); // Ypos
38 write16(os, mask->bitmap() ? bounds.w: 0); // Width
39 write16(os, mask->bitmap() ? bounds.h: 0); // Height
40
41 if (mask->bitmap()) {
42 int size = BitmapTraits::getRowStrideBytes(bounds.w);
43
44 for (int c=0; c<bounds.h; c++)
45 os.write((char*)mask->bitmap()->getPixelAddress(0, c), size);
46 }
47}
48
49Mask* read_mask(std::istream& is)
50{
51 int x = int16_t(read16(is)); // Xpos (it's a signed int16 because we support negative mask coordinates)
52 int y = int16_t(read16(is)); // Ypos
53 int w = read16(is); // Width
54 int h = read16(is); // Height
55
56 std::unique_ptr<Mask> mask(new Mask());
57
58 if (w > 0 && h > 0) {
59 int size = BitmapTraits::getRowStrideBytes(w);
60
61 mask->add(gfx::Rect(x, y, w, h));
62 for (int c=0; c<mask->bounds().h; c++)
63 is.read((char*)mask->bitmap()->getPixelAddress(0, c), size);
64 }
65
66 return mask.release();
67}
68
69}
70