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

#include <kis_pixel_selection.h>

+ Inheritance diagram for KisPixelSelection:

Public Member Functions

void applySelection (KisPixelSelectionSP selection, SelectionAction action)
 
void clear () override
 
void clear (const QRect &r)
 
KisSelectionComponentclone (KisSelection *) override
 
const KoColorSpacecompositionSourceColorSpace () const override
 
void copyAlphaFrom (KisPaintDeviceSP src, const QRect &processRect)
 
void invalidateOutlineCache ()
 
void invalidateThumbnailImage ()
 
void invert ()
 
bool isEmpty () const override
 
bool isTotallyUnselected (const QRect &r) const
 Tests if the rect is totally outside the selection.
 
 KisPixelSelection (const KisPaintDeviceSP copySource, KritaUtils::DeviceCopyMode copyMode=KritaUtils::CopySnapshot, KisSelectionWSP parentSelection=KisSelectionWSP())
 
 KisPixelSelection (const KisPixelSelection &rhs, KritaUtils::DeviceCopyMode copyMode=KritaUtils::CopySnapshot)
 
 KisPixelSelection (KisDefaultBoundsBaseSP defaultBounds=KisDefaultBoundsBaseSP(), KisSelectionWSP parentSelection=KisSelectionWSP())
 
virtual void moveTo (const QPoint &pt)
 
void moveTo (const QPoint &pt) override
 
void moveTo (qint32 x, qint32 y)
 
QVector< QPolygon > outline () const
 outline returns the outline of the current selection
 
QPainterPath outlineCache () const override
 
bool outlineCacheValid () const override
 
KisSelectionWSP parentSelection () const
 
bool read (QIODevice *stream)
 
void recalculateOutlineCache () override
 
void recalculateThumbnailImage (const QColor &maskColor)
 
void renderToProjection (KisPaintDeviceSP projection) override
 
void renderToProjection (KisPaintDeviceSP projection, const QRect &r) override
 
void select (const QRect &r, quint8 selectedness=MAX_SELECTED)
 
QRect selectedExactRect () const
 
QRect selectedRect () const
 
void setOutlineCache (const QPainterPath &cache)
 
void setParentSelection (KisSelectionWSP selection)
 
QImage thumbnailImage () const
 
QTransform thumbnailImageTransform () const
 
bool thumbnailImageValid () const
 
 ~KisPixelSelection () override
 
- Public Member Functions inherited from Private
 Private (KisCanvas2 *c)
 
- Public Member Functions inherited from KisPaintDevice
bool burnKeyframe ()
 
bool burnKeyframe (int frameID)
 burnKeyframe
 
QRect calculateExactBounds (bool nonDefaultOnly) const
 
quint32 channelCount () const
 
void clear (const QRect &rc)
 
void clearSelection (KisSelectionSP selection)
 
const KoColorSpacecolorSpace () const
 
void convertFromQImage (const QImage &image, const KoColorProfile *profile, qint32 offsetX=0, qint32 offsetY=0)
 
void convertTo (const KoColorSpace *dstColorSpace, KoColorConversionTransformation::Intent renderingIntent=KoColorConversionTransformation::internalRenderingIntent(), KoColorConversionTransformation::ConversionFlags conversionFlags=KoColorConversionTransformation::internalConversionFlags(), KUndo2Command *parentCommand=nullptr, KoUpdater *progressUpdater=nullptr)
 
QImage convertToQImage (const KoColorProfile *dstProfile, const QRect &rc, KoColorConversionTransformation::Intent renderingIntent=KoColorConversionTransformation::internalRenderingIntent(), KoColorConversionTransformation::ConversionFlags conversionFlags=KoColorConversionTransformation::internalConversionFlags()) const
 
QImage convertToQImage (const KoColorProfile *dstProfile, KoColorConversionTransformation::Intent renderingIntent=KoColorConversionTransformation::internalRenderingIntent(), KoColorConversionTransformation::ConversionFlags conversionFlags=KoColorConversionTransformation::internalConversionFlags()) const
 
QImage convertToQImage (const KoColorProfile *dstProfile, qint32 x, qint32 y, qint32 w, qint32 h, KoColorConversionTransformation::Intent renderingIntent=KoColorConversionTransformation::internalRenderingIntent(), KoColorConversionTransformation::ConversionFlags conversionFlags=KoColorConversionTransformation::internalConversionFlags()) const
 
KUndo2CommandcreateChangeInterstrokeDataCommand (KisInterstrokeDataSP data)
 set interstroke data to the device
 
KisPaintDeviceSP createCompositionSourceDevice () const
 
KisPaintDeviceSP createCompositionSourceDevice (KisPaintDeviceSP cloneSource) const
 
KisPaintDeviceSP createCompositionSourceDevice (KisPaintDeviceSP cloneSource, const QRect roughRect) const
 
KisFixedPaintDeviceSP createCompositionSourceDeviceFixed () const
 
KisHLineConstIteratorSP createHLineConstIteratorNG (qint32 x, qint32 y, qint32 w) const
 
KisHLineIteratorSP createHLineIteratorNG (qint32 x, qint32 y, qint32 w)
 
KisRasterKeyframeChannelcreateKeyframeChannel (const KoID &id)
 
LodDataStructcreateLodDataStruct (int lod)
 
KisRandomAccessorSP createRandomAccessorNG ()
 
KisRandomConstAccessorSP createRandomConstAccessorNG () const
 
KisRandomSubAccessorSP createRandomSubAccessor () const
 
KisRepeatHLineConstIteratorSP createRepeatHLineConstIterator (qint32 x, qint32 y, qint32 w, const QRect &_dataWidth) const
 
KisRepeatVLineConstIteratorSP createRepeatVLineConstIterator (qint32 x, qint32 y, qint32 h, const QRect &_dataWidth) const
 
QImage createThumbnail (qint32 maxw, qint32 maxh, qreal oversample=1, KoColorConversionTransformation::Intent renderingIntent=KoColorConversionTransformation::internalRenderingIntent(), KoColorConversionTransformation::ConversionFlags conversionFlags=KoColorConversionTransformation::internalConversionFlags())
 
