Krita Source Code Documentation
Loading...
Searching...
No Matches
KisMimeData Class Reference

#include <kis_mimedata.h>

+ Inheritance diagram for KisMimeData:

Public Member Functions

void deepCopyNodes ()
 
QStringList formats () const override
 
 KisMimeData (QList< KisNodeSP > nodes, KisImageSP image, bool forceCopy=false)
 
QList< KisNodeSPnodes () const
 return the node set on this mimedata object – for internal use
 

Static Public Member Functions

static KisDisplayConfig displayConfigForMimePastes ()
 
static bool insertMimeLayers (const QMimeData *data, KisImageSP image, KisShapeController *shapeController, KisNodeDummy *parentDummy, KisNodeDummy *aboveThisDummy, bool copyNode, KisNodeInsertionAdapter *nodeInsertionAdapter, bool changeOffset=false, QPointF offset=QPointF(), KisProcessingApplicator *applicator=nullptr)
 
static KisNodeList loadNodesFast (const QMimeData *data, KisImageSP image, KisShapeController *shapeController, bool &copyNode)
 
static KisNodeList loadNodesFastAndRecenter (const QPoint &preferredCenter, const QMimeData *data, KisImageSP image, KisShapeController *shapeController, bool &copyNode)
 
static QMimeData * mimeForLayers (const KisNodeList &nodes, KisImageSP image, bool forceCopy=false)
 
static QMimeData * mimeForLayersDeepCopy (const KisNodeList &nodes, KisImageSP image, bool forceCopy)
 

Protected Member Functions

QVariant retrieveData (const QString &mimetype, QMetaType preferredType) const override
 

Static Private Member Functions

static void initializeExternalNode (KisNodeSP *nodes, KisImageSP srcImage, KisImageSP dstImage, KisShapeController *shapeController)
 
static KisNodeList loadNonNativeNodes (const QMimeData *data, KisImageWSP image)
 
static KisNodeList tryLoadInternalNodes (const QMimeData *data, KisImageSP image, KisShapeController *shapeController, bool &copyNode)
 

Private Attributes

QRect m_copiedBounds
 
bool m_forceCopy
 
KisImageSP m_image
 
QList< KisNodeSPm_nodes
 

Detailed Description

KisMimeData implements delayed retrieval of nodes for d&d and copy/paste.

TODO: implement support for the ora format.

Definition at line 28 of file kis_mimedata.h.

Constructor & Destructor Documentation

◆ KisMimeData()

KisMimeData::KisMimeData ( QList< KisNodeSP > nodes,
KisImageSP image,
bool forceCopy = false )

Definition at line 62 of file kis_mimedata.cpp.

63 : QMimeData()
64 , m_nodes(nodes)
65 , m_forceCopy(forceCopy)
66 , m_image(image)
67{
68 Q_ASSERT(m_nodes.size() > 0);
69
71
72 Q_FOREACH (KisNodeSP node, nodes) {
74 }
75}
QList< KisNodeSP > nodes() const
return the node set on this mimedata object – for internal use
QRect m_copiedBounds
KisImageSP m_image
QList< KisNodeSP > m_nodes
#define KIS_SAFE_ASSERT_RECOVER_RETURN(cond)
Definition kis_assert.h:128
QRect recursiveTightNodeVisibleBounds(KisNodeSP rootNode)

References KIS_SAFE_ASSERT_RECOVER_RETURN, m_copiedBounds, m_nodes, nodes(), and KisLayerUtils::recursiveTightNodeVisibleBounds().

Member Function Documentation

◆ deepCopyNodes()

void KisMimeData::deepCopyNodes ( )

For Cut/Copy/Paste operations we should detach the contents of the mime data from the actual image because the user can modify our image between the Copy/Cut and Paste calls. So we just copy all our nodes into the internal array.

It also fixes the problem of Cutting group layers. If we don't copy the node and all its children, it'll be deleted by the Cut operation and we will not be able to paste it correctly later.

