1 // Aseprite
2 // Copyright (C) 2018  David Capello
3 //
4 // This program is distributed under the terms of
5 // the End-User License Agreement for Aseprite.
6 
7 #ifdef HAVE_CONFIG_H
8 #include "config.h"
9 #endif
10 
11 #include "app/ui/editor/editor_render.h"
12 
13 #include "app/color_utils.h"
14 #include "app/pref/preferences.h"
15 #include "render/render.h"
16 
17 namespace app {
18 
19 static doc::ImageBufferPtr g_renderBuffer;
20 
EditorRender()21 EditorRender::EditorRender()
22   : m_render(new render::Render)
23 {
24 }
25 
~EditorRender()26 EditorRender::~EditorRender()
27 {
28   delete m_render;
29 }
30 
setRefLayersVisiblity(const bool visible)31 void EditorRender::setRefLayersVisiblity(const bool visible)
32 {
33   m_render->setRefLayersVisiblity(visible);
34 }
35 
setNonactiveLayersOpacity(const int opacity)36 void EditorRender::setNonactiveLayersOpacity(const int opacity)
37 {
38   m_render->setNonactiveLayersOpacity(opacity);
39 }
40 
setProjection(const render::Projection & projection)41 void EditorRender::setProjection(const render::Projection& projection)
42 {
43   m_render->setProjection(projection);
44 }
45 
setupBackground(Doc * doc,doc::PixelFormat pixelFormat)46 void EditorRender::setupBackground(Doc* doc, doc::PixelFormat pixelFormat)
47 {
48   DocumentPreferences& docPref = Preferences::instance().document(doc);
49   render::BgType bgType;
50 
51   gfx::Size tile;
52   switch (docPref.bg.type()) {
53     case app::gen::BgType::CHECKED_16x16:
54       bgType = render::BgType::CHECKED;
55       tile = gfx::Size(16, 16);
56       break;
57     case app::gen::BgType::CHECKED_8x8:
58       bgType = render::BgType::CHECKED;
59       tile = gfx::Size(8, 8);
60       break;
61     case app::gen::BgType::CHECKED_4x4:
62       bgType = render::BgType::CHECKED;
63       tile = gfx::Size(4, 4);
64       break;
65     case app::gen::BgType::CHECKED_2x2:
66       bgType = render::BgType::CHECKED;
67       tile = gfx::Size(2, 2);
68       break;
69     case app::gen::BgType::CHECKED_1x1:
70       bgType = render::BgType::CHECKED;
71       tile = gfx::Size(1, 1);
72       break;
73     default:
74       bgType = render::BgType::TRANSPARENT;
75       break;
76   }
77 
78   m_render->setBgType(bgType);
79   m_render->setBgZoom(docPref.bg.zoom());
80   m_render->setBgColor1(color_utils::color_for_image(docPref.bg.color1(), pixelFormat));
81   m_render->setBgColor2(color_utils::color_for_image(docPref.bg.color2(), pixelFormat));
82   m_render->setBgCheckedSize(tile);
83 }
84 
setTransparentBackground()85 void EditorRender::setTransparentBackground()
86 {
87   m_render->setBgType(render::BgType::TRANSPARENT);
88 }
89 
setSelectedLayer(const doc::Layer * layer)90 void EditorRender::setSelectedLayer(const doc::Layer* layer)
91 {
92   m_render->setSelectedLayer(layer);
93 }
94 
setPreviewImage(const doc::Layer * layer,const doc::frame_t frame,const doc::Image * image,const gfx::Point & pos,const doc::BlendMode blendMode)95 void EditorRender::setPreviewImage(const doc::Layer* layer,
96                          const doc::frame_t frame,
97                          const doc::Image* image,
98                          const gfx::Point& pos,
99                          const doc::BlendMode blendMode)
100 {
101   m_render->setPreviewImage(layer, frame, image, pos, blendMode);
102 }
103 
removePreviewImage()104 void EditorRender::removePreviewImage()
105 {
106   m_render->removePreviewImage();
107 }
108 
setExtraImage(render::ExtraType type,const doc::Cel * cel,const doc::Image * image,doc::BlendMode blendMode,const doc::Layer * currentLayer,doc::frame_t currentFrame)109 void EditorRender::setExtraImage(
110   render::ExtraType type,
111   const doc::Cel* cel,
112   const doc::Image* image,
113   doc::BlendMode blendMode,
114   const doc::Layer* currentLayer,
115   doc::frame_t currentFrame)
116 {
117   m_render->setExtraImage(type, cel, image, blendMode,
118                           currentLayer, currentFrame);
119 }
120 
removeExtraImage()121 void EditorRender::removeExtraImage()
122 {
123   m_render->removeExtraImage();
124 }
125 
setOnionskin(const render::OnionskinOptions & options)126 void EditorRender::setOnionskin(const render::OnionskinOptions& options)
127 {
128   m_render->setOnionskin(options);
129 }
130 
disableOnionskin()131 void EditorRender::disableOnionskin()
132 {
133   m_render->disableOnionskin();
134 }
135 
renderSprite(doc::Image * dstImage,const doc::Sprite * sprite,doc::frame_t frame)136 void EditorRender::renderSprite(
137   doc::Image* dstImage,
138   const doc::Sprite* sprite,
139   doc::frame_t frame)
140 {
141   m_render->renderSprite(dstImage, sprite, frame);
142 }
143 
renderSprite(doc::Image * dstImage,const doc::Sprite * sprite,doc::frame_t frame,const gfx::ClipF & area)144 void EditorRender::renderSprite(
145   doc::Image* dstImage,
146   const doc::Sprite* sprite,
147   doc::frame_t frame,
148   const gfx::ClipF& area)
149 {
150   m_render->renderSprite(dstImage, sprite, frame, area);
151 }
152 
renderBackground(doc::Image * image,const gfx::Clip & area)153 void EditorRender::renderBackground(
154   doc::Image* image,
155   const gfx::Clip& area)
156 {
157   m_render->renderBackground(image, area);
158 }
159 
renderImage(doc::Image * dst_image,const doc::Image * src_image,const doc::Palette * pal,const int x,const int y,const int opacity,const doc::BlendMode blendMode)160 void EditorRender::renderImage(
161   doc::Image* dst_image,
162   const doc::Image* src_image,
163   const doc::Palette* pal,
164   const int x,
165   const int y,
166   const int opacity,
167   const doc::BlendMode blendMode)
168 {
169   m_render->renderImage(dst_image, src_image, pal,
170                         x, y, opacity, blendMode);
171 }
172 
getRenderImageBuffer()173 doc::ImageBufferPtr EditorRender::getRenderImageBuffer()
174 {
175   if (!g_renderBuffer)
176     g_renderBuffer.reset(new doc::ImageBuffer);
177   return g_renderBuffer;
178 }
179 
180 } // namespace app
181