Krita Source Code Documentation
Loading...
Searching...
No Matches
KisShapeLayerCanvas Class Reference

#include <kis_shape_layer_canvas.h>

+ Inheritance diagram for KisShapeLayerCanvas:

Public Member Functions

void forceRepaint () override
 
void forceRepaintWithHiddenAreas () override
 
bool hasPendingUpdates () const override
 
 KisShapeLayerCanvas (const KisShapeLayerCanvas &rhs, KisShapeLayer *parent)
 
 KisShapeLayerCanvas (const KoColorSpace *cs, KisDefaultBoundsBaseSP defaultBounds, KisShapeLayer *parent)
 
KisPaintDeviceSP projection () const override
 
void rerenderAfterBeingInvisible () override
 
void resetCache (const KoColorSpace *colorSpace=0) override
 
void setImage (KisImageWSP image) override
 
void setProjection (KisPaintDeviceSP projection)
 This canvas won't render onto a widget, but a projection.
 
void updateCanvas (const QRectF &rc) override
 
void updateCanvas (const QVector< QRectF > &region)
 
 ~KisShapeLayerCanvas () override
 
- Public Member Functions inherited from KisShapeLayerCanvasBase
void addCommand (KUndo2Command *command) override
 
const QWidget * canvasWidget () const override
 
QWidget * canvasWidget () override
 
void gridSize (QPointF *offset, QSizeF *spacing) const override
 
bool hasChangedWhileBeingInvisible ()
 
 KisShapeLayerCanvasBase (const KisShapeLayerCanvasBase &rhs, KisShapeLayer *parent)
 
 KisShapeLayerCanvasBase (KisShapeLayer *parent)
 
void prepareForDestroying ()
 
KoSelectedShapesProxyselectedShapesProxy () const override
 selectedShapesProxy() is a special interface for keeping a persistent connections to selectionChanged() and selectionContentChanged() signals. While shapeManager() can change throughout the life time of the canvas, selectedShapesProxy() is guaranteed to stay the same.
 
void setCursor (const QCursor &) override
 
KoShapeManagershapeManager () const override
 
bool snapToGrid () const override
 
KoToolProxytoolProxy () const override
 
KoUnit unit () const override
 
const KoViewConverterviewConverter () const override
 
KoViewConverterviewConverter () override
 
- Public Member Functions inherited from KoCanvasBase
KoCanvasControllercanvasController () const
 
virtual bool canvasIsOpenGL () const
 
virtual void clipToDocument (const KoShape *shape, QPointF &move) const
 
virtual void disconnectCanvasObserver (QObject *object)
 
virtual QPoint documentOrigin () const
 
 KoCanvasBase (KoShapeControllerBase *shapeController, KoCanvasResourceProvider *sharedResourceManager=0)
 
 Private ()
 
KoCanvasResourceProviderresourceManager () const
 
void setCanvasController (KoCanvasController *controller)
 called by KoCanvasController to set the controller that handles this canvas.
 
KoShapeControllershapeController () const
 
KoSnapGuidesnapGuide () const
 
virtual QPointF viewToDocument (const QPointF &viewPoint) const
 
 ~KoCanvasBase () override
 
 ~Private ()
 

Private Member Functions

void repaint ()
 
void slotImageSizeChanged ()
 
void slotStartAsyncRepaint ()
 

Private Attributes

KisThreadSafeSignalCompressor m_asyncUpdateSignalCompressor
 
QRect m_cachedImageRect
 
QRegion m_dirtyRegion
 
QMutex m_dirtyRegionMutex
 
bool m_forceUpdateHiddenAreasOnly = false
 
volatile bool m_hasUpdateInCompressor = false
 
bool m_hasUpdateOnSetImage = false
 
KisImageWSP m_image
 
KisSignalAutoConnectionsStore m_imageConnections
 
KoShapeManager::PaintJobsOrder m_paintJobsOrder
 
KisShapeLayerm_parentLayer {0}
 
KisPaintDeviceSP m_projection
 
KisSafeBlockingQueueConnectionProxy< voidm_safeForcedConnection
 

Friends

class KisRepaintShapeLayerLayerJob
 

