Krita Source Code Documentation
Loading...
Searching...
No Matches
kis_repeat_iterators_pixel.h
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2008 Cyrille Berger <cberger@cberger.net>
3 *
4 * SPDX-License-Identifier: GPL-2.0-or-later
5 */
6
7#ifndef _KIS_REPEAT_ITERATORS_PIXEL_H_
8#define _KIS_REPEAT_ITERATORS_PIXEL_H_
9
10#include <QRect>
11#include "kis_shared.h"
14
15template<class T>
17template<class T>
19
24template<class T>
26{
27 Q_DISABLE_COPY(KisRepeatLineIteratorPixelBase)
28public:
29
30 friend class KisRepeatHLineIteratorPixelBase<T>;
31 friend class KisRepeatVLineIteratorPixelBase<T>;
41 inline KisRepeatLineIteratorPixelBase(KisDataManager *dm, qint32 x, qint32 y, qint32 offsetx, qint32 offsety, const QRect& _rc, KisIteratorCompleteListener *completeListener);
42 virtual inline ~KisRepeatLineIteratorPixelBase();
43public:
44 inline qint32 x() const {
45 return m_realX;
46 }
47 inline qint32 y() const {
48 return m_realY;
49 }
50 inline const quint8 * oldRawData() const {
51 return m_iterator->oldRawData();
52 }
53
54private:
61};
62
67template<class T>
69{
70public:
81 inline KisRepeatHLineIteratorPixelBase(KisDataManager *dm, qint32 x, qint32 y, qint32 w, qint32 offsetx, qint32 offsety, const QRect& _rc, KisIteratorCompleteListener *completeListener);
82 inline ~KisRepeatHLineIteratorPixelBase() override;
83 inline bool nextPixel();
87 inline void nextRow();
88private:
89 void createIterator();
90private:
91 qint32 m_startX;
93 qint32 m_width;
94};
95
100template<class T>
102{
103public:
114 inline KisRepeatVLineIteratorPixelBase(KisDataManager *dm, qint32 x, qint32 y, qint32 h, qint32 offsetx, qint32 offsety, const QRect& _rc, KisIteratorCompleteListener *completeListener);
115 inline ~KisRepeatVLineIteratorPixelBase() override;
117 inline bool nextPixel();
121 inline void nextColumn();
122private:
123 void createIterator();
124private:
125 qint32 m_startY;
127 qint32 m_height;
128};
129
130//------------------------ Implementations ------------------------//
131
132//---------------- KisRepeatLineIteratorPixelBase -----------------//
133
134template<class T>
135KisRepeatLineIteratorPixelBase<T>::KisRepeatLineIteratorPixelBase(KisDataManager *dm, qint32 x, qint32 y, qint32 offsetx, qint32 offsety, const QRect& _rc, KisIteratorCompleteListener *completeListener) :
136 m_dm(dm),
137 m_realX(x), m_realY(y),
138 m_offsetX(offsetx), m_offsetY(offsety),
139 m_dataRect(_rc),
140 m_iterator(0),
141 m_completeListener(completeListener)
142{
143}
144
145template<class T>
150
151//---------------- KisRepeatHLineIteratorPixelBase ----------------//
152
153template<class T>
154KisRepeatHLineIteratorPixelBase<T>::KisRepeatHLineIteratorPixelBase(KisDataManager *dm, qint32 x, qint32 y, qint32 w, qint32 offsetx, qint32 offsety, const QRect& _rc, KisIteratorCompleteListener *completeListener)
155 : KisRepeatLineIteratorPixelBase<T>(dm, x, y, offsetx, offsety , _rc, completeListener),
156 m_startX(x), m_startIteratorX(x),
157 m_width(w)
158{
159 // Compute the startx value of the iterator
160 if (m_startIteratorX < _rc.left()) {
161 m_startIteratorX = _rc.left();
162 }
164}
165
166template<class T>
170
171template<class T>
173{
174 Q_ASSERT(this->m_iterator);
175 if (this->m_realX >= this->m_dataRect.x() && this->m_realX < this->m_dataRect.x() + this->m_dataRect.width() - 1) {
176 this->m_iterator->nextPixel();
177 }
178 ++this->m_realX;
179
180 return (this->m_realX < m_startX + m_width);
181}
182
183template<class T>
185{
186 if (this->m_realY >= this->m_dataRect.y() && this->m_realY < this->m_dataRect.y() + this->m_dataRect.height() - 1) {
187 this->m_iterator->nextRow();
188 } else {
189 createIterator();
190 }
191 this->m_realX = this->m_startX;
192 ++this->m_realY;
193}
194
195template<class T>
197{
198 // Cleanup
199 delete this->m_iterator;
200 qint32 startY = this->m_realY;
201 if (startY < this->m_dataRect.y()) {
202 startY = this->m_dataRect.top();
203 }
204 if (startY > (this->m_dataRect.y() + this->m_dataRect.height() - 1)) {
205 startY = (this->m_dataRect.y() + this->m_dataRect.height() - 1);
206 }
207
208 int width = this->m_dataRect.x() + this->m_dataRect.width() - this->m_startIteratorX;
209 this->m_iterator = new T(this->m_dm, this->m_startIteratorX, startY, width, this->m_offsetX, this->m_offsetY, false, this->m_completeListener);
210 this->m_realX = this->m_startX;
211}
212
213//---------------- KisRepeatVLineIteratorPixelBase ----------------//
214
215template<class T>
216KisRepeatVLineIteratorPixelBase<T>::KisRepeatVLineIteratorPixelBase(KisDataManager *dm, qint32 x, qint32 y, qint32 h, qint32 offsetx, qint32 offsety, const QRect& _rc, KisIteratorCompleteListener *completeListener)
217 : KisRepeatLineIteratorPixelBase<T>(dm, x, y, offsetx, offsety , _rc, completeListener),
218 m_startY(y), m_startIteratorY(y),
219 m_height(h)
220{
221 // Compute the startx value of the iterator
222 if (m_startIteratorY < _rc.top()) {
223 m_startIteratorY = _rc.top();
224 }
226}
227
228template<class T>
232
233template<class T>
235{
236 Q_ASSERT(this->m_iterator);
237 if (this->m_realY >= this->m_dataRect.y() && this->m_realY < this->m_dataRect.y() + this->m_dataRect.height() - 1) {
238 this->m_iterator->nextPixel();
239 }
240 ++this->m_realY;
241 return (this->m_realY < m_startY + m_height);
242
243}
244
245template<class T>
247{
248 if (this->m_realX >= this->m_dataRect.x() && this->m_realX < this->m_dataRect.x() + this->m_dataRect.width() - 1) {
249 this->m_iterator->nextColumn();
250 } else {
251 createIterator();
252 }
253 this->m_realY = this->m_startY;
254 ++this->m_realX;
255}
256
257template<class T>
259{
260 // Cleanup
261 delete this->m_iterator;
262 qint32 startX = this->m_realX;
263 if (startX < this->m_dataRect.x()) {
264 startX = this->m_dataRect.x();
265 }
266 if (startX > (this->m_dataRect.x() + this->m_dataRect.width() - 1)) {
267 startX = (this->m_dataRect.x() + this->m_dataRect.width() - 1);
268 }
269
270 int height = this->m_dataRect.y() + this->m_dataRect.height() - this->m_startIteratorY;
271 this->m_iterator = new T(this->m_dm, startX, this->m_startIteratorY, height, this->m_offsetX, this->m_offsetY, false, this->m_completeListener);
272 this->m_realY = this->m_startY;
273}
274
275
276#endif
KisRepeatHLineIteratorPixelBase(KisDataManager *dm, qint32 x, qint32 y, qint32 w, qint32 offsetx, qint32 offsety, const QRect &_rc, KisIteratorCompleteListener *completeListener)
KisIteratorCompleteListener * m_completeListener
KisRepeatLineIteratorPixelBase(KisDataManager *dm, qint32 x, qint32 y, qint32 offsetx, qint32 offsety, const QRect &_rc, KisIteratorCompleteListener *completeListener)
KisRepeatVLineIteratorPixelBase(KisDataManager *dm, qint32 x, qint32 y, qint32 h, qint32 offsetx, qint32 offsety, const QRect &_rc, KisIteratorCompleteListener *completeListener)
KisRepeatVLineIteratorPixelBase< T > & operator++()
The KisIteratorCompleteListener struct is a special interface for notifying the paint device that an ...