Krita Source Code Documentation
Loading...
Searching...
No Matches
kis_painter_blt_multi_fixed.cpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2017 Dmitry Kazakov <dimula73@gmail.com>
3 *
4 * SPDX-License-Identifier: GPL-2.0-or-later
5 */
6
7#include "kis_painter.h"
8#include "kis_painter_p.h"
9
10#include "kis_paint_device.h"
13#include "KisRenderedDab.h"
14
15void KisPainter::Private::applyDevice(const QRect &applyRect,
16 const KisRenderedDab &dab,
18 const KoColorSpace *srcColorSpace,
19 KoCompositeOp::ParameterInfo &localParamInfo)
20{
21 const QRect dabRect = dab.realBounds();
22 const QRect rc = applyRect & dabRect;
23
24 const int srcPixelSize = srcColorSpace->pixelSize();
25 const int dabRowStride = srcPixelSize * dabRect.width();
26
27
28 qint32 dstY = rc.y();
29 qint32 rowsRemaining = rc.height();
30
31 while (rowsRemaining > 0) {
32 qint32 dstX = rc.x();
33
34 qint32 numContiguousDstRows = dstIt->numContiguousRows(dstY);
35 qint32 rows = qMin(rowsRemaining, numContiguousDstRows);
36
37 qint32 columnsRemaining = rc.width();
38
39 while (columnsRemaining > 0) {
40
41 qint32 numContiguousDstColumns = dstIt->numContiguousColumns(dstX);
42 qint32 columns = qMin(numContiguousDstColumns, columnsRemaining);
43
44 qint32 dstRowStride = dstIt->rowStride(dstX, dstY);
45 dstIt->moveTo(dstX, dstY);
46
47 localParamInfo.dstRowStart = dstIt->rawData();
48 localParamInfo.dstRowStride = dstRowStride;
49 localParamInfo.maskRowStart = 0;
50 localParamInfo.maskRowStride = 0;
51 localParamInfo.rows = rows;
52 localParamInfo.cols = columns;
53
54
55 const int dabX = dstX - dabRect.x();
56 const int dabY = dstY - dabRect.y();
57
58 localParamInfo.srcRowStart = dab.device->constData() + dabX * srcPixelSize + dabY * dabRowStride;
59 localParamInfo.srcRowStride = dabRowStride;
60 localParamInfo.setOpacityAndAverage(dab.opacity, dab.averageOpacity);
61 localParamInfo.flow = dab.flow;
62 colorSpace->bitBlt(srcColorSpace, localParamInfo, compositeOp(srcColorSpace), renderingIntent, conversionFlags);
63
64 dstX += columns;
65 columnsRemaining -= columns;
66 }
67
68 dstY += rows;
69 rowsRemaining -= rows;
70 }
71
72}
73
74void KisPainter::Private::applyDeviceWithSelection(const QRect &applyRect,
75 const KisRenderedDab &dab,
78 const KoColorSpace *srcColorSpace,
79 KoCompositeOp::ParameterInfo &localParamInfo)
80{
81 const QRect dabRect = dab.realBounds();
82 const QRect rc = applyRect & dabRect;
83
84 const int srcPixelSize = srcColorSpace->pixelSize();
85 const int dabRowStride = srcPixelSize * dabRect.width();
86
87
88 qint32 dstY = rc.y();
89 qint32 rowsRemaining = rc.height();
90
91 while (rowsRemaining > 0) {
92 qint32 dstX = rc.x();
93
94 qint32 numContiguousDstRows = dstIt->numContiguousRows(dstY);
95 qint32 numContiguousMaskRows = maskIt->numContiguousRows(dstY);
96 qint32 rows = qMin(rowsRemaining, qMin(numContiguousDstRows, numContiguousMaskRows));
97
98 qint32 columnsRemaining = rc.width();
99
100 while (columnsRemaining > 0) {
101
102 qint32 numContiguousDstColumns = dstIt->numContiguousColumns(dstX);
103 qint32 numContiguousMaskColumns = maskIt->numContiguousColumns(dstX);
104 qint32 columns = qMin(columnsRemaining, qMin(numContiguousDstColumns, numContiguousMaskColumns));
105
106 qint32 dstRowStride = dstIt->rowStride(dstX, dstY);
107 qint32 maskRowStride = maskIt->rowStride(dstX, dstY);
108 dstIt->moveTo(dstX, dstY);
109 maskIt->moveTo(dstX, dstY);
110
111 localParamInfo.dstRowStart = dstIt->rawData();
112 localParamInfo.dstRowStride = dstRowStride;
113 localParamInfo.maskRowStart = maskIt->rawDataConst();
114 localParamInfo.maskRowStride = maskRowStride;
115 localParamInfo.rows = rows;
116 localParamInfo.cols = columns;
117
118
119 const int dabX = dstX - dabRect.x();
120 const int dabY = dstY - dabRect.y();
121
122 localParamInfo.srcRowStart = dab.device->constData() + dabX * srcPixelSize + dabY * dabRowStride;
123 localParamInfo.srcRowStride = dabRowStride;
124 localParamInfo.setOpacityAndAverage(dab.opacity, dab.averageOpacity);
125 localParamInfo.flow = dab.flow;
126 colorSpace->bitBlt(srcColorSpace, localParamInfo, compositeOp(srcColorSpace), renderingIntent, conversionFlags);
127
128 dstX += columns;
129 columnsRemaining -= columns;
130 }
131
132 dstY += rows;
133 rowsRemaining -= rows;
134 }
135
136}
137
138void KisPainter::bltFixed(const QRect &applyRect, const QList<KisRenderedDab> allSrcDevices)
139{
140 const KoColorSpace *srcColorSpace = 0;
141 QList<KisRenderedDab> devices;
142 QRect rc = applyRect;
143
144 if (d->selection) {
145 rc &= d->selection->selectedRect();
146 }
147
148 QRect totalDevicesRect;
149
150 Q_FOREACH (const KisRenderedDab &dab, allSrcDevices) {
151 if (rc.intersects(dab.realBounds())) {
152 devices.append(dab);
153 totalDevicesRect |= dab.realBounds();
154 }
155
156 if (!srcColorSpace) {
157 srcColorSpace = dab.device->colorSpace();
158 } else {
159 KIS_SAFE_ASSERT_RECOVER_RETURN(*srcColorSpace == *dab.device->colorSpace());
160 }
161 }
162
163 rc &= totalDevicesRect;
164
165 if (devices.isEmpty() || rc.isEmpty()) return;
166
167 KoCompositeOp::ParameterInfo localParamInfo = d->paramInfo;
168 KisRandomAccessorSP dstIt = d->device->createRandomAccessorNG();
169 KisRandomConstAccessorSP maskIt = d->selection ? d->selection->projection()->createRandomConstAccessorNG() : 0;
170
171 if (maskIt) {
172 Q_FOREACH (const KisRenderedDab &dab, devices) {
173 d->applyDeviceWithSelection(rc, dab, dstIt, maskIt, srcColorSpace, localParamInfo);
174 }
175 } else {
176 Q_FOREACH (const KisRenderedDab &dab, devices) {
177 d->applyDevice(rc, dab, dstIt, srcColorSpace, localParamInfo);
178 }
179 }
180
181
182#if 0
183 // the code above does basically the same thing as this one,
184 // but more efficiently :)
185
186 Q_FOREACH (KisFixedPaintDeviceSP dev, devices) {
187 const QRect copyRect = dev->bounds() & rc;
188 if (copyRect.isEmpty()) continue;
189
190 bltFixed(copyRect.topLeft(), dev, copyRect);
191 }
192#endif
193}
194
virtual quint8 * rawData()=0
virtual const quint8 * rawDataConst() const =0
const quint8 * constData() const
const KoColorSpace * colorSpace() const
Private *const d
void bltFixed(qint32 dstX, qint32 dstY, const KisFixedPaintDeviceSP srcDev, qint32 srcX, qint32 srcY, qint32 srcWidth, qint32 srcHeight)
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
virtual quint32 pixelSize() const =0
#define KIS_SAFE_ASSERT_RECOVER_RETURN(cond)
Definition kis_assert.h:128
KisFixedPaintDeviceSP device
QRect realBounds() const
void setOpacityAndAverage(float _opacity, float _averageOpacity)