Additional Inherited Members

- Public Attributes inherited from KoCanvasBase
KoCanvasControllercontroller
 
bool isResourceManagerShared
 
QPointer< KoCanvasResourceProviderresourceManager
 
QPointer< KoShapeControllershapeController
 
KoSnapGuidesnapGuide
 
- Protected Attributes inherited from KisShapeLayerCanvasBase
bool m_hasChangedWhileBeingInvisible {false}
 
bool m_isDestroying {false}
 
QScopedPointer< KoSelectedShapesProxym_selectedShapesProxy
 
QScopedPointer< KoShapeManagerm_shapeManager
 
KisImageViewConverter m_viewConverter
 

Detailed Description

KisShapeLayerCanvas is a special canvas implementation that Krita uses for non-krita shapes to request updates on.

Do NOT give this canvas to tools or to the KoCanvasController, it's not made for that.

Definition at line 82 of file kis_shape_layer_canvas.h.

Constructor & Destructor Documentation

◆ KisShapeLayerCanvas() [1/2]

KisShapeLayerCanvas::KisShapeLayerCanvas ( const KoColorSpace * cs,
KisDefaultBoundsBaseSP defaultBounds,
KisShapeLayer * parent )

The layer should also add itself to its own shape manager, so that the canvas would track its changes/transformations

Definition at line 136 of file kis_shape_layer_canvas.cpp.

138 , m_projection(new KisPaintDevice(parent, cs, defaultBounds))
139 , m_parentLayer(parent)
142{
148 m_shapeManager->selection()->setActiveLayer(parent);
149
150 connect(&m_asyncUpdateSignalCompressor, SIGNAL(timeout()), SLOT(slotStartAsyncRepaint()));
151}
connect(this, SIGNAL(optionsChanged()), this, SLOT(saveOptions()))
KisShapeLayerCanvasBase(KisShapeLayer *parent)
QScopedPointer< KoShapeManager > m_shapeManager
KisSafeBlockingQueueConnectionProxy< void > m_safeForcedConnection
KisThreadSafeSignalCompressor m_asyncUpdateSignalCompressor
@ AddWithoutRepaint
Avoids each shapes 'update()' to be called for faster addition when its possible.

References KoShapeManager::AddWithoutRepaint, connect(), m_asyncUpdateSignalCompressor, KisShapeLayerCanvasBase::m_shapeManager, and slotStartAsyncRepaint().

◆ KisShapeLayerCanvas() [2/2]

KisShapeLayerCanvas::KisShapeLayerCanvas ( const KisShapeLayerCanvas & rhs,
KisShapeLayer * parent )

The layer should also add itself to its own shape manager, so that the canvas would track its changes/transformations

Definition at line 153 of file kis_shape_layer_canvas.cpp.

154 : KisShapeLayerCanvasBase(rhs, parent)
156 , m_parentLayer(parent)
159{
165 m_shapeManager->selection()->setActiveLayer(parent);
166
167 connect(&m_asyncUpdateSignalCompressor, SIGNAL(timeout()), SLOT(slotStartAsyncRepaint()));
169}
void setParentNode(KisNodeWSP parent)

References KoShapeManager::AddWithoutRepaint, connect(), m_asyncUpdateSignalCompressor, m_projection, KisShapeLayerCanvasBase::m_shapeManager, KisPaintDevice::setParentNode(), and slotStartAsyncRepaint().

◆ ~KisShapeLayerCanvas()

KisShapeLayerCanvas::~KisShapeLayerCanvas ( )
override

Definition at line 171 of file kis_shape_layer_canvas.cpp.

172{
174}

References m_parentLayer, and KisShapeLayerCanvasBase::m_shapeManager.

Member Function Documentation

◆ forceRepaint()

void KisShapeLayerCanvas::forceRepaint ( )
overridevirtual

WARNING! Although forceRepaint() may be called from different threads, it is not entirely safe. If the user plays with shapes at the same time (vector tools are not ported to strokes yet), the shapes my be accessed from two different places at the same time, which will cause a crash.

The only real solution to this is to port vector tools to strokes framework.

Implements KisShapeLayerCanvasBase.