QImage createThumbnail (qint32 maxw, qint32 maxh, QRect rect, qreal oversample=1, KoColorConversionTransformation::Intent renderingIntent=KoColorConversionTransformation::internalRenderingIntent(), KoColorConversionTransformation::ConversionFlags conversionFlags=KoColorConversionTransformation::internalConversionFlags())
 
QImage createThumbnail (qint32 maxw, qint32 maxh, Qt::AspectRatioMode aspectRatioMode, qreal oversample=1, KoColorConversionTransformation::Intent renderingIntent=KoColorConversionTransformation::internalRenderingIntent(), KoColorConversionTransformation::ConversionFlags conversionFlags=KoColorConversionTransformation::internalConversionFlags())
 
KisPaintDeviceSP createThumbnailDevice (qint32 w, qint32 h, QRect rect=QRect(), QRect outputRect=QRect()) const
 
KisPaintDeviceSP createThumbnailDeviceOversampled (qint32 w, qint32 h, qreal oversample, QRect rect=QRect(), QRect outputRect=QRect()) const
 
KisVLineConstIteratorSP createVLineConstIteratorNG (qint32 x, qint32 y, qint32 h) const
 
KisVLineIteratorSP createVLineIteratorNG (qint32 x, qint32 y, qint32 h)
 
void crop (const QRect &r)
 Convenience method for the above.
 
void crop (qint32 x, qint32 y, qint32 w, qint32 h)
 
KisDataManagerSP dataManager () const
 
KisDefaultBoundsBaseSP defaultBounds () const
 
KoColor defaultPixel () const
 
void estimateMemoryStats (qint64 &imageData, qint64 &temporaryData, qint64 &lodData) const
 
QRect exactBounds () const
 
QRect exactBoundsAmortized () const
 
QRect extent () const
 
void extent (qint32 &x, qint32 &y, qint32 &w, qint32 &h) const
 Convenience method for the above.
 
void fill (const QRect &rc, const KoColor &color)
 
void fill (qint32 x, qint32 y, qint32 w, qint32 h, const quint8 *fillPixel)
 
KisPaintDeviceFramesInterfaceframesInterface ()
 
void generateLodCloneDevice (KisPaintDeviceSP dst, const QRect &originalRect, int lod)
 
KisInterstrokeDataSP interstrokeData () const
 
KisRasterKeyframeChannelkeyframeChannel () const
 
 KisPaintDevice (const KisPaintDevice &rhs, KritaUtils::DeviceCopyMode copyMode=KritaUtils::CopySnapshot, KisNode *newParentNode=0)
 
 KisPaintDevice (const KoColorSpace *colorSpace, const QString &name=QString())
 
 KisPaintDevice (KisNodeWSP parent, const KoColorSpace *colorSpace, KisDefaultBoundsBaseSP defaultBounds=KisDefaultBoundsBaseSP(), const QString &name=QString())
 
void makeCloneFrom (KisPaintDeviceSP src, const QRect &rect)
 
void makeCloneFromRough (KisPaintDeviceSP src, const QRect &minimalRect)
 
void makeFullCopyFrom (const KisPaintDevice &rhs, KritaUtils::DeviceCopyMode copyMode=KritaUtils::CopySnapshot, KisNode *newParentNode=0)
 
void moveTo (qint32 x, qint32 y)
 
QRect nonDefaultPixelArea () const
 
QPoint offset () const
 
KoColor pixel (const QPoint &pos) const
 
bool pixel (qint32 x, qint32 y, KoColor *kc) const
 
bool pixel (qint32 x, qint32 y, QColor *c) const
 
quint32 pixelSize () const
 
void prepareClone (KisPaintDeviceSP src)
 
void purgeDefaultPixels ()
 
bool read (QIODevice *stream)
 
void readBytes (quint8 *data, const QRect &rect) const
 
void readBytes (quint8 *data, qint32 x, qint32 y, qint32 w, qint32 h) const
 
QVector< quint8 * > readPlanarBytes (qint32 x, qint32 y, qint32 w, qint32 h) const
 
KisRegion region () const
 
KisRegion regionExact () const
 
KisRegion regionForLodSyncing () const
 
KUndo2CommandreincarnateWithDetachedHistory (bool copyContent)
 
void requestTimeSwitch (int time)
 
int sequenceNumber () const
 
void setDataManager (KisDataManagerSP data, const KoColorSpace *colorSpace=0)
 
void setDefaultBounds (KisDefaultBoundsBaseSP bounds)
 
void setDefaultPixel (const KoColor &defPixel)
 
void setDirty ()
 
void setDirty (const KisRegion &region)
 
void setDirty (const QRect &rc)
 
void setDirty (const QVector< QRect > &rects)
 
void setParentNode (KisNodeWSP parent)
 
bool setPixel (qint32 x, qint32 y, const KoColor &kc)
 Convenience method for the above.
 
bool setPixel (qint32 x, qint32 y, const QColor &c)
 
bool setProfile (const KoColorProfile *profile, KUndo2Command *parentCommand)
 
void setProjectionDevice (bool value)
 
void setSupportsWraparoundMode (bool value)
 
void setX (qint32 x)
 
void setY (qint32 y)
 
bool supportsWraproundMode () const
 
void testingFetchLodDevice (KisPaintDeviceSP targetDevice)
 
void updateLodDataStruct (LodDataStruct *dst, const QRect &srcRect)
 
void uploadLodDataStruct (LodDataStruct *dst)
 
bool write (KisPaintDeviceWriter &store)
 
void writeBytes (const quint8 *data, const QRect &rect)
 
void writeBytes (const quint8 *data, qint32 x, qint32 y, qint32 w, qint32 h)
 
void writePlanarBytes (QVector< quint8 * > planes, qint32 x, qint32 y, qint32 w, qint32 h)
 
qint32 x () const
 
qint32 y () const
 
 ~KisPaintDevice () override
 
- Public Member Functions inherited from KisShared
bool deref ()
 
bool ref ()
 
int refCount ()
 
QAtomicInt * sharedWeakReference ()
 
- Public Member Functions inherited from KisSelectionComponent
 KisSelectionComponent ()
 
virtual void moveX (qint32 x)
 
virtual void moveY (qint32 y)
 
virtual KUndo2CommandresetToEmpty ()
 