Definition at line 103 of file kis_mimedata.cpp.

104{
105 KisNodeList newNodes;
106
107 {
108 KisImageReadOnlyBarrierLock lock(m_image, std::defer_lock);
109 if (m_image) {
110 lock.lock();
111 }
112
113 Q_FOREACH (KisNodeSP node, m_nodes) {
114 KisNodeSP newNode = safeCopyNode(node);
115 newNode->setImage(nullptr);
116
117 newNodes << newNode;
118 }
119 }
120
121 m_nodes = newNodes;
122 m_image = 0;
123}
void setImage(KisImageWSP newImage) override
Definition kis_node.cpp:254

References m_image, m_nodes, and KisNode::setImage().

◆ displayConfigForMimePastes()

KisDisplayConfig KisMimeData::displayConfigForMimePastes ( )
static

Conversion options for mime clips when they are pasted into clipboard or fetched from clipboard (with user selecting "display" space)

On unmanaged compositors they should coinside with the space of the display. On managed ones they should be set to the default color space, e.g. sRGB.

When the surface is managed, we just put the data in sRGB mode, because the compositor expects untagged data to be sRGB.

Definition at line 77 of file kis_mimedata.cpp.

78{
79 KisDisplayConfig result;
80
81 if (KisPlatformPluginInterfaceFactory::instance()->surfaceColorManagedByOS() ||
82 KisOpenGLModeProber::instance()->useHDRMode()) {
88 } else {
89 KisConfig cfg(true);
90 const KoColorProfile *profile = cfg.displayProfile(KisPortingUtils::getScreenNumberForWidget(QApplication::activeWindow()));
93 }
94 }
95
98 result.isHDR = false;
99
100 return result;
101}
KisDisplayConfig This class keeps track of the color management configuration for image to display....
KoColorConversionTransformation::ConversionFlags conversionFlags
const KoColorProfile * profile
KoColorConversionTransformation::Intent intent
static KisOpenGLModeProber * instance()
static KisPlatformPluginInterfaceFactory * instance()
#define KIS_SAFE_ASSERT_RECOVER(cond)
Definition kis_assert.h:126
int getScreenNumberForWidget(const QWidget *w)
static KoColorSpaceRegistry * instance()
const KoColorProfile * p709SRGBProfile() const

References KisDisplayConfig::conversionFlags, KisConfig::displayProfile(), KisPortingUtils::getScreenNumberForWidget(), KoColorSpaceRegistry::instance(), KisPlatformPluginInterfaceFactory::instance(), KisOpenGLModeProber::instance(), KisDisplayConfig::intent, KoColorConversionTransformation::internalConversionFlags(), KoColorConversionTransformation::internalRenderingIntent(), KisDisplayConfig::isHDR, KIS_SAFE_ASSERT_RECOVER, KoColorSpaceRegistry::p709SRGBProfile(), and KisDisplayConfig::profile.

◆ formats()

QStringList KisMimeData::formats ( ) const
override

KisMimeData provides the following formats if a node has been set:

  • application/x-krita-node-internal-pointer: requests a pointer to a Krita node.
  • application/x-qt-image: fallback for other applications, returns a QImage of the current node's paintdevice
  • application/zip: allows drop targets that can handle zip files to open the data

Definition at line 130 of file kis_mimedata.cpp.

131{
132 QStringList f = QMimeData::formats();
133 if (m_nodes.size() > 0) {
134 f << "application/x-qt-image"
135 << "application/zip"
136 << "application/x-krita-node-internal-pointer";
137 }
138 return f;
139}

References m_nodes.

◆ initializeExternalNode()

void KisMimeData::initializeExternalNode ( KisNodeSP * nodes,
KisImageSP srcImage,
KisImageSP dstImage,
KisShapeController * shapeController )
staticprivate

Definition at line 252 of file kis_mimedata.cpp.