Definition at line 498 of file kis_shape_layer_canvas.cpp.

References hasPendingUpdates(), m_asyncUpdateSignalCompressor, m_safeForcedConnection, KisSafeBlockingQueueConnectionProxy< void >::start(), and KisThreadSafeSignalCompressor::stop().

◆ forceRepaintWithHiddenAreas()

◆ hasPendingUpdates()

bool KisShapeLayerCanvas::hasPendingUpdates ( ) const
overridevirtual

Implements KisShapeLayerCanvasBase.

Definition at line 515 of file kis_shape_layer_canvas.cpp.

516{
518}
volatile bool m_hasUpdateInCompressor

References m_hasUpdateInCompressor.

◆ projection()

KisPaintDeviceSP KisShapeLayerCanvas::projection ( ) const
overridevirtual

Implements KisShapeLayerCanvasBase.

Definition at line 181 of file kis_shape_layer_canvas.cpp.

182{
183 return m_projection;
184}

References m_projection.

◆ repaint()

void KisShapeLayerCanvas::repaint ( )
private

Sometimes two update jobs might not override and the second one will arrive right after the first one

Definition at line 402 of file kis_shape_layer_canvas.cpp.

403{
404
405 KoShapeManager::PaintJobsOrder paintJobsOrder;
406
407 {
408 QMutexLocker locker(&m_dirtyRegionMutex);
409 std::swap(paintJobsOrder, m_paintJobsOrder);
410 }
411
416 if (paintJobsOrder.isEmpty()) return;
417
418 const qint32 MASK_IMAGE_WIDTH = 256;
419 const qint32 MASK_IMAGE_HEIGHT = 256;
420
421 QImage image(MASK_IMAGE_WIDTH, MASK_IMAGE_HEIGHT, QImage::Format_ARGB32);
422 QPainter tempPainter(&image);
423
425 tempPainter.setRenderHint(QPainter::Antialiasing);
426 tempPainter.setRenderHint(QPainter::TextAntialiasing);
427 }
428
429 quint8 * dstData = new quint8[MASK_IMAGE_WIDTH * MASK_IMAGE_HEIGHT * m_projection->pixelSize()];
430
431 QRect repaintRect = paintJobsOrder.uncroppedViewUpdateRect;
432 m_projection->clear(repaintRect);
433
434 Q_FOREACH (const KoShapeManager::PaintJob &job, paintJobsOrder.jobs) {
435 if (job.isEmpty()) {
437 continue;
438 }
439
440 KIS_SAFE_ASSERT_RECOVER(job.viewUpdateRect.width() <= MASK_IMAGE_WIDTH &&
441 job.viewUpdateRect.height() <= MASK_IMAGE_HEIGHT) {
442 continue;
443 }
444
445 image.fill(0);
446
447 tempPainter.setTransform(QTransform());
448 tempPainter.setClipRect(QRect(0,0,job.viewUpdateRect.width(), job.viewUpdateRect.height()));
449 tempPainter.setTransform(viewConverter()->documentToView() *
450 QTransform::fromTranslate(-job.viewUpdateRect.x(), -job.viewUpdateRect.y()));
451
452 m_shapeManager->paintJob(tempPainter, job);
453
454 if (image.size() != job.viewUpdateRect.size()) {
455 const quint8 *imagePtr = image.constBits();
456 const int imageRowStride = 4 * image.width();
457
458 for (int y = 0; y < job.viewUpdateRect.height(); y++) {
459
461 ->convertPixelsTo(imagePtr, dstData, m_projection->colorSpace(),
462 job.viewUpdateRect.width(),
465
466 m_projection->writeBytes(dstData,
467 job.viewUpdateRect.x(),
468 job.viewUpdateRect.y() + y,
469 job.viewUpdateRect.width(),
470 1);
471
472 imagePtr += imageRowStride;
473 }
474 } else {
476 ->convertPixelsTo(image.constBits(), dstData, m_projection->colorSpace(),
477 MASK_IMAGE_WIDTH * MASK_IMAGE_HEIGHT,
480
481 m_projection->writeBytes(dstData,
482 job.viewUpdateRect.x(),
483 job.viewUpdateRect.y(),
484 MASK_IMAGE_WIDTH,
485 MASK_IMAGE_HEIGHT);
486
487 }
488 repaintRect |= job.viewUpdateRect;
489 }
490
491 delete[] dstData;
493 m_parentLayer->setDirty(repaintRect);
494
496}
quint32 pixelSize() const
virtual void clear()
const KoColorSpace * colorSpace() const
void writeBytes(const quint8 *data, qint32 x, qint32 y, qint32 w, qint32 h)
const KoViewConverter * viewConverter() const override
KoShapeManager::PaintJobsOrder m_paintJobsOrder
bool antialiased() const
bool visible(bool recursive=false) const override
virtual bool convertPixelsTo(const quint8 *src, quint8 *dst, const KoColorSpace *dstColorSpace, quint32 numPixels, KoColorConversionTransformation::Intent renderingIntent, KoColorConversionTransformation::ConversionFlags conversionFlags) const
#define KIS_SAFE_ASSERT_RECOVER(cond)
Definition kis_assert.h:126
virtual void setDirty()
Definition kis_node.cpp:577
static KoColorSpaceRegistry * instance()
const KoColorSpace * rgb8(const QString &profileName=QString())

References KisShapeLayer::antialiased(), KisPaintDevice::clear(), KisPaintDevice::colorSpace(), KoColorSpace::convertPixelsTo(), KoColorSpaceRegistry::instance(), KoColorConversionTransformation::internalConversionFlags(), KoColorConversionTransformation::internalRenderingIntent(), KoShapeManager::PaintJob::isEmpty(), KoShapeManager::PaintJobsOrder::isEmpty(), KoShapeManager::PaintJobsOrder::jobs, KIS_SAFE_ASSERT_RECOVER, m_dirtyRegionMutex, KisShapeLayerCanvasBase::m_hasChangedWhileBeingInvisible, m_paintJobsOrder, m_parentLayer, m_projection, KisShapeLayerCanvasBase::m_shapeManager, KisPaintDevice::pixelSize(), KisPaintDevice::purgeDefaultPixels(), KoColorSpaceRegistry::rgb8(), KisNode::setDirty(), KoShapeManager::PaintJobsOrder::uncroppedViewUpdateRect, KisShapeLayerCanvasBase::viewConverter(), KoShapeManager::PaintJob::viewUpdateRect, KisShapeLayer::visible(), and KisPaintDevice::writeBytes().

◆ rerenderAfterBeingInvisible()

void KisShapeLayerCanvas::rerenderAfterBeingInvisible ( )
overridevirtual

◆ resetCache()

void KisShapeLayerCanvas::resetCache ( const KoColorSpace * colorSpace = 0)
overridevirtual

Implements KisShapeLayerCanvasBase.

Definition at line 535 of file kis_shape_layer_canvas.cpp.

536{
537 Q_UNUSED(colorSpace);
539
540 QList<KoShape*> shapes = m_shapeManager->shapes();
541 Q_FOREACH (const KoShape* shape, shapes) {
542 shape->update();
543 }
544}
virtual void update() const
Definition KoShape.cpp:605

References KisPaintDevice::clear(), m_projection, KisShapeLayerCanvasBase::m_shapeManager, and KoShape::update().

◆ setImage()

void KisShapeLayerCanvas::setImage ( KisImageWSP image)
overridevirtual

Reimplemented from KisShapeLayerCanvasBase.

Definition at line 186 of file kis_shape_layer_canvas.cpp.

187{
189
191 m_image = image;
192
193 if (image) {
194 m_imageConnections.addUniqueConnection(m_image, SIGNAL(sigSizeChanged(QPointF,QPointF)), this, SLOT(slotImageSizeChanged()));
197 }
199 if (image && m_hasUpdateOnSetImage) {
200 m_hasUpdateOnSetImage = false;
202 }
203}
const KoColorSpace * colorSpace() const
QRect bounds() const override
void setDefaultBounds(KisDefaultBoundsBaseSP bounds)
void convertTo(const KoColorSpace *dstColorSpace, KoColorConversionTransformation::Intent renderingIntent=KoColorConversionTransformation::internalRenderingIntent(), KoColorConversionTransformation::ConversionFlags conversionFlags=KoColorConversionTransformation::internalConversionFlags(), KUndo2Command *parentCommand=nullptr, KoUpdater *progressUpdater=nullptr)
virtual void setImage(KisImageWSP image)
KisSignalAutoConnectionsStore m_imageConnections
void updateCanvas(const QRectF &rc) override
void addUniqueConnection(Sender sender, Signal signal, Receiver receiver, Method method)

References KisSignalAutoConnectionsStore::addUniqueConnection(), KisImage::bounds(), KisSignalAutoConnectionsStore::clear(), KisImage::colorSpace(), KisPaintDevice::convertTo(), m_cachedImageRect, m_hasUpdateOnSetImage, m_image, m_imageConnections, m_projection, KisPaintDevice::setDefaultBounds(), KisShapeLayerCanvasBase::setImage(), slotImageSizeChanged(), and updateCanvas().

◆ setProjection()

void KisShapeLayerCanvas::setProjection ( KisPaintDeviceSP projection)

This canvas won't render onto a widget, but a projection.

Definition at line 176 of file kis_shape_layer_canvas.cpp.

177{
179}
KisPaintDeviceSP projection() const override

References m_projection, and projection().

◆ slotImageSizeChanged()

void KisShapeLayerCanvas::slotImageSizeChanged ( )
private

Definition at line 384 of file kis_shape_layer_canvas.cpp.

385{
386 QRegion dirtyCacheRegion;
387 dirtyCacheRegion += m_image->bounds();
388 dirtyCacheRegion += m_cachedImageRect;
389 dirtyCacheRegion -= m_image->bounds() & m_cachedImageRect;
390
391 QVector<QRectF> dirtyRects;
392 auto rc = dirtyCacheRegion.begin();
393 while (rc != dirtyCacheRegion.end()) {
394 dirtyRects.append(viewConverter()->viewToDocument(*rc));
395 rc++;
396 }
397 updateCanvas(dirtyRects);
398
400}
virtual QPointF viewToDocument(const QPointF &viewPoint) const

References KisImage::bounds(), m_cachedImageRect, m_image, updateCanvas(), KisShapeLayerCanvasBase::viewConverter(), and KoCanvasBase::viewToDocument().

◆ slotStartAsyncRepaint()

void KisShapeLayerCanvas::slotStartAsyncRepaint ( )
private

Don't try to start a regeneration stroke while image is locked. It may happen on loading, when all necessary conversions are not yet finished.

Since we are going to override the previous jobs, we should fetch all the area covered by it. Otherwise we'll get dirty leftovers of the layer on the projection

Vector shapes are not thread-safe against concurrent read-writes, so we need to utilize rather complicated policy on accessing them:

1) All shape writes happen in GUI thread (right in the tools) 2) No concurrent reads from the shapes may happen in other threads while the user is modifying them.

