Krita Source Code Documentation
Loading...
Searching...
No Matches
kis_transform_processing_visitor.cpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2011 Dmitry Kazakov <dimula73@gmail.com>
3 *
4 * SPDX-License-Identifier: GPL-2.0-or-later
5 */
6
8
9#include "klocalizedstring.h"
10
11#include <KoUpdater.h>
12
13#include "kis_layer.h"
14#include "kis_paint_device.h"
15#include "kis_selection.h"
16#include "kis_group_layer.h"
17#include "kis_paint_layer.h"
18#include "kis_clone_layer.h"
21
23#include "kis_filter_mask.h"
24#include "kis_transform_mask.h"
25#include "kis_selection_mask.h"
27
29
30#include "kis_transaction.h"
31#include "kis_undo_adapter.h"
34
37
39
40
42KisTransformProcessingVisitor(qreal xscale, qreal yscale,
43 qreal xshear, qreal yshear,
44 qreal angle,
45 qreal tx, qreal ty,
46 KisFilterStrategy *filter,
47 const QTransform &shapesCorrection)
48 : m_sx(xscale), m_sy(yscale)
49 , m_tx(tx), m_ty(ty)
50 , m_shearx(xshear), m_sheary(yshear)
51 , m_filter(filter)
52 , m_angle(angle)
53 , m_shapesCorrection(shapesCorrection)
54 , m_selectionHelper(0, KisSelectionBasedProcessingHelper::Functor())
55{
56}
57
62
71
73{
74 Q_UNUSED(node);
75 Q_UNUSED(undoAdapter);
76}
77
79{
80 transformPaintDevice(layer->paintDevice(), undoAdapter, ProgressHelper(layer));
81 transformClones(layer, undoAdapter);
82}
83
85{
86 using namespace KisDoSomethingCommandOps;
87 undoAdapter->addCommand(new KisDoSomethingCommand<ResetOp, KisGroupLayer*>(layer, false));
89 transformClones(layer, undoAdapter);
90
91}
92
94{
95 using namespace KisDoSomethingCommandOps;
97 transformSelection(layer->internalSelection(), undoAdapter, ProgressHelper(layer));
99
100 transformClones(layer, undoAdapter);
101}
102
104{
106 m_angle, m_tx, m_ty, 0,
107 m_filter);
108
109 KUndo2Command* command = layer->transform(tw.transform() * m_shapesCorrection);
110 if(command) {
111 undoAdapter->addCommand(command);
112 }
113
114 transformClones(layer, undoAdapter);
115}
116
118{
119 using namespace KisDoSomethingCommandOps;
121 transformSelection(layer->internalSelection(), undoAdapter, ProgressHelper(layer));
123
124 transformClones(layer, undoAdapter);
125}
126
128{
129 transformClones(layer, undoAdapter);
130}
131
133{
134 transformSelection(mask->selection(), undoAdapter, ProgressHelper(mask));
135}
136
138{
139 Q_UNUSED(mask);
140 Q_UNUSED(undoAdapter);
141
143 m_angle, m_tx, m_ty, 0,
144 m_filter);
145
147 params->transformSrcAndDst(tw.transform());
148
149 undoAdapter->addCommand(new KisSimpleModifyTransformMaskCommand(mask, params));
150}
151
153{
154 transformSelection(mask->selection(), undoAdapter, ProgressHelper(mask));
155}
156
158{
159 transformSelection(mask->selection(), undoAdapter, ProgressHelper(mask));
160}
161
163{
165
166 Q_FOREACH (KisPaintDeviceSP device, devices) {
167 transformPaintDevice(device, undoAdapter, ProgressHelper(mask));
168 }
169}
170
172{
174
175 Q_FOREACH (KisCloneLayerSP clone, clones) {
176 // we have just casted an object from a weak pointer,
177 // so check validity first
178 if(!clone) continue;
179
180 KisTransformWorker tw(clone->projection(), m_sx, m_sy, m_shearx, m_sheary,
181 m_angle, m_tx, m_ty, 0,
182 m_filter);
183
184 QTransform trans = tw.transform();
185 QTransform offsetTrans = QTransform::fromTranslate(clone->x(), clone->y());
186
187 QTransform newTrans = trans.inverted() * offsetTrans * trans;
188
189 QPoint oldPos(clone->x(), clone->y());
190 QPoint newPos(newTrans.dx(), newTrans.dy());
191 KUndo2Command *command = new KisNodeMoveCommand2(clone, oldPos, newPos);
192 undoAdapter->addCommand(command);
193 }
194}
195
197{
199 adapter,
201 this,
202 std::placeholders::_1,
203 helper.updater()));
204}
205
207 KoUpdater *updater)
208{
210 m_angle, m_tx, m_ty, updater,
211 m_filter);
212 tw.run();
213}
214
216{
217 if (selection->hasShapeSelection()) {
219 m_angle, m_tx, m_ty, 0,
220 m_filter);
221
222 KUndo2Command* command =
224 if (command) {
225 adapter->addCommand(command);
226 }
227 } else {
228 transformPaintDevice(selection->pixelSelection(), adapter, helper);
229 }
230
231 selection->updateProjection();
232}
QVector< KisPaintDeviceSP > allPaintDevices() const
virtual KUndo2Command * transform(const QTransform &transform)
void transformPaintDevice(KisPaintDeviceSP device, KisUndoAdapter *undoAdapter)
virtual KUndo2Command * transform(const QTransform &transform)
KisSelectionBasedProcessingHelper m_selectionHelper
void transformSelection(KisSelectionSP selection, KisUndoAdapter *adapter, const ProgressHelper &helper)
void transformPaintDevice(KisPaintDeviceSP device, KisUndoAdapter *adapter, const ProgressHelper &helper)
void transformOneDevice(KisPaintDeviceSP device, KoUpdater *updater)
void visit(KisNode *node, KisUndoAdapter *undoAdapter) override
KisTransformProcessingVisitor(qreal xscale, qreal yscale, qreal xshear, qreal yshear, qreal angle, qreal tx, qreal ty, KisFilterStrategy *filter, const QTransform &shapesCorrection=QTransform())
void transformClones(KisLayer *layer, KisUndoAdapter *undoAdapter)
QTransform transform() const
virtual void addCommand(KUndo2Command *cmd)=0
KisPaintDeviceSP projection() const override
Definition kis_layer.cc:820
const QList< KisCloneLayerWSP > registeredClones() const
Definition kis_layer.cc:478
KisSelectionSP selection
Definition kis_mask.cc:44
KisPaintDeviceSP paintDevice
KisSelectionSP internalSelection() const
KisPixelSelectionSP projection() const
void updateProjection(const QRect &rect)
KisPixelSelectionSP pixelSelection
KisSelectionComponent * shapeSelection
bool hasShapeSelection() const
KisTransformMaskParamsInterfaceSP transformParams() const