File indexing completed on 2024-05-19 04:26:58
0001 /* 0002 * SPDX-FileCopyrightText: 2017 Wolthera van Hövell tot Westerflier <griffinvalley@gmail.com> 0003 * 0004 * SPDX-License-Identifier: LGPL-2.0-or-later 0005 */ 0006 #include "TransformMask.h" 0007 #include <kis_transform_mask.h> 0008 #include <kis_image.h> 0009 #include <kis_transform_mask_params_interface.h> 0010 #include <QDomDocument> 0011 0012 #include "Node.h" 0013 #include <kis_transform_mask_params_factory_registry.h> 0014 #include <commands_new/KisSimpleModifyTransformMaskCommand.h> 0015 #include "commands_new/KisLazyCreateTransformMaskKeyframesCommand.h" 0016 #include <kis_processing_applicator.h> 0017 0018 0019 #include "kis_transform_mask_params_interface.h" 0020 0021 0022 TransformMask::TransformMask(KisImageSP image, QString name, QObject *parent) : 0023 Node(image, new KisTransformMask(image, name), parent) 0024 { 0025 0026 } 0027 0028 TransformMask::TransformMask(KisImageSP image, KisTransformMaskSP mask, QObject *parent): 0029 Node(image, mask, parent) 0030 { 0031 0032 } 0033 0034 TransformMask::~TransformMask() 0035 { 0036 0037 } 0038 0039 QString TransformMask::type() const 0040 { 0041 return "transformmask"; 0042 } 0043 0044 QTransform TransformMask::finalAffineTransform() const 0045 { 0046 QTransform affineTransformation; 0047 KisTransformMask *mask = dynamic_cast<KisTransformMask*>(this->node().data()); 0048 KIS_SAFE_ASSERT_RECOVER_RETURN_VALUE(mask, QTransform()); 0049 0050 affineTransformation = mask->transformParams()->finalAffineTransform(); 0051 0052 return affineTransformation; 0053 } 0054 0055 QString TransformMask::toXML() const 0056 { 0057 KisTransformMaskSP mask = qobject_cast<KisTransformMask*>(this->node().data()); 0058 KIS_SAFE_ASSERT_RECOVER_RETURN_VALUE(mask, QString()); 0059 0060 QDomDocument doc("transform_params"); 0061 QDomElement root = doc.createElement("transform_params"); 0062 QDomElement main = doc.createElement("main"); 0063 QDomElement data = doc.createElement("data"); 0064 0065 main.setAttribute("id", mask->transformParams()->id()); 0066 0067 mask->transformParams()->toXML(&data); 0068 doc.appendChild(root); 0069 root.appendChild(main); 0070 root.appendChild(data); 0071 0072 return doc.toString(); 0073 } 0074 0075 bool TransformMask::fromXML (const QString &xml) 0076 { 0077 QDomDocument doc; 0078 KisTransformMaskSP mask = qobject_cast<KisTransformMask*>(this->node().data()); 0079 KIS_SAFE_ASSERT_RECOVER_RETURN_VALUE(mask, false); 0080 0081 doc.setContent(xml); 0082 0083 QDomElement rootElement = doc.documentElement(); 0084 QDomElement main = rootElement.firstChildElement("main"); 0085 QDomElement data = rootElement.firstChildElement("data"); 0086 0087 if (!main.isElement() || !main.hasAttribute("id") || !data.isElement()) { 0088 return false; 0089 } 0090 0091 QString id = main.attribute("id", "not-valid"); 0092 0093 // backward compatibility 0094 if (id == "animatedtransformparams") { 0095 id = "tooltransformparams"; 0096 } 0097 0098 KisTransformMaskParamsInterfaceSP params = KisTransformMaskParamsFactoryRegistry::instance()->createParams(id, data); 0099 0100 if (!params) { 0101 return false; 0102 } 0103 0104 QScopedPointer<KUndo2Command> cmd(new KUndo2Command); 0105 0106 if (KisLazyCreateTransformMaskKeyframesCommand::maskHasAnimation(mask)) { 0107 new KisLazyCreateTransformMaskKeyframesCommand(mask, cmd.data()); 0108 } 0109 0110 new KisSimpleModifyTransformMaskCommand(mask, params, {}, cmd.data()); 0111 0112 KisProcessingApplicator::runSingleCommandStroke(this->node()->image(), cmd.take()); 0113 0114 return true; 0115 }