Krita Source Code Documentation
Loading...
Searching...
No Matches
kis_qpainter_canvas.cpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2006 Boudewijn Rempt <boud@valdyas.org>
3 * SPDX-FileCopyrightText: 2009 Lukas Tvrdy <lukast.dev@gmail.com>
4 *
5 * SPDX-License-Identifier: GPL-2.0-or-later
6 */
7
9
10
11#include <QPaintEvent>
12#include <QPoint>
13#include <QRect>
14#include <QPainter>
15#include <QImage>
16#include <QBrush>
17#include <QColor>
18#include <QTime>
19#include <QApplication>
20
21#include <kis_debug.h>
22#include <kis_config.h>
23
24#include <KoColorProfile.h>
26#include <KoZoomHandler.h>
27#include <KoToolManager.h>
28#include <KoToolProxy.h>
29
30#include <kis_image.h>
31#include <kis_layer.h>
32
33#include "KisViewManager.h"
34#include "kis_canvas2.h"
37#include "KisDocument.h"
39#include "kis_selection.h"
41#include "kis_config_notifier.h"
42#include "kis_group_layer.h"
43
45#include <KoCanvasController.h>
46#include <KisRepaintDebugger.h>
47#include <KisDisplayConfig.h>
48
57
58KisQPainterCanvas::KisQPainterCanvas(KisCanvas2 *canvas, KisCoordinatesConverter *coordinatesConverter, QWidget * parent)
59 : QWidget(parent)
60 , KisCanvasWidgetBase(canvas, coordinatesConverter)
61 , m_d(new Private())
62{
64
65 setAutoFillBackground(true);
66 setAcceptDrops(true);
67 setFocusPolicy(Qt::StrongFocus);
68 setAttribute(Qt::WA_InputMethodEnabled, true);
69 setAttribute(Qt::WA_StaticContents);
70 setAttribute(Qt::WA_OpaquePaintEvent);
71#ifdef Q_OS_MACOS
72 setAttribute(Qt::WA_AcceptTouchEvents, false);
73#else
74 setAttribute(Qt::WA_AcceptTouchEvents, true);
75#endif
76 connect(KisConfigNotifier::instance(), SIGNAL(configChanged()), SLOT(slotConfigChanged()));
78}
79
84
86{
87 m_d->prescaledProjection = prescaledProjection;
88}
89
90void KisQPainterCanvas::paintEvent(QPaintEvent * ev)
91{
92 KisImageWSP image = canvas()->image();
93 if (image == 0) return;
94
95 setAutoFillBackground(false);
96
97 QPainter gc(this);
98 gc.setClipRegion(ev->region());
99
101
102 gc.save();
103
104 gc.setCompositionMode(QPainter::CompositionMode_Source);
105 gc.fillRect(QRect(QPoint(0, 0), size()), borderColor());
106
107 QTransform checkersTransform;
108 QPointF brushOrigin;
109 QPolygonF polygon;
110
111 converter->getQPainterCheckersInfo(&checkersTransform, &brushOrigin, &polygon, m_d->scrollCheckers);
112 gc.setPen(Qt::NoPen);
113 gc.setBrush(m_d->checkBrush);
114 gc.setBrushOrigin(brushOrigin);
115 gc.setTransform(checkersTransform);
116 gc.drawPolygon(polygon);
117
118 drawImage(gc, ev->rect());
119
120 gc.restore();
121
122 drawDecorations(gc, ev->rect());
123
124 gc.end();
125 m_d->repaintDbg.paint(this, ev);
126}
127
128void KisQPainterCanvas::drawImage(QPainter & gc, const QRect &updateWidgetRect) const
129{
131
132 QTransform imageTransform = converter->viewportToWidgetTransform();
133 gc.setTransform(imageTransform);
134 gc.setRenderHint(QPainter::SmoothPixmapTransform, true);
135
136 QRectF viewportRect = converter->widgetToViewport(updateWidgetRect);
137
138 gc.setCompositionMode(QPainter::CompositionMode_SourceOver);
139 gc.drawImage(viewportRect, m_d->prescaledProjection->prescaledQImage(),
140 viewportRect);
141}
142
143QVariant KisQPainterCanvas::inputMethodQuery(Qt::InputMethodQuery query) const
144{
145 return processInputMethodQuery(query);
146}
147
148void KisQPainterCanvas::inputMethodEvent(QInputMethodEvent *event)
149{
151}
152
153void KisQPainterCanvas::focusInEvent(QFocusEvent *event)
154{
155 processFocusInEvent(event);
156}
157
158void KisQPainterCanvas::focusOutEvent(QFocusEvent *event)
159{
161}
162
164{
165 QWidget::hideEvent(e);
167}
168
170{
171 QWidget::showEvent(e);
173}
174
175void KisQPainterCanvas::channelSelectionChanged(const QBitArray &channelFlags)
176{
177 Q_ASSERT(m_d->prescaledProjection);
179}
180
186
194
196{
197 Q_UNUSED(cs);
198 // FIXME: on color space change the data is refetched multiple
199 // times by different actors!
200 canvas()->startUpdateInPatches(canvas()->image()->bounds());
201}
202
204{
205 Q_UNUSED(value);
206 dbgKrita << "Wrap around viewing mode not implemented in QPainter Canvas.";
207 return;
208}
209
211{
212 return false;
213}
214
216{
217 Q_UNUSED(value);
218 dbgKrita << "Wrap around viewing mode not implemented in QPainter Canvas.";
219 return;
220}
221
226
231
236
237
239{
245 bool isPPUpdateInfo = dynamic_cast<KisPPUpdateInfo*>(info.data());
246 if (isPPUpdateInfo) {
248 return info->dirtyViewportRect();
249 } else {
250 return QRect();
251 }
252}
253
254
256{
257 QSize size(e->size());
258 if (size.width() <= 0) {
259 size.setWidth(1);
260 }
261 if (size.height() <= 0) {
262 size.setHeight(1);
263 }
264
266}
267
276
278{
279 return focusNextPrevChild(next);
280}
float value(const T *src, size_t ch)
WrapAroundAxis
@ WRAPAROUND_BOTH
void startUpdateInPatches(const QRect &imageRect)
KisImageWSP image() const
void drawDecorations(QPainter &gc, const QRect &updateWidgetRect) const override
KisCoordinatesConverter * coordinatesConverter() const
QVariant processInputMethodQuery(Qt::InputMethodQuery query) const
void processFocusInEvent(QFocusEvent *event)
void processInputMethodEvent(QInputMethodEvent *event)
void processFocusOutEvent(QFocusEvent *event)
KisCanvas2 * canvas() const
void notifyDecorationsWindowMinimized(bool minimized)
static QImage createCheckersImage(qint32 checkSize=-1)
static KisConfigNotifier * instance()
bool scrollCheckers(bool defaultValue=false) const
_Private::Traits< T >::Result widgetToViewport(const T &obj) const
void getQPainterCheckersInfo(QTransform *transform, QPointF *brushOrigin, QPolygonF *polygon, const bool scrollCheckers) const
KisDisplayConfig This class keeps track of the color management configuration for image to display....
static constexpr char ENABLED_PROPERTY[]
void notifyCanvasSizeChanged(const QSize &widgetSize)
void setChannelFlags(const QBitArray &channelFlags)
void slotImageSizeChanged(qint32 w, qint32 h)
void recalculateCache(KisUpdateInfoSP info)
void setDisplayConfig(const KisDisplayConfig &config)
KisUpdateInfoSP updateCache(const QRect &dirtyImageRect)
void setDisplayFilter(QSharedPointer< KisDisplayFilter > displayFilter)
KisPrescaledProjectionSP prescaledProjection
KisQPainterCanvas(KisCanvas2 *canvas, KisCoordinatesConverter *coordinatesConverter, QWidget *parent)
void channelSelectionChanged(const QBitArray &channelFlags) override
void inputMethodEvent(QInputMethodEvent *event) override
void setWrapAroundViewingModeAxis(WrapAroundAxis value) override
WrapAroundAxis wrapAroundViewingModeAxis() const override
KisUpdateInfoSP startUpdateCanvasProjection(const QRect &rc) override
void setDisplayConfig(const KisDisplayConfig &config) override
void focusInEvent(QFocusEvent *event) override
void resizeEvent(QResizeEvent *e) override
void setWrapAroundViewingMode(bool value) override
void setPrescaledProjection(KisPrescaledProjectionSP prescaledProjection)
void hideEvent(QHideEvent *event) override
void notifyImageColorSpaceChanged(const KoColorSpace *cs) override
set/update the color space of the attached image
void finishResizingImage(qint32 w, qint32 h) override
QVariant inputMethodQuery(Qt::InputMethodQuery query) const override
virtual void drawImage(QPainter &gc, const QRect &updateWidgetRect) const
QRect updateCanvasProjection(KisUpdateInfoSP info) override
bool callFocusNextPrevChild(bool next) override
To be implemented by the derived canvas.
void showEvent(QShowEvent *event) override
bool wrapAroundViewingMode() const override
void focusOutEvent(QFocusEvent *event) override
void paintEvent(QPaintEvent *ev) override
void setDisplayFilter(QSharedPointer< KisDisplayFilter > displayFilter) override
set the specified display filter on the canvas
void paint(QPaintDevice *paintDevice, const QRect &widgetRect)
#define bounds(x, a, b)
#define dbgKrita
Definition kis_debug.h:49