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 bool isNodeMimeDataFromSameImage (const QMimeData *data, KisImageSP image)
 
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 coincide 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:374
QTransform transformation() const
Returns the shapes local transformation matrix.
Definition KoShape.cpp:383
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 493 of file kis_mimedata.cpp.

503{
504 QList<KisNodeSP> nodes = loadNodesFast(data, image, shapeController, copyNode /* IN-OUT */);
505
506 if (changeOffset) {
507 Q_FOREACH (KisNodeSP node, nodes) {
508 KisLayerUtils::recursiveApplyNodes(node, [offset] (KisNodeSP node){
509 const QPoint newOffset(node->x() + offset.x(), node->y() + offset.y());
510 node->setX(newOffset.x());
511 node->setY(newOffset.y());
512 });
513 }
514 }
515
516 if (nodes.isEmpty()) return false;
517
518 bool result = true;
519
520 if (!correctNewNodeLocation(nodes, parentDummy, aboveThisDummy)) {
521 return false;
522 }
523
524 KIS_SAFE_ASSERT_RECOVER_RETURN_VALUE(nodeInsertionAdapter, false);
525 KIS_SAFE_ASSERT_RECOVER_RETURN_VALUE(parentDummy, false);
526
527 KisNodeSP aboveThisNode = aboveThisDummy ? aboveThisDummy->node() : 0;
528
529 if (!applicator) {
530 if (copyNode) {
531 nodeInsertionAdapter->addNodes(nodes, parentDummy->node(), aboveThisNode);
532 }
533 else {
534 KIS_SAFE_ASSERT_RECOVER_RETURN_VALUE(nodes.first()->graphListener() == image.data(), false);
535 nodeInsertionAdapter->moveNodes(nodes, parentDummy->node(), aboveThisNode);
536 }
537 } else {
538 {
539 if (copyNode) {
540 KisNodeSP prevNode = aboveThisNode;
541 Q_FOREACH (KisNodeSP node, nodes) {
542 applicator->applyCommand(
543 new KisImageLayerAddCommand(image, node, parentDummy->node(), prevNode));
544 prevNode = node;
545 }
546 } else {
547 KIS_SAFE_ASSERT_RECOVER_RETURN_VALUE(nodes.first()->graphListener() == image.data(), false);
548
549 KisNodeSP prevNode = aboveThisNode;
550 Q_FOREACH (KisNodeSP node, nodes) {
551 applicator->applyCommand(
552 new KisImageLayerMoveCommand(image, node, parentDummy->node(), prevNode));
553 prevNode = node;
554 }
555 }
556 }
557 }
558
559 const bool hasDelayedNodes =
560 std::find_if(nodes.begin(), nodes.end(),
561 [] (KisNodeSP node) {
562 return bool(dynamic_cast<KisDelayedUpdateNodeInterface*>(node.data()));
563 }) != nodes.end();
564
565 if (hasDelayedNodes) {
571 image->requestStrokeEnd();
572 }
573
574 return result;
575}
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().

◆ isNodeMimeDataFromSameImage()

bool KisMimeData::isNodeMimeDataFromSameImage ( const QMimeData * data,
KisImageSP image )
static

Definition at line 448 of file kis_mimedata.cpp.

449{
450 const KisMimeData *mimedata = qobject_cast<const KisMimeData*>(data);
451 return mimedata && mimedata->m_image == image;
452}

References m_image.

◆ 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 454 of file kis_mimedata.cpp.

459{
462 image,
463 shapeController,
464 copyNode /* IN-OUT */);
465
466 if (nodes.isEmpty()) {
472 copyNode = true;
473 }
474
475 return nodes;
476}
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 478 of file kis_mimedata.cpp.

479{
480 KisNodeList nodes = loadNodesFast(data, image, shapeController, copyNode);
481
482 Q_FOREACH (KisNodeSP node, nodes) {
483 const QRect layerBounds = node->exactBounds();
484 const QPoint offset = preferredCenter - layerBounds.center();
485
486 node->setX(node->x() + offset.x());
487 node->setY(node->y() + offset.y());
488 }
489
490 return nodes;
491}
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 133 of file kis_mimedata.h.

◆ m_forceCopy

bool KisMimeData::m_forceCopy
private

Definition at line 131 of file kis_mimedata.h.

◆ m_image

KisImageSP KisMimeData::m_image
private

Definition at line 132 of file kis_mimedata.h.

◆ m_nodes

QList<KisNodeSP> KisMimeData::m_nodes
private

Definition at line 130 of file kis_mimedata.h.


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