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

#include <kis_hline_iterator.h>

+ Inheritance diagram for KisHLineIterator2:

Classes

struct  KisTileInfo
 

Public Member Functions

 KisHLineIterator2 (KisDataManager *dataManager, qint32 x, qint32 y, qint32 w, qint32 offsetX, qint32 offsetY, bool writable, KisIteratorCompleteListener *listener)
 
qint32 nConseqPixels () const override
 
bool nextPixel () override
 
bool nextPixels (qint32 n) override
 
void nextRow () override
 
const quint8 * oldRawData () const override
 
quint8 * rawData () override
 
const quint8 * rawDataConst () const override
 
void resetPixelPos () override
 
void resetRowPos () override
 
qint32 x () const override
 
qint32 y () const override
 
 ~KisHLineIterator2 () override
 
- Public Member Functions inherited from KisHLineIteratorNG
 KisHLineIteratorNG ()
 
 ~KisHLineIteratorNG () override
 
- Public Member Functions inherited from KisHLineConstIteratorNG
 KisHLineConstIteratorNG ()
 
 ~KisHLineConstIteratorNG () 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)
 
 KisHLineIterator2 (const KisHLineIterator2 &)
 
KisHLineIterator2operator= (const KisHLineIterator2 &)
 
void preallocateTiles ()
 
void switchToTile (qint32 xInTile)
 

Private Attributes

quint8 * m_data {nullptr}
 
bool m_havePixels {false}
 
quint32 m_index {0}
 
qint32 m_left {0}
 
qint32 m_leftCol {0}
 
qint32 m_leftInLeftmostTile {0}
 
qint32 m_offsetX {0}
 
qint32 m_offsetY {0}
 
quint8 * m_oldData {nullptr}
 
qint32 m_right {0}
 
qint32 m_rightCol {0}
 
qint32 m_rightmostInTile {0}
 
qint32 m_row {0}
 
QVector< KisTileInfom_tilesCache
 
quint32 m_tilesCacheSize {0}
 
quint32 m_tileWidth {0}
 
qint32 m_top {0}
 
qint32 m_x {0}
 
qint32 m_y {0}
 
qint32 m_yInTile {0}
 

Additional Inherited Members

- Protected Member Functions inherited from KisShared
 KisShared ()
 
 ~KisShared ()
 
- Protected 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 ()
 
- Protected Attributes inherited from KisBaseIterator
KisTiledDataManagerm_dataManager
 
qint32 m_pixelSize
 
bool m_writable
 

Detailed Description

Definition at line 14 of file kis_hline_iterator.h.

Constructor & Destructor Documentation

◆ KisHLineIterator2() [1/2]

KisHLineIterator2::KisHLineIterator2 ( const KisHLineIterator2 & )
private

◆ KisHLineIterator2() [2/2]

KisHLineIterator2::KisHLineIterator2 ( KisDataManager * dataManager,
qint32 x,
qint32 y,
qint32 w,
qint32 offsetX,
qint32 offsetY,
bool writable,
KisIteratorCompleteListener * listener )

Definition at line 10 of file kis_hline_iterator.cpp.

11 : KisBaseIterator(dataManager, writable, completionListener),
12 m_offsetX(offsetX),
13 m_offsetY(offsetY)
14{
15 x -= m_offsetX;
16 y -= m_offsetY;
17 Q_ASSERT(dataManager);
18
19 if (w < 1) w = 1; // To make sure there's always at least one pixel read.
20
21 m_x = x;
22 m_y = y;
23
24 m_left = x;
25 m_right = x + w - 1;
26
27 m_top = y;
28
29 m_havePixels = (w == 0) ? false : true;
30 if (m_left > m_right) {
31 m_havePixels = false;
32 return;
33 }
34
37
38 m_row = yToRow(m_y);
40
42
45
47
48 // let's preallocate first row
49 for (quint32 i = 0; i < m_tilesCacheSize; i++){
51 }
52 m_index = 0;
54}
KisBaseIterator(KisTiledDataManager *_dataManager, bool _writable, KisIteratorCompleteListener *listener)
quint32 yToRow(quint32 y) const
qint32 calcYInTile(qint32 y, qint32 row) const
quint32 xToCol(quint32 x) const
QVector< KisTileInfo > m_tilesCache
void fetchTileDataForCache(KisTileInfo &kti, qint32 col, qint32 row)
qint32 x() const override
void switchToTile(qint32 xInTile)
qint32 y() const override
static const qint32 HEIGHT
static const qint32 WIDTH

References KisBaseIterator::calcYInTile(), fetchTileDataForCache(), KisTileData::HEIGHT, m_havePixels, m_index, m_left, m_leftCol, m_leftInLeftmostTile, m_offsetX, m_offsetY, KisBaseIterator::m_pixelSize, m_right, m_rightCol, m_row, m_tilesCache, m_tilesCacheSize, m_tileWidth, m_top, m_x, m_y, m_yInTile, switchToTile(), KisTileData::WIDTH, x(), KisBaseIterator::xToCol(), y(), and KisBaseIterator::yToRow().