virtual void setResolutionProxy (KisImageResolutionProxySP)
 
virtual KUndo2Commandtransform (const QTransform &transform)
 
virtual ~KisSelectionComponent ()
 

Public Attributes

QPoint lod0CachesOffset
 
QPainterPath outlineCache
 
QMutex outlineCacheMutex
 
bool outlineCacheValid
 
KisSelectionWSP parentSelection
 
QImage thumbnailImage
 
QTransform thumbnailImageTransform
 
bool thumbnailImageValid
 
- Public Attributes inherited from Private
KisCanvas2canvas
 
int displayedFrame
 
int intendedFrame
 

Private Member Functions

void addSelection (KisPixelSelectionSP selection)
 
QRect exactBounds () const
 
QRect extent () const
 
void extent (qint32 &x, qint32 &y, qint32 &w, qint32 &h) const
 Convenience method for the above.
 
void intersectSelection (KisPixelSelectionSP selection)
 
void subtractSelection (KisPixelSelectionSP selection)
 
void symmetricdifferenceSelection (KisPixelSelectionSP selection)
 

Private Attributes

Private *const m_d
 

Additional Inherited Members

- Signals inherited from KisPaintDevice
void colorSpaceChanged (const KoColorSpace *colorspace)
 
void profileChanged (const KoColorProfile *profile)
 
- Static Public Member Functions inherited from KisPaintDevice
static MemoryReleaseObjectcreateMemoryReleaseObject ()
 
- Protected Member Functions inherited from KisPaintDevice
void fastBitBlt (KisPaintDeviceSP src, const QRect &rect)
 
void fastBitBltOldData (KisPaintDeviceSP src, const QRect &rect)
 
bool fastBitBltPossible (KisPaintDeviceSP src)
 
void fastBitBltRough (KisPaintDeviceSP src, const QRect &rect)
 
void fastBitBltRoughOldData (KisPaintDeviceSP src, const QRect &rect)
 
 KisPaintDevice (KisDataManagerSP explicitDataManager, KisPaintDeviceSP src, const QString &name=QString())
 
KisNodeWSP parentNode () const
 
- Protected Member Functions inherited from KisShared
 KisShared ()
 
 ~KisShared ()
 

Detailed Description

KisPixelSelection contains a byte-map representation of a layer, where the value of a byte signifies whether a corresponding pixel is selected, or not.

Definition at line 35 of file kis_pixel_selection.cpp.

Constructor & Destructor Documentation

◆ KisPixelSelection() [1/3]

KisPixelSelection::KisPixelSelection ( KisDefaultBoundsBaseSP defaultBounds = KisDefaultBoundsBaseSP(),
KisSelectionWSP parentSelection = KisSelectionWSP() )

Create a new KisPixelSelection. This selection will not have a parent paint device.

Definition at line 55 of file kis_pixel_selection.cpp.

57 , m_d(new Private)
58{
59 m_d->outlineCacheValid = true;
60 m_d->invalidateThumbnailImage();
61
62 m_d->parentSelection = parentSelection;
63}
KisPaintDevice(const KoColorSpace *colorSpace, const QString &name=QString())
KisDefaultBoundsBaseSP defaultBounds() const
KisSelectionWSP parentSelection
static KoColorSpaceRegistry * instance()

References m_d, and parentSelection.

◆ KisPixelSelection() [2/3]

KisPixelSelection::KisPixelSelection ( const KisPixelSelection & rhs,
KritaUtils::DeviceCopyMode copyMode = KritaUtils::CopySnapshot )

Copy the selection

Definition at line 65 of file kis_pixel_selection.cpp.

66 : KisPaintDevice(rhs, copyMode)
68 , m_d(new Private)
69{
70 // parent selection is not supposed to be shared
71 m_d->outlineCache = rhs.m_d->outlineCache;
72 m_d->outlineCacheValid = rhs.m_d->outlineCacheValid;
73
74 m_d->thumbnailImageValid = rhs.m_d->thumbnailImageValid;
75 m_d->thumbnailImage = rhs.m_d->thumbnailImage;
76 m_d->thumbnailImageTransform = rhs.m_d->thumbnailImageTransform;
77}

References m_d.

◆ KisPixelSelection() [3/3]

KisPixelSelection::KisPixelSelection ( const KisPaintDeviceSP copySource,
KritaUtils::DeviceCopyMode copyMode = KritaUtils::CopySnapshot,
KisSelectionWSP parentSelection = KisSelectionWSP() )

Create a new selection using the content of copySource as the mask.

Definition at line 79 of file kis_pixel_selection.cpp.

80 : KisPaintDevice(0, KoColorSpaceRegistry::instance()->alpha8(), copySource->defaultBounds())
81 , m_d(new Private)
82{
83 KisPaintDeviceSP tmpDevice = new KisPaintDevice(*copySource, copyMode, 0);
84 tmpDevice->convertTo(this->colorSpace());
85
86 this->makeFullCopyFrom(*tmpDevice, copyMode, 0);
87
88 m_d->parentSelection = parentSelection;
89 m_d->outlineCacheValid = false;
90 m_d->invalidateThumbnailImage();
91}
const KoColorSpace * colorSpace() const
void makeFullCopyFrom(const KisPaintDevice &rhs, KritaUtils::DeviceCopyMode copyMode=KritaUtils::CopySnapshot, KisNode *newParentNode=0)
void convertTo(const KoColorSpace *dstColorSpace, KoColorConversionTransformation::Intent renderingIntent=KoColorConversionTransformation::internalRenderingIntent(), KoColorConversionTransformation::ConversionFlags conversionFlags=KoColorConversionTransformation::internalConversionFlags(), KUndo2Command *parentCommand=nullptr, KoUpdater *progressUpdater=nullptr)

References KisPaintDevice::colorSpace(), KisPaintDevice::convertTo(), KisPaintDevice::KisPaintDevice(), m_d, KisPaintDevice::makeFullCopyFrom(), and parentSelection.

◆ ~KisPixelSelection()

KisPixelSelection::~KisPixelSelection ( )
override

Definition at line 98 of file kis_pixel_selection.cpp.

99{
100 delete m_d;
101}

References m_d.

Member Function Documentation

◆ addSelection()

void KisPixelSelection::addSelection ( KisPixelSelectionSP selection)
private

