forked from aseprite/aseprite
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathrender.h
More file actions
243 lines (210 loc) · 6.26 KB
/
render.h
File metadata and controls
243 lines (210 loc) · 6.26 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
// Aseprite Render Library
// Copyright (c) 2001-2016 David Capello
//
// This file is released under the terms of the MIT license.
// Read LICENSE.txt for more information.
#ifndef RENDER_RENDER_H_INCLUDED
#define RENDER_RENDER_H_INCLUDED
#pragma once
#include "doc/anidir.h"
#include "doc/blend_mode.h"
#include "doc/color.h"
#include "doc/frame.h"
#include "doc/pixel_format.h"
#include "gfx/point.h"
#include "gfx/size.h"
#include "render/extra_type.h"
#include "render/onionskin_position.h"
#include "render/zoom.h"
namespace gfx {
class Clip;
}
namespace doc {
class Cel;
class FrameTag;
class Image;
class Layer;
class Palette;
class Sprite;
}
namespace render {
using namespace doc;
enum class BgType {
NONE,
TRANSPARENT,
CHECKED,
};
enum class OnionskinType {
NONE,
MERGE,
RED_BLUE_TINT,
};
class OnionskinOptions {
public:
OnionskinOptions(OnionskinType type)
: m_type(type)
, m_position(OnionskinPosition::BEHIND)
, m_prevFrames(0)
, m_nextFrames(0)
, m_opacityBase(0)
, m_opacityStep(0)
, m_loopTag(nullptr)
, m_layer(nullptr) {
}
OnionskinType type() const { return m_type; }
OnionskinPosition position() const { return m_position; }
int prevFrames() const { return m_prevFrames; }
int nextFrames() const { return m_nextFrames; }
int opacityBase() const { return m_opacityBase; }
int opacityStep() const { return m_opacityStep; }
FrameTag* loopTag() const { return m_loopTag; }
Layer* layer() const { return m_layer; }
void type(OnionskinType type) { m_type = type; }
void position(OnionskinPosition position) { m_position = position; }
void prevFrames(int prevFrames) { m_prevFrames = prevFrames; }
void nextFrames(int nextFrames) { m_nextFrames = nextFrames; }
void opacityBase(int base) { m_opacityBase = base; }
void opacityStep(int step) { m_opacityStep = step; }
void loopTag(FrameTag* loopTag) { m_loopTag = loopTag; }
void layer(Layer* layer) { m_layer = layer; }
private:
OnionskinType m_type;
OnionskinPosition m_position;
int m_prevFrames;
int m_nextFrames;
int m_opacityBase;
int m_opacityStep;
FrameTag* m_loopTag;
Layer* m_layer;
};
typedef void (*CompositeImageFunc)(
Image* dst,
const Image* src,
const Palette* pal,
const gfx::Clip& area,
const int opacity,
const BlendMode blendMode,
const Zoom& zoom);
class Render {
public:
Render();
// Background configuration
void setBgType(BgType type);
void setBgZoom(bool state);
void setBgColor1(color_t color);
void setBgColor2(color_t color);
void setBgCheckedSize(const gfx::Size& size);
// Sets the preview image. This preview image is an alternative
// image to be used for the given layer/frame.
void setPreviewImage(const Layer* layer,
const frame_t frame,
const Image* image,
const gfx::Point& pos,
const BlendMode blendMode);
void removePreviewImage();
// Sets an extra cel/image to be drawn after the current
// layer/frame.
void setExtraImage(
ExtraType type,
const Cel* cel, const Image* image, BlendMode blendMode,
const Layer* currentLayer,
frame_t currentFrame);
void removeExtraImage();
void setOnionskin(const OnionskinOptions& options);
void disableOnionskin();
void renderSprite(
Image* dstImage,
const Sprite* sprite,
frame_t frame);
void renderSprite(
Image* dstImage,
const Sprite* sprite,
frame_t frame,
const gfx::Clip& area);
void renderLayer(
Image* dstImage,
const Layer* layer,
frame_t frame);
void renderLayer(
Image* dstImage,
const Layer* layer,
frame_t frame,
const gfx::Clip& area,
BlendMode blendMode = BlendMode::UNSPECIFIED);
// Main function used to render the sprite. Draws the given sprite
// frame in a new image and return it. Note: zoomedRect must have
// the zoom applied (zoomedRect = zoom.apply(spriteRect)).
void renderSprite(
Image* dstImage,
const Sprite* sprite,
frame_t frame,
const gfx::Clip& area,
Zoom zoom);
// Extra functions
void renderBackground(Image* image,
const gfx::Clip& area,
Zoom zoom);
void renderImage(Image* dst_image, const Image* src_image,
const Palette* pal, int x, int y, Zoom zoom,
int opacity, BlendMode blendMode);
private:
void renderOnionskin(
Image* image,
const gfx::Clip& area,
frame_t frame, Zoom zoom,
CompositeImageFunc compositeImage);
void renderLayer(
const Layer* layer,
Image* image,
const gfx::Clip& area,
frame_t frame, Zoom zoom,
CompositeImageFunc compositeImage,
bool render_background,
bool render_transparent,
BlendMode blendMode);
void renderCel(
Image* dst_image,
const Image* cel_image,
const Palette* pal,
const gfx::Point& celPos,
const gfx::Clip& area,
CompositeImageFunc compositeImage,
int opacity, BlendMode blendMode, Zoom zoom);
void renderImage(
Image* dst_image,
const Image* cel_image,
const Palette* pal,
const int x,
const int y,
const gfx::Clip& area,
CompositeImageFunc compositeImage,
int opacity, BlendMode blendMode, Zoom zoom);
const Sprite* m_sprite;
const Layer* m_currentLayer;
frame_t m_currentFrame;
ExtraType m_extraType;
const Cel* m_extraCel;
const Image* m_extraImage;
BlendMode m_extraBlendMode;
BgType m_bgType;
bool m_bgZoom;
color_t m_bgColor1;
color_t m_bgColor2;
gfx::Size m_bgCheckedSize;
int m_globalOpacity;
const Layer* m_selectedLayer;
frame_t m_selectedFrame;
const Image* m_previewImage;
gfx::Point m_previewPos;
BlendMode m_previewBlendMode;
OnionskinOptions m_onionskin;
};
void composite_image(Image* dst,
const Image* src,
const Palette* pal,
const int x,
const int y,
const int opacity,
const BlendMode blendMode);
} // namespace render
#endif