Krita Source Code Documentation
Loading...
Searching...
No Matches
KisReferenceImagesLayer.cpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2017 Jouni Pentikäinen <joupent@gmail.com>
3 *
4 * SPDX-License-Identifier: LGPL-2.0-or-later
5 */
6
10#include <KoSelection.h>
11#include <kis_node_visitor.h>
14
15#include "kis_default_bounds.h"
17#include "KisReferenceImage.h"
18#include "KisDocument.h"
19#include <KoViewConverter.h>
20
22{
24 : KoShapeCreateCommand(layer->shapeController(), referenceImages, layer.data(), parent, kundo2_i18n("Add reference image"))
25 , m_document(document)
26 , m_layer(layer)
27 {}
28
29 void redo() override {
30 auto layer = m_document->referenceImagesLayer();
31 KIS_SAFE_ASSERT_RECOVER_NOOP(!layer || layer == m_layer);
32
33 if (!layer) {
35 }
36
38 }
39
40 void undo() override {
42
43 if (m_layer->shapeCount() == 0) {
44 m_document->setReferenceImagesLayer(nullptr, true);
45 }
46 }
47
48private:
51};
52
54{
56 : KoShapeDeleteCommand(layer->shapeController(), referenceImages, parent)
57 , m_document(document)
58 , m_layer(layer)
59 {}
60
61
62 void redo() override {
64
65 if (m_layer->shapeCount() == 0) {
66 m_document->setReferenceImagesLayer(nullptr, true);
67 }
68 }
69
70 void undo() override {
71 auto layer = m_document->referenceImagesLayer();
72 KIS_SAFE_ASSERT_RECOVER_NOOP(!layer || layer == m_layer);
73
74 if (!layer) {
76 }
77
79 }
80
81private:
84};
85
87{
88 Q_OBJECT
89public:
92 , m_layer(parent)
93 , m_fallbackProjection(new KisPaintDevice(parent, cs, defaultBounds))
95 {
96 connect(&m_compressor, SIGNAL(timeout()), this, SLOT(slotAsyncRepaint()));
97 }
98
100 : KisShapeLayerCanvasBase(rhs, parent)
101 , m_layer(parent)
104 {
105 connect(&m_compressor, SIGNAL(timeout()), this, SLOT(slotAsyncRepaint()));
106 }
107
108 void updateCanvas(const QRectF &rect) override
109 {
110 if (!m_layer->image() || m_isDestroying) {
111 return;
112 }
113
114 m_dirtyRect |= rect;
115
118 }
119
120 void forceRepaint() override
121 {
123 }
124
125 bool hasPendingUpdates() const override
126 {
128 }
129
131
132 void resetCache(const KoColorSpace *colorSpace) override {
133 Q_UNUSED(colorSpace);
134 }
135
136 KisPaintDeviceSP projection() const override {
138 }
139private Q_SLOTS:
143 m_dirtyRect = QRectF();
145 }
146
147private:
152 volatile bool m_hasUpdateInCompressor = false;
153};
154
156 : KisShapeLayer(shapeController, image, i18n("Reference images"), OPACITY_OPAQUE_U8,
157 [&] () { return new ReferenceImagesCanvas(image->colorSpace(), new KisDefaultBounds(image), this); })
158{}
159
161 : KisShapeLayer(rhs, rhs.shapeController(),
162 [&] () {
163 const ReferenceImagesCanvas* referenceImagesCanvas = dynamic_cast<const ReferenceImagesCanvas*>(rhs.canvas());
164 KIS_ASSERT(referenceImagesCanvas);
165 return new ReferenceImagesCanvas(*referenceImagesCanvas, this); })
166{}
167
169{
170 KisSharedPtr<KisReferenceImagesLayer> layer = document->referenceImagesLayer();
171 if (!layer) {
172 layer = new KisReferenceImagesLayer(document->shapeController(), document->image());
173 }
174
175 KUndo2Command *parentCommand = new KUndo2Command();
176
177 new KoKeepShapesSelectedCommand(layer->shapeManager()->selection()->selectedShapes(), {}, layer->selectedShapesProxy(), KisCommandUtils::FlipFlopCommand::State::INITIALIZING, parentCommand);
178 AddReferenceImagesCommand *cmd = new AddReferenceImagesCommand(document, layer, referenceImages, parentCommand);
179 parentCommand->setText(cmd->text());
180 new KoKeepShapesSelectedCommand({}, referenceImages, layer->selectedShapesProxy(), KisCommandUtils::FlipFlopCommand::State::FINALIZING, parentCommand);
181
182 return parentCommand;
183}
184
189
191{
193
194 Q_FOREACH(auto shape, shapes()) {
195 KisReferenceImage *referenceImage = dynamic_cast<KisReferenceImage*>(shape);
196 if (referenceImage) {
197 references.append(referenceImage);
198 }
199 }
200 return references;
201}
202
204 painter.setTransform(converter()->documentToView(), true);
205 shapeManager()->paint(painter);
206}
207
209{
210 return false;
211}
212
214{
215 return visitor.visit(this);
216}
217
219{
220 visitor.visit(this, undoAdapter);
221}
222
224{
225 return true;
226}
227
229{
230 // references should not be converted with the image
231 Q_UNUSED(profile);
232 return 0;
233}
234
235KUndo2Command *KisReferenceImagesLayer::convertTo(const KoColorSpace *dstColorSpace, KoColorConversionTransformation::Intent renderingIntent, KoColorConversionTransformation::ConversionFlags conversionFlags)
236{
237 // references should not be converted with the image
238 Q_UNUSED(dstColorSpace);
239 Q_UNUSED(renderingIntent);
240 Q_UNUSED(conversionFlags);
241 return 0;
242}
243
245{
246 Q_EMIT sigUpdateCanvas(rect);
247}
248
253
254QColor KisReferenceImagesLayer::getPixel(QPointF position) const
255{
256 const QPointF docPoint = converter()->viewToDocument(position);
257
258 KoShape *shape = shapeManager()->shapeAt(docPoint);
259
260 if (shape) {
261 auto *reference = dynamic_cast<KisReferenceImage*>(shape);
262 KIS_SAFE_ASSERT_RECOVER_RETURN_VALUE(reference, QColor());
263
264 return reference->getPixel(docPoint);
265 }
266
267 return QColor();
268}
269
270#include "KisReferenceImagesLayer.moc"
const quint8 OPACITY_OPAQUE_U8
connect(this, SIGNAL(optionsChanged()), this, SLOT(saveOptions()))
void setText(const KUndo2MagicString &text)
KUndo2MagicString text() const
KisSharedPtr< KisReferenceImagesLayer > referenceImagesLayer() const
void setReferenceImagesLayer(KisSharedPtr< KisReferenceImagesLayer > layer, bool updateImage)
const KoColorSpace * colorSpace() const
virtual bool visit(KisNode *node)=0
virtual void visit(KisNode *node, KisUndoAdapter *undoAdapter)=0
The KisReferenceImage class represents a single reference image.
void paintReferences(QPainter &painter)
void sigUpdateCanvas(const QRectF &rect)
void signalUpdate(const QRectF &rect)
static KUndo2Command * addReferenceImages(KisDocument *document, QList< KoShape * > referenceImages)
QVector< KisReferenceImage * > referenceImages() const
KUndo2Command * convertTo(const KoColorSpace *dstColorSpace, KoColorConversionTransformation::Intent renderingIntent=KoColorConversionTransformation::internalRenderingIntent(), KoColorConversionTransformation::ConversionFlags conversionFlags=KoColorConversionTransformation::internalConversionFlags()) override
bool allowAsChild(KisNodeSP) const override
bool accept(KisNodeVisitor &) override
QColor getPixel(QPointF position) const
KUndo2Command * setProfile(const KoColorProfile *profile) override
KisReferenceImagesLayer(KoShapeControllerBase *shapeController, KisImageWSP image)
KUndo2Command * removeReferenceImages(KisDocument *document, QList< KoShape * > referenceImages)
const KoViewConverter * viewConverter() const override
KoShapeManager * shapeManager() const
KisShapeLayerCanvasBase * canvas() const
const KoViewConverter * converter() const
QList< KoShape * > shapes() const
The undo / redo command for creating shapes.
void undo() override
revert the actions done in redo
void redo() override
redo the command
The undo / redo command for deleting shapes.
void undo() override
revert the actions done in redo
void redo() override
redo the command
QRectF boundingRect() const override
Get the bounding box of the shape.
KoShape * shapeAt(const QPointF &position, KoFlake::ShapeSelection selection=KoFlake::ShapeOnTop, bool omitHiddenShapes=true)
void paint(QPainter &painter)
QPointF position() const
Get the position of the shape in pt.
Definition KoShape.cpp:825
virtual QPointF viewToDocument(const QPointF &viewPoint) const
virtual QPointF documentToView(const QPointF &documentPoint) const
KisThreadSafeSignalCompressor m_compressor
ReferenceImagesCanvas(const ReferenceImagesCanvas &rhs, KisReferenceImagesLayer *parent)
ReferenceImagesCanvas(const KoColorSpace *cs, KisDefaultBoundsBaseSP defaultBounds, KisReferenceImagesLayer *parent)
void resetCache(const KoColorSpace *colorSpace) override
void rerenderAfterBeingInvisible() override
KisPaintDeviceSP projection() const override
KisReferenceImagesLayer * m_layer
bool hasPendingUpdates() const override
void updateCanvas(const QRectF &rect) override
#define KIS_SAFE_ASSERT_RECOVER_RETURN_VALUE(cond, val)
Definition kis_assert.h:129
#define KIS_SAFE_ASSERT_RECOVER_NOOP(cond)
Definition kis_assert.h:130
#define KIS_ASSERT(cond)
Definition kis_assert.h:33
KUndo2MagicString kundo2_i18n(const char *text)
AddReferenceImagesCommand(KisDocument *document, KisSharedPtr< KisReferenceImagesLayer > layer, const QList< KoShape * > referenceImages, KUndo2Command *parent=nullptr)
KisSharedPtr< KisReferenceImagesLayer > m_layer
KisImageWSP image
void undo() override
revert the actions done in redo
void redo() override
redo the command
RemoveReferenceImagesCommand(KisDocument *document, KisSharedPtr< KisReferenceImagesLayer > layer, QList< KoShape * > referenceImages, KUndo2Command *parent=nullptr)
KisSharedPtr< KisReferenceImagesLayer > m_layer