Add a selection

Definition at line 184 of file kis_pixel_selection.cpp.

185{
186 QRect r = selection->selectedRect();
187 if (r.isEmpty()) return;
188
189 KisHLineIteratorSP dst = createHLineIteratorNG(r.x(), r.y(), r.width());
190 KisHLineConstIteratorSP src = selection->createHLineConstIteratorNG(r.x(), r.y(), r.width());
191 for (int i = 0; i < r.height(); ++i) {
192 do {
193 if (*src->oldRawData() + *dst->rawData() < MAX_SELECTED)
194 *dst->rawData() = *src->oldRawData() + *dst->rawData();
195 else
196 *dst->rawData() = MAX_SELECTED;
197
198 } while (src->nextPixel() && dst->nextPixel());
199 dst->nextRow();
200 src->nextRow();
201 }
202
203 const quint8 defPixel = qMax(*defaultPixel().data(), *selection->defaultPixel().data());
204 setDefaultPixel(KoColor(&defPixel, colorSpace()));
205
206 m_d->outlineCacheValid &= selection->outlineCacheValid();
207
208 if (m_d->outlineCacheValid) {
209 m_d->outlineCache += selection->outlineCache();
210 }
211
212 m_d->invalidateThumbnailImage();
213}
void setDefaultPixel(const KoColor &defPixel)
KisHLineIteratorSP createHLineIteratorNG(qint32 x, qint32 y, qint32 w)
KoColor defaultPixel() const
KisHLineConstIteratorSP createHLineConstIteratorNG(qint32 x, qint32 y, qint32 w) const
quint8 * data()
Definition KoColor.h:144
const quint8 MAX_SELECTED
Definition kis_global.h:32

References KisPaintDevice::colorSpace(), KisPaintDevice::createHLineConstIteratorNG(), KisPaintDevice::createHLineIteratorNG(), KoColor::data(), KisPaintDevice::defaultPixel(), m_d, MAX_SELECTED, outlineCache, outlineCacheValid, selectedRect(), and KisPaintDevice::setDefaultPixel().

◆ applySelection()

void KisPixelSelection::applySelection ( KisPixelSelectionSP selection,
SelectionAction action )

Apply a selection to the selection using the specified selection mode

Definition at line 141 of file kis_pixel_selection.cpp.

142{
143 switch (action) {
145 clear();
146 addSelection(selection);
147 break;
148 case SELECTION_ADD:
149 addSelection(selection);
150 break;
152 subtractSelection(selection);
153 break;
155 intersectSelection(selection);
156 break;
159 break;
160 default:
161 break;
162 }
163}
@ SELECTION_REPLACE
@ SELECTION_INTERSECT
@ SELECTION_SYMMETRICDIFFERENCE
@ SELECTION_SUBTRACT
@ SELECTION_ADD
void intersectSelection(KisPixelSelectionSP selection)
void symmetricdifferenceSelection(KisPixelSelectionSP selection)
void subtractSelection(KisPixelSelectionSP selection)
void addSelection(KisPixelSelectionSP selection)

References addSelection(), clear(), intersectSelection(), SELECTION_ADD, SELECTION_INTERSECT, SELECTION_REPLACE, SELECTION_SUBTRACT, SELECTION_SYMMETRICDIFFERENCE, subtractSelection(), and symmetricdifferenceSelection().

◆ clear() [1/2]

void KisPixelSelection::clear ( )
overridevirtual

Reset the entire selection. The selectedRect and selectedExactRect will be empty. The selection will be completely deselected.

Reimplemented from KisPaintDevice.

Definition at line 330 of file kis_pixel_selection.cpp.

331{
334
335 m_d->outlineCacheValid = true;
336 m_d->outlineCache = QPainterPath();
337
338 // Empty the thumbnail image. It is a valid state.
339 m_d->invalidateThumbnailImage();
340 m_d->thumbnailImageValid = true;
341}
virtual void clear()
static KoColor createTransparent(const KoColorSpace *cs)
Definition KoColor.cpp:681

References KisPaintDevice::clear(), KisPaintDevice::colorSpace(), KoColor::createTransparent(), m_d, and KisPaintDevice::setDefaultPixel().

◆ clear() [2/2]

void KisPixelSelection::clear ( const QRect & r)

Set the specified rect to MIN_SELECTED.

Definition at line 310 of file kis_pixel_selection.cpp.

311{
312 if (*defaultPixel().data() != MIN_SELECTED) {
313 KisFillPainter painter(KisPaintDeviceSP(this));
315 painter.fillRect(r, KoColor(Qt::white, cs), MIN_SELECTED);
316 } else {
318 }
319
320 if (m_d->outlineCacheValid) {
321 QPainterPath path;
322 path.addRect(r);
323
324 m_d->outlineCache -= path;
325 }
326
327 m_d->invalidateThumbnailImage();
328}
const quint8 MIN_SELECTED
Definition kis_global.h:33
KisSharedPtr< KisPaintDevice > KisPaintDeviceSP
Definition kis_types.h:73
const KoColorSpace * rgb8(const QString &profileName=QString())

References KisPaintDevice::clear(), KisPaintDevice::defaultPixel(), KisFillPainter::fillRect(), KoColorSpaceRegistry::instance(), m_d, MIN_SELECTED, and KoColorSpaceRegistry::rgb8().

◆ clone()

KisSelectionComponent * KisPixelSelection::clone ( KisSelection * )
overridevirtual

Implements KisSelectionComponent.

Definition at line 93 of file kis_pixel_selection.cpp.

94{
95 return new KisPixelSelection(*this);
96}
KisPixelSelection(KisDefaultBoundsBaseSP defaultBounds=KisDefaultBoundsBaseSP(), KisSelectionWSP parentSelection=KisSelectionWSP())

References KisPixelSelection().

◆ compositionSourceColorSpace()

const KoColorSpace * KisPixelSelection::compositionSourceColorSpace ( ) const
overridevirtual

This is a lowlevel method for the principle used in createCompositionSourceDevice(). In most of the cases the paint device creation methods should be used instead of this function.

See also
createCompositionSourceDevice()
createCompositionSourceDeviceFixed()

Reimplemented from KisPaintDevice.

