Do not share the AppRender instance between editors

This commit is contained in:
David Capello 2015-08-19 13:05:45 -03:00
parent 22adb9d7d3
commit c2569060f3
8 changed files with 23 additions and 35 deletions

View File

@ -173,7 +173,7 @@ protected:
virtual void onPaint(PaintEvent& ev) override {
Graphics* g = ev.getGraphics();
AppRender& render = Editor::renderEngine();
AppRender& render = m_editor->renderEngine();
render.disableOnionskin();
render.setBgType(render::BgType::TRANSPARENT);

View File

@ -12,6 +12,7 @@
#include "app/commands/filters/filter_preview.h"
#include "app/commands/filters/filter_manager_impl.h"
#include "app/modules/editors.h"
#include "app/ui/editor/editor.h"
#include "doc/sprite.h"
#include "ui/manager.h"
@ -64,14 +65,14 @@ bool FilterPreview::onProcessMessage(Message* msg)
switch (msg->type()) {
case kOpenMessage:
Editor::renderEngine().setPreviewImage(
current_editor->renderEngine().setPreviewImage(
m_filterMgr->layer(),
m_filterMgr->frame(),
m_filterMgr->destinationImage());
break;
case kCloseMessage:
Editor::renderEngine().removePreviewImage();
current_editor->renderEngine().removePreviewImage();
// Stop the preview timer.
m_timer.stop();

View File

@ -18,7 +18,6 @@
#include "app/tools/intertwine.h"
#include "app/tools/point_shape.h"
#include "app/tools/tool_loop.h"
#include "app/ui/editor/editor.h"
#include "doc/image.h"
#include "doc/primitives.h"
#include "doc/sprite.h"
@ -57,19 +56,6 @@ void ToolLoopManager::prepareLoop(const Pointer& pointer,
m_toolLoop->getIntertwine()->prepareIntertwine();
m_toolLoop->getController()->prepareController(modifiers);
m_toolLoop->getPointShape()->preparePointShape(m_toolLoop);
// Prepare preview image (the destination image will be our preview
// in the tool-loop time, so we can see what we are drawing)
Editor::renderEngine().setPreviewImage(
m_toolLoop->getLayer(),
m_toolLoop->getFrame(),
m_toolLoop->getDstImage());
}
void ToolLoopManager::releaseLoop(const Pointer& pointer)
{
// No more preview image
Editor::renderEngine().removePreviewImage();
}
void ToolLoopManager::pressKey(ui::KeyScancode key)

View File

@ -37,7 +37,6 @@ namespace app {
// is called.
// 5. When the user release the mouse:
// - ToolLoopManager::releaseButton
// - ToolLoopManager::releaseLoop
class ToolLoopManager {
public:
@ -72,9 +71,6 @@ namespace app {
void prepareLoop(const Pointer& pointer,
ui::KeyModifiers modifiers);
// Called when the loop is over.
void releaseLoop(const Pointer& pointer);
void pressKey(ui::KeyScancode key);
void releaseKey(ui::KeyScancode key);

View File

@ -59,7 +59,7 @@ DrawingState::DrawingState(tools::ToolLoop* toolLoop)
DrawingState::~DrawingState()
{
destroyLoop();
destroyLoop(nullptr);
}
void DrawingState::initToolLoop(Editor* editor, MouseMessage* msg)
@ -71,6 +71,13 @@ void DrawingState::initToolLoop(Editor* editor, MouseMessage* msg)
m_toolLoopManager->prepareLoop(pointer_from_msg(msg), msg->keyModifiers());
m_toolLoopManager->pressButton(pointer_from_msg(msg));
// Prepare preview image (the destination image will be our preview
// in the tool-loop time, so we can see what we are drawing)
editor->renderEngine().setPreviewImage(
m_toolLoop->getLayer(),
m_toolLoop->getFrame(),
m_toolLoop->getDstImage());
editor->captureMouse();
}
@ -84,8 +91,7 @@ bool DrawingState::onMouseDown(Editor* editor, MouseMessage* msg)
// Cancel drawing loop
if (m_toolLoopManager->isCanceled()) {
m_toolLoopManager->releaseLoop(pointer_from_msg(msg));
destroyLoop();
destroyLoop(editor);
// Change to standby state
editor->backToPreviousState();
@ -112,8 +118,7 @@ bool DrawingState::onMouseUp(Editor* editor, MouseMessage* msg)
return true;
}
m_toolLoopManager->releaseLoop(pointer_from_msg(msg));
destroyLoop();
destroyLoop(editor);
// Back to standby state.
editor->backToPreviousState();
@ -196,15 +201,18 @@ void DrawingState::onExposeSpritePixels(const gfx::Region& rgn)
m_toolLoop->validateDstImage(rgn);
}
void DrawingState::destroyLoop()
void DrawingState::destroyLoop(Editor* editor)
{
if (editor)
editor->renderEngine().removePreviewImage();
if (m_toolLoop)
m_toolLoop->dispose();
delete m_toolLoopManager;
delete m_toolLoop;
m_toolLoopManager = NULL;
m_toolLoop = NULL;
m_toolLoopManager = nullptr;
m_toolLoop = nullptr;
app_rebuild_documents_tabs();
}

View File

@ -37,7 +37,7 @@ namespace app {
void initToolLoop(Editor* editor, ui::MouseMessage* msg);
private:
void destroyLoop();
void destroyLoop(Editor* editor);
// The tool-loop.
tools::ToolLoop* m_toolLoop;

View File

@ -139,9 +139,6 @@ private:
// static
doc::ImageBufferPtr Editor::m_renderBuffer;
// static
AppRender Editor::m_renderEngine;
Editor::Editor(Document* document, EditorFlags flags)
: Widget(editor_type())
, m_state(new StandbyState())

View File

@ -206,7 +206,7 @@ namespace app {
// E.g. It can be re-used by PreviewCommand
static ImageBufferPtr getRenderImageBuffer();
static AppRender& renderEngine() { return m_renderEngine; }
AppRender& renderEngine() { return m_renderEngine; }
protected:
bool onProcessMessage(ui::Message* msg) override;
@ -305,7 +305,7 @@ namespace app {
double m_aniSpeed;
static doc::ImageBufferPtr m_renderBuffer;
static AppRender m_renderEngine;
AppRender m_renderEngine;
};
ui::WidgetType editor_type();