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 }