void KisConvolutionFilter::process(KisConstProcessingInformation srcInfo, KisProcessingInformation dstInfo, const QSize& size, const KisFilterConfiguration* config, KoUpdater* progressUpdater ) const { Q_UNUSED(config); const KisPaintDeviceSP src = srcInfo.paintDevice(); KisPaintDeviceSP dst = dstInfo.paintDevice(); QPoint dstTopLeft = dstInfo.topLeft(); QPoint srcTopLeft = srcInfo.topLeft(); Q_ASSERT(src != 0); Q_ASSERT(dst != 0); KisConvolutionPainter painter(dst, dstInfo.selection()); QBitArray channelFlags; if (config) { channelFlags = config->channelFlags(); } if (channelFlags.isEmpty() || !config) { channelFlags = QBitArray(src->colorSpace()->channelCount(), true); } // disable alpha channel channelFlags.clearBit(1); painter.setChannelFlags(channelFlags); painter.setProgress(progressUpdater); painter.applyMatrix(m_matrix, src, srcTopLeft, dstTopLeft, size, BORDER_REPEAT); }
void KoPatternGenerator::generate(KisProcessingInformation dstInfo, const QSize& size, const KisFilterConfiguration* config, KoUpdater* progressUpdater) const { KisPaintDeviceSP dst = dstInfo.paintDevice(); Q_ASSERT(!dst.isNull()); Q_ASSERT(config); if (!config) return; QString patternName = config->getString("pattern", "Grid01.pat"); KoResourceServer<KoPattern> *rserver = KoResourceServerProvider::instance()->patternServer(); KoPattern *pattern = rserver->resourceByName(patternName); // KoColor c = config->getColor("color"); KisFillPainter gc(dst); gc.setPattern(pattern); // gc.setPaintColor(c); gc.setProgress(progressUpdater); gc.setChannelFlags(config->channelFlags()); gc.setOpacity(OPACITY_OPAQUE_U8); gc.setSelection(dstInfo.selection()); gc.setWidth(size.width()); gc.setHeight(size.height()); gc.setFillStyle(KisFillPainter::FillStylePattern); gc.fillRect(QRect(dstInfo.topLeft(), size), pattern); gc.end(); }
void KisFilterColorToAlpha::process(KisConstProcessingInformation srcInfo, KisProcessingInformation dstInfo, const QSize& size, const KisFilterConfiguration* config, KoUpdater* progressUpdater ) const { const KisPaintDeviceSP src = srcInfo.paintDevice(); KisPaintDeviceSP dst = dstInfo.paintDevice(); QPoint dstTopLeft = dstInfo.topLeft(); QPoint srcTopLeft = srcInfo.topLeft(); Q_ASSERT(src != 0); Q_ASSERT(dst != 0); if (config == 0) config = new KisFilterConfiguration("colortoalpha", 1); QVariant value; QColor cTA = (config->getProperty("targetcolor", value)) ? value.value<QColor>() : QColor(255, 255, 255); int threshold = (config->getProperty("threshold", value)) ? value.toInt() : 0; qreal thresholdF = threshold; KisRectIteratorPixel dstIt = dst->createRectIterator(dstTopLeft.x(), dstTopLeft.y(), size.width(), size.height(), dstInfo.selection()); KisRectConstIteratorPixel srcIt = src->createRectConstIterator(srcTopLeft.x(), srcTopLeft.y(), size.width(), size.height(), srcInfo.selection()); int totalCost = size.width() * size.height() / 100; if (totalCost == 0) totalCost = 1; int currentProgress = 0; const KoColorSpace * cs = src->colorSpace(); qint32 pixelsize = cs->pixelSize(); quint8* color = new quint8[pixelsize]; cs->fromQColor(cTA, color); while (! srcIt.isDone()) { if (srcIt.isSelected()) { quint8 d = cs->difference(color, srcIt.oldRawData()); qreal newOpacity; // = cs->opacityF(srcIt.rawData()); if (d >= threshold) { newOpacity = 1.0; } else { newOpacity = d / thresholdF; } memcpy(dstIt.rawData(), srcIt.rawData(), pixelsize); if(newOpacity < cs->opacityF(srcIt.rawData())) { cs->setOpacity(dstIt.rawData(), newOpacity, 1); } } if (progressUpdater) progressUpdater->setProgress((++currentProgress) / totalCost); ++srcIt; ++dstIt; } delete[] color; }