57 quint32 channelCount = src->colorSpace()->channelCount();
63 for (quint32 r = 0; r < kernel->
height(); r++) {
64 for (quint32 c = 0; c < kernel->
width(); c++) {
65 *kernelDataPtr = (*(kernel->
data()))(r, c);
73 dstPos += r.topLeft() - srcPos;
78 if (areaSize.width() == 0 || areaSize.height() == 0)
82 Q_ASSERT((
m_kw & 0x01) == 1 || (
m_kh & 0x01) == 1 || kernel->
factor() != 0);
96 if (hasProgressUpdater)
108 enum TraversingDirection { Horizontal, Vertical };
109 TraversingDirection traversingDirection = Vertical;
111 traversingDirection = Horizontal;
133 qint32 row = srcPos.y();
134 qint32 col = srcPos.x();
138 typename _IteratorFactory_::HLineConstIterator hitInitSrc = _IteratorFactory_::createHLineConstIterator(src, col -
m_khalfWidth, row -
m_khalfHeight,
m_kw, dataRect);
140 for (quint32 krow = 0; krow <
m_kh; ++krow) {
142 const quint8* data = hitInitSrc->oldRawData();
145 }
while (hitInitSrc->nextPixel());
146 hitInitSrc->nextRow();
150 if (traversingDirection == Horizontal) {
151 if(hasProgressUpdater) {
154 typename _IteratorFactory_::HLineIterator hitDst = _IteratorFactory_::createHLineIterator(this->
m_painter->
device(), dstPos.x(), dstPos.y(), areaSize.width(), dataRect);
155 typename _IteratorFactory_::HLineConstIterator hitSrc = _IteratorFactory_::createHLineConstIterator(src, srcPos.x(), srcPos.y(), areaSize.width(), dataRect);
157 typename _IteratorFactory_::HLineConstIterator khitSrc = _IteratorFactory_::createHLineConstIterator(src, col -
m_khalfWidth, row +
m_khalfHeight,
m_kw, dataRect);
158 for (
int prow = 0; prow < areaSize.height(); ++prow) {
163 typename _IteratorFactory_::VLineConstIterator kitSrc = _IteratorFactory_::createVLineConstIterator(src, col +
m_khalfWidth, row -
m_khalfHeight,
m_kh, dataRect);
164 for (
int pcol = 0; pcol < areaSize.width(); ++pcol) {
166 memcpy(hitDst->rawData(), hitSrc->oldRawData(),
m_pixelSize);
170 kitSrc->nextColumn();
184 if (hasProgressUpdater) {
195 if(hasProgressUpdater) {
198 typename _IteratorFactory_::VLineIterator vitDst = _IteratorFactory_::createVLineIterator(this->
m_painter->
device(), dstPos.x(), dstPos.y(), areaSize.height(), dataRect);
199 typename _IteratorFactory_::VLineConstIterator vitSrc = _IteratorFactory_::createVLineConstIterator(src, srcPos.x(), srcPos.y(), areaSize.height(), dataRect);
201 typename _IteratorFactory_::VLineConstIterator kitSrc = _IteratorFactory_::createVLineConstIterator(src, col +
m_khalfWidth, row -
m_khalfHeight,
m_kh, dataRect);
202 for (
int pcol = 0; pcol < areaSize.width(); pcol++) {
207 typename _IteratorFactory_::HLineConstIterator khitSrc = _IteratorFactory_::createHLineConstIterator(src, col -
m_khalfWidth, row +
m_khalfHeight,
m_kw, dataRect);
208 for (
int prow = 0; prow < areaSize.height(); prow++) {
210 memcpy(vitDst->rawData(), vitSrc->oldRawData(),
m_pixelSize);
221 kitSrc->nextColumn();
222 vitDst->nextColumn();
223 vitSrc->nextColumn();
228 if (hasProgressUpdater) {
252 qreal interimConvoResult = 0;
254 for (quint32 pIndex = 0; pIndex <
m_cacheSize; ++pIndex) {
259 qreal channelPixelValue;
260 if (additionalMultiplierActive) {
271 return channelPixelValue;
276 qreal alphaValue = convolveOneChannelFromCache<false>(dstPtr,
m_alphaCachePos);
283 if (alphaValue != 0.0) {
284 qreal alphaValueInv = 1.0 / alphaValue;
288 convolveOneChannelFromCache<true>(dstPtr, k, alphaValueInv);
294 const qreal zeroValue = 0.0;
301 convolveOneChannelFromCache<false>(dstPtr, k);
306 inline void moveKernelRight(
typename _IteratorFactory_::VLineConstIterator& kitSrc, qreal **pixelPtrCache) {
307 qreal** d = pixelPtrCache;
309 for (quint32 krow = 0; krow <
m_kh; ++krow) {
311 memmove(d, d + 1, (
m_kw - 1) *
sizeof(qreal *));
312 *(d +
m_kw - 1) = first;
318 const quint8* data = kitSrc->oldRawData();
321 }
while (kitSrc->nextPixel());
324 inline void moveKernelDown(
typename _IteratorFactory_::HLineConstIterator& kitSrc, qreal **pixelPtrCache) {
325 quint8 **
tmp =
new quint8*[
m_kw];
326 memcpy(
tmp, pixelPtrCache,
m_kw *
sizeof(qreal *));
327 memmove(pixelPtrCache, pixelPtrCache +
m_kw, (
m_kw *
m_kh -
m_kw) *
sizeof(quint8 *));
328 memcpy(pixelPtrCache +
m_kw *(
m_kh - 1),
tmp,
m_kw *
sizeof(quint8 *));
333 const quint8* data = kitSrc->oldRawData();
336 }
while (kitSrc->nextPixel());