Krita Source Code Documentation
Loading...
Searching...
No Matches
kis_wrapped_line_iterator_base.h
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2013 Dmitry Kazakov <dimula73@gmail.com>
3 *
4 * SPDX-License-Identifier: GPL-2.0-or-later
5 */
6
7#ifndef __KIS_WRAPPED_LINE_ITERATOR_BASE_H
8#define __KIS_WRAPPED_LINE_ITERATOR_BASE_H
9
10
11template <class IteratorStrategy, class BaseClass>
12 class KisWrappedLineIteratorBase : public BaseClass
13{
14public:
16 const KisWrappedRect &splitRect,
17 qint32 offsetX, qint32 offsetY,
18 bool writable,
20 : m_splitRect(splitRect)
21 {
22 Q_ASSERT(m_splitRect.isSplit());
23
24 m_iterators.resize(4);
25 for (int i = 0; i < 4; i++) {
26 QRect rc = m_splitRect[i];
27 if (rc.isEmpty()) continue;
28
29 m_iterators[i] = m_strategy.createIterator(dataManager,
30 rc,
31 offsetX, offsetY,
32 writable,
33 listener);
34 }
35 m_strategy.completeInitialization(&m_iterators, &m_splitRect);
37 m_strategy.originalRectToColumnsRows(m_splitRect.originalRect());
38
39 m_currentIterator = m_strategy.leftColumnIterator();
40 }
41
42 bool nextPixel() {
43 int result = m_currentIterator->nextPixel();
44 if (!result) {
45 result = trySwitchColumn();
46 }
47
48 m_currentPos.rx()++;
49 return m_currentPos.rx() < m_iterationAreaSize.width();
50 }
51
52 bool nextPixels(qint32 n) {
53 int result = m_currentIterator->nextPixels(n);
54 if (!result) {
55 result = trySwitchColumn();
56 }
57
58 m_currentPos.rx() += n;
59 return m_currentPos.rx() < m_iterationAreaSize.width();
60 }
61
62 void nextRow() {
63 if (!m_strategy.trySwitchIteratorStripe()) {
64 m_strategy.iteratorsToNextRow();
65 }
66
67 m_currentIterator = m_strategy.leftColumnIterator();
68 m_currentPos.rx() = 0;
69 m_currentPos.ry()++;
70 }
71
72 void nextColumn() {
73 nextRow();
74 }
75
76 const quint8* oldRawData() const {
77 return m_currentIterator->oldRawData();
78 }
79
80 const quint8* rawDataConst() const {
81 return m_currentIterator->rawDataConst();
82 }
83
84 quint8* rawData() {
85 return m_currentIterator->rawData();
86 }
87
88 qint32 nConseqPixels() const {
89 qint32 iteratorChunk =
90 m_currentIterator->nConseqPixels();
91 return qMin(iteratorChunk,
92 m_iterationAreaSize.width() - m_currentPos.x());
93 }
94
95 qint32 x() const {
96 return (m_splitRect.originalRect().topLeft() +
97 m_strategy.columnRowToXY(m_currentPos)).x();
98 }
99
100 qint32 y() const {
101 return (m_splitRect.originalRect().topLeft() +
102 m_strategy.columnRowToXY(m_currentPos)).y();
103 }
104
106 errKrita << "CRITICAL: resetPixelPos() is not implemented";
107 }
108
109 void resetRowPos() {
110 errKrita << "CRITICAL: resetRowPos() is not implemented";
111 }
112
114 resetRowPos();
115 }
116
117private:
119 int result = true;
120
121 if (m_currentIterator == m_strategy.leftColumnIterator() &&
122 m_strategy.rightColumnIterator()) {
123
124 m_currentIterator = m_strategy.rightColumnIterator();
125
126 } else if (m_strategy.trySwitchColumnForced()) {
127
128 m_currentIterator = m_strategy.leftColumnIterator();
129
130 } else {
131 result = false;
132 }
133
134 return result;
135 }
136
137private:
138
140 QSize m_iterationAreaSize; // columns x rows
141 QPoint m_currentPos; // column, row
143 typename IteratorStrategy::IteratorTypeSP m_currentIterator;
144 IteratorStrategy m_strategy;
145};
146
147#endif /* __KIS_WRAPPED_LINE_ITERATOR_BASE_H */
IteratorStrategy::IteratorTypeSP m_currentIterator
KisWrappedLineIteratorBase(KisDataManager *dataManager, const KisWrappedRect &splitRect, qint32 offsetX, qint32 offsetY, bool writable, KisIteratorCompleteListener *listener)
QVector< typename IteratorStrategy::IteratorTypeSP > m_iterators
#define errKrita
Definition kis_debug.h:107
The KisIteratorCompleteListener struct is a special interface for notifying the paint device that an ...
bool isSplit() const
QRect originalRect() const