256{
257 KisShapeLayer *shapeLayer = dynamic_cast<KisShapeLayer*>(node->data());
258 if (shapeLayer) {
259 // attach the layer to a new shape controller
260 KisShapeLayer *shapeLayer2 = new KisShapeLayer(*shapeLayer, shapeController);
261
262 if (srcImage
263 && (!qFuzzyCompare(dstImage->xRes(), srcImage->xRes())
264 || !qFuzzyCompare(dstImage->yRes(), srcImage->yRes()))) {
265
266 const QTransform t = QTransform::fromScale(srcImage->xRes() / dstImage->xRes(),
267 srcImage->yRes() / dstImage->yRes());
268
269 shapeLayer2->setTransformation(shapeLayer2->transformation() * t);
270 }
271
272 *node = shapeLayer2;
273 }
274}
double xRes() const
double yRes() const
void setTransformation(const QTransform &matrix)
Definition KoShape.cpp:417
QTransform transformation() const
Returns the shapes local transformation matrix.
Definition KoShape.cpp:424
static bool qFuzzyCompare(half p1, half p2)

References qFuzzyCompare(), KoShape::setTransformation(), KoShape::transformation(), KisImage::xRes(), and KisImage::yRes().

◆ insertMimeLayers()

bool KisMimeData::insertMimeLayers ( const QMimeData * data,
KisImageSP image,
KisShapeController * shapeController,
KisNodeDummy * parentDummy,
KisNodeDummy * aboveThisDummy,
bool copyNode,
KisNodeInsertionAdapter * nodeInsertionAdapter,
bool changeOffset = false,
QPointF offset = QPointF(),
KisProcessingApplicator * applicator = nullptr )
static

We have the node juggler running, so it will delay the update of the generator layers that might be included into the paste. To avoid that we should forcefully to make it stop

Definition at line 487 of file kis_mimedata.cpp.

497{
498 QList<KisNodeSP> nodes = loadNodesFast(data, image, shapeController, copyNode /* IN-OUT */);
499
500 if (changeOffset) {
501 Q_FOREACH (KisNodeSP node, nodes) {
502 KisLayerUtils::recursiveApplyNodes(node, [offset] (KisNodeSP node){
503 const QPoint newOffset(node->x() + offset.x(), node->y() + offset.y());
504 node->setX(newOffset.x());
505 node->setY(newOffset.y());
506 });
507 }
508 }
509
510 if (nodes.isEmpty()) return false;
511
512 bool result = true;
513
514 if (!correctNewNodeLocation(nodes, parentDummy, aboveThisDummy)) {
515 return false;
516 }
517
518 KIS_SAFE_ASSERT_RECOVER_RETURN_VALUE(nodeInsertionAdapter, false);
519 KIS_SAFE_ASSERT_RECOVER_RETURN_VALUE(parentDummy, false);
520
521 KisNodeSP aboveThisNode = aboveThisDummy ? aboveThisDummy->node() : 0;
522
523 if (!applicator) {
524 if (copyNode) {
525 nodeInsertionAdapter->addNodes(nodes, parentDummy->node(), aboveThisNode);
526 }
527 else {
528 KIS_SAFE_ASSERT_RECOVER_RETURN_VALUE(nodes.first()->graphListener() == image.data(), false);
529 nodeInsertionAdapter->moveNodes(nodes, parentDummy->node(), aboveThisNode);
530 }
531 } else {
532 {
533 if (copyNode) {
534 KisNodeSP prevNode = aboveThisNode;
535 Q_FOREACH (KisNodeSP node, nodes) {
536 applicator->applyCommand(
537 new KisImageLayerAddCommand(image, node, parentDummy->node(), prevNode));
538 prevNode = node;
539 }
540 } else {
541 KIS_SAFE_ASSERT_RECOVER_RETURN_VALUE(nodes.first()->graphListener() == image.data(), false);
542
543 KisNodeSP prevNode = aboveThisNode;
544 Q_FOREACH (KisNodeSP node, nodes) {
545 applicator->applyCommand(
546 new KisImageLayerMoveCommand(image, node, parentDummy->node(), prevNode));
547 prevNode = node;
548 }
549 }
550 }
551 }
552
553 const bool hasDelayedNodes =
554 std::find_if(nodes.begin(), nodes.end(),
555 [] (KisNodeSP node) {
556 return bool(dynamic_cast<KisDelayedUpdateNodeInterface*>(node.data()));
557 }) != nodes.end();
558
559 if (hasDelayedNodes) {
565 image->requestStrokeEnd();
566 }
567
568 return result;
569}
The command for adding a layer.
The command for layer moves inside the layer stack.
void requestStrokeEnd()
static KisNodeList loadNodesFast(const QMimeData *data, KisImageSP image, KisShapeController *shapeController, bool &copyNode)
KisNodeSP node() const
void addNodes(KisNodeList nodes, KisNodeSP parent, KisNodeSP aboveThis)
void moveNodes(KisNodeList nodes, KisNodeSP parent, KisNodeSP aboveThis)
void applyCommand(KUndo2Command *command, KisStrokeJobData::Sequentiality sequentiality=KisStrokeJobData::SEQUENTIAL, KisStrokeJobData::Exclusivity exclusivity=KisStrokeJobData::NORMAL)
#define KIS_SAFE_ASSERT_RECOVER_RETURN_VALUE(cond, val)
Definition kis_assert.h:129
bool correctNewNodeLocation(KisNodeList nodes, KisNodeDummy *&parentDummy, KisNodeDummy *&aboveThisDummy)
void recursiveApplyNodes(NodePointer node, Functor func)
virtual qint32 y() const
virtual void setX(qint32)
virtual void setY(qint32)
virtual qint32 x() const

