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