1 /*
2  *  Copyright (c) 2014 Dmitry Kazakov <dimula73@gmail.com>
3  *
4  *  This program is free software; you can redistribute it and/or modify
5  *  it under the terms of the GNU General Public License as published by
6  *  the Free Software Foundation; either version 2 of the License, or
7  *  (at your option) any later version.
8  *
9  *  This program is distributed in the hope that it will be useful,
10  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
11  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  *  GNU General Public License for more details.
13  *
14  *  You should have received a copy of the GNU General Public License
15  *  along with this program; if not, write to the Free Software
16  *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17  */
18 
19 #include "kis_transform_mask_params_interface.h"
20 
21 #include <QTransform>
22 
23 
~KisTransformMaskParamsInterface()24 KisTransformMaskParamsInterface::~KisTransformMaskParamsInterface()
25 {
26 }
27 
28 
~KisAnimatedTransformParamsInterface()29 KisAnimatedTransformParamsInterface::~KisAnimatedTransformParamsInterface()
30 {
31 }
32 
33 ///////////////// KisDumbTransformMaskParams ////////////////////////////
34 
35 #include <QDomElement>
36 #include "kis_dom_utils.h"
37 #include "kis_node.h"
38 #include "kis_painter.h"
39 #include "KoCompositeOpRegistry.h"
40 
41 
42 
43 struct Q_DECL_HIDDEN KisDumbTransformMaskParams::Private
44 {
PrivateKisDumbTransformMaskParams::Private45     Private() : isHidden(false) {}
46 
47     QTransform transform;
48     bool isHidden;
49 };
50 
KisDumbTransformMaskParams()51 KisDumbTransformMaskParams::KisDumbTransformMaskParams()
52     : m_d(new Private)
53 {
54 }
55 
KisDumbTransformMaskParams(const QTransform & transform)56 KisDumbTransformMaskParams::KisDumbTransformMaskParams(const QTransform &transform)
57     : m_d(new Private)
58 {
59     m_d->isHidden = false;
60     m_d->transform = transform;
61 }
62 
KisDumbTransformMaskParams(bool isHidden)63 KisDumbTransformMaskParams::KisDumbTransformMaskParams(bool isHidden)
64     : m_d(new Private)
65 {
66     m_d->isHidden = isHidden;
67 }
68 
~KisDumbTransformMaskParams()69 KisDumbTransformMaskParams::~KisDumbTransformMaskParams()
70 {
71 }
72 
finalAffineTransform() const73 QTransform KisDumbTransformMaskParams::finalAffineTransform() const
74 {
75     return m_d->transform;
76 }
77 
isAffine() const78 bool KisDumbTransformMaskParams::isAffine() const
79 {
80     return true;
81 }
82 
isHidden() const83 bool KisDumbTransformMaskParams::isHidden() const
84 {
85     return m_d->isHidden;
86 }
87 
transformDevice(KisNodeSP node,KisPaintDeviceSP src,KisPaintDeviceSP dst) const88 void KisDumbTransformMaskParams::transformDevice(KisNodeSP node, KisPaintDeviceSP src, KisPaintDeviceSP dst) const
89 {
90     Q_UNUSED(node);
91 
92     QRect rc = src->exactBounds();
93     QPoint dstTopLeft = rc.topLeft();
94 
95     QTransform t = finalAffineTransform();
96     if (t.isTranslating()) {
97         dstTopLeft = t.map(dstTopLeft);
98     } else if (!t.isIdentity()) {
99         warnKrita << "KisDumbTransformMaskParams::transformDevice does not support this kind of transformation";
100         warnKrita << ppVar(t);
101     }
102 
103     KisPainter::copyAreaOptimized(dstTopLeft, src, dst, rc);
104 }
105 
id() const106 QString KisDumbTransformMaskParams::id() const
107 {
108     return "dumbparams";
109 }
110 
toXML(QDomElement * e) const111 void KisDumbTransformMaskParams::toXML(QDomElement *e) const
112 {
113     QDomDocument doc = e->ownerDocument();
114     QDomElement transformEl = doc.createElement("dumb_transform");
115     e->appendChild(transformEl);
116 
117     KisDomUtils::saveValue(&transformEl, "transform", m_d->transform);
118 }
119 
fromXML(const QDomElement & e)120 KisTransformMaskParamsInterfaceSP KisDumbTransformMaskParams::fromXML(const QDomElement &e)
121 {
122     QDomElement transformEl;
123     bool result = false;
124 
125     QTransform transform;
126 
127     result =
128         KisDomUtils::findOnlyElement(e, "dumb_transform", &transformEl) &&
129         KisDomUtils::loadValue(transformEl, "transform", &transform);
130 
131     if (!result) {
132         warnKrita << "WARNING: couldn't load dumb transform. Ignoring...";
133     }
134 
135     return KisTransformMaskParamsInterfaceSP(
136         new KisDumbTransformMaskParams(transform));
137 }
138 
translate(const QPointF & offset)139 void KisDumbTransformMaskParams::translate(const QPointF &offset)
140 {
141     Q_UNUSED(offset);
142 
143     /**
144      * Normal translation doesn't change affine transformations
145      * in full-featured KisTransformMaskAdapter, so we should resemble
146      * this behavior in the dumb one
147      */
148 }
149 
nonAffineChangeRect(const QRect & rc)150 QRect KisDumbTransformMaskParams::nonAffineChangeRect(const QRect &rc)
151 {
152     return rc;
153 }
154 
nonAffineNeedRect(const QRect & rc,const QRect & srcBounds)155 QRect KisDumbTransformMaskParams::nonAffineNeedRect(const QRect &rc, const QRect &srcBounds)
156 {
157     Q_UNUSED(srcBounds);
158     return rc;
159 }
160 
isAnimated() const161 bool KisDumbTransformMaskParams::isAnimated() const
162 {
163     return false;
164 }
165 
getKeyframeChannel(const QString &,KisDefaultBoundsBaseSP)166 KisKeyframeChannel *KisDumbTransformMaskParams::getKeyframeChannel(const QString&, KisDefaultBoundsBaseSP)
167 {
168     return 0;
169 }
170 
clearChangedFlag()171 void KisDumbTransformMaskParams::clearChangedFlag()
172 {}
173 
hasChanged() const174 bool KisDumbTransformMaskParams::hasChanged() const
175 {
176     return false;
177 }
178 
testingGetTransform() const179 QTransform KisDumbTransformMaskParams::testingGetTransform() const
180 {
181     return m_d->transform;
182 }
183 
testingSetTransform(const QTransform & t)184 void KisDumbTransformMaskParams::testingSetTransform(const QTransform &t)
185 {
186     m_d->transform = t;
187 }
188 
189 #include "kis_transform_mask_params_factory_registry.h"
190 
191 struct DumbParamsRegistrar {
DumbParamsRegistrarDumbParamsRegistrar192     DumbParamsRegistrar() {
193         KisTransformMaskParamsFactory f(KisDumbTransformMaskParams::fromXML);
194         KisTransformMaskParamsFactoryRegistry::instance()->addFactory("dumbparams", f);
195     }
196 };
197 static DumbParamsRegistrar __dumbParamsRegistrar;
198