Patch a possible crash when dropping pixels onBeforeFrameChanged

This is not a "real fix". But we hope the program at least doesn't crash
in this scenario.

Reviewed this problem on #275, #424, and #690
This commit is contained in:
David Capello 2015-06-02 16:46:04 -03:00
parent ecb4c8b464
commit 61c745ee7c
2 changed files with 28 additions and 12 deletions

View File

@ -17,6 +17,7 @@
#include "app/commands/cmd_move_mask.h"
#include "app/commands/command.h"
#include "app/commands/commands.h"
#include "app/console.h"
#include "app/pref/preferences.h"
#include "app/tools/ink.h"
#include "app/tools/tool.h"
@ -130,8 +131,23 @@ EditorState::LeaveAction MovingPixelsState::onLeaveState(Editor* editor, EditorS
// Drop pixels if we are changing to a non-temporary state (a
// temporary state is something like ScrollingState).
if (!newState || !newState->isTemporalState()) {
if (!m_discarded)
m_pixelsMovement->dropImage();
if (!m_discarded) {
try {
m_pixelsMovement->dropImage();
}
catch (const LockedDocumentException& ex) {
// This is one of the worst possible scenarios. We want to
// drop pixels because we're leaving this state (e.g. the user
// changed the current frame/layer, so we came from
// onBeforeFrameChanged) and we weren't able to drop those
// pixels.
//
// TODO this problem should be caught before we reach this
// state, or this problem should cancel the frame/layer
// change.
Console::showException(ex);
}
}
editor->document()->resetTransformation();

View File

@ -103,7 +103,7 @@ void PixelsMovement::flipImage(doc::algorithm::FlipType flipType)
flipType);
{
ContextWriter writer(m_reader, 500);
ContextWriter writer(m_reader, 5000);
// Regenerate the transformed (rotated, scaled, etc.) image and
// mask.
@ -119,7 +119,7 @@ void PixelsMovement::flipImage(doc::algorithm::FlipType flipType)
void PixelsMovement::cutMask()
{
{
ContextWriter writer(m_reader, 500);
ContextWriter writer(m_reader, 5000);
if (writer.cel())
m_transaction.execute(new cmd::ClearMask(writer.cel()));
}
@ -133,7 +133,7 @@ void PixelsMovement::copyMask()
// m_transaction.setMaskPosition)
Mask emptyMask;
{
ContextWriter writer(m_reader, 500);
ContextWriter writer(m_reader, 5000);
m_document->generateMaskBoundaries(&emptyMask);
update_screen_for_document(m_document);
}
@ -160,7 +160,7 @@ void PixelsMovement::catchImageAgain(const gfx::Point& pos, HandleType handle)
// m_transaction.setMaskPosition)
Mask emptyMask;
{
ContextWriter writer(m_reader, 500);
ContextWriter writer(m_reader, 5000);
m_document->generateMaskBoundaries(&emptyMask);
update_screen_for_document(m_document);
}
@ -181,7 +181,7 @@ void PixelsMovement::moveImage(const gfx::Point& pos, MoveModifier moveModifier)
gfx::Transformation::Corners oldCorners;
m_currentData.transformBox(oldCorners);
ContextWriter writer(m_reader, 500);
ContextWriter writer(m_reader, 5000);
int x1, y1, x2, y2;
x1 = m_initialData.bounds().x;
@ -444,7 +444,7 @@ void PixelsMovement::stampImage()
ASSERT(cel && image);
{
ContextWriter writer(m_reader, 500);
ContextWriter writer(m_reader, 5000);
{
// Expand the canvas to paste the image in the fully visible
// portion of sprite.
@ -474,7 +474,7 @@ void PixelsMovement::dropImageTemporarily()
m_isDragging = false;
{
ContextWriter writer(m_reader, 500);
ContextWriter writer(m_reader, 5000);
// TODO Add undo information so the user can undo each transformation step.
@ -523,7 +523,7 @@ void PixelsMovement::dropImage()
// Destroy the extra cel (this cel will be used by the drawing
// cursor surely).
ContextWriter writer(m_reader, 500);
ContextWriter writer(m_reader, 5000);
m_document->destroyExtraCel();
}
@ -539,7 +539,7 @@ void PixelsMovement::discardImage(bool commit)
// Destroy the extra cel and regenerate the mask boundaries (we've
// just deselect the mask).
ContextWriter writer(m_reader, 500);
ContextWriter writer(m_reader, 5000);
m_document->destroyExtraCel();
m_document->generateMaskBoundaries();
}
@ -567,7 +567,7 @@ gfx::Size PixelsMovement::getInitialImageSize() const
void PixelsMovement::setMaskColor(color_t mask_color)
{
ContextWriter writer(m_reader, 500);
ContextWriter writer(m_reader, 5000);
m_maskColor = mask_color;