◆ ~KisHLineIterator2()

KisHLineIterator2::~KisHLineIterator2 ( )
override

Definition at line 149 of file kis_hline_iterator.cpp.

150{
151 for (uint i = 0; i < m_tilesCacheSize; i++) {
152 unlockTile(m_tilesCache[i].tile);
153 unlockOldTile(m_tilesCache[i].oldtile);
154 }
155}
unsigned int uint
void unlockOldTile(KisTileSP &tile)
void unlockTile(KisTileSP &tile)

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

Member Function Documentation

◆ fetchTileDataForCache()

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

Definition at line 191 of file kis_hline_iterator.cpp.

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

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

◆ nConseqPixels()

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

Implements KisBaseConstIteratorNG.

Definition at line 118 of file kis_hline_iterator.cpp.

119{
120 return qMin(m_rightmostInTile, m_right) - m_x + 1;
121}

References m_right, m_rightmostInTile, and m_x.

◆ nextPixel()

bool KisHLineIterator2::nextPixel ( )
overridevirtual

Move to the next pixel

Returns
false if there is no more pixel in the line

Implements KisBaseConstIteratorNG.

Definition at line 77 of file kis_hline_iterator.cpp.

78{
79 // We won't increment m_x here as integer can overflow here
80 if (m_x >= m_right) {
81 //return !m_isDoneFlag;
82 return m_havePixels = false;
83 } else {
84 ++m_x;
88 else {
89 // Switching to the beginning of the next tile
90 ++m_index;
91 switchToTile(0);
92 }
93 }
94
95 return m_havePixels;
96}

References m_data, m_havePixels, m_index, m_oldData, KisBaseIterator::m_pixelSize, m_right, m_rightmostInTile, m_x, and switchToTile().

◆ nextPixels()

bool KisHLineIterator2::nextPixels ( qint32 n)
overridevirtual

Move to the next pixels

Implements KisBaseConstIteratorNG.

Definition at line 125 of file kis_hline_iterator.cpp.

126{
127 Q_ASSERT_X(!(m_x > 0 && (m_x + n) < 0), "hlineIt+=", "Integer overflow");
128
129 qint32 previousCol = xToCol(m_x);
130 // We won't increment m_x here first as integer can overflow
131 if (m_x >= m_right || (m_x += n) > m_right) {
132 m_havePixels = false;
133 } else {
134 qint32 col = xToCol(m_x);
135 // if we are in the same column in tiles
136 if (col == previousCol) {
137 m_data += n * m_pixelSize;
138 } else {
139 qint32 xInTile = calcXInTile(m_x, col);
140 m_index += col - previousCol;
141 switchToTile(xInTile);
142 }
143 }
144 return m_havePixels;
145}
qint32 calcXInTile(qint32 x, qint32 col) const

References KisBaseIterator::calcXInTile(), m_data, m_havePixels, m_index, KisBaseIterator::m_pixelSize, m_right, m_x, switchToTile(), and KisBaseIterator::xToCol().

◆ nextRow()

void KisHLineIterator2::nextRow ( )
overridevirtual

Move to the next row

Implements KisHLineConstIteratorNG.

Definition at line 99 of file kis_hline_iterator.cpp.

100{
101 m_x = m_left;
102 ++m_y;
103
105 /* do nothing, usual case */
106 } else {
107 ++m_row;
108 m_yInTile = 0;
110 }
111 m_index = 0;
113
114 m_havePixels = true;
115}

References KisTileData::HEIGHT, m_havePixels, m_index, m_left, m_leftInLeftmostTile, m_row, m_x, m_y, m_yInTile, preallocateTiles(), and switchToTile().

◆ oldRawData()

const quint8 * KisHLineIterator2::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 164 of file kis_hline_iterator.cpp.

165{
166 return m_oldData;
167}

References m_oldData.

◆ operator=()

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

◆ preallocateTiles()

void KisHLineIterator2::preallocateTiles ( )
private

◆ rawData()

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

Implements KisBaseAccessor.

Definition at line 158 of file kis_hline_iterator.cpp.

159{
160 return m_data;
161}

References m_data.

◆ rawDataConst()

const quint8 * KisHLineIterator2::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 169 of file kis_hline_iterator.cpp.

170{
171 return m_data;
172}

References m_data.

◆ resetPixelPos()

void KisHLineIterator2::resetPixelPos ( )
overridevirtual

Implements KisHLineConstIteratorNG.

Definition at line 56 of file kis_hline_iterator.cpp.

57{
58 m_x = m_left;
59
60 m_index = 0;
62
63 m_havePixels = true;
64}

References m_havePixels, m_index, m_left, m_leftInLeftmostTile, m_x, and switchToTile().

