Create EditorRender to merge shared render image buffer and AppRender

This commit is contained in:
David Capello 2018-06-19 23:25:31 -03:00
parent a5b0c7ebdd
commit c3e233f34d
18 changed files with 435 additions and 201 deletions

View File

@ -169,7 +169,6 @@ if(ENABLE_UI)
set(ui_app_files
app_brushes.cpp
app_menus.cpp
app_render.cpp
commands/cmd_about.cpp
commands/cmd_add_color.cpp
commands/cmd_advanced_mode.cpp
@ -328,6 +327,7 @@ if(ENABLE_UI)
ui/editor/drawing_state.cpp
ui/editor/editor.cpp
ui/editor/editor_observers.cpp
ui/editor/editor_render.cpp
ui/editor/editor_states_history.cpp
ui/editor/editor_view.cpp
ui/editor/moving_cel_state.cpp

View File

@ -1,67 +0,0 @@
// Aseprite
// Copyright (C) 2001-2017 David Capello
//
// This program is distributed under the terms of
// the End-User License Agreement for Aseprite.
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include "app/app_render.h"
#include "app/color_utils.h"
#include "app/pref/preferences.h"
#include "render/render.h"
namespace app {
AppRender::AppRender()
{
}
AppRender::AppRender(app::Document* doc, doc::PixelFormat pixelFormat)
{
setupBackground(doc, pixelFormat);
}
void AppRender::setupBackground(app::Document* doc, doc::PixelFormat pixelFormat)
{
DocumentPreferences& docPref = Preferences::instance().document(doc);
render::BgType bgType;
gfx::Size tile;
switch (docPref.bg.type()) {
case app::gen::BgType::CHECKED_16x16:
bgType = render::BgType::CHECKED;
tile = gfx::Size(16, 16);
break;
case app::gen::BgType::CHECKED_8x8:
bgType = render::BgType::CHECKED;
tile = gfx::Size(8, 8);
break;
case app::gen::BgType::CHECKED_4x4:
bgType = render::BgType::CHECKED;
tile = gfx::Size(4, 4);
break;
case app::gen::BgType::CHECKED_2x2:
bgType = render::BgType::CHECKED;
tile = gfx::Size(2, 2);
break;
case app::gen::BgType::CHECKED_1x1:
bgType = render::BgType::CHECKED;
tile = gfx::Size(1, 1);
break;
default:
bgType = render::BgType::TRANSPARENT;
break;
}
setBgType(bgType);
setBgZoom(docPref.bg.zoom());
setBgColor1(color_utils::color_for_image(docPref.bg.color1(), pixelFormat));
setBgColor2(color_utils::color_for_image(docPref.bg.color2(), pixelFormat));
setBgCheckedSize(tile);
}
}

View File

@ -1,27 +0,0 @@
// Aseprite
// Copyright (C) 2001-2015 David Capello
//
// This program is distributed under the terms of
// the End-User License Agreement for Aseprite.
#ifndef APP_RENDER_H_INCLUDED
#define APP_RENDER_H_INCLUDED
#pragma once
#include "doc/pixel_format.h"
#include "render/render.h"
namespace app {
class Document;
class AppRender : public render::Render {
public:
AppRender();
AppRender(app::Document* doc, doc::PixelFormat pixelFormat);
void setupBackground(app::Document* doc, doc::PixelFormat pixelFormat);
};
} // namespace app
#endif // APP_RENDER_H_INCLUDED

View File

@ -24,6 +24,7 @@
#include "app/transaction.h"
#include "app/ui/dithering_selector.h"
#include "app/ui/editor/editor.h"
#include "app/ui/editor/editor_render.h"
#include "app/ui/skin/skin_theme.h"
#include "base/bind.h"
#include "base/thread.h"

View File

@ -1,5 +1,5 @@
// Aseprite
// Copyright (C) 2001-2017 David Capello
// Copyright (C) 2001-2018 David Capello
//
// This program is distributed under the terms of
// the End-User License Agreement for Aseprite.
@ -11,7 +11,6 @@
#include "ui/ui.h"
#include "app/app.h"
#include "app/app_render.h"
#include "app/commands/command.h"
#include "app/commands/commands.h"
#include "app/context.h"
@ -19,6 +18,7 @@
#include "app/modules/gfx.h"
#include "app/pref/preferences.h"
#include "app/ui/editor/editor.h"
#include "app/ui/editor/editor_render.h"
#include "app/ui/keyboard_shortcuts.h"
#include "app/ui/status_bar.h"
#include "doc/conversion_she.h"
@ -172,15 +172,15 @@ protected:
virtual void onPaint(PaintEvent& ev) override {
Graphics* g = ev.graphics();
AppRender& render = m_editor->renderEngine();
EditorRender& render = m_editor->renderEngine();
render.setRefLayersVisiblity(false);
render.setProjection(render::Projection());
render.disableOnionskin();
render.setBgType(render::BgType::TRANSPARENT);
render.setTransparentBackground();
// Render sprite and leave the result in 'm_render' variable
if (m_render == nullptr) {
ImageBufferPtr buf = Editor::getRenderImageBuffer();
ImageBufferPtr buf = render.getRenderImageBuffer();
m_render.reset(Image::create(IMAGE_RGB,
m_sprite->width(), m_sprite->height(), buf));

View File

@ -1,5 +1,5 @@
// Aseprite
// Copyright (C) 2001-2017 David Capello
// Copyright (C) 2001-2018 David Capello
//
// This program is distributed under the terms of
// the End-User License Agreement for Aseprite.
@ -35,6 +35,7 @@
#include "doc/palette.h"
#include "doc/primitives.h"
#include "doc/sprite.h"
#include "render/render.h"
#include "ui/ui.h"
#include "import_sprite_sheet.xml.h"

View File

@ -13,6 +13,7 @@
#include "app/commands/filters/filter_manager_impl.h"
#include "app/modules/editors.h"
#include "app/ui/editor/editor.h"
#include "app/ui/editor/editor_render.h"
#include "base/bind.h"
#include "base/scoped_lock.h"
#include "doc/layer.h"

View File

@ -1,5 +1,5 @@
// Aseprite
// Copyright (C) 2001-2015 David Capello
// Copyright (C) 2001-2018 David Capello
//
// This program is distributed under the terms of
// the End-User License Agreement for Aseprite.
@ -11,10 +11,10 @@
#include "app/thumbnail_generator.h"
#include "app/app.h"
#include "app/app_render.h"
#include "app/document.h"
#include "app/file/file.h"
#include "app/file_system.h"
#include "app/ui/editor/editor_render.h"
#include "base/bind.h"
#include "base/scoped_lock.h"
#include "base/thread.h"
@ -71,9 +71,8 @@ private:
base::UniquePtr<Image> image(Image::create(
IMAGE_RGB, sprite->width(), sprite->height()));
AppRender render;
EditorRender render;
render.setupBackground(NULL, image->pixelFormat());
render.setBgType(render::BgType::CHECKED);
render.renderSprite(image, sprite, frame_t(0));
// Calculate the thumbnail size

View File

@ -1,5 +1,5 @@
// Aseprite
// Copyright (C) 2001-2017 David Capello
// Copyright (C) 2001-2018 David Capello
//
// This program is distributed under the terms of
// the End-User License Agreement for Aseprite.
@ -33,6 +33,7 @@
#include "doc/layer.h"
#include "doc/primitives.h"
#include "doc/site.h"
#include "render/render.h"
#include "she/display.h"
#include "ui/manager.h"
#include "ui/system.h"

View File

@ -1,5 +1,5 @@
// Aseprite
// Copyright (C) 2001-2017 David Capello
// Copyright (C) 2001-2018 David Capello
//
// This program is distributed under the terms of
// the End-User License Agreement for Aseprite.
@ -20,6 +20,7 @@
#include "app/tools/tool_loop_manager.h"
#include "app/ui/editor/editor.h"
#include "app/ui/editor/editor_customization_delegate.h"
#include "app/ui/editor/editor_render.h"
#include "app/ui/editor/glue.h"
#include "app/ui/keyboard_shortcuts.h"
#include "app/ui/skin/skin_theme.h"

View File

@ -35,6 +35,7 @@
#include "app/ui/editor/drawing_state.h"
#include "app/ui/editor/editor_customization_delegate.h"
#include "app/ui/editor/editor_decorator.h"
#include "app/ui/editor/editor_render.h"
#include "app/ui/editor/glue.h"
#include "app/ui/editor/moving_pixels_state.h"
#include "app/ui/editor/pixels_movement.h"
@ -153,10 +154,7 @@ private:
};
// static
doc::ImageBufferPtr Editor::m_renderBuffer;
// static
AppRender Editor::m_renderEngine;
EditorRender* Editor::m_renderEngine = nullptr;
Editor::Editor(Document* document, EditorFlags flags)
: Widget(editor_type())
@ -181,6 +179,9 @@ Editor::Editor(Document* document, EditorFlags flags)
, m_showGuidesThisCel(nullptr)
, m_tagFocusBand(-1)
{
if (!m_renderEngine)
m_renderEngine = new EditorRender;
m_proj.setPixelRatio(m_sprite->pixelRatio());
// Add the first state into the history.
@ -247,7 +248,10 @@ Editor::~Editor()
void Editor::destroyEditorSharedInternals()
{
m_renderBuffer.reset();
if (m_renderEngine) {
delete m_renderEngine;
m_renderEngine = nullptr;
}
}
bool Editor::isActive() const
@ -537,10 +541,6 @@ void Editor::drawOneSpriteUnclippedRect(ui::Graphics* g, const gfx::Rect& sprite
if (rc.isEmpty())
return;
// Generate the rendered image
if (!m_renderBuffer)
m_renderBuffer.reset(new doc::ImageBuffer());
base::UniquePtr<Image> rendered(NULL);
try {
// Generate a "expose sprite pixels" notification. This is used by
@ -571,17 +571,18 @@ void Editor::drawOneSpriteUnclippedRect(ui::Graphics* g, const gfx::Rect& sprite
}
// Create a temporary RGB bitmap to draw all to it
rendered.reset(Image::create(IMAGE_RGB, rc.w, rc.h, m_renderBuffer));
rendered.reset(Image::create(IMAGE_RGB, rc.w, rc.h,
m_renderEngine->getRenderImageBuffer()));
m_renderEngine.setRefLayersVisiblity(true);
m_renderEngine.setSelectedLayer(m_layer);
m_renderEngine->setRefLayersVisiblity(true);
m_renderEngine->setSelectedLayer(m_layer);
if (m_flags & Editor::kUseNonactiveLayersOpacityWhenEnabled)
m_renderEngine.setNonactiveLayersOpacity(Preferences::instance().experimental.nonactiveLayersOpacity());
m_renderEngine->setNonactiveLayersOpacity(Preferences::instance().experimental.nonactiveLayersOpacity());
else
m_renderEngine.setNonactiveLayersOpacity(255);
m_renderEngine.setProjection(m_proj);
m_renderEngine.setupBackground(m_document, rendered->pixelFormat());
m_renderEngine.disableOnionskin();
m_renderEngine->setNonactiveLayersOpacity(255);
m_renderEngine->setProjection(m_proj);
m_renderEngine->setupBackground(m_document, rendered->pixelFormat());
m_renderEngine->disableOnionskin();
if ((m_flags & kShowOnionskin) == kShowOnionskin) {
if (m_docPref.onionskin.active()) {
@ -604,13 +605,13 @@ void Editor::drawOneSpriteUnclippedRect(ui::Graphics* g, const gfx::Rect& sprite
tag = m_sprite->frameTags().innerTag(m_frame);
opts.loopTag(tag);
m_renderEngine.setOnionskin(opts);
m_renderEngine->setOnionskin(opts);
}
}
ExtraCelRef extraCel = m_document->extraCel();
if (extraCel && extraCel->type() != render::ExtraType::NONE) {
m_renderEngine.setExtraImage(
m_renderEngine->setExtraImage(
extraCel->type(),
extraCel->cel(),
extraCel->image(),
@ -618,10 +619,10 @@ void Editor::drawOneSpriteUnclippedRect(ui::Graphics* g, const gfx::Rect& sprite
m_layer, m_frame);
}
m_renderEngine.renderSprite(
m_renderEngine->renderSprite(
rendered, m_sprite, m_frame, gfx::Clip(0, 0, rc));
m_renderEngine.removeExtraImage();
m_renderEngine->removeExtraImage();
}
catch (const std::exception& e) {
Console::showException(e);
@ -1204,7 +1205,7 @@ void Editor::flashCurrentLayer()
int x, y;
const Image* src_image = site.image(&x, &y);
if (src_image) {
m_renderEngine.removePreviewImage();
m_renderEngine->removePreviewImage();
ExtraCelRef extraCel(new ExtraCel);
extraCel->create(m_sprite, m_sprite->bounds(), m_frame, 255);
@ -2383,12 +2384,6 @@ void Editor::showBrushPreview(const gfx::Point& screenPos)
m_brushPreview.show(screenPos);
}
// static
ImageBufferPtr Editor::getRenderImageBuffer()
{
return m_renderBuffer;
}
gfx::Point Editor::calcExtraPadding(const Projection& proj)
{
View* view = View::getView(this);

View File

@ -1,5 +1,5 @@
// Aseprite
// Copyright (C) 2001-2017 David Capello
// Copyright (C) 2001-2018 David Capello
//
// This program is distributed under the terms of
// the End-User License Agreement for Aseprite.
@ -8,7 +8,6 @@
#define APP_UI_EDITOR_H_INCLUDED
#pragma once
#include "app/app_render.h"
#include "app/color.h"
#include "app/document.h"
#include "app/pref/preferences.h"
@ -26,6 +25,7 @@
#include "filters/tiled_mode.h"
#include "gfx/fwd.h"
#include "obs/connection.h"
#include "render/projection.h"
#include "render/zoom.h"
#include "ui/base.h"
#include "ui/cursor_type.h"
@ -51,6 +51,7 @@ namespace app {
class Context;
class DocumentView;
class EditorCustomizationDelegate;
class EditorRender;
class PixelsMovement;
namespace tools {
@ -253,11 +254,7 @@ namespace app {
// Gets the brush preview controller.
BrushPreview& brushPreview() { return m_brushPreview; }
// Returns the buffer used to render editor viewports.
// E.g. It can be re-used by PreviewCommand
static ImageBufferPtr getRenderImageBuffer();
AppRender& renderEngine() { return m_renderEngine; }
EditorRender& renderEngine() { return *m_renderEngine; }
// IColorSource
app::Color getColorByPosition(const gfx::Point& pos) override;
@ -408,13 +405,11 @@ namespace app {
// TODO could we avoid one extra field just to do this?
gfx::Point m_oldMainTilePos;
static doc::ImageBufferPtr m_renderBuffer;
// The render engine must be shared between all editors so when a
// DrawingState is being used in one editor, other editors for the
// same document can show the same preview image/stroke being drawn
// (search for Render::setPreviewImage()).
static AppRender m_renderEngine;
static EditorRender* m_renderEngine;
};
ui::WidgetType editor_type();

View File

@ -0,0 +1,180 @@
// Aseprite
// Copyright (C) 2018 David Capello
//
// This program is distributed under the terms of
// the End-User License Agreement for Aseprite.
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include "app/ui/editor/editor_render.h"
#include "app/color_utils.h"
#include "app/pref/preferences.h"
#include "render/render.h"
namespace app {
static doc::ImageBufferPtr g_renderBuffer;
EditorRender::EditorRender()
: m_render(new render::Render)
{
}
EditorRender::~EditorRender()
{
delete m_render;
}
void EditorRender::setRefLayersVisiblity(const bool visible)
{
m_render->setRefLayersVisiblity(visible);
}
void EditorRender::setNonactiveLayersOpacity(const int opacity)
{
m_render->setNonactiveLayersOpacity(opacity);
}
void EditorRender::setProjection(const render::Projection& projection)
{
m_render->setProjection(projection);
}
void EditorRender::setupBackground(app::Document* doc, doc::PixelFormat pixelFormat)
{
DocumentPreferences& docPref = Preferences::instance().document(doc);
render::BgType bgType;
gfx::Size tile;
switch (docPref.bg.type()) {
case app::gen::BgType::CHECKED_16x16:
bgType = render::BgType::CHECKED;
tile = gfx::Size(16, 16);
break;
case app::gen::BgType::CHECKED_8x8:
bgType = render::BgType::CHECKED;
tile = gfx::Size(8, 8);
break;
case app::gen::BgType::CHECKED_4x4:
bgType = render::BgType::CHECKED;
tile = gfx::Size(4, 4);
break;
case app::gen::BgType::CHECKED_2x2:
bgType = render::BgType::CHECKED;
tile = gfx::Size(2, 2);
break;
case app::gen::BgType::CHECKED_1x1:
bgType = render::BgType::CHECKED;
tile = gfx::Size(1, 1);
break;
default:
bgType = render::BgType::TRANSPARENT;
break;
}
m_render->setBgType(bgType);
m_render->setBgZoom(docPref.bg.zoom());
m_render->setBgColor1(color_utils::color_for_image(docPref.bg.color1(), pixelFormat));
m_render->setBgColor2(color_utils::color_for_image(docPref.bg.color2(), pixelFormat));
m_render->setBgCheckedSize(tile);
}
void EditorRender::setTransparentBackground()
{
m_render->setBgType(render::BgType::TRANSPARENT);
}
void EditorRender::setSelectedLayer(const doc::Layer* layer)
{
m_render->setSelectedLayer(layer);
}
void EditorRender::setPreviewImage(const doc::Layer* layer,
const doc::frame_t frame,
const doc::Image* image,
const gfx::Point& pos,
const doc::BlendMode blendMode)
{
m_render->setPreviewImage(layer, frame, image, pos, blendMode);
}
void EditorRender::removePreviewImage()
{
m_render->removePreviewImage();
}
void EditorRender::setExtraImage(
render::ExtraType type,
const doc::Cel* cel,
const doc::Image* image,
doc::BlendMode blendMode,
const doc::Layer* currentLayer,
doc::frame_t currentFrame)
{
m_render->setExtraImage(type, cel, image, blendMode,
currentLayer, currentFrame);
}
void EditorRender::removeExtraImage()
{
m_render->removeExtraImage();
}
void EditorRender::setOnionskin(const render::OnionskinOptions& options)
{
m_render->setOnionskin(options);
}
void EditorRender::disableOnionskin()
{
m_render->disableOnionskin();
}
void EditorRender::renderSprite(
doc::Image* dstImage,
const doc::Sprite* sprite,
doc::frame_t frame)
{
m_render->renderSprite(dstImage, sprite, frame);
}
void EditorRender::renderSprite(
doc::Image* dstImage,
const doc::Sprite* sprite,
doc::frame_t frame,
const gfx::ClipF& area)
{
m_render->renderSprite(dstImage, sprite, frame, area);
}
void EditorRender::renderBackground(
doc::Image* image,
const gfx::Clip& area)
{
m_render->renderBackground(image, area);
}
void EditorRender::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)
{
m_render->renderImage(dst_image, src_image, pal,
x, y, opacity, blendMode);
}
doc::ImageBufferPtr EditorRender::getRenderImageBuffer()
{
if (!g_renderBuffer)
g_renderBuffer.reset(new doc::ImageBuffer);
return g_renderBuffer;
}
} // namespace app

View File

@ -0,0 +1,100 @@
// Aseprite
// Copyright (C) 2018 David Capello
//
// This program is distributed under the terms of
// the End-User License Agreement for Aseprite.
#ifndef APP_UI_EDITOR_RENDER_H_INCLUDED
#define APP_UI_EDITOR_RENDER_H_INCLUDED
#pragma once
#include "doc/blend_mode.h"
#include "doc/color.h"
#include "doc/frame.h"
#include "doc/image_buffer.h"
#include "doc/pixel_format.h"
#include "gfx/clip.h"
#include "gfx/point.h"
#include "render/extra_type.h"
#include "render/onionskin_options.h"
#include "render/projection.h"
namespace doc {
class Cel;
class Image;
class Layer;
class Palette;
class Sprite;
}
namespace render {
class Render;
}
namespace app {
class Document;
class EditorRender {
public:
EditorRender();
~EditorRender();
void setRefLayersVisiblity(const bool visible);
void setNonactiveLayersOpacity(const int opacity);
void setProjection(const render::Projection& projection);
void setupBackground(app::Document* doc, doc::PixelFormat pixelFormat);
void setTransparentBackground();
void setSelectedLayer(const doc::Layer* layer);
void setPreviewImage(const doc::Layer* layer,
const doc::frame_t frame,
const doc::Image* image,
const gfx::Point& pos,
const doc::BlendMode blendMode);
void removePreviewImage();
void setExtraImage(
render::ExtraType type,
const doc::Cel* cel,
const doc::Image* image,
doc::BlendMode blendMode,
const doc::Layer* currentLayer,
doc::frame_t currentFrame);
void removeExtraImage();
void setOnionskin(const render::OnionskinOptions& options);
void disableOnionskin();
void renderSprite(
doc::Image* dstImage,
const doc::Sprite* sprite,
doc::frame_t frame);
void renderSprite(
doc::Image* dstImage,
const doc::Sprite* sprite,
doc::frame_t frame,
const gfx::ClipF& area);
void renderBackground(
doc::Image* image,
const gfx::Clip& area);
void 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);
doc::ImageBufferPtr getRenderImageBuffer();
private:
render::Render* m_render;
};
} // namespace app
#endif

21
src/render/bg_type.h Normal file
View File

@ -0,0 +1,21 @@
// Aseprite Render Library
// Copyright (c) 2018 David Capello
//
// This file is released under the terms of the MIT license.
// Read LICENSE.txt for more information.
#ifndef RENDER_BG_TYPE_H_INCLUDED
#define RENDER_BG_TYPE_H_INCLUDED
#pragma once
namespace render {
enum class BgType {
NONE,
TRANSPARENT,
CHECKED,
};
} // namespace render
#endif

View File

@ -0,0 +1,65 @@
// Aseprite Render Library
// Copyright (c) 2018 David Capello
//
// This file is released under the terms of the MIT license.
// Read LICENSE.txt for more information.
#ifndef RENDER_ONIONSKIN_OPTIONS_H_INCLUDED
#define RENDER_ONIONSKIN_OPTIONS_H_INCLUDED
#pragma once
#include "render/onionskin_position.h"
#include "render/onionskin_type.h"
namespace doc {
class FrameTag;
class Layer;
}
namespace render {
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; }
doc::FrameTag* loopTag() const { return m_loopTag; }
doc::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(doc::FrameTag* loopTag) { m_loopTag = loopTag; }
void layer(doc::Layer* layer) { m_layer = layer; }
private:
OnionskinType m_type;
OnionskinPosition m_position;
int m_prevFrames;
int m_nextFrames;
int m_opacityBase;
int m_opacityStep;
doc::FrameTag* m_loopTag;
doc::Layer* m_layer;
};
} // namespace render
#endif

View File

@ -0,0 +1,21 @@
// Aseprite Render Library
// Copyright (c) 2018 David Capello
//
// This file is released under the terms of the MIT license.
// Read LICENSE.txt for more information.
#ifndef RENDER_ONIONSKIN_TYPE_H_INCLUDED
#define RENDER_ONIONSKIN_TYPE_H_INCLUDED
#pragma once
namespace render {
enum class OnionskinType {
NONE,
MERGE,
RED_BLUE_TINT,
};
} // namespace render
#endif

View File

@ -1,5 +1,5 @@
// Aseprite Render Library
// Copyright (c) 2001-2016 David Capello
// Copyright (c) 2001-2018 David Capello
//
// This file is released under the terms of the MIT license.
// Read LICENSE.txt for more information.
@ -16,8 +16,9 @@
#include "gfx/clip.h"
#include "gfx/point.h"
#include "gfx/size.h"
#include "render/bg_type.h"
#include "render/extra_type.h"
#include "render/onionskin_position.h"
#include "render/onionskin_options.h"
#include "render/projection.h"
namespace doc {
@ -32,60 +33,6 @@ namespace doc {
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,