From ef16a9e57dc1184b6028e7deb0c18212dd5a8e32 Mon Sep 17 00:00:00 2001 From: David Capello Date: Wed, 19 Aug 2015 16:43:13 -0300 Subject: [PATCH] Fix crash on copy & paste in same place (fix #758) This crash happened when the selection was created from top to bottom. --- src/app/document_range_ops.cpp | 4 ++++ src/app/util/clipboard.cpp | 19 +++++++++++++------ 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/src/app/document_range_ops.cpp b/src/app/document_range_ops.cpp index 8c583a385..b79d58d9e 100644 --- a/src/app/document_range_ops.cpp +++ b/src/app/document_range_ops.cpp @@ -141,6 +141,10 @@ static DocumentRange drop_range_op( dstLayerIdx = dstLayerBegin; srcLayerIdx != srcLayerEnd; ) { for (frame_t srcFrame = srcFrameBegin, dstFrame = dstFrameBegin; srcFrame != srcFrameEnd; ) { + if (dstLayerIdx < 0 || dstLayerIdx >= int(layers.size()) || + srcLayerIdx < 0 || srcLayerIdx >= int(layers.size())) + break; + LayerImage* srcLayer = static_cast(layers[srcLayerIdx]); LayerImage* dstLayer = static_cast(layers[dstLayerIdx]); diff --git a/src/app/util/clipboard.cpp b/src/app/util/clipboard.cpp index 88581ef78..c9dda7f06 100644 --- a/src/app/util/clipboard.cpp +++ b/src/app/util/clipboard.cpp @@ -316,16 +316,23 @@ void clipboard::paste() // We can use a document range op (copy_range) to copy/paste // cels in the same document. if (srcDoc == dstDoc) { - DocumentRange dstRange; + Timeline* timeline = App::instance()->getMainWindow()->getTimeline(); + DocumentRange dstRange = timeline->range(); LayerIndex dstLayer = srcSpr->layerToIndex(editor->layer()); frame_t dstFrame = editor->frame(); - dstRange.startRange(dstLayer, dstFrame, - DocumentRange::kCels); - dstRange.endRange(dstLayer + LayerIndex(- srcRange.layers() + 1), - dstFrame + srcRange.frames() - 1); + if (dstRange.enabled()) { + dstLayer = dstRange.layerEnd(); + dstFrame = dstRange.frameBegin(); + } - copy_range(srcDoc, srcRange, dstRange, kDocumentRangeBefore); + LayerIndex dstLayer2(int(dstLayer)-srcRange.layers()+1); + dstRange.startRange(dstLayer, dstFrame, DocumentRange::kCels); + dstRange.endRange(dstLayer2, dstFrame+srcRange.frames()-1); + + // This is the app::copy_range (not clipboard::copy_range()). + app::copy_range(srcDoc, srcRange, dstRange, kDocumentRangeBefore); + editor->invalidate(); return; }