Definition at line 103 of file kis_pixel_selection.cpp.

104{
108 QString());
109}
const KoID GrayAColorModelID("GRAYA", ki18n("Grayscale/Alpha"))
const KoID Integer8BitsColorDepthID("U8", ki18n("8-bit integer/channel"))
QString id() const
Definition KoID.cpp:63

References KisPaintDevice::colorSpace(), GrayAColorModelID, KoID::id(), KoColorSpaceRegistry::instance(), and Integer8BitsColorDepthID.

◆ copyAlphaFrom()

void KisPixelSelection::copyAlphaFrom ( KisPaintDeviceSP src,
const QRect & processRect )

Copies alpha channel form the specified src device

Definition at line 165 of file kis_pixel_selection.cpp.

166{
167 const KoColorSpace *srcCS = src->colorSpace();
168
169 KisSequentialConstIterator srcIt(src, processRect);
170 KisSequentialIterator dstIt(this, processRect);
171
172 while (srcIt.nextPixel() && dstIt.nextPixel()) {
173 const quint8 *srcPtr = srcIt.rawDataConst();
174 quint8 *alpha8Ptr = dstIt.rawData();
175
176 *alpha8Ptr = srcCS->opacityU8(srcPtr);
177 }
178
179 m_d->outlineCacheValid = false;
180 m_d->outlineCache = QPainterPath();
181 m_d->invalidateThumbnailImage();
182}
virtual quint8 opacityU8(const quint8 *pixel) const =0

References m_d, KisSequentialIteratorBase< IteratorPolicy, SourcePolicy, ProgressPolicy >::nextPixel(), KoColorSpace::opacityU8(), KisSequentialIteratorBase< IteratorPolicy, SourcePolicy, ProgressPolicy >::rawData(), and KisSequentialIteratorBase< IteratorPolicy, SourcePolicy, ProgressPolicy >::rawDataConst().

◆ exactBounds()

QRect KisPaintDevice::exactBounds ( ) const
private

Get the exact bounds of this paint device. The real solution is very slow because it does a linear scanline search, but it uses caching, so calling to this function without changing the device is quite cheap.

exactBounds follows these rules:

See also
calculateExactBounds()

Definition at line 215 of file kis_paint_device.cc.

1278{
1279 return m_d->cache()->exactBounds();
1280}
KisPaintDeviceCache * cache()

◆ extent() [1/2]

QRect KisPaintDevice::extent ( ) const
private

Retrieve the bounds of the paint device. The size is not exact, but may be larger if the underlying datamanager works that way. For instance, the tiled datamanager keeps the extent to the nearest multiple of 64.

If default pixel is not transparent, then the actual extent rect is united with the defaultBounds()->bounds() value (the size of the image, usually).

Definition at line 193 of file kis_paint_device.cc.

1263{
1264 return m_d->currentStrategy()->extent();
1265}
KisPaintDeviceStrategy * currentStrategy()

◆ extent() [2/2]

void KisPaintDevice::extent ( qint32 & x,
qint32 & y,
qint32 & w,
qint32 & h ) const
private

Convenience method for the above.

Definition at line 196 of file kis_paint_device.cc.

1254{
1255 QRect rc = extent();
1256 x = rc.x();
1257 y = rc.y();
1258 w = rc.width();
1259 h = rc.height();
1260}

References KisPaintDevice::Private::fastBitBltPossible(), KIS_SAFE_ASSERT_RECOVER_NOOP, and KisPaintDevice::Private::prepareCloneImpl().

◆ intersectSelection()

void KisPixelSelection::intersectSelection ( KisPixelSelectionSP selection)
private

Intersects a selection using min-T-norm for this.

Definition at line 249 of file kis_pixel_selection.cpp.

250{
251 const QRect r = selection->selectedRect().united(selectedRect());
252 if (r.isEmpty()) {
253 clear();
254 return;
255 }
256
257 KisHLineIteratorSP dst = createHLineIteratorNG(r.x(), r.y(), r.width());
258 KisHLineConstIteratorSP src = selection->createHLineConstIteratorNG(r.x(), r.y(), r.width());
259 for (int i = 0; i < r.height(); ++i) {
260 do {
261 *dst->rawData() = qMin(*dst->rawData(), *src->oldRawData());
262 } while (src->nextPixel() && dst->nextPixel());
263 dst->nextRow();
264 src->nextRow();
265 }
266
267 const quint8 defPixel = qMin(*defaultPixel().data(), *selection->defaultPixel().data());
268 setDefaultPixel(KoColor(&defPixel, colorSpace()));
269
270 crop(r);
271
272 m_d->outlineCacheValid &= selection->outlineCacheValid();
273
274 if (m_d->outlineCacheValid) {
275 m_d->outlineCache = KritaUtils::tryCloseTornSubpathsAfterIntersection(m_d->outlineCache & selection->outlineCache());
276 }
277
278 m_d->invalidateThumbnailImage();
279}
void crop(qint32 x, qint32 y, qint32 w, qint32 h)
QPainterPath tryCloseTornSubpathsAfterIntersection(QPainterPath path)

References clear(), KisPaintDevice::colorSpace(), KisPaintDevice::createHLineConstIteratorNG(), KisPaintDevice::createHLineIteratorNG(), KisPaintDevice::crop(), KoColor::data(), KisPaintDevice::defaultPixel(), m_d, outlineCache, outlineCacheValid, selectedRect(), KisPaintDevice::setDefaultPixel(), and KritaUtils::tryCloseTornSubpathsAfterIntersection().

◆ invalidateOutlineCache()

void KisPixelSelection::invalidateOutlineCache ( )

Definition at line 472 of file kis_pixel_selection.cpp.

473{
474 QMutexLocker locker(&m_d->outlineCacheMutex);
475 m_d->outlineCacheValid = false;
476 m_d->thumbnailImageValid = false;
477}

References m_d.

◆ invalidateThumbnailImage()

void KisPixelSelection::invalidateThumbnailImage ( )
inline

Definition at line 48 of file kis_pixel_selection.cpp.

48 {
49 thumbnailImageValid = false;
50 thumbnailImage = QImage();
51 thumbnailImageTransform = QTransform();
52 }

◆ invert()

void KisPixelSelection::invert ( )

