File indexing completed on 2024-05-12 15:58:12

0001 /*
0002  *  SPDX-FileCopyrightText: 2005, 2008 Cyrille Berger <cberger@cberger.net>
0003  *  SPDX-FileCopyrightText: 2010 Edward Apap <schumifer@hotmail.com>
0004  *
0005  *  SPDX-License-Identifier: GPL-2.0-or-later
0006  */
0007 
0008 #ifndef KIS_CONVOLUTION_WORKER_H
0009 #define KIS_CONVOLUTION_WORKER_H
0010 
0011 #include <KoUpdater.h>
0012 
0013 #include "kis_iterator_ng.h"
0014 #include "kis_repeat_iterators_pixel.h"
0015 #include "kis_painter.h"
0016 #include <QBitArray>
0017 
0018 struct StandardIteratorFactory {
0019     typedef KisHLineIteratorSP HLineIterator;
0020     typedef KisVLineIteratorSP VLineIterator;
0021     typedef KisHLineConstIteratorSP HLineConstIterator;
0022     typedef KisVLineConstIteratorSP VLineConstIterator;
0023     inline static KisHLineIteratorSP createHLineIterator(KisPaintDeviceSP src, qint32 x, qint32 y, qint32 w, const QRect&) {
0024         return src->createHLineIteratorNG(x, y, w);
0025     }
0026     inline static KisVLineIteratorSP createVLineIterator(KisPaintDeviceSP src, qint32 x, qint32 y, qint32 h, const QRect&) {
0027         return src->createVLineIteratorNG(x, y, h);
0028     }
0029     inline static KisHLineConstIteratorSP createHLineConstIterator(KisPaintDeviceSP src, qint32 x, qint32 y, qint32 w, const QRect&) {
0030         return src->createHLineConstIteratorNG(x, y, w);
0031     }
0032     inline static KisVLineConstIteratorSP createVLineConstIterator(KisPaintDeviceSP src, qint32 x, qint32 y, qint32 h, const QRect&) {
0033         return src->createVLineConstIteratorNG(x, y, h);
0034     }
0035 };
0036 
0037 struct RepeatIteratorFactory {
0038     typedef KisHLineIteratorSP HLineIterator;
0039     typedef KisVLineIteratorSP VLineIterator;
0040     typedef KisRepeatHLineConstIteratorSP HLineConstIterator;
0041     typedef KisRepeatVLineConstIteratorSP VLineConstIterator;
0042     inline static KisHLineIteratorSP createHLineIterator(KisPaintDeviceSP src, qint32 x, qint32 y, qint32 w, const QRect&) {
0043         return src->createHLineIteratorNG(x, y, w);
0044     }
0045     inline static KisVLineIteratorSP createVLineIterator(KisPaintDeviceSP src, qint32 x, qint32 y, qint32 h, const QRect&) {
0046         return src->createVLineIteratorNG(x, y, h);
0047     }
0048     inline static HLineConstIterator createHLineConstIterator(KisPaintDeviceSP src, qint32 x, qint32 y, qint32 w, const QRect& _dataRect) {
0049         return src->createRepeatHLineConstIterator(x, y, w, _dataRect);
0050     }
0051     inline static VLineConstIterator createVLineConstIterator(KisPaintDeviceSP src, qint32 x, qint32 y, qint32 h, const QRect& _dataRect) {
0052         return src->createRepeatVLineConstIterator(x, y, h, _dataRect);
0053     }
0054 };
0055 
0056 template <class _IteratorFactory_>
0057 class KisConvolutionWorker
0058 {
0059 public:
0060     KisConvolutionWorker(KisPainter *painter, KoUpdater *progress)
0061     {
0062         m_painter = painter;
0063         m_progress = progress;
0064     }
0065 
0066     virtual ~KisConvolutionWorker()
0067     {
0068     }
0069 
0070     virtual void execute(const KisConvolutionKernelSP kernel, const KisPaintDeviceSP src, QPoint srcPos, QPoint dstPos, QSize areaSize, const QRect& dataRect) = 0;
0071 
0072 protected:
0073     QList<KoChannelInfo *> convolvableChannelList(const KisPaintDeviceSP src)
0074     {
0075         QBitArray painterChannelFlags = m_painter->channelFlags();
0076         if (painterChannelFlags.isEmpty()) {
0077             painterChannelFlags = QBitArray(src->colorSpace()->channelCount(), true);
0078         }
0079         Q_ASSERT(static_cast<quint32>(painterChannelFlags.size()) == src->colorSpace()->channelCount());
0080         QList<KoChannelInfo *> channelInfo = src->colorSpace()->channels();
0081         QList<KoChannelInfo *> convChannelList;
0082 
0083         for (qint32 c = 0; c < channelInfo.count(); ++c) {
0084             if (painterChannelFlags.testBit(c)) {
0085                 convChannelList.append(channelInfo[c]);
0086             }
0087         }
0088 
0089         return convChannelList;
0090     }
0091 
0092 protected:
0093     KisPainter* m_painter;
0094     KoUpdater* m_progress;
0095 };
0096 
0097 
0098 #endif