[Calligra] 1081b47 Added a workaround for bug 255617
Dmitry Kazakov
dimula73 at gmail.com
Sun Dec 19 14:01:45 CET 2010
commit 1081b47359851f53d4a73eca2ecf3b8b938c2cb1
branch master
Author: Dmitry Kazakov <dimula73 at gmail.com>
Date: Sun Dec 19 15:52:44 2010 +0300
Added a workaround for bug 255617
1st: see a commit 1f3e41ed10baeb939c017b315d6b5986aed09d0b
This patch makes KisToolMove block the updates for the image while it
sets the offset for the layer. This is just a workaround, iterators
infrastructure must be revised to conform always-read idea.
This patch should be backported to 2.3
CCMAIL:kimageshop at kde.org
CCBUG:255617
diff --git a/krita/image/commands/kis_node_move_command.cpp b/krita/image/commands/kis_node_move_command.cpp
index 571d404..40bdef4 100644
--- a/krita/image/commands/kis_node_move_command.cpp
+++ b/krita/image/commands/kis_node_move_command.cpp
@@ -55,8 +55,16 @@ void KisNodeMoveCommand::undo()
void KisNodeMoveCommand::moveTo(const QPoint& pos)
{
+ /**
+ * FIXME: Hack alert:
+ * Our iterators don't have guarantees on thread-safety
+ * when the offset varies. When it is fixed, remove the locking.
+ * see: KisIterator::stressTest(), KisToolMove::mousePressEvent()
+ */
+ m_image->lock();
m_node->setX(pos.x());
m_node->setY(pos.y());
+ m_image->unlock();
m_node->setDirty(m_updateRect);
diff --git a/krita/plugins/tools/defaulttools/kis_tool_move.cc b/krita/plugins/tools/defaulttools/kis_tool_move.cc
index 8068c4f..2ba2447 100644
--- a/krita/plugins/tools/defaulttools/kis_tool_move.cc
+++ b/krita/plugins/tools/defaulttools/kis_tool_move.cc
@@ -157,7 +157,7 @@ void KisToolMove::mousePressEvent(KoPointerEvent *event)
node = currentNode();
}
- currentImage()->undoAdapter()->beginMacro(i18n("Move"));
+ image->undoAdapter()->beginMacro(i18n("Move"));
if (selection && !selection->isTotallyUnselected(image->bounds()) && !selection->isDeselected() && !node->inherits("KisSelectionMask")) {
// Create a temporary layer with the contents of the selection of the current layer.
@@ -187,7 +187,7 @@ void KisToolMove::mousePressEvent(KoPointerEvent *event)
if (image->globalSelection()) {
KisDeselectGlobalSelectionCommand* cmd = new KisDeselectGlobalSelectionCommand(image);
- currentImage()->undoAdapter()->addCommand(cmd);
+ image->undoAdapter()->addCommand(cmd);
}
}
@@ -198,11 +198,11 @@ void KisToolMove::mousePressEvent(KoPointerEvent *event)
}
// create the new layer and add it.
- KisPaintLayerSP layer = new KisPaintLayer(currentImage(),
+ KisPaintLayerSP layer = new KisPaintLayer(image,
node->name() + "(moved)",
oldLayer->opacity(),
dev);
- currentImage()->undoAdapter()->addCommand(new KisImageLayerAddCommand(currentImage(), layer, node->parent(), node));
+ image->undoAdapter()->addCommand(new KisImageLayerAddCommand(image, layer, node->parent(), node));
view->nodeManager()->activateNode(layer);
m_targetLayer = node;
m_selectedNode = layer;
@@ -213,8 +213,17 @@ void KisToolMove::mousePressEvent(KoPointerEvent *event)
m_targetLayer = 0;
}
+ /**
+ * FIXME: Hack alert:
+ * Our iterators don't have guarantees on thread-safety
+ * when the offset varies. When it is fixed, remove the locking
+ * see: KisIterator::stressTest()
+ */
+ image->lock();
m_layerStart.setX(node->x());
m_layerStart.setY(node->y());
+ image->unlock();
+
m_layerPosition = m_layerStart;
m_dragStart = pos.toPoint();
}
@@ -273,14 +282,19 @@ void KisToolMove::drag(const QPoint& original)
pos -= m_dragStart; // convert to delta
rc = m_selectedNode->extent();
+
+ // FIXME: see comment in KisToolMove::mousePressEvent()
+ KisImageWSP image = currentImage();
+ image->lock();
m_selectedNode->setX(m_selectedNode->x() + pos.x());
m_selectedNode->setY(m_selectedNode->y() + pos.y());
+ image->unlock();
rc = rc.unite(m_selectedNode->extent());
m_layerPosition = QPoint(m_selectedNode->x(), m_selectedNode->y());
m_dragStart = original;
-
+
if (m_selectedNode->inherits("KisSelectionMask")) {
currentImage()->undoAdapter()->emitSelectionChanged();
}
More information about the kimageshop
mailing list