1 // Aseprite
2 // Copyright (C) 2001-2018  David Capello
3 //
4 // This program is distributed under the terms of
5 // the End-User License Agreement for Aseprite.
6 
7 #ifndef APP_DOC_API_H_INCLUDED
8 #define APP_DOC_API_H_INCLUDED
9 #pragma once
10 
11 #include "app/drop_frame_place.h"
12 #include "app/tags_handling.h"
13 #include "doc/algorithm/flip_type.h"
14 #include "doc/color.h"
15 #include "doc/frame.h"
16 #include "doc/image_ref.h"
17 #include "gfx/rect.h"
18 
19 namespace doc {
20   class Cel;
21   class Image;
22   class Layer;
23   class LayerGroup;
24   class LayerImage;
25   class Mask;
26   class Palette;
27   class Sprite;
28 }
29 
30 namespace app {
31   class Doc;
32   class Transaction;
33 
34   using namespace doc;
35 
36   // Old high-level API. The new way is to create Cmds and add them
37   // directly to the transaction.
38   //
39   // TODO refactor this class in several Cmd, don't make it bigger
40   class DocApi {
41   public:
42     DocApi(Doc* document, Transaction& transaction);
43 
44     // Sprite API
45     void setSpriteSize(Sprite* sprite, int w, int h);
46     void setSpriteTransparentColor(Sprite* sprite, color_t maskColor);
47     void cropSprite(Sprite* sprite, const gfx::Rect& bounds);
48     void trimSprite(Sprite* sprite);
49 
50     // Frames API
51     void addFrame(Sprite* sprite, frame_t newFrame);
52     void addEmptyFrame(Sprite* sprite, frame_t newFrame);
53     void addEmptyFramesTo(Sprite* sprite, frame_t newFrame);
54     void copyFrame(Sprite* sprite,
55                    const frame_t fromFrame,
56                    const frame_t newFrame,
57                    const DropFramePlace dropFramePlace,
58                    const TagsHandling tagsHandling);
59     void removeFrame(Sprite* sprite, frame_t frame);
60     void setTotalFrames(Sprite* sprite, frame_t frames);
61     void setFrameDuration(Sprite* sprite, frame_t frame, int msecs);
62     void setFrameRangeDuration(Sprite* sprite, frame_t from, frame_t to, int msecs);
63     void moveFrame(Sprite* sprite,
64                    const frame_t frame,
65                    frame_t targetFrame,
66                    const DropFramePlace dropFramePlace,
67                    const TagsHandling tagsHandling);
68 
69     // Cels API
70     void addCel(LayerImage* layer, Cel* cel);
71     Cel* addCel(LayerImage* layer, frame_t frameNumber, const ImageRef& image);
72     void clearCel(LayerImage* layer, frame_t frame);
73     void clearCel(Cel* cel);
74     void setCelPosition(Sprite* sprite, Cel* cel, int x, int y);
75     void setCelOpacity(Sprite* sprite, Cel* cel, int newOpacity);
76     void moveCel(
77       LayerImage* srcLayer, frame_t srcFrame,
78       LayerImage* dstLayer, frame_t dstFrame);
79     void copyCel(
80       LayerImage* srcLayer, frame_t srcFrame,
81       LayerImage* dstLayer, frame_t dstFrame);
82     void copyCel(
83       LayerImage* srcLayer, frame_t srcFrame,
84       LayerImage* dstLayer, frame_t dstFrame, bool continuous);
85     void swapCel(
86       LayerImage* layer, frame_t frame1, frame_t frame2);
87 
88     // Layers API
89     LayerImage* newLayer(LayerGroup* parent, const std::string& name);
90     LayerGroup* newGroup(LayerGroup* parent, const std::string& name);
91     void addLayer(LayerGroup* parent, Layer* newLayer, Layer* afterThis);
92     void removeLayer(Layer* layer);
93     void restackLayerAfter(Layer* layer, LayerGroup* parent, Layer* afterThis);
94     void restackLayerBefore(Layer* layer, LayerGroup* parent, Layer* beforeThis);
95     void backgroundFromLayer(Layer* layer);
96     void layerFromBackground(Layer* layer);
97     Layer* duplicateLayerAfter(Layer* sourceLayer, LayerGroup* parent, Layer* afterLayer);
98     Layer* duplicateLayerBefore(Layer* sourceLayer, LayerGroup* parent, Layer* beforeLayer);
99 
100     // Images API
101     void replaceImage(Sprite* sprite, const ImageRef& oldImage, const ImageRef& newImage);
102 
103     // Image API
104     void flipImage(Image* image, const gfx::Rect& bounds, doc::algorithm::FlipType flipType);
105     void flipImageWithMask(Layer* layer, Image* image, doc::algorithm::FlipType flipType);
106 
107     // Mask API
108     void copyToCurrentMask(Mask* mask);
109     void setMaskPosition(int x, int y);
110 
111     // Palette API
112     void setPalette(Sprite* sprite, frame_t frame, const Palette* newPalette);
113 
114   private:
115     void setCelFramePosition(Cel* cel, frame_t frame);
116     void moveFrameLayer(Layer* layer, frame_t frame, frame_t beforeFrame);
117     void adjustFrameTags(Sprite* sprite,
118                          const frame_t frame,
119                          const frame_t delta,
120                          const DropFramePlace dropFramePlace,
121                          const TagsHandling tagsHandling);
122 
123     Doc* m_document;
124     Transaction& m_transaction;
125   };
126 
127 } // namespace app
128 
129 #endif
130