That is why our shape rendering code is split into two parts:

1) First we just fetch a shallow copy of the shapes of the layer (it takes about 1ms for complicated vector layers) and pack them into KoShapeManager::PaintJobsList jobs. It happens here, in slotStartAsyncRepaint(), which runs in the GUI thread. It guarantees that no one is accessing the shapes during the copy operation.

2) The rendering itself happens in the worker thread in repaint(). But repaint() doesn't access original shapes anymore. It accesses only they shallow copies, which means that there is no concurrent access to anything (*).

(*) "no concurrent access to anything" is a rather fragile term :) There will still be concurrent access to it, on detaching... But(!), when detaching, the original data is kept unchanged, so "it should be safe enough"(c). Especially if we guarantee that rendering thread may not cause a detach (?), and the detach can happen only from a single GUI thread.

Definition at line 275 of file kis_shape_layer_canvas.cpp.

276{
277 KisImageSP image = m_image;
278 if (!image || !m_parentLayer->image()) {
279 return;
280 }
281
287 if (image->locked()) {
289 return;
290 }
291
292 QRect repaintRect;
293 QRect uncroppedRepaintRect;
294 bool forceUpdateHiddenAreasOnly = false;
295 const qint32 MASK_IMAGE_WIDTH = 256;
296 const qint32 MASK_IMAGE_HEIGHT = 256;
297 {
298 QMutexLocker locker(&m_dirtyRegionMutex);
299
300 repaintRect = m_dirtyRegion.boundingRect();
301 forceUpdateHiddenAreasOnly = m_forceUpdateHiddenAreasOnly;
302
306 Q_FOREACH (const KoShapeManager::PaintJob &job, m_paintJobsOrder.jobs) {
307 repaintRect |= viewConverter()->documentToView().mapRect(job.docUpdateRect).toAlignedRect();
308 }
310
311 m_dirtyRegion = QRegion();
313 }
314
315 if (!forceUpdateHiddenAreasOnly) {
316 if (repaintRect.isEmpty()) {
317 return;
318 }
319
320 // Crop the update rect by the image bounds. We keep the cache consistent
321 // by tracking the size of the image in slotImageSizeChanged()
322 uncroppedRepaintRect = repaintRect;
323 repaintRect = repaintRect.intersected(image->bounds());
324 } else {
325 const QRectF shapesBounds = KoShape::boundingRect(m_shapeManager->shapes());
326 repaintRect |= kisGrowRect(viewConverter()->documentToView(shapesBounds).toAlignedRect(), 2);
327 uncroppedRepaintRect = repaintRect;
328 }
329
358 const QVector<QRect> updateRects =
360 QSize(MASK_IMAGE_WIDTH, MASK_IMAGE_HEIGHT));
361
363 Q_FOREACH (const QRect &viewUpdateRect, updateRects) {
364 jobsOrder.jobs << KoShapeManager::PaintJob(viewConverter()->viewToDocument().mapRect(QRectF(viewUpdateRect)),
365 viewUpdateRect);
366 }
367 jobsOrder.uncroppedViewUpdateRect = uncroppedRepaintRect;
368
369 m_shapeManager->preparePaintJobs(jobsOrder, m_parentLayer);
370
371 {
372 QMutexLocker locker(&m_dirtyRegionMutex);
373
374 // check if it is still empty! It should be true, because GUI thread is
375 // the only actor that can add stuff to it.
377 m_paintJobsOrder = jobsOrder;
378 }
379
382}
bool locked() const
Definition kis_image.cc:751
void addSpontaneousJob(KisSpontaneousJob *spontaneousJob)
friend class KisRepaintShapeLayerLayerJob
virtual QRectF boundingRect() const
Get the bounding box of the shape.
Definition KoShape.cpp:335
virtual QPointF documentToView(const QPointF &documentPoint) const
#define KIS_SAFE_ASSERT_RECOVER_NOOP(cond)
Definition kis_assert.h:130
T kisGrowRect(const T &rect, U offset)
Definition kis_global.h:186
QVector< QRect > splitRectIntoPatchesTight(const QRect &rc, const QSize &patchSize)