Invert the total selection. This will also invert the default value of the selection paint device, from MIN_SELECTED to MAX_SELECTED or back.

Definition at line 343 of file kis_pixel_selection.cpp.

344{
345 // Region is needed here (not exactBounds or extent), because
346 // unselected but existing pixels need to be inverted too
347 QRect rc = region().boundingRect();
348
349 if (!rc.isEmpty()) {
350 KisSequentialIterator it(this, rc);
351 while(it.nextPixel()) {
352 *(it.rawData()) = MAX_SELECTED - *(it.rawData());
353 }
354 }
355 quint8 defPixel = MAX_SELECTED - *defaultPixel().data();
356 setDefaultPixel(KoColor(&defPixel, colorSpace()));
357
358 if (m_d->outlineCacheValid) {
359 QPainterPath path;
360 path.addRect(defaultBounds()->bounds());
361
362 m_d->outlineCache = path - m_d->outlineCache;
363 }
364
365 m_d->invalidateThumbnailImage();
366}
KisRegion region() const
QRect boundingRect() const
#define bounds(x, a, b)

References KisRegion::boundingRect(), bounds, KisPaintDevice::colorSpace(), KoColor::data(), KisPaintDevice::defaultBounds(), KisPaintDevice::defaultPixel(), m_d, MAX_SELECTED, KisSequentialIteratorBase< IteratorPolicy, SourcePolicy, ProgressPolicy >::nextPixel(), KisSequentialIteratorBase< IteratorPolicy, SourcePolicy, ProgressPolicy >::rawData(), KisPaintDevice::region(), and KisPaintDevice::setDefaultPixel().

◆ isEmpty()

bool KisPixelSelection::isEmpty ( ) const
overridevirtual

Implements KisSelectionComponent.

Definition at line 447 of file kis_pixel_selection.cpp.

448{
449 return *defaultPixel().data() == MIN_SELECTED && selectedRect().isEmpty();
450}

References KoColor::data(), KisPaintDevice::defaultPixel(), MIN_SELECTED, and selectedRect().

◆ isTotallyUnselected()

bool KisPixelSelection::isTotallyUnselected ( const QRect & r) const

Tests if the rect is totally outside the selection.

Definition at line 391 of file kis_pixel_selection.cpp.

392{
393 if (*defaultPixel().data() != MIN_SELECTED)
394 return false;
395 QRect sr = selectedExactRect();
396 return ! r.intersects(sr);
397}
QRect selectedExactRect() const

References KisPaintDevice::defaultPixel(), MIN_SELECTED, and selectedExactRect().

◆ moveTo() [1/3]

void KisPaintDevice::moveTo ( const QPoint & pt)
virtual

Convenience method for the above.

Reimplemented from KisPaintDevice.

Definition at line 156 of file kis_paint_device.cc.

References KisPaintDevice::Private::m_frames.

◆ moveTo() [2/3]

void KisPixelSelection::moveTo ( const QPoint & pt)
overridevirtual

Overridden from KisPaintDevice to handle outline cache moves

Reimplemented from KisPaintDevice.

Definition at line 368 of file kis_pixel_selection.cpp.

369{
370 const int lod = defaultBounds()->currentLevelOfDetail();
371 const QPoint lod0Point = !lod ? pt :
373
374 const QPoint offset = lod0Point - m_d->lod0CachesOffset;
375
376 if (m_d->outlineCacheValid) {
377 m_d->outlineCache.translate(offset);
378 }
379
380 if (m_d->thumbnailImageValid) {
381 m_d->thumbnailImageTransform =
382 QTransform::fromTranslate(offset.x(), offset.y()) *
383 m_d->thumbnailImageTransform;
384 }
385
386 m_d->lod0CachesOffset = lod0Point;
387
389}
virtual int currentLevelOfDetail() const =0
static qreal lodToInvScale(int levelOfDetail)
void moveTo(qint32 x, qint32 y)
QPoint offset() const

References KisDefaultBoundsBase::currentLevelOfDetail(), KisPaintDevice::defaultBounds(), KisLodTransformBase::lodToInvScale(), m_d, KisPaintDevice::moveTo(), and KisPaintDevice::offset().

◆ moveTo() [3/3]

void KisPaintDevice::moveTo ( qint32 x,
qint32 y )

Moves the device to these new coordinates (no incremental move)

Definition at line 151 of file kis_paint_device.cc.

1229{
1230 moveTo(QPoint(x, y));
1231}
void moveTo(const QPoint &pt) override

◆ outline()

QVector< QPolygon > KisPixelSelection::outline ( ) const

outline returns the outline of the current selection

Returns
a vector of polygons that can be used to draw the outline

When the default pixel is not fully transparent, the exactBounds() return extent of the device instead. To make this value sane we should limit the calculated area by the bounds of the image.

Definition at line 409 of file kis_pixel_selection.cpp.

410{
411 QRect selectionExtent = selectedExactRect();
412
419 if (*defaultPixel().data() != MIN_SELECTED) {
420 selectionExtent &= defaultBounds()->bounds();
421 }
422
423 qint32 xOffset = selectionExtent.x();
424 qint32 yOffset = selectionExtent.y();
425 qint32 width = selectionExtent.width();
426 qint32 height = selectionExtent.height();
427
429 // If the selection is small using a buffer is much faster
430 try {
431 quint8* buffer = new quint8[width*height];
432 readBytes(buffer, xOffset, yOffset, width, height);
433
434 QVector<QPolygon> paths = generator.outline(buffer, xOffset, yOffset, width, height);
435
436 delete[] buffer;
437 return paths;
438 }
439 catch(const std::bad_alloc&) {
440 // Allocating so much memory failed, so we fall through to the slow option.
441 warnKrita << "KisPixelSelection::outline ran out of memory allocating" << width << "*" << height << "bytes.";
442 }
443
444 return generator.outline(this, xOffset, yOffset, width, height);
445}
virtual QRect bounds() const =0
void readBytes(quint8 *data, qint32 x, qint32 y, qint32 w, qint32 h) const
#define warnKrita
Definition kis_debug.h:87

References KisDefaultBoundsBase::bounds(), KisPaintDevice::colorSpace(), KisPaintDevice::defaultBounds(), KisPaintDevice::defaultPixel(), MIN_SELECTED, KisOutlineGenerator::outline(), KisPaintDevice::readBytes(), selectedExactRect(), and warnKrita.

◆ outlineCache()

QPainterPath KisPixelSelection::outlineCache ( ) const
overridevirtual

Implements KisSelectionComponent.

◆ outlineCacheValid()

bool KisPixelSelection::outlineCacheValid ( ) const
overridevirtual

Implements KisSelectionComponent.

◆ parentSelection()

KisSelectionWSP KisPixelSelection::parentSelection ( ) const

◆ read()

bool KisPixelSelection::read ( QIODevice * stream)

Definition at line 111 of file kis_pixel_selection.cpp.

112{
113 bool retval = KisPaintDevice::read(stream);
114 m_d->outlineCacheValid = false;
115 m_d->invalidateThumbnailImage();
116 return retval;
117}
bool read(QIODevice *stream)

References m_d, and KisPaintDevice::read().

◆ recalculateOutlineCache()

void KisPixelSelection::recalculateOutlineCache ( )
overridevirtual

The outline generation algorithm has a small bug, which results in the starting point be repeated twice in the beginning of the path, instead of being put to the end. Here we just explicitly close the path to workaround it.

See also
KisSelectionTest::testOutlineGeneration()

Implements KisSelectionComponent.

Definition at line 479 of file kis_pixel_selection.cpp.

480{
481 QMutexLocker locker(&m_d->outlineCacheMutex);
482
483 m_d->outlineCache = QPainterPath();
484
485 Q_FOREACH (const QPolygon &polygon, outline()) {
486 m_d->outlineCache.addPolygon(polygon);
487
497 m_d->outlineCache.closeSubpath();
498 }
499
500 m_d->outlineCacheValid = true;
501}
QVector< QPolygon > outline() const
outline returns the outline of the current selection

References m_d, and outline().

◆ recalculateThumbnailImage()

void KisPixelSelection::recalculateThumbnailImage ( const QColor & maskColor)

Definition at line 541 of file kis_pixel_selection.cpp.

542{
543 QRect rc = selectedExactRect();
544 const int maxPreviewSize = 2000;
545
546 if (rc.isEmpty()) {
547 m_d->thumbnailImageTransform = QTransform();
548 m_d->thumbnailImage = QImage();
549 return;
550 }
551
552
553 if (rc.width() > maxPreviewSize ||
554 rc.height() > maxPreviewSize) {
555
556 qreal factor = 1.0;
557
558 if (rc.width() > rc.height()) {
559 factor = qreal(maxPreviewSize) / rc.width();
560 } else {
561 factor = qreal(maxPreviewSize) / rc.height();
562 }
563
564 int newWidth = qRound(rc.width() * factor);
565 int newHeight = qRound(rc.height() * factor);
566
567 m_d->thumbnailImageTransform =
568 QTransform::fromScale(qreal(rc.width()) / newWidth,
569 qreal(rc.height()) / newHeight) *
570 QTransform::fromTranslate(rc.x(), rc.y());
571
572 KisPaintDeviceSP thumbDevice =
573 createThumbnailDevice(newWidth, newHeight, rc);
574
575 QRect thumbRect(0, 0, newWidth, newHeight);
576 m_d->thumbnailImage = deviceToQImage(thumbDevice, thumbRect, maskColor);
577
578 } else {
579 m_d->thumbnailImageTransform = QTransform::fromTranslate(rc.x(), rc.y());
580 m_d->thumbnailImage = deviceToQImage(this, rc, maskColor);
581 }
582
583 m_d->thumbnailImageValid = true;
584}
KisPaintDeviceSP createThumbnailDevice(qint32 w, qint32 h, QRect rect=QRect(), QRect outputRect=QRect()) const
QImage deviceToQImage(KisPaintDeviceSP device, const QRect &rc, const QColor &maskColor)

References KisPaintDevice::createThumbnailDevice(), deviceToQImage(), m_d, and selectedExactRect().

◆ renderToProjection() [1/2]

void KisPixelSelection::renderToProjection ( KisPaintDeviceSP projection)
overridevirtual

Implements KisSelectionComponent.

Definition at line 596 of file kis_pixel_selection.cpp.

597{
599}
void renderToProjection(KisPaintDeviceSP projection) override

References renderToProjection(), and selectedExactRect().

◆ renderToProjection() [2/2]

void KisPixelSelection::renderToProjection ( KisPaintDeviceSP projection,
const QRect & r )
overridevirtual

Implements KisSelectionComponent.

Definition at line 601 of file kis_pixel_selection.cpp.

602{
603 QRect updateRect = rc & selectedExactRect();
604
605 if (updateRect.isValid()) {
606 KisPainter::copyAreaOptimized(updateRect.topLeft(), KisPaintDeviceSP(this), projection, updateRect);
607 }
608}
static void copyAreaOptimized(const QPoint &dstPt, KisPaintDeviceSP src, KisPaintDeviceSP dst, const QRect &originalSrcRect)

References KisPainter::copyAreaOptimized(), and selectedExactRect().

◆ select()

void KisPixelSelection::select ( const QRect & r,
quint8 selectedness = MAX_SELECTED )

Fill the specified rect with the specified selectedness.

Definition at line 119 of file kis_pixel_selection.cpp.

120{
121 QRect r = rc.normalized();
122 if (r.isEmpty()) return;
123
124 KisFillPainter painter(KisPaintDeviceSP(this));
126 painter.fillRect(r, KoColor(Qt::white, cs), selectedness);
127
128 if (m_d->outlineCacheValid) {
129 QPainterPath path;
130 path.addRect(r);
131
132 if (selectedness != MIN_SELECTED) {
133 m_d->outlineCache += path;
134 } else {
135 m_d->outlineCache -= path;
136 }
137 }
138 m_d->invalidateThumbnailImage();
139}

References KisFillPainter::fillRect(), KoColorSpaceRegistry::instance(), m_d, MIN_SELECTED, and KoColorSpaceRegistry::rgb8().

◆ selectedExactRect()

QRect KisPixelSelection::selectedExactRect ( ) const

Slow, but exact way of determining the rectangle that encloses the selection.

Definition at line 404 of file kis_pixel_selection.cpp.

405{
406 return exactBounds();
407}
QRect exactBounds() const

References exactBounds().

◆ selectedRect()

QRect KisPixelSelection::selectedRect ( ) const

Rough, but fastish way of determining the area of the tiles used by the selection.

Definition at line 399 of file kis_pixel_selection.cpp.

400{
401 return extent();
402}

References extent().

◆ setOutlineCache()

void KisPixelSelection::setOutlineCache ( const QPainterPath & cache)

Definition at line 458 of file kis_pixel_selection.cpp.

459{
460 QMutexLocker locker(&m_d->outlineCacheMutex);
461 m_d->outlineCache = cache;
462 m_d->outlineCacheValid = true;
463 m_d->thumbnailImageValid = false;
464}

References m_d.

◆ setParentSelection()

void KisPixelSelection::setParentSelection ( KisSelectionWSP selection)

Definition at line 586 of file kis_pixel_selection.cpp.

587{
588 m_d->parentSelection = selection;
589}

References m_d.

◆ subtractSelection()

void KisPixelSelection::subtractSelection ( KisPixelSelectionSP selection)
private

Subtracts a selection

Definition at line 215 of file kis_pixel_selection.cpp.

216{
217 QRect r = selection->selectedRect();
218 if (r.isEmpty()) return;
219
220
221 KisHLineIteratorSP dst = createHLineIteratorNG(r.x(), r.y(), r.width());
222 KisHLineConstIteratorSP src = selection->createHLineConstIteratorNG(r.x(), r.y(), r.width());
223 for (int i = 0; i < r.height(); ++i) {
224 do {
225 if (*dst->rawData() - *src->oldRawData() > MIN_SELECTED)
226 *dst->rawData() = *dst->rawData() - *src->oldRawData();
227 else
228 *dst->rawData() = MIN_SELECTED;
229
230 } while (src->nextPixel() && dst->nextPixel());
231 dst->nextRow();
232 src->nextRow();
233 }
234
235 const quint8 defPixel = *selection->defaultPixel().data() > *defaultPixel().data()
237 : *defaultPixel().data() - *selection->defaultPixel().data();
238 setDefaultPixel(KoColor(&defPixel, colorSpace()));
239
240 m_d->outlineCacheValid &= selection->outlineCacheValid();
241
242 if (m_d->outlineCacheValid) {
243 m_d->outlineCache -= selection->outlineCache();
244 }
245
246 m_d->invalidateThumbnailImage();
247}

References KisPaintDevice::colorSpace(), KisPaintDevice::createHLineConstIteratorNG(), KisPaintDevice::createHLineIteratorNG(), KoColor::data(), KisPaintDevice::defaultPixel(), m_d, MIN_SELECTED, outlineCache, outlineCacheValid, selectedRect(), and KisPaintDevice::setDefaultPixel().

◆ symmetricdifferenceSelection()

void KisPixelSelection::symmetricdifferenceSelection ( KisPixelSelectionSP selection)
private

Invert a selection or intersect with the inverse of a selection

Definition at line 281 of file kis_pixel_selection.cpp.

282{
283 QRect r = selection->selectedRect().united(selectedRect());
284 if (r.isEmpty()) return;
285
286 KisHLineIteratorSP dst = createHLineIteratorNG(r.x(), r.y(), r.width());
287 KisHLineConstIteratorSP src = selection->createHLineConstIteratorNG(r.x(), r.y(), r.width());
288 for (int i = 0; i < r.height(); ++i) {
289
290 do {
291 *dst->rawData() = abs(*dst->rawData() - *src->oldRawData());
292 } while (src->nextPixel() && dst->nextPixel());
293
294 dst->nextRow();
295 src->nextRow();
296 }
297
298 const quint8 defPixel = abs(*defaultPixel().data() - *selection->defaultPixel().data());
299 setDefaultPixel(KoColor(&defPixel, colorSpace()));
300
301 m_d->outlineCacheValid &= selection->outlineCacheValid();
302
303 if (m_d->outlineCacheValid) {
304 m_d->outlineCache = (m_d->outlineCache | selection->outlineCache()) - (m_d->outlineCache & selection->outlineCache());
305 }
306
307 m_d->invalidateThumbnailImage();
308}
Point abs(const Point &pt)

References KisPaintDevice::colorSpace(), KisPaintDevice::createHLineConstIteratorNG(), KisPaintDevice::createHLineIteratorNG(), KoColor::data(), KisPaintDevice::defaultPixel(), m_d, outlineCache, outlineCacheValid, selectedRect(), and KisPaintDevice::setDefaultPixel().

◆ thumbnailImage()

QImage KisPixelSelection::thumbnailImage ( ) const

◆ thumbnailImageTransform()

QTransform KisPixelSelection::thumbnailImageTransform ( ) const

◆ thumbnailImageValid()

bool KisPixelSelection::thumbnailImageValid ( ) const

Member Data Documentation

◆ lod0CachesOffset

QPoint KisPixelSelection::lod0CachesOffset

Definition at line 46 of file kis_pixel_selection.cpp.

◆ m_d

Private* const KisPixelSelection::m_d
private

Definition at line 162 of file kis_pixel_selection.h.

◆ outlineCache

QPainterPath KisPixelSelection::outlineCache

Definition at line 38 of file kis_pixel_selection.cpp.

◆ outlineCacheMutex

QMutex KisPixelSelection::outlineCacheMutex

Definition at line 40 of file kis_pixel_selection.cpp.

◆ outlineCacheValid

bool KisPixelSelection::outlineCacheValid

Definition at line 39 of file kis_pixel_selection.cpp.

◆ parentSelection

KisSelectionWSP KisPixelSelection::parentSelection

Definition at line 36 of file kis_pixel_selection.cpp.

◆ thumbnailImage

QImage KisPixelSelection::thumbnailImage

Definition at line 43 of file kis_pixel_selection.cpp.

◆ thumbnailImageTransform

QTransform KisPixelSelection::thumbnailImageTransform

Definition at line 44 of file kis_pixel_selection.cpp.

◆ thumbnailImageValid

bool KisPixelSelection::thumbnailImageValid

Definition at line 42 of file kis_pixel_selection.cpp.


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