References KisNodeInsertionAdapter::addNodes(), KisProcessingApplicator::applyCommand(), correctNewNodeLocation(), KisSharedPtr< T >::data(), KIS_SAFE_ASSERT_RECOVER_RETURN_VALUE, loadNodesFast(), KisNodeInsertionAdapter::moveNodes(), KisNodeDummy::node(), nodes(), KisLayerUtils::recursiveApplyNodes(), KisImage::requestStrokeEnd(), KisBaseNode::setX(), KisBaseNode::setY(), KisBaseNode::x(), and KisBaseNode::y().

◆ loadNodesFast()

KisNodeList KisMimeData::loadNodesFast ( const QMimeData * data,
KisImageSP image,
KisShapeController * shapeController,
bool & copyNode )
static

Don't try to move a node originating from another image, just copy it.

Definition at line 448 of file kis_mimedata.cpp.

453{
456 image,
457 shapeController,
458 copyNode /* IN-OUT */);
459
460 if (nodes.isEmpty()) {
466 copyNode = true;
467 }
468
469 return nodes;
470}
static KisNodeList tryLoadInternalNodes(const QMimeData *data, KisImageSP image, KisShapeController *shapeController, bool &copyNode)
static KisNodeList loadNonNativeNodes(const QMimeData *data, KisImageWSP image)

References loadNonNativeNodes(), nodes(), and tryLoadInternalNodes().

◆ loadNodesFastAndRecenter()

KisNodeList KisMimeData::loadNodesFastAndRecenter ( const QPoint & preferredCenter,
const QMimeData * data,
KisImageSP image,
KisShapeController * shapeController,
bool & copyNode )
static

Definition at line 472 of file kis_mimedata.cpp.

473{
474 KisNodeList nodes = loadNodesFast(data, image, shapeController, copyNode);
475
476 Q_FOREACH (KisNodeSP node, nodes) {
477 const QRect layerBounds = node->exactBounds();
478 const QPoint offset = preferredCenter - layerBounds.center();
479
480 node->setX(node->x() + offset.x());
481 node->setY(node->y() + offset.y());
482 }
483
484 return nodes;
485}
virtual QRect exactBounds() const