References KisImage::addSpontaneousJob(), KoShape::boundingRect(), KisImage::bounds(), KoShapeManager::PaintJobsOrder::clear(), KoViewConverter::documentToView(), KoShapeManager::PaintJob::docUpdateRect, KisBaseNode::image, KoShapeManager::PaintJobsOrder::isEmpty(), KoShapeManager::PaintJobsOrder::jobs, KIS_SAFE_ASSERT_RECOVER_NOOP, kisGrowRect(), KisRepaintShapeLayerLayerJob, KisImage::locked(), m_asyncUpdateSignalCompressor, m_dirtyRegion, m_dirtyRegionMutex, m_forceUpdateHiddenAreasOnly, m_hasUpdateInCompressor, m_image, m_paintJobsOrder, m_parentLayer, KisShapeLayerCanvasBase::m_shapeManager, KritaUtils::splitRectIntoPatchesTight(), KisThreadSafeSignalCompressor::start(), KoShapeManager::PaintJobsOrder::uncroppedViewUpdateRect, KisShapeLayerCanvasBase::viewConverter(), and KoCanvasBase::viewToDocument().

◆ updateCanvas() [1/2]

void KisShapeLayerCanvas::updateCanvas ( const QRectF & rc)
overridevirtual

Tell the canvas to repaint the specified rectangle. The coordinates are document coordinates, not view coordinates.

