13 qint32 width, qint32 height,
18 width = width < 0 ? 0 : width;
19 height = height < 0 ? 0 : height;
23 qint32 rowsRemaining = height;
26 if (dataRowStride <= 0) {
30 while (rowsRemaining > 0) {
34 qint32 columnsRemaining = width;
38 qint32 rowsToWork = qMin(numContiguousImageRows, rowsRemaining);
40 while (columnsRemaining > 0) {
42 qint32 numContiguousImageColumns =
44 imageY + rowsToWork - 1);
46 qint32 columnsToWork = qMin(numContiguousImageColumns,
50 quint8 *tileIt = tw.
data();
53 const qint32 tileRowStride =
rowStride(imageX, imageY);
55 const quint8 *dataIt = data +
56 dataX *
pixelSize + dataY * dataRowStride;
58 const qint32 lineSize = columnsToWork *
pixelSize;
60 for (qint32 row = 0; row < rowsToWork; row++) {
61 memcpy(tileIt, dataIt, lineSize);
62 tileIt += tileRowStride;
63 dataIt += dataRowStride;
66 imageX += columnsToWork;
67 dataX += columnsToWork;
68 columnsRemaining -= columnsToWork;
73 rowsRemaining -= rowsToWork;
80 qint32 width, qint32 height,
81 qint32 dataRowStride)
const
85 width = width < 0 ? 0 : width;
86 height = height < 0 ? 0 : height;
90 qint32 rowsRemaining = height;
93 if (dataRowStride <= 0) {
97 while (rowsRemaining > 0) {
101 qint32 columnsRemaining = width;
105 qint32 rowsToWork = qMin(numContiguousImageRows, rowsRemaining);
107 while (columnsRemaining > 0) {
110 imageY + rowsToWork - 1);
112 qint32 columnsToWork = qMin(numContiguousImageColumns,
117 quint8 *tileIt = tw.
data();
120 const qint32 tileRowStride =
rowStride(imageX, imageY);
122 quint8 *dataIt = data +
123 dataX *
pixelSize + dataY * dataRowStride;
125 const qint32 lineSize = columnsToWork *
pixelSize;
127 for (qint32 row = 0; row < rowsToWork; row++) {
128 memcpy(dataIt, tileIt, lineSize);
129 tileIt += tileRowStride;
130 dataIt += dataRowStride;
133 imageX += columnsToWork;
134 dataX += columnsToWork;
135 columnsRemaining -= columnsToWork;
138 imageY += rowsToWork;
140 rowsRemaining -= rowsToWork;
154 qint32 width, qint32 height)
156 Q_ASSERT(planes.size() == channelSizes.size());
157 Q_ASSERT(planes.size() > 0);
159 width = width < 0 ? 0 : width;
160 height = height < 0 ? 0 : height;
162 const qint32 numChannels = planes.size();
167 qint32 rowsRemaining = height;
169 while (rowsRemaining > 0) {
173 qint32 columnsRemaining = width;
177 qint32 rowsToWork = qMin(numContiguousImageRows, rowsRemaining);
179 while (columnsRemaining > 0) {
181 qint32 numContiguousImageColumns =
183 imageY + rowsToWork - 1);
184 qint32 columnsToWork = qMin(numContiguousImageColumns,
187 const qint32 dataIdx = dataX + dataY * width;
188 const qint32 tileRowStride =
rowStride(imageX, imageY) -
193 quint8 *tileItStart = tw.
data();
197 if (allChannelsPresent || planes[i]) {
198 const quint8* planeIt = planes[i] + dataIdx * channelSize;
199 qint32 dataStride = (width - columnsToWork) * channelSize;
200 quint8* tileIt = tileItStart;
202 for (qint32 row = 0; row < rowsToWork; row++) {
203 for (
int col = 0; col < columnsToWork; col++) {
204 memcpy(tileIt, planeIt, channelSize);
206 planeIt += channelSize;
209 tileIt += tileRowStride;
210 planeIt += dataStride;
214 tileItStart += channelSize;
217 imageX += columnsToWork;
218 dataX += columnsToWork;
219 columnsRemaining -= columnsToWork;
223 imageY += rowsToWork;
225 rowsRemaining -= rowsToWork;
231 qint32 width, qint32 height)
const
233 Q_ASSERT(channelSizes.size() > 0);
235 width = width < 0 ? 0 : width;
236 height = height < 0 ? 0 : height;
238 const qint32 numChannels = channelSizes.size();
243 planes.append(
new quint8[width * height * channelSize]);
248 qint32 rowsRemaining = height;
250 while (rowsRemaining > 0) {
254 qint32 columnsRemaining = width;
258 qint32 rowsToWork = qMin(numContiguousImageRows, rowsRemaining);
260 while (columnsRemaining > 0) {
262 qint32 numContiguousImageColumns =
264 imageY + rowsToWork - 1);
265 qint32 columnsToWork = qMin(numContiguousImageColumns,
268 const qint32 dataIdx = dataX + dataY * width;
269 const qint32 tileRowStride =
rowStride(imageX, imageY) -
275 quint8 *tileItStart = tw.
data();
279 quint8* planeIt = planes[i] + dataIdx * channelSize;
280 qint32 dataStride = (width - columnsToWork) * channelSize;
281 quint8* tileIt = tileItStart;
283 for (qint32 row = 0; row < rowsToWork; row++) {
284 for (
int col = 0; col < columnsToWork; col++) {
285 memcpy(planeIt, tileIt, channelSize);
287 planeIt += channelSize;
290 tileIt += tileRowStride;
291 planeIt += dataStride;
293 tileItStart += channelSize;
296 imageX += columnsToWork;
297 dataX += columnsToWork;
298 columnsRemaining -= columnsToWork;
302 imageY += rowsToWork;
304 rowsRemaining -= rowsToWork;