File indexing completed on 2024-05-12 15:58:46

0001 /*
0002  *  SPDX-FileCopyrightText: 2014 Dmitry Kazakov <dimula73@gmail.com>
0003  *
0004  *  SPDX-License-Identifier: GPL-2.0-or-later
0005  */
0006 
0007 #include "kis_transform_mask_params_interface.h"
0008 
0009 #include <QTransform>
0010 
0011 
0012 KisTransformMaskParamsInterface::~KisTransformMaskParamsInterface()
0013 {
0014 }
0015 
0016 
0017 KisAnimatedTransformParamsInterface::~KisAnimatedTransformParamsInterface()
0018 {
0019 }
0020 
0021 ///////////////// KisDumbTransformMaskParams ////////////////////////////
0022 
0023 #include <QDomElement>
0024 #include "kis_dom_utils.h"
0025 #include "kis_node.h"
0026 #include "kis_painter.h"
0027 #include "KoCompositeOpRegistry.h"
0028 
0029 
0030 
0031 struct Q_DECL_HIDDEN KisDumbTransformMaskParams::Private
0032 {
0033     Private() : isHidden(false) {}
0034 
0035     QTransform transform;
0036     bool isHidden;
0037 };
0038 
0039 KisDumbTransformMaskParams::KisDumbTransformMaskParams()
0040     : m_d(new Private)
0041 {
0042 }
0043 
0044 KisDumbTransformMaskParams::KisDumbTransformMaskParams(const QTransform &transform)
0045     : m_d(new Private)
0046 {
0047     m_d->isHidden = false;
0048     m_d->transform = transform;
0049 }
0050 
0051 KisDumbTransformMaskParams::KisDumbTransformMaskParams(bool isHidden)
0052     : m_d(new Private)
0053 {
0054     m_d->isHidden = isHidden;
0055 }
0056 
0057 KisDumbTransformMaskParams::~KisDumbTransformMaskParams()
0058 {
0059 }
0060 
0061 QTransform KisDumbTransformMaskParams::finalAffineTransform() const
0062 {
0063     return m_d->transform;
0064 }
0065 
0066 bool KisDumbTransformMaskParams::isAffine() const
0067 {
0068     return true;
0069 }
0070 
0071 bool KisDumbTransformMaskParams::isHidden() const
0072 {
0073     return m_d->isHidden;
0074 }
0075 
0076 void KisDumbTransformMaskParams::transformDevice(KisNodeSP node, KisPaintDeviceSP src, KisPaintDeviceSP dst) const
0077 {
0078     Q_UNUSED(node);
0079 
0080     QRect rc = src->exactBounds();
0081     QPoint dstTopLeft = rc.topLeft();
0082 
0083     QTransform t = finalAffineTransform();
0084     if (t.isTranslating()) {
0085         dstTopLeft = t.map(dstTopLeft);
0086     } else if (!t.isIdentity()) {
0087         warnKrita << "KisDumbTransformMaskParams::transformDevice does not support this kind of transformation";
0088         warnKrita << ppVar(t);
0089     }
0090 
0091     KisPainter::copyAreaOptimized(dstTopLeft, src, dst, rc);
0092 }
0093 
0094 QString KisDumbTransformMaskParams::id() const
0095 {
0096     return "dumbparams";
0097 }
0098 
0099 void KisDumbTransformMaskParams::toXML(QDomElement *e) const
0100 {
0101     QDomDocument doc = e->ownerDocument();
0102     QDomElement transformEl = doc.createElement("dumb_transform");
0103     e->appendChild(transformEl);
0104 
0105     KisDomUtils::saveValue(&transformEl, "transform", m_d->transform);
0106 }
0107 
0108 KisTransformMaskParamsInterfaceSP KisDumbTransformMaskParams::fromXML(const QDomElement &e)
0109 {
0110     QDomElement transformEl;
0111     bool result = false;
0112 
0113     QTransform transform;
0114 
0115     result =
0116         KisDomUtils::findOnlyElement(e, "dumb_transform", &transformEl) &&
0117         KisDomUtils::loadValue(transformEl, "transform", &transform);
0118 
0119     if (!result) {
0120         warnKrita << "WARNING: couldn't load dumb transform. Ignoring...";
0121     }
0122 
0123     return KisTransformMaskParamsInterfaceSP(
0124         new KisDumbTransformMaskParams(transform));
0125 }
0126 
0127 void KisDumbTransformMaskParams::translateSrcAndDst(const QPointF &offset)
0128 {
0129     Q_UNUSED(offset);
0130 
0131     /**
0132      * Normal translation doesn't change affine transformations
0133      * in full-featured KisTransformMaskAdapter, so we should resemble
0134      * this behavior in the dumb one
0135      */
0136 }
0137 
0138 void KisDumbTransformMaskParams::transformSrcAndDst(const QTransform &t)
0139 {
0140     Q_UNUSED(t);
0141 
0142     /**
0143      * Normal translation doesn't change affine transformations
0144      * in full-featured KisTransformMaskAdapter, so we should resemble
0145      * this behavior in the dumb one
0146      */
0147 }
0148 
0149 void KisDumbTransformMaskParams::translateDstSpace(const QPointF &offset)
0150 {
0151     m_d->transform.translate(offset.x(), offset.y());
0152 }
0153 
0154 QRect KisDumbTransformMaskParams::nonAffineChangeRect(const QRect &rc)
0155 {
0156     return rc;
0157 }
0158 
0159 QRect KisDumbTransformMaskParams::nonAffineNeedRect(const QRect &rc, const QRect &srcBounds)
0160 {
0161     Q_UNUSED(srcBounds);
0162     return rc;
0163 }
0164 
0165 bool KisDumbTransformMaskParams::isAnimated() const
0166 {
0167     return false;
0168 }
0169 
0170 KisKeyframeChannel *KisDumbTransformMaskParams::getKeyframeChannel(const QString&, KisDefaultBoundsBaseSP)
0171 {
0172     return 0;
0173 }
0174 
0175 void KisDumbTransformMaskParams::clearChangedFlag()
0176 {}
0177 
0178 bool KisDumbTransformMaskParams::hasChanged() const
0179 {
0180     return false;
0181 }
0182 
0183 KisTransformMaskParamsInterfaceSP KisDumbTransformMaskParams::clone() const
0184 {
0185     return toQShared(new KisDumbTransformMaskParams(m_d->transform));
0186 }
0187 
0188 QTransform KisDumbTransformMaskParams::testingGetTransform() const
0189 {
0190     return m_d->transform;
0191 }
0192 
0193 void KisDumbTransformMaskParams::testingSetTransform(const QTransform &t)
0194 {
0195     m_d->transform = t;
0196 }
0197 
0198 #include "kis_transform_mask_params_factory_registry.h"
0199 
0200 struct DumbParamsRegistrar {
0201     DumbParamsRegistrar() {
0202         KisTransformMaskParamsFactory f(KisDumbTransformMaskParams::fromXML);
0203         KisTransformMaskParamsFactoryRegistry::instance()->addFactory("dumbparams", f);
0204     }
0205 };
0206 static DumbParamsRegistrar __dumbParamsRegistrar;