Krita Source Code Documentation
Loading...
Searching...
No Matches
KisFastDeviceProcessingUtils.h
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2018 Dmitry Kazakov <dimula73@gmail.com>
3 *
4 * SPDX-License-Identifier: GPL-2.0-or-later
5 */
6
7#ifndef KISFASTDEVICEPROCESSINGUTILS_H
8#define KISFASTDEVICEPROCESSINGUTILS_H
9
11#include <KoAlwaysInline.h>
12
13namespace KritaUtils {
14
15
21template <class PixelProcessor>
22void processTwoDevices(const QRect &rc,
25 const int srcPixelSize,
26 const int dstPixelSize,
27 PixelProcessor pixelProcessor)
28{
29 qint32 dstY = rc.y();
30 qint32 rowsRemaining = rc.height();
31
32 while (rowsRemaining > 0) {
33 qint32 dstX = rc.x();
34
35 qint32 numContiguousSrcRows = srcIt->numContiguousRows(dstY);
36 qint32 numContiguousDstRows = dstIt->numContiguousRows(dstY);
37 qint32 rows = std::min({rowsRemaining, numContiguousSrcRows, numContiguousDstRows});
38
39 qint32 columnsRemaining = rc.width();
40
41 while (columnsRemaining > 0) {
42
43 qint32 numContiguousSrcColumns = srcIt->numContiguousColumns(dstX);
44 qint32 numContiguousDstColumns = dstIt->numContiguousColumns(dstX);
45 qint32 columns = std::min({columnsRemaining, numContiguousSrcColumns, numContiguousDstColumns});
46
47 qint32 dstRowStride = dstIt->rowStride(dstX, dstY);
48 qint32 srcRowStride = srcIt->rowStride(dstX, dstY);
49
50 dstIt->moveTo(dstX, dstY);
51 srcIt->moveTo(dstX, dstY);
52
53 quint8 *dstRowStart = dstIt->rawData();
54 const quint8 *srcRowStart = srcIt->rawDataConst();
55
56 for (int i = 0; i < rows; i++) {
57 const quint8 *srcPtr = reinterpret_cast<const quint8*>(srcRowStart);
58 quint8 *dstPtr = reinterpret_cast<quint8*>(dstRowStart);
59
60 for (int j = 0; j < columns; j++) {
61 pixelProcessor(srcPtr, dstPtr);
62
63 srcPtr += srcPixelSize;
64 dstPtr += dstPixelSize;
65 }
66
67 srcRowStart += srcRowStride;
68 dstRowStart += dstRowStride;
69 }
70
71 dstX += columns;
72 columnsRemaining -= columns;
73 }
74
75 dstY += rows;
76 rowsRemaining -= rows;
77 }
78}
79
85template <class PixelProcessor>
86void processTwoDevicesWithStrides(const QRect &rc,
89 PixelProcessor pixelProcessor)
90{
91 qint32 dstY = rc.y();
92 qint32 rowsRemaining = rc.height();
93
94 while (rowsRemaining > 0) {
95 qint32 dstX = rc.x();
96
97 qint32 numContiguousSrcRows = srcIt->numContiguousRows(dstY);
98 qint32 numContiguousDstRows = dstIt->numContiguousRows(dstY);
99 qint32 rows = std::min({rowsRemaining, numContiguousSrcRows, numContiguousDstRows});
100
101 qint32 columnsRemaining = rc.width();
102
103 while (columnsRemaining > 0) {
104
105 qint32 numContiguousSrcColumns = srcIt->numContiguousColumns(dstX);
106 qint32 numContiguousDstColumns = dstIt->numContiguousColumns(dstX);
107 qint32 columns = std::min({columnsRemaining, numContiguousSrcColumns, numContiguousDstColumns});
108
109 qint32 dstRowStride = dstIt->rowStride(dstX, dstY);
110 qint32 srcRowStride = srcIt->rowStride(dstX, dstY);
111
112 dstIt->moveTo(dstX, dstY);
113 srcIt->moveTo(dstX, dstY);
114
115 quint8 *dstRowStart = dstIt->rawData();
116 const quint8 *srcRowStart = srcIt->rawDataConst();
117
118 pixelProcessor(srcRowStart, srcRowStride,
119 dstRowStart, dstRowStride,
120 rows, columns);
121
122 dstX += columns;
123 columnsRemaining -= columns;
124 }
125
126 dstY += rows;
127 rowsRemaining -= rows;
128 }
129}
130
131}
132
133
134#endif // KISFASTDEVICEPROCESSINGUTILS_H
virtual quint8 * rawData()=0
virtual const quint8 * rawDataConst() const =0
virtual qint32 rowStride(qint32 x, qint32 y) const =0
virtual qint32 numContiguousRows(qint32 y) const =0
virtual void moveTo(qint32 x, qint32 y)=0
virtual qint32 numContiguousColumns(qint32 x) const =0
void processTwoDevices(const QRect &rc, KisRandomConstAccessorSP srcIt, KisRandomAccessorSP dstIt, const int srcPixelSize, const int dstPixelSize, PixelProcessor pixelProcessor)
void processTwoDevicesWithStrides(const QRect &rc, KisRandomConstAccessorSP srcIt, KisRandomAccessorSP dstIt, PixelProcessor pixelProcessor)