Implements KoCanvasBase.

Definition at line 270 of file kis_shape_layer_canvas.cpp.

271{
273}

References updateCanvas().

◆ updateCanvas() [2/2]

void KisShapeLayerCanvas::updateCanvas ( const QVector< QRectF > & region)

Definition at line 246 of file kis_shape_layer_canvas.cpp.

247{
248 if (!m_image){
250 return;
251 }
253 return;
254 }
255
256 {
257 QMutexLocker locker(&m_dirtyRegionMutex);
258 Q_FOREACH (const QRectF &rc, region) {
259 // grow for antialiasing
260 const QRect imageRect = kisGrowRect(viewConverter()->documentToView(rc).toAlignedRect(), 2);
261 m_dirtyRegion += imageRect;
262 }
263 }
264
267}

References KisBaseNode::image, kisGrowRect(), m_asyncUpdateSignalCompressor, m_dirtyRegion, m_dirtyRegionMutex, m_hasUpdateInCompressor, m_hasUpdateOnSetImage, m_image, KisShapeLayerCanvasBase::m_isDestroying, m_parentLayer, KisThreadSafeSignalCompressor::start(), and KisShapeLayerCanvasBase::viewConverter().

Friends And Related Symbol Documentation

◆ KisRepaintShapeLayerLayerJob