◆ resetRowPos()

void KisHLineIterator2::resetRowPos ( )
overridevirtual

◆ switchToTile()

void KisHLineIterator2::switchToTile ( qint32 xInTile)
private

Definition at line 174 of file kis_hline_iterator.cpp.

175{
176 // The caller must ensure that we are not out of bounds
177 Q_ASSERT(m_index < m_tilesCacheSize);
178
180 m_oldData = m_tilesCache[m_index].oldData;
181
182 int offset_row = m_pixelSize * (m_yInTile * KisTileData::WIDTH);
183 m_data += offset_row;
185 int offset_col = m_pixelSize * xInTile;
186 m_data += offset_col;
187 m_oldData += offset_row + offset_col;
188}

References m_data, m_index, m_leftCol, m_oldData, KisBaseIterator::m_pixelSize, m_rightmostInTile, m_tilesCache, m_tilesCacheSize, m_yInTile, and KisTileData::WIDTH.

◆ x()

qint32 KisHLineIterator2::x ( ) const
overridevirtual

Implements KisBaseConstAccessor.

Definition at line 211 of file kis_hline_iterator.cpp.

212{
213 return m_x + m_offsetX;
214}

References m_offsetX, and m_x.

◆ y()

qint32 KisHLineIterator2::y ( ) const
overridevirtual

Implements KisBaseConstAccessor.

Definition at line 216 of file kis_hline_iterator.cpp.

217{
218 return m_y + m_offsetY;
219}

References m_offsetY, and m_y.

Member Data Documentation

◆ m_data

quint8* KisHLineIterator2::m_data {nullptr}
private

Definition at line 53 of file kis_hline_iterator.h.

53{nullptr};

◆ m_havePixels

bool KisHLineIterator2::m_havePixels {false}
private

Definition at line 55 of file kis_hline_iterator.h.

55{false};

◆ m_index

quint32 KisHLineIterator2::m_index {0}
private

Definition at line 51 of file kis_hline_iterator.h.

51{0}; // current col in tilemgr

◆ m_left

qint32 KisHLineIterator2::m_left {0}
private

Definition at line 58 of file kis_hline_iterator.h.

58{0};

◆ m_leftCol

qint32 KisHLineIterator2::m_leftCol {0}
private

Definition at line 60 of file kis_hline_iterator.h.

60{0};

◆ m_leftInLeftmostTile

qint32 KisHLineIterator2::m_leftInLeftmostTile {0}
private

Definition at line 65 of file kis_hline_iterator.h.

65{0};

◆ m_offsetX

qint32 KisHLineIterator2::m_offsetX {0}
private

Definition at line 45 of file kis_hline_iterator.h.

45{0};

◆ m_offsetY

qint32 KisHLineIterator2::m_offsetY {0}
private

Definition at line 46 of file kis_hline_iterator.h.

46{0};

◆ m_oldData

quint8* KisHLineIterator2::m_oldData {nullptr}
private

Definition at line 54 of file kis_hline_iterator.h.

54{nullptr};

◆ m_right

qint32 KisHLineIterator2::m_right {0}
private

Definition at line 57 of file kis_hline_iterator.h.

57{0};

◆ m_rightCol

qint32 KisHLineIterator2::m_rightCol {0}
private

Definition at line 61 of file kis_hline_iterator.h.

61{0};

◆ m_rightmostInTile

qint32 KisHLineIterator2::m_rightmostInTile {0}
private

Definition at line 63 of file kis_hline_iterator.h.

63{0}; // limited by the current tile border only

◆ m_row

qint32 KisHLineIterator2::m_row {0}
private

Definition at line 50 of file kis_hline_iterator.h.

50{0}; // current row in tilemgr

◆ m_tilesCache

QVector<KisTileInfo> KisHLineIterator2::m_tilesCache
private

Definition at line 68 of file kis_hline_iterator.h.

◆ m_tilesCacheSize

quint32 KisHLineIterator2::m_tilesCacheSize {0}
private

Definition at line 69 of file kis_hline_iterator.h.

69{0};

◆ m_tileWidth

quint32 KisHLineIterator2::m_tileWidth {0}
private

Definition at line 52 of file kis_hline_iterator.h.

52{0};

◆ m_top

qint32 KisHLineIterator2::m_top {0}
private

Definition at line 59 of file kis_hline_iterator.h.

59{0};

◆ m_x

qint32 KisHLineIterator2::m_x {0}
private

Definition at line 48 of file kis_hline_iterator.h.

48{0}; // current x position

◆ m_y

qint32 KisHLineIterator2::m_y {0}
private

Definition at line 49 of file kis_hline_iterator.h.

49{0}; // current y position

◆ m_yInTile

qint32 KisHLineIterator2::m_yInTile {0}
private

Definition at line 66 of file kis_hline_iterator.h.

66{0};

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