References KisBaseNode::exactBounds(), loadNodesFast(), nodes(), KisBaseNode::setX(), KisBaseNode::setY(), KisBaseNode::x(), and KisBaseNode::y().

◆ loadNonNativeNodes()

QList< KisNodeSP > KisMimeData::loadNonNativeNodes ( const QMimeData * data,
KisImageWSP image )
staticprivate

Loads a node from a mime container Supports image and color types.

Definition at line 338 of file kis_mimedata.cpp.

340{
341 bool doRecenter = false;
343
344 if (nodes.isEmpty() && (data->hasFormat("application/x-color") || data->hasFormat("krita/x-colorsetentry"))) {
345 QColor color = data->hasColor() ? qvariant_cast<QColor>(data->colorData()) : QColor(255, 0, 255);
346 if (!data->hasColor() && data->hasFormat("krita/x-colorsetentry")) {
347 QByteArray byteData = data->data("krita/x-colorsetentry");
349 color = s.color().toQColor();
350 }
353 defaultConfig->setProperty("color", color);
354 defaultConfig->createLocalResourcesSnapshot(KisGlobalResourcesInterface::instance());
355
356 if (image) {
357 KisGeneratorLayerSP fillLayer = new KisGeneratorLayer(image, image->nextLayerName(i18n("Fill Layer")),
358 defaultConfig, image->globalSelection());
359 nodes << fillLayer;
360 }
361 }
362
363 if (nodes.isEmpty() && data->hasImage()) {
364 QImage qimage = qvariant_cast<QImage>(data->imageData());
365
367 device->convertFromQImage(qimage, 0);
368
369 if (image) {
370 nodes << new KisPaintLayer(image.data(), image->nextLayerName(), OPACITY_OPAQUE_U8, device);
371 }
372
373 doRecenter = true;
374 }
375
376 if (!nodes.isEmpty() && doRecenter) {
377 const QRect imageBounds = image->bounds();
378
379 Q_FOREACH (KisNodeSP node, nodes) {
380 const QRect layerBounds = node->projection()->exactBounds();
381 if (doRecenter) {
382 QPoint pt = imageBounds.center() - layerBounds.center();
383 node->setX(pt.x());
384 node->setY(pt.y());
385 }
386 }
387 }
388
389 return nodes;
390}
const quint8 OPACITY_OPAQUE_U8
static KisGeneratorRegistry * instance()
static KisResourcesInterfaceSP instance()
QString nextLayerName(const QString &baseName="") const
Definition kis_image.cc:715
KisSelectionSP globalSelection() const
Definition kis_image.cc:695
QRect bounds() const override
QRect exactBounds() const
void convertFromQImage(const QImage &image, const KoColorProfile *profile, qint32 offsetX=0, qint32 offsetY=0)
KoColor color() const
Definition KisSwatch.h:30
static KisSwatch fromByteArray(QByteArray &data, QString &groupName, int &originalRow, int &originalColumn)
Definition KisSwatch.cpp:57
void toQColor(QColor *c) const
a convenience method for the above.
Definition KoColor.cpp:198
const T value(const QString &id) const
virtual KisPaintDeviceSP projection() const =0
virtual KisFilterConfigurationSP factoryConfiguration(KisResourcesInterfaceSP resourcesInterface) const

References KisImage::bounds(), KisSwatch::color(), KisPaintDevice::convertFromQImage(), KisWeakSharedPtr< T >::data(), KisPaintDevice::exactBounds(), KisBaseProcessor::factoryConfiguration(), KisSwatch::fromByteArray(), KisImage::globalSelection(), KisGeneratorRegistry::instance(), KoColorSpaceRegistry::instance(), KisGlobalResourcesInterface::instance(), KisImage::nextLayerName(), nodes(), OPACITY_OPAQUE_U8, KisBaseNode::projection(), KisBaseNode::setX(), KisBaseNode::setY(), KoColor::toQColor(), and KoGenericRegistry< T >::value().

◆ mimeForLayers()

QMimeData * KisMimeData::mimeForLayers ( const KisNodeList & nodes,
KisImageSP image,
bool forceCopy = false )
static

Definition at line 392 of file kis_mimedata.cpp.

393{
395 KisNodeList sortedNodes;
396 KisLayerUtils::sortMergeableNodes(image->root(), inputNodes, sortedNodes);
397 if (sortedNodes.isEmpty()) return 0;
398
399 KisMimeData* data = new KisMimeData(sortedNodes, image, forceCopy);
400 return data;
401}
KisMimeData(QList< KisNodeSP > nodes, KisImageSP image, bool forceCopy=false)
void sortMergeableNodes(KisNodeSP root, KisNodeList &inputNodes, KisNodeList &outputNodes)
KisNodeListSP inputNodes(KisImageSP image, InputLayerMode inputMode, KisNodeSP currentNode)

References KisMimeData(), nodes(), KisNodeFacade::root, and KisLayerUtils::sortMergeableNodes().

◆ mimeForLayersDeepCopy()

QMimeData * KisMimeData::mimeForLayersDeepCopy ( const KisNodeList & nodes,
KisImageSP image,
bool forceCopy )
static

Definition at line 403 of file kis_mimedata.cpp.

404{
406 KisNodeList sortedNodes;
407 KisLayerUtils::sortMergeableNodes(image->root(), inputNodes, sortedNodes);
408 if (sortedNodes.isEmpty()) return 0;
409
410 KisMimeData* data = new KisMimeData(sortedNodes, image, forceCopy);
411 data->deepCopyNodes();
412 return data;
413}
void deepCopyNodes()

References deepCopyNodes(), KisMimeData(), nodes(), KisNodeFacade::root, and KisLayerUtils::sortMergeableNodes().

◆ nodes()

QList< KisNodeSP > KisMimeData::nodes ( ) const

return the node set on this mimedata object – for internal use

Definition at line 125 of file kis_mimedata.cpp.

126{
127 return m_nodes;
128}

References m_nodes.

◆ retrieveData()

QVariant KisMimeData::retrieveData ( const QString & mimetype,
QMetaType preferredType ) const
overrideprotected

HACK ALERT:

Sometimes Qt requests the data after destruction of Krita, we cannot load the nodes in that case, because we need signals and timers. So we just skip serializing.

Definition at line 198 of file kis_mimedata.cpp.

200{
208 if (!QApplication::instance()) return QVariant();
209
210
211 Q_ASSERT(m_nodes.size() > 0);
212
213 if (mimetype == "application/x-qt-image") {
214 KisConfig cfg(true);
215
216 QScopedPointer<KisDocument> doc(createDocument(m_nodes, m_image, m_copiedBounds));
217
218 const KisDisplayConfig displayConfig = this->displayConfigForMimePastes();
219 return doc->image()->projection()->convertToQImage(displayConfig.profile,
220 displayConfig.intent,
221 displayConfig.conversionFlags);
222 }
223 else if (mimetype == "application/zip") {
224
226 return ba;
227
228 }
229 else if (mimetype == "application/x-krita-node-internal-pointer") {
230
231 QDomDocument doc("krita_internal_node_pointer");
232 QDomElement root = doc.createElement("pointer");
233 root.setAttribute("application_pid", (qint64)QApplication::applicationPid());
234 root.setAttribute("force_copy", m_forceCopy);
235 root.setAttribute("image_pointer_value", (qint64)m_image.data());
236 doc.appendChild(root);
237
238 Q_FOREACH (KisNodeSP node, m_nodes) {
239 QDomElement element = doc.createElement("node");
240 element.setAttribute("pointer_value", (qint64)node.data());
241 root.appendChild(element);
242 }
243
244 return doc.toByteArray();
245
246 }
247 else {
248 return QMimeData::retrieveData(mimetype, preferredType);
249 }
250}
static KisDisplayConfig displayConfigForMimePastes()
KisDocument * createDocument(QList< KisNodeSP > nodes, KisImageSP srcImage, const QRect &copiedBounds)
QByteArray serializeToByteArray(QList< KisNodeSP > nodes, KisImageSP srcImage, const QRect &copiedBounds)