friend class KisRepaintShapeLayerLayerJob
friend

Definition at line 108 of file kis_shape_layer_canvas.h.

Member Data Documentation

◆ m_asyncUpdateSignalCompressor

KisThreadSafeSignalCompressor KisShapeLayerCanvas::m_asyncUpdateSignalCompressor
private

Definition at line 117 of file kis_shape_layer_canvas.h.

◆ m_cachedImageRect

QRect KisShapeLayerCanvas::m_cachedImageRect
private

Definition at line 127 of file kis_shape_layer_canvas.h.

◆ m_dirtyRegion

QRegion KisShapeLayerCanvas::m_dirtyRegion
private

Definition at line 123 of file kis_shape_layer_canvas.h.

◆ m_dirtyRegionMutex

QMutex KisShapeLayerCanvas::m_dirtyRegionMutex
private

Definition at line 124 of file kis_shape_layer_canvas.h.

◆ m_forceUpdateHiddenAreasOnly

bool KisShapeLayerCanvas::m_forceUpdateHiddenAreasOnly = false
private

Definition at line 122 of file kis_shape_layer_canvas.h.

◆ m_hasUpdateInCompressor

volatile bool KisShapeLayerCanvas::m_hasUpdateInCompressor = false
private

Definition at line 118 of file kis_shape_layer_canvas.h.

◆ m_hasUpdateOnSetImage

bool KisShapeLayerCanvas::m_hasUpdateOnSetImage = false
private

Definition at line 119 of file kis_shape_layer_canvas.h.

◆ m_image

KisImageWSP KisShapeLayerCanvas::m_image
private

Definition at line 129 of file kis_shape_layer_canvas.h.

◆ m_imageConnections

KisSignalAutoConnectionsStore KisShapeLayerCanvas::m_imageConnections
private

Definition at line 130 of file kis_shape_layer_canvas.h.

◆ m_paintJobsOrder

KoShapeManager::PaintJobsOrder KisShapeLayerCanvas::m_paintJobsOrder
private

Definition at line 125 of file kis_shape_layer_canvas.h.

◆ m_parentLayer

KisShapeLayer* KisShapeLayerCanvas::m_parentLayer {0}
private

Definition at line 115 of file kis_shape_layer_canvas.h.

115{0};

◆ m_projection

KisPaintDeviceSP KisShapeLayerCanvas::m_projection
private

Definition at line 114 of file kis_shape_layer_canvas.h.

◆ m_safeForcedConnection

KisSafeBlockingQueueConnectionProxy<void> KisShapeLayerCanvas::m_safeForcedConnection
private

Definition at line 120 of file kis_shape_layer_canvas.h.


The documentation for this class was generated from the following files: