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

#include <kis_vline_iterator.h>

+ Inheritance diagram for KisVLineIterator2:

Classes

struct  KisTileInfo
 

Public Member Functions

 KisVLineIterator2 (KisDataManager *dataManager, qint32 x, qint32 y, qint32 h, qint32 offsetX, qint32 offsetY, bool writable, KisIteratorCompleteListener *completeListener)
 
qint32 nConseqPixels () const override
 
void nextColumn () override
 
bool nextPixel () override
 
bool nextPixels (qint32 n) override
 
const quint8 * oldRawData () const override
 
quint8 * rawData () override
 
const quint8 * rawDataConst () const override
 
void resetColumnPos () override
 
void resetPixelPos () override
 
qint32 x () const override
 
qint32 y () const override
 
 ~KisVLineIterator2 () override
 
- Public Member Functions inherited from KisVLineIteratorNG
 KisVLineIteratorNG ()
 
 ~KisVLineIteratorNG () override
 
- Public Member Functions inherited from KisVLineConstIteratorNG
 KisVLineConstIteratorNG ()
 
 ~KisVLineConstIteratorNG () override
 
- Public Member Functions inherited from KisBaseConstIteratorNG
 KisBaseConstIteratorNG ()
 
 ~KisBaseConstIteratorNG () override
 
- Public Member Functions inherited from KisBaseConstAccessor
 KisBaseConstAccessor ()
 
virtual ~KisBaseConstAccessor ()
 
- Public Member Functions inherited from KisShared
bool deref ()
 
bool ref ()
 
int refCount ()
 
QAtomicInt * sharedWeakReference ()
 
- Public Member Functions inherited from KisBaseAccessor
 KisBaseAccessor ()
 
virtual ~KisBaseAccessor ()
 

Private Member Functions

void fetchTileDataForCache (KisTileInfo &kti, qint32 col, qint32 row)
 
 KisVLineIterator2 (const KisVLineIterator2 &)
 
KisVLineIterator2operator= (const KisVLineIterator2 &)
 
void preallocateTiles ()
 
void switchToTile (qint32 xInTile)
 
- Private Member Functions inherited from KisBaseIterator
qint32 calcXInTile (qint32 x, qint32 col) const
 
qint32 calcYInTile (qint32 y, qint32 row) const
 
 KisBaseIterator (KisTiledDataManager *_dataManager, bool _writable, KisIteratorCompleteListener *listener)
 
void lockOldTile (KisTileSP &tile)
 
void lockTile (KisTileSP &tile)
 
void unlockOldTile (KisTileSP &tile)
 
void unlockTile (KisTileSP &tile)
 
quint32 xToCol (quint32 x) const
 
quint32 yToRow (quint32 y) const
 
 ~KisBaseIterator ()
 

Private Attributes

qint32 m_bottom {0}
 
qint32 m_bottomRow {0}
 
qint32 m_column {0}
 
quint8 * m_data {nullptr}
 
quint8 * m_dataBottom {nullptr}
 
bool m_havePixels {false}
 
qint32 m_index {0}
 
qint32 m_left {0}
 
qint32 m_lineStride {0}
 
qint32 m_offsetX {0}
 
qint32 m_offsetY {0}
 
quint8 * m_oldData {nullptr}
 
QVector< KisTileInfom_tilesCache
 
qint32 m_tilesCacheSize {0}
 
qint32 m_tileSize {0}
 
qint32 m_top {0}
 
qint32 m_topInTopmostTile {0}
 
qint32 m_topRow {0}
 
qint32 m_x {0}
 
qint32 m_xInTile {0}
 
qint32 m_y {0}
 
- Private Attributes inherited from KisBaseIterator
KisTiledDataManagerm_dataManager
 
qint32 m_pixelSize
 
bool m_writable
 

Additional Inherited Members

- Protected Member Functions inherited from KisShared
 KisShared ()
 
 ~KisShared ()
 

Detailed Description

Definition at line 15 of file kis_vline_iterator.h.

Constructor & Destructor Documentation

◆ KisVLineIterator2() [1/2]

KisVLineIterator2::KisVLineIterator2 ( const KisVLineIterator2 & )
private

◆ KisVLineIterator2() [2/2]

KisVLineIterator2::KisVLineIterator2 ( KisDataManager * dataManager,
qint32 x,
qint32 y,
qint32 h,
qint32 offsetX,
qint32 offsetY,
bool writable,
KisIteratorCompleteListener * completeListener )

Definition at line 12 of file kis_vline_iterator.cpp.

13 : KisBaseIterator(dataManager, writable, completeListener),
14 m_offsetX(offsetX),
15 m_offsetY(offsetY)
16{
17 x -= m_offsetX;
18 y -= m_offsetY;
19 Q_ASSERT(dataManager != 0);
20
21 Q_ASSERT(h > 0); // for us, to warn us when abusing the iterators
22 if (h < 1) h = 1; // for release mode, to make sure there's always at least one pixel read.
23
25
26 m_x = x;
27 m_y = y;
28
29 m_top = y;
30 m_bottom = y + h - 1;
31
32 m_left = m_x;
33
34 m_havePixels = (h == 0) ? false : true;
35 if (m_top > m_bottom) {
36 m_havePixels = false;
37 return;
38 }
39
42
45
47
50
52
53 // let's preallocate first row
54 for (int i = 0; i < m_tilesCacheSize; i++){
56 }
57 m_index = 0;
59}
qint32 calcXInTile(qint32 x, qint32 col) const
KisBaseIterator(KisTiledDataManager *_dataManager, bool _writable, KisIteratorCompleteListener *listener)
quint32 yToRow(quint32 y) const
quint32 xToCol(quint32 x) const
static const qint32 HEIGHT
static const qint32 WIDTH
QVector< KisTileInfo > m_tilesCache
qint32 x() const override
void switchToTile(qint32 xInTile)
qint32 y() const override
void fetchTileDataForCache(KisTileInfo &kti, qint32 col, qint32 row)

References KisBaseIterator::calcXInTile(), fetchTileDataForCache(), KisTileData::HEIGHT, m_bottom, m_bottomRow, m_column, m_havePixels, m_index, m_left, m_lineStride, m_offsetX, m_offsetY, KisBaseIterator::m_pixelSize, m_tilesCache, m_tilesCacheSize, m_tileSize, m_top, m_topInTopmostTile, m_topRow, m_x, m_xInTile, m_y, switchToTile(), KisTileData::WIDTH, x(), KisBaseIterator::xToCol(), y(), and KisBaseIterator::yToRow().

◆ ~KisVLineIterator2()

KisVLineIterator2::~KisVLineIterator2 ( )
override

Definition at line 152 of file kis_vline_iterator.cpp.

153{
154 for (int i = 0; i < m_tilesCacheSize; i++) {
155 unlockTile(m_tilesCache[i].tile);
156 unlockOldTile(m_tilesCache[i].oldtile);
157 }
158}
void unlockOldTile(KisTileSP &tile)
void unlockTile(KisTileSP &tile)

References m_tilesCache, m_tilesCacheSize, KisBaseIterator::unlockOldTile(), and KisBaseIterator::unlockTile().

Member Function Documentation

◆ fetchTileDataForCache()

void KisVLineIterator2::fetchTileDataForCache ( KisTileInfo & kti,
qint32 col,
qint32 row )
private

Definition at line 194 of file kis_vline_iterator.cpp.

195{
196 m_dataManager->getTilesPair(col, row, m_writable, &kti.tile, &kti.oldtile);
197
198 lockTile(kti.tile);
199 kti.data = kti.tile->data();
200
201 lockOldTile(kti.oldtile);
202 kti.oldData = kti.oldtile->data();
203}
void lockOldTile(KisTileSP &tile)
void lockTile(KisTileSP &tile)
KisTiledDataManager * m_dataManager
void getTilesPair(qint32 col, qint32 row, bool writable, KisTileSP *tile, KisTileSP *oldTile)

References KisTile::data(), KisVLineIterator2::KisTileInfo::data, KisTiledDataManager::getTilesPair(), KisBaseIterator::lockOldTile(), KisBaseIterator::lockTile(), KisBaseIterator::m_dataManager, KisBaseIterator::m_writable, KisVLineIterator2::KisTileInfo::oldData, KisVLineIterator2::KisTileInfo::oldtile, and KisVLineIterator2::KisTileInfo::tile.

◆ nConseqPixels()

qint32 KisVLineIterator2::nConseqPixels ( ) const
overridevirtual
Returns
return number of consequential numbers of pixels, useful for optimization

Implements KisBaseConstIteratorNG.

Definition at line 123 of file kis_vline_iterator.cpp.

124{
125 return 1;
126}

◆ nextColumn()

void KisVLineIterator2::nextColumn ( )
overridevirtual

Move to the next row

Implements KisVLineConstIteratorNG.

Definition at line 104 of file kis_vline_iterator.cpp.

105{
106 m_y = m_top;
107 ++m_x;
108
110 /* do nothing, usual case */
111 } else {
112 ++m_column;
113 m_xInTile = 0;
115 }
116 m_index = 0;
118
119 m_havePixels = true;
120}

References KisTileData::HEIGHT, m_column, m_havePixels, m_index, m_top, m_topInTopmostTile, m_x, m_xInTile, m_y, preallocateTiles(), and switchToTile().

◆ nextPixel()

bool KisVLineIterator2::nextPixel ( )
overridevirtual

Move to the next pixel

Returns
false if there is no more pixel in the line

Implements KisBaseConstIteratorNG.

Definition at line 82 of file kis_vline_iterator.cpp.

83{
84 // We won't increment m_x here as integer can overflow here
85 if (m_y >= m_bottom) {
86 //return !m_isDoneFlag;
87 return m_havePixels = false;
88 } else {
89 ++m_y;
91 if (m_data < m_dataBottom)
93 else {
94 // Switching to the beginning of the next tile
95 ++m_index;
96 switchToTile(0);
97 }
98 }
99
100 return m_havePixels;
101}

References m_bottom, m_data, m_dataBottom, m_havePixels, m_index, m_lineStride, m_oldData, m_y, and switchToTile().

◆ nextPixels()

bool KisVLineIterator2::nextPixels ( qint32 n)
overridevirtual

Move to the next pixels

Implements KisBaseConstIteratorNG.

Definition at line 128 of file kis_vline_iterator.cpp.

129{
130 Q_ASSERT_X(!(m_y > 0 && (m_y + n) < 0), "vlineIt+=", "Integer overflow");
131
132 qint32 previousRow = yToRow(m_y);
133 // We won't increment m_x here first as integer can overflow
134 if (m_y >= m_bottom || (m_y += n) > m_bottom) {
135 m_havePixels = false;
136 } else {
137 qint32 row = yToRow(m_y);
138 // if we are in the same column in tiles
139 if (row == previousRow) {
140 m_data += n * m_pixelSize;
141 } else {
142 qint32 yInTile = calcYInTile(m_y, row);
143 m_index += row - previousRow;
144 switchToTile(yInTile);
145 }
146 }
147 return m_havePixels;
148}
qint32 calcYInTile(qint32 y, qint32 row) const

References KisBaseIterator::calcYInTile(), m_bottom, m_data, m_havePixels, m_index, KisBaseIterator::m_pixelSize, m_y, switchToTile(), and KisBaseIterator::yToRow().

◆ oldRawData()

const quint8 * KisVLineIterator2::oldRawData ( ) const
overridevirtual
Returns
a pointer to the pixel data as it was at the moment of the last memento creation.

Implements KisBaseConstAccessor.

Definition at line 167 of file kis_vline_iterator.cpp.

168{
169 return m_oldData;
170}

References m_oldData.

◆ operator=()

KisVLineIterator2 & KisVLineIterator2::operator= ( const KisVLineIterator2 & )
private

◆ preallocateTiles()

void KisVLineIterator2::preallocateTiles ( )
private

◆ rawData()

quint8 * KisVLineIterator2::rawData ( )
overridevirtual
Returns
a pointer to the pixel data. Do NOT interpret the data - leave that to a colorspace

Implements KisBaseAccessor.

Definition at line 161 of file kis_vline_iterator.cpp.

162{
163 return m_data;
164}

References m_data.

◆ rawDataConst()

const quint8 * KisVLineIterator2::rawDataConst ( ) const
overridevirtual
Returns
a pointer to the most actual pixel data, this points to the same data as rawData() method of a writable accessor.

Implements KisBaseConstAccessor.

Definition at line 172 of file kis_vline_iterator.cpp.

173{
174 return m_data;
175}

References m_data.

◆ resetColumnPos()

void KisVLineIterator2::resetColumnPos ( )
overridevirtual

◆ resetPixelPos()

void KisVLineIterator2::resetPixelPos ( )
overridevirtual

Implements KisVLineConstIteratorNG.

Definition at line 61 of file kis_vline_iterator.cpp.

62{
63 m_y = m_top;
64
65 m_index = 0;
67
68 m_havePixels = true;
69}

References m_havePixels, m_index, m_top, m_topInTopmostTile, m_y, and switchToTile().

◆ switchToTile()

void KisVLineIterator2::switchToTile ( qint32 xInTile)
private

Definition at line 177 of file kis_vline_iterator.cpp.

178{
179 // The caller must ensure that we are not out of bounds
180 Q_ASSERT(m_index < m_tilesCacheSize);
181 Q_ASSERT(m_index >= 0);
182
183 int offset_row = m_pixelSize * m_xInTile;
185 m_oldData = m_tilesCache[m_index].oldData;
186 m_data += offset_row;
188 int offset_col = m_pixelSize * yInTile * KisTileData::WIDTH;
189 m_data += offset_col;
190 m_oldData += offset_row + offset_col;
191}

References m_data, m_dataBottom, m_index, m_oldData, KisBaseIterator::m_pixelSize, m_tilesCache, m_tilesCacheSize, m_tileSize, m_xInTile, and KisTileData::WIDTH.

◆ x()

qint32 KisVLineIterator2::x ( ) const
overridevirtual

Implements KisBaseConstAccessor.

Definition at line 214 of file kis_vline_iterator.cpp.

215{
216 return m_x + m_offsetX;
217}

References m_offsetX, and m_x.

◆ y()

qint32 KisVLineIterator2::y ( ) const
overridevirtual

Implements KisBaseConstAccessor.

Definition at line 219 of file kis_vline_iterator.cpp.

220{
221 return m_y + m_offsetY;
222}

References m_offsetY, and m_y.

Member Data Documentation

◆ m_bottom

qint32 KisVLineIterator2::m_bottom {0}
private

Definition at line 60 of file kis_vline_iterator.h.

60{0};

◆ m_bottomRow

qint32 KisVLineIterator2::m_bottomRow {0}
private

Definition at line 63 of file kis_vline_iterator.h.

63{0};

◆ m_column

qint32 KisVLineIterator2::m_column {0}
private

Definition at line 51 of file kis_vline_iterator.h.

51{0}; // current column in tilemgr

◆ m_data

quint8* KisVLineIterator2::m_data {nullptr}
private

Definition at line 54 of file kis_vline_iterator.h.

54{nullptr};

◆ m_dataBottom

quint8* KisVLineIterator2::m_dataBottom {nullptr}
private

Definition at line 55 of file kis_vline_iterator.h.

55{nullptr};

◆ m_havePixels

bool KisVLineIterator2::m_havePixels {false}
private

Definition at line 57 of file kis_vline_iterator.h.

57{false};

◆ m_index

qint32 KisVLineIterator2::m_index {0}
private

Definition at line 52 of file kis_vline_iterator.h.

52{0}; // current row in tilemgr

◆ m_left

qint32 KisVLineIterator2::m_left {0}
private

Definition at line 61 of file kis_vline_iterator.h.

61{0};

◆ m_lineStride

qint32 KisVLineIterator2::m_lineStride {0}
private

Definition at line 67 of file kis_vline_iterator.h.

67{0};

◆ m_offsetX

qint32 KisVLineIterator2::m_offsetX {0}
private

Definition at line 46 of file kis_vline_iterator.h.

46{0};

◆ m_offsetY

qint32 KisVLineIterator2::m_offsetY {0}
private

Definition at line 47 of file kis_vline_iterator.h.

47{0};

◆ m_oldData

quint8* KisVLineIterator2::m_oldData {nullptr}
private

Definition at line 56 of file kis_vline_iterator.h.

56{nullptr};

◆ m_tilesCache

QVector<KisTileInfo> KisVLineIterator2::m_tilesCache
private

Definition at line 69 of file kis_vline_iterator.h.

◆ m_tilesCacheSize

qint32 KisVLineIterator2::m_tilesCacheSize {0}
private

Definition at line 70 of file kis_vline_iterator.h.

70{0};

◆ m_tileSize

qint32 KisVLineIterator2::m_tileSize {0}
private

Definition at line 53 of file kis_vline_iterator.h.

53{0};

◆ m_top

qint32 KisVLineIterator2::m_top {0}
private

Definition at line 59 of file kis_vline_iterator.h.

59{0};

◆ m_topInTopmostTile

qint32 KisVLineIterator2::m_topInTopmostTile {0}
private

Definition at line 65 of file kis_vline_iterator.h.

65{0};

◆ m_topRow

qint32 KisVLineIterator2::m_topRow {0}
private

Definition at line 62 of file kis_vline_iterator.h.

62{0};

◆ m_x

qint32 KisVLineIterator2::m_x {0}
private

Definition at line 49 of file kis_vline_iterator.h.

49{0}; // current x position

◆ m_xInTile

qint32 KisVLineIterator2::m_xInTile {0}
private

Definition at line 66 of file kis_vline_iterator.h.

66{0};

◆ m_y

qint32 KisVLineIterator2::m_y {0}
private

Definition at line 50 of file kis_vline_iterator.h.

50{0}; // current y position

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