References KisDisplayConfig::conversionFlags, createDocument(), KisSharedPtr< T >::data(), KisDisplayConfig::intent, KisDisplayConfig::profile, and serializeToByteArray().

◆ tryLoadInternalNodes()

QList< KisNodeSP > KisMimeData::tryLoadInternalNodes ( const QMimeData * data,
KisImageSP image,
KisShapeController * shapeController,
bool & copyNode )
staticprivate

Try load the node, which belongs to the same Krita instance, that is can be fetched without serialization

Definition at line 276 of file kis_mimedata.cpp.

280{
282 bool forceCopy = false;
283 KisImageSP sourceImage;
284
285 // Qt 4.7 and Qt 5.5 way
286 const KisMimeData *mimedata = qobject_cast<const KisMimeData*>(data);
287 if (mimedata) {
288 nodes = mimedata->nodes();
289 forceCopy = mimedata->m_forceCopy;
290 sourceImage = mimedata->m_image;
291 }
292
293 // Qt 4.8 way
294 if (nodes.isEmpty() && data->hasFormat("application/x-krita-node-internal-pointer")) {
295 QByteArray nodeXml = data->data("application/x-krita-node-internal-pointer");
296
297 QDomDocument doc;
298 doc.setContent(nodeXml);
299
300 QDomElement root = doc.documentElement();
301 qint64 pid = root.attribute("application_pid").toLongLong();
302 forceCopy = root.attribute("force_copy").toInt();
303 qint64 imagePointerValue = root.attribute("image_pointer_value").toLongLong();
304 sourceImage = reinterpret_cast<KisImage*>(imagePointerValue);
305
306 if (pid == QApplication::applicationPid()) {
307 QDomElement e;
308 for (e = root.firstChildElement(); !e.isNull(); e = e.nextSiblingElement()) {
309 qint64 pointerValue = e.attribute("pointer_value").toLongLong();
310 if (pointerValue) {
311 nodes << reinterpret_cast<KisNode*>(pointerValue);
312 }
313 }
314 }
315 }
316
317 if (!nodes.isEmpty() && (forceCopy || copyNode || sourceImage != image)) {
318 KisImageReadOnlyBarrierLock lock(sourceImage, std::defer_lock);
319 if (sourceImage) {
320 lock.lock();
321 }
322
323 QList<KisNodeSP> clones;
324 Q_FOREACH (KisNodeSP node, nodes) {
325 node = safeCopyNode(node, sourceImage != image);
326 if ((forceCopy || copyNode) && sourceImage == image) {
328 }
329 initializeExternalNode(&node, sourceImage, image, shapeController);
330 clones << node;
331 }
332 nodes = clones;
333 copyNode = true;
334 }
335 return nodes;
336}
static void initializeExternalNode(KisNodeSP *nodes, KisImageSP srcImage, KisImageSP dstImage, KisShapeController *shapeController)
void addCopyOfNameTag(KisNodeSP node)

References KisLayerUtils::addCopyOfNameTag(), initializeExternalNode(), m_forceCopy, m_image, and nodes().

Member Data Documentation

◆ m_copiedBounds

QRect KisMimeData::m_copiedBounds
private

Definition at line 131 of file kis_mimedata.h.

◆ m_forceCopy

bool KisMimeData::m_forceCopy
private

Definition at line 129 of file kis_mimedata.h.

◆ m_image

KisImageSP KisMimeData::m_image
private

Definition at line 130 of file kis_mimedata.h.

◆ m_nodes

QList<KisNodeSP> KisMimeData::m_nodes
private

Definition at line 128 of file kis_mimedata.h.


The documentation for this class was generated from the following files: