• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • krita API Reference
  • KDE Home
  • Contact Us
 

libs/ui

  • sources
  • kfour-appscomplete
  • krita
  • libs
  • ui
  • canvas
kis_qpainter_canvas.cpp
Go to the documentation of this file.
1 /*
2  * SPDX-FileCopyrightText: 2006 Boudewijn Rempt <[email protected]>
3  * SPDX-FileCopyrightText: 2009 Lukas Tvrdy <[email protected]>
4  *
5  * SPDX-License-Identifier: GPL-2.0-or-later
6  */
7 
8 #include "kis_qpainter_canvas.h"
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 <QString>
19 #include <QTime>
20 #include <QTimer>
21 #include <QApplication>
22 #include <QMenu>
23 
24 #include <kis_debug.h>
25 #include <kis_config.h>
26 
27 #include <KoColorProfile.h>
28 #include "kis_coordinates_converter.h"
29 #include <KoZoomHandler.h>
30 #include <KoToolManager.h>
31 #include <KoToolProxy.h>
32 
33 #include <kis_image.h>
34 #include <kis_layer.h>
35 
36 #include "KisViewManager.h"
37 #include "kis_canvas2.h"
38 #include "kis_prescaled_projection.h"
39 #include "kis_canvas_resource_provider.h"
40 #include "KisDocument.h"
41 #include "kis_selection_manager.h"
42 #include "kis_selection.h"
43 #include "kis_canvas_updates_compressor.h"
44 #include "kis_config_notifier.h"
45 #include "kis_group_layer.h"
46 #include "canvas/kis_display_color_converter.h"
47 
48 //#define DEBUG_REPAINT
49 #include <KoCanvasController.h>
50 
51 class KisQPainterCanvas::Private
52 {
53 public:
54  KisPrescaledProjectionSP prescaledProjection;
55  QBrush checkBrush;
56  bool scrollCheckers;
57 };
58 
59 KisQPainterCanvas::KisQPainterCanvas(KisCanvas2 *canvas, KisCoordinatesConverter *coordinatesConverter, QWidget * parent)
60  : QWidget(parent)
61  , KisCanvasWidgetBase(canvas, coordinatesConverter)
62  , m_d(new Private())
63 {
64  setAutoFillBackground(true);
65  setAcceptDrops(true);
66  setFocusPolicy(Qt::StrongFocus);
67  setAttribute(Qt::WA_InputMethodEnabled, false);
68  setAttribute(Qt::WA_StaticContents);
69  setAttribute(Qt::WA_OpaquePaintEvent);
70 #ifdef Q_OS_MACOS
71  setAttribute(Qt::WA_AcceptTouchEvents, false);
72 #else
73  setAttribute(Qt::WA_AcceptTouchEvents, true);
74 #endif
75  connect(KisConfigNotifier::instance(), SIGNAL(configChanged()), SLOT(slotConfigChanged()));
76  slotConfigChanged();
77 }
78 
79 KisQPainterCanvas::~KisQPainterCanvas()
80 {
81  delete m_d;
82 }
83 
84 void KisQPainterCanvas::setPrescaledProjection(KisPrescaledProjectionSP prescaledProjection)
85 {
86  m_d->prescaledProjection = prescaledProjection;
87 }
88 
89 void KisQPainterCanvas::paintEvent(QPaintEvent * ev)
90 {
91  KisImageWSP image = canvas()->image();
92  if (image == 0) return;
93 
94  setAutoFillBackground(false);
95 
96  QPainter gc(this);
97  gc.setClipRegion(ev->region());
98 
99  KisCoordinatesConverter *converter = coordinatesConverter();
100 
101  gc.save();
102 
103  gc.setCompositionMode(QPainter::CompositionMode_Source);
104  gc.fillRect(QRect(QPoint(0, 0), size()), borderColor());
105 
106  QTransform checkersTransform;
107  QPointF brushOrigin;
108  QPolygonF polygon;
109 
110  converter->getQPainterCheckersInfo(&checkersTransform, &brushOrigin, &polygon, m_d->scrollCheckers);
111  gc.setPen(Qt::NoPen);
112  gc.setBrush(m_d->checkBrush);
113  gc.setBrushOrigin(brushOrigin);
114  gc.setTransform(checkersTransform);
115  gc.drawPolygon(polygon);
116 
117  drawImage(gc, ev->rect());
118 
119  gc.restore();
120 
121 #ifdef DEBUG_REPAINT
122  QColor color = QColor(random() % 255, random() % 255, random() % 255, 150);
123  gc.fillRect(ev->rect(), color);
124 #endif
125 
126  drawDecorations(gc, ev->rect());
127 }
128 
129 void KisQPainterCanvas::drawImage(QPainter & gc, const QRect &updateWidgetRect) const
130 {
131  KisCoordinatesConverter *converter = coordinatesConverter();
132 
133  QTransform imageTransform = converter->viewportToWidgetTransform();
134  gc.setTransform(imageTransform);
135  gc.setRenderHint(QPainter::SmoothPixmapTransform, true);
136 
137  QRectF viewportRect = converter->widgetToViewport(updateWidgetRect);
138 
139  gc.setCompositionMode(QPainter::CompositionMode_SourceOver);
140  gc.drawImage(viewportRect, m_d->prescaledProjection->prescaledQImage(),
141  viewportRect);
142 }
143 
144 QVariant KisQPainterCanvas::inputMethodQuery(Qt::InputMethodQuery query) const
145 {
146  return processInputMethodQuery(query);
147 }
148 
149 void KisQPainterCanvas::inputMethodEvent(QInputMethodEvent *event)
150 {
151  processInputMethodEvent(event);
152 }
153 
154 void KisQPainterCanvas::channelSelectionChanged(const QBitArray &channelFlags)
155 {
156  Q_ASSERT(m_d->prescaledProjection);
157  m_d->prescaledProjection->setChannelFlags(channelFlags);
158 }
159 
160 void KisQPainterCanvas::setDisplayColorConverter(KisDisplayColorConverter *colorConverter)
161 {
162  Q_ASSERT(m_d->prescaledProjection);
163  m_d->prescaledProjection->setMonitorProfile(colorConverter->monitorProfile(),
164  colorConverter->renderingIntent(),
165  colorConverter->conversionFlags());
166 }
167 
168 void KisQPainterCanvas::setDisplayFilter(QSharedPointer<KisDisplayFilter> displayFilter)
169 {
170  Q_ASSERT(m_d->prescaledProjection);
171  m_d->prescaledProjection->setDisplayFilter(displayFilter);
172 
173  canvas()->startUpdateInPatches(canvas()->image()->bounds());
174 }
175 
176 void KisQPainterCanvas::notifyImageColorSpaceChanged(const KoColorSpace *cs)
177 {
178  Q_UNUSED(cs);
179  // FIXME: on color space change the data is refetched multiple
180  // times by different actors!
181  canvas()->startUpdateInPatches(canvas()->image()->bounds());
182 }
183 
184 void KisQPainterCanvas::setWrapAroundViewingMode(bool value)
185 {
186  Q_UNUSED(value);
187  dbgKrita << "Wrap around viewing mode not implemented in QPainter Canvas.";
188  return;
189 }
190 
191 bool KisQPainterCanvas::wrapAroundViewingMode() const
192 {
193  return false;
194 }
195 
196 void KisQPainterCanvas::finishResizingImage(qint32 w, qint32 h)
197 {
198  m_d->prescaledProjection->slotImageSizeChanged(w, h);
199 }
200 
201 KisUpdateInfoSP KisQPainterCanvas::startUpdateCanvasProjection(const QRect & rc, const QBitArray &channelFlags)
202 {
203  Q_UNUSED(channelFlags);
204 
205  return m_d->prescaledProjection->updateCache(rc);
206 }
207 
208 
209 QRect KisQPainterCanvas::updateCanvasProjection(KisUpdateInfoSP info)
210 {
216  bool isPPUpdateInfo = dynamic_cast<KisPPUpdateInfo*>(info.data());
217  if (isPPUpdateInfo) {
218  m_d->prescaledProjection->recalculateCache(info);
219  return info->dirtyViewportRect();
220  } else {
221  return QRect();
222  }
223 }
224 
225 
226 void KisQPainterCanvas::resizeEvent(QResizeEvent *e)
227 {
228  QSize size(e->size());
229  if (size.width() <= 0) {
230  size.setWidth(1);
231  }
232  if (size.height() <= 0) {
233  size.setHeight(1);
234  }
235 
236  coordinatesConverter()->setCanvasWidgetSize(size);
237  m_d->prescaledProjection->notifyCanvasSizeChanged(size);
238 }
239 
240 void KisQPainterCanvas::slotConfigChanged()
241 {
242  KisConfig cfg(true);
243 
244  m_d->checkBrush = QBrush(createCheckersImage());
245  m_d->scrollCheckers = cfg.scrollCheckers();
246  notifyConfigChanged();
247 }
248 
249 bool KisQPainterCanvas::callFocusNextPrevChild(bool next)
250 {
251  return focusNextPrevChild(next);
252 }
QPaintEvent::region
const QRegion & region() const
KisDisplayColorConverter::conversionFlags
static KoColorConversionTransformation::ConversionFlags conversionFlags()
Definition: kis_display_color_converter.cpp:403
KisCoordinatesConverter::widgetToViewport
_Private::Traits< T >::Result widgetToViewport(const T &obj) const
Definition: kis_coordinates_converter.h:85
QColor
KisDisplayColorConverter::renderingIntent
static KoColorConversionTransformation::Intent renderingIntent()
Definition: kis_display_color_converter.cpp:396
kis_prescaled_projection.h
kis_config.h
QPainter::setPen
void setPen(const QColor &color)
kis_canvas_updates_compressor.h
KisQPainterCanvas::inputMethodEvent
void inputMethodEvent(QInputMethodEvent *event) override
Definition: kis_qpainter_canvas.cpp:149
QWidget::setFocusPolicy
void setFocusPolicy(Qt::FocusPolicy policy)
QRect
KisQPainterCanvas::paintEvent
void paintEvent(QPaintEvent *ev) override
Definition: kis_qpainter_canvas.cpp:89
KisQPainterCanvas::setWrapAroundViewingMode
void setWrapAroundViewingMode(bool value) override
Definition: kis_qpainter_canvas.cpp:184
KisQPainterCanvas::callFocusNextPrevChild
bool callFocusNextPrevChild(bool next) override
To be implemented by the derived canvas.
Definition: kis_qpainter_canvas.cpp:249
QWidget::event
virtual bool event(QEvent *event)
QWidget
KisCanvasWidgetBase::notifyConfigChanged
void notifyConfigChanged()
Definition: kis_canvas_widget_base.cpp:185
QSize
QPainter::setBrushOrigin
void setBrushOrigin(int x, int y)
QSize::width
int width() const
QWidget::setAttribute
void setAttribute(Qt::WidgetAttribute attribute, bool on)
QSharedPointer< KisDisplayFilter >
KisQPainterCanvas::notifyImageColorSpaceChanged
void notifyImageColorSpaceChanged(const KoColorSpace *cs) override
set/update the color space of the attached image
Definition: kis_qpainter_canvas.cpp:176
QBitArray
kis_display_color_converter.h
QPainter
QPointF
QResizeEvent::size
const QSize & size() const
QPainter::fillRect
void fillRect(const QRectF &rectangle, const QBrush &brush)
QObject::connect
bool connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
QPainter::drawImage
void drawImage(const QRectF &target, const QImage &image, const QRectF &source, QFlags< Qt::ImageConversionFlag > flags)
QSize::setWidth
void setWidth(int width)
QPainter::drawPolygon
void drawPolygon(const QPointF *points, int pointCount, Qt::FillRule fillRule)
kis_qpainter_canvas.h
KisConfig
Definition: kis_config.h:28
KisCanvasWidgetBase::processInputMethodQuery
QVariant processInputMethodQuery(Qt::InputMethodQuery query) const
Event handlers to be called by derived canvas event handlers.
Definition: kis_canvas_widget_base.cpp:222
QPainter::setTransform
void setTransform(const QTransform &transform, bool combine)
KisQPainterCanvas::wrapAroundViewingMode
bool wrapAroundViewingMode() const override
Definition: kis_qpainter_canvas.cpp:191
KisQPainterCanvas::~KisQPainterCanvas
~KisQPainterCanvas() override
Definition: kis_qpainter_canvas.cpp:79
QSize::height
int height() const
KisQPainterCanvas::channelSelectionChanged
void channelSelectionChanged(const QBitArray &channelFlags) override
Definition: kis_qpainter_canvas.cpp:154
KisQPainterCanvas::updateCanvasProjection
QRect updateCanvasProjection(KisUpdateInfoSP info) override
Definition: kis_qpainter_canvas.cpp:209
QWidget::focusNextPrevChild
virtual bool focusNextPrevChild(bool next)
KisQPainterCanvas::setDisplayFilter
void setDisplayFilter(QSharedPointer< KisDisplayFilter > displayFilter) override
set the specified display filter on the canvas
Definition: kis_qpainter_canvas.cpp:168
KisCanvasWidgetBase::processInputMethodEvent
void processInputMethodEvent(QInputMethodEvent *event)
Definition: kis_canvas_widget_base.cpp:231
KisQPainterCanvas::startUpdateCanvasProjection
KisUpdateInfoSP startUpdateCanvasProjection(const QRect &rc, const QBitArray &channelFlags) override
Definition: kis_qpainter_canvas.cpp:201
KisCoordinatesConverter::viewportToWidgetTransform
QTransform viewportToWidgetTransform() const
Definition: kis_coordinates_converter.cpp:310
KisCanvasWidgetBase::canvas
KisCanvas2 * canvas() const
Definition: kis_canvas_widget_base.cpp:196
QWidget::setAcceptDrops
void setAcceptDrops(bool on)
KisQPainterCanvas::drawImage
virtual void drawImage(QPainter &gc, const QRect &updateWidgetRect) const
Definition: kis_qpainter_canvas.cpp:129
bounds
#define bounds(x, a, b)
Definition: kis_curve_widget.cpp:48
KisViewManager.h
QPaintEvent::rect
const QRect & rect() const
QBrush
KisCanvasWidgetBase::createCheckersImage
static QImage createCheckersImage(qint32 checkSize=-1)
Returns one check of the background checkerboard pattern.
Definition: kis_canvas_widget_base.cpp:165
QPainter::setBrush
void setBrush(const QBrush &brush)
QTransform
KisCanvasWidgetBase::drawDecorations
void drawDecorations(QPainter &gc, const QRect &updateWidgetRect) const override
Draw the specified decorations on the view.
Definition: kis_canvas_widget_base.cpp:76
KisCanvasWidgetBase::coordinatesConverter
KisCoordinatesConverter * coordinatesConverter() const
Definition: kis_canvas_widget_base.cpp:201
QPainter::setCompositionMode
void setCompositionMode(CompositionMode mode)
KisSharedPtr< KisPrescaledProjection >
KisDisplayColorConverter::monitorProfile
const KoColorProfile * monitorProfile() const
Definition: kis_display_color_converter.cpp:421
KisQPainterCanvas::setPrescaledProjection
void setPrescaledProjection(KisPrescaledProjectionSP prescaledProjection)
Definition: kis_qpainter_canvas.cpp:84
KisQPainterCanvas::inputMethodQuery
QVariant inputMethodQuery(Qt::InputMethodQuery query) const override
Definition: kis_qpainter_canvas.cpp:144
QPolygonF
QResizeEvent
QPaintEvent
QRectF
QPainter::restore
void restore()
QWidget::setAutoFillBackground
void setAutoFillBackground(bool enabled)
QPainter::setClipRegion
void setClipRegion(const QRegion &region, Qt::ClipOperation operation)
KisDisplayColorConverter
Special helper class that provides primitives for converting colors when displaying.
Definition: kis_display_color_converter.h:35
kis_canvas_resource_provider.h
QPainter::save
void save()
KisDocument.h
KisCoordinatesConverter
Definition: kis_coordinates_converter.h:44
KisCanvasWidgetBase::borderColor
QColor borderColor() const
Returns the color of the border, i.e.
Definition: kis_canvas_widget_base.cpp:191
QVariant
QInputMethodEvent
QPainter::setRenderHint
void setRenderHint(RenderHint hint, bool on)
KisQPainterCanvas::setDisplayColorConverter
void setDisplayColorConverter(KisDisplayColorConverter *colorConverter) override
Definition: kis_qpainter_canvas.cpp:160
KisCanvasWidgetBase
Definition: kis_canvas_widget_base.h:26
KisQPainterCanvas::finishResizingImage
void finishResizingImage(qint32 w, qint32 h) override
Definition: kis_qpainter_canvas.cpp:196
KisCoordinatesConverter::getQPainterCheckersInfo
void getQPainterCheckersInfo(QTransform *transform, QPointF *brushOrigin, QPolygonF *poligon, const bool scrollCheckers) const
Definition: kis_coordinates_converter.cpp:318
QWidget::size
QSize size() const
kis_selection_manager.h
KisCoordinatesConverter::setCanvasWidgetSize
void setCanvasWidgetSize(QSizeF size)
Definition: kis_coordinates_converter.cpp:147
kis_canvas2.h
QSize::setHeight
void setHeight(int height)
KisQPainterCanvas::KisQPainterCanvas
KisQPainterCanvas(KisCanvas2 *canvas, KisCoordinatesConverter *coordinatesConverter, QWidget *parent)
Definition: kis_qpainter_canvas.cpp:59
QPoint
kis_coordinates_converter.h
KisQPainterCanvas::resizeEvent
void resizeEvent(QResizeEvent *e) override
Definition: kis_qpainter_canvas.cpp:226
This file is part of the KDE documentation.
Documentation copyright © 1996-2021 The KDE developers.
Generated on Tue Mar 2 2021 06:25:55 by doxygen 1.8.16 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

libs/ui

Skip menu "libs/ui"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members

krita API Reference

Skip menu "krita API Reference"
  • libs
  •   KritaBasicFlakes
  •   brush
  •   KritaUndo2
  •   KritaFlake
  •   image
  •   KritaPlugin
  •   Krita
  •   KritaPigment
  •   KritaResources
  •   KritaStore
  •   ui
  •   KritaWidgets
  •   KritaWidgetUtils
  • plugins
  •   Assitants
  •   Extensions
  •   Filters
  •   Generators
  •   Formats
  •           src
  •   PaintOps
  •     libpaintop

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal