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
44#include <KoCanvasController.h>
45#include <KisRepaintDebugger.h>
46#include <KisDisplayConfig.h>
47
56
57KisQPainterCanvas::KisQPainterCanvas(KisCanvas2 *canvas, KisCoordinatesConverter *coordinatesConverter, QWidget * parent)
58 : QWidget(parent)
59 , KisCanvasWidgetBase(canvas, coordinatesConverter)
60 , m_d(new Private())
61{
62 setAutoFillBackground(true);
63 setAcceptDrops(true);
64 setFocusPolicy(Qt::StrongFocus);
65 setAttribute(Qt::WA_InputMethodEnabled, true);
66 setAttribute(Qt::WA_StaticContents);
67 setAttribute(Qt::WA_OpaquePaintEvent);
68#ifdef Q_OS_MACOS
69 setAttribute(Qt::WA_AcceptTouchEvents, false);
70#else
71 setAttribute(Qt::WA_AcceptTouchEvents, true);
72#endif
73 connect(KisConfigNotifier::instance(), SIGNAL(configChanged()), SLOT(slotConfigChanged()));
75}
76
81
83{
84 m_d->prescaledProjection = prescaledProjection;
85}
86
87void KisQPainterCanvas::paintEvent(QPaintEvent * ev)
88{
89 KisImageWSP image = canvas()->image();
90 if (image == 0) return;
91
92 setAutoFillBackground(false);
93
94 QPainter gc(this);
95 gc.setClipRegion(ev->region());
96
98
99 gc.save();
100
101 gc.setCompositionMode(QPainter::CompositionMode_Source);
102 gc.fillRect(QRect(QPoint(0, 0), size()), borderColor());
103
104 QTransform checkersTransform;
105 QPointF brushOrigin;
106 QPolygonF polygon;
107
108 converter->getQPainterCheckersInfo(&checkersTransform, &brushOrigin, &polygon, m_d->scrollCheckers);
109 gc.setPen(Qt::NoPen);
110 gc.setBrush(m_d->checkBrush);
111 gc.setBrushOrigin(brushOrigin);
112 gc.setTransform(checkersTransform);
113 gc.drawPolygon(polygon);
114
115 drawImage(gc, ev->rect());
116
117 gc.restore();
118
119 drawDecorations(gc, ev->rect());
120
121 gc.end();
122 m_d->repaintDbg.paint(this, ev);
123}
124
125void KisQPainterCanvas::drawImage(QPainter & gc, const QRect &updateWidgetRect) const
126{
128
129 QTransform imageTransform = converter->viewportToWidgetTransform();
130 gc.setTransform(imageTransform);
131 gc.setRenderHint(QPainter::SmoothPixmapTransform, true);
132
133 QRectF viewportRect = converter->widgetToViewport(updateWidgetRect);
134
135 gc.setCompositionMode(QPainter::CompositionMode_SourceOver);
136 gc.drawImage(viewportRect, m_d->prescaledProjection->prescaledQImage(),
137 viewportRect);
138}
139
140QVariant KisQPainterCanvas::inputMethodQuery(Qt::InputMethodQuery query) const
141{
142 return processInputMethodQuery(query);
143}
144
145void KisQPainterCanvas::inputMethodEvent(QInputMethodEvent *event)
146{
148}
149
150void KisQPainterCanvas::focusInEvent(QFocusEvent *event)
151{
152 processFocusInEvent(event);
153}
154
155void KisQPainterCanvas::focusOutEvent(QFocusEvent *event)
156{
158}
159
161{
162 QWidget::hideEvent(e);
164}
165
167{
168 QWidget::showEvent(e);
170}
171
172void KisQPainterCanvas::channelSelectionChanged(const QBitArray &channelFlags)
173{
174 Q_ASSERT(m_d->prescaledProjection);
176}
177
183
191
193{
194 Q_UNUSED(cs);
195 // FIXME: on color space change the data is refetched multiple
196 // times by different actors!
197 canvas()->startUpdateInPatches(canvas()->image()->bounds());
198}
199
201{
202 Q_UNUSED(value);
203 dbgKrita << "Wrap around viewing mode not implemented in QPainter Canvas.";
204 return;
205}
206
208{
209 return false;
210}
211
213{
214 Q_UNUSED(value);
215 dbgKrita << "Wrap around viewing mode not implemented in QPainter Canvas.";
216 return;
217}
218
223
228
233
234
236{
242 bool isPPUpdateInfo = dynamic_cast<KisPPUpdateInfo*>(info.data());
243 if (isPPUpdateInfo) {
245 return info->dirtyViewportRect();
246 } else {
247 return QRect();
248 }
249}
250
251
253{
254 QSize size(e->size());
255 if (size.width() <= 0) {
256 size.setWidth(1);
257 }
258 if (size.height() <= 0) {
259 size.setHeight(1);
260 }
261
263}
264
273
275{
276 return focusNextPrevChild(next);
277}
float value(const T *src, size_t ch)
WrapAroundAxis
@ WRAPAROUND_BOTH
connect(this, SIGNAL(optionsChanged()), this, SLOT(saveOptions()))
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....
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:45