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