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;