void ShivaGenerator::generate(KisProcessingInformation dstInfo, const QSize& size, const KisFilterConfiguration* config, KoUpdater* progressUpdater) const { Q_UNUSED(progressUpdater); KisPaintDeviceSP dst = dstInfo.paintDevice(); QPoint dstTopLeft = dstInfo.topLeft(); UpdaterProgressReport* report = 0; if (progressUpdater) { progressUpdater->setRange(0, size.height()); report = new UpdaterProgressReport(progressUpdater); } Q_ASSERT(!dst.isNull()); // Q_ASSERT(config); // TODO implement the generating of pixel OpenShiva::Kernel kernel; kernel.setSource(*m_source); if (config) { QMap<QString, QVariant> map = config->getProperties(); for (QMap<QString, QVariant>::iterator it = map.begin(); it != map.end(); ++it) { const GTLCore::Metadata::Entry* entry = kernel.metadata()->parameter(it.key().toAscii().data()); if (entry && entry->asParameterEntry()) { #if OPENSHIVA_12 GTLCore::Value val = qvariantToValue(it.value(), entry->asParameterEntry()->valueType()); #else GTLCore::Value val = qvariantToValue(it.value(), entry->asParameterEntry()->type()); #endif if(val.isValid()) { kernel.setParameter(it.key().toAscii().data(), val); } } } } { QMutexLocker l(shivaMutex); kernel.compile(); } if (kernel.isCompiled()) { PaintDeviceImage pdi(dst); #if OPENSHIVA_12 std::list< GTLCore::AbstractImage* > inputs; GTLCore::Region region(dstTopLeft.x(), dstTopLeft.y() , size.width(), size.height()); kernel.evaluatePixeles(region, inputs, &pdi, report ); #else std::list< const GTLCore::AbstractImage* > inputs; GTLCore::RegionI region(dstTopLeft.x(), dstTopLeft.y() , size.width(), size.height()); kernel.evaluatePixels(region, inputs, &pdi, report ); #endif } #if OPENSHIVA_13_OR_MORE else { dbgPlugins << "Error: " << kernel.compilationMessages().toString().c_str(); } #endif }
void ShivaFilter::processImpl(KisPaintDeviceSP dev, const QRect& size, const KisFilterConfiguration* config, KoUpdater* progressUpdater ) const { Q_UNUSED(progressUpdater); QPoint dstTopLeft = size.topLeft(); UpdaterProgressReport* report = 0; if (progressUpdater) { progressUpdater->setRange(0, size.height()); report = new UpdaterProgressReport(progressUpdater); } Q_ASSERT(!dev.isNull()); // Q_ASSERT(config); // TODO support for selection OpenShiva::Kernel kernel; kernel.setSource(*m_source); if (config) { QMap<QString, QVariant> map = config->getProperties(); for (QMap<QString, QVariant>::iterator it = map.begin(); it != map.end(); ++it) { dbgPlugins << it.key() << " " << it.value(); const GTLCore::Metadata::Entry* entry = kernel.metadata()->parameter(it.key().toLatin1().constData()); if (entry && entry->asParameterEntry()) { GTLCore::Value val = qvariantToValue(it.value(), entry->asParameterEntry()->type()); if(val.isValid()) { kernel.setParameter(it.key().toLatin1().constData(), val); } } } } kernel.setParameter(OpenShiva::Kernel::IMAGE_WIDTH, float(dev->defaultBounds()->bounds().width())); kernel.setParameter(OpenShiva::Kernel::IMAGE_HEIGHT, float(dev->defaultBounds()->bounds().height())); KisGtlLocker gtlLocker; { dbgPlugins << "Compile: " << m_source->name().c_str(); QMutexLocker l(shivaMutex); kernel.compile(); } if (kernel.isCompiled()) { ConstPaintDeviceImage pdisrc(dev); PaintDeviceImage pdi(dev); std::list< const GTLCore::AbstractImage* > inputs; GTLCore::RegionI region(dstTopLeft.x(), dstTopLeft.y() , size.width(), size.height()); inputs.push_back(&pdisrc); dbgPlugins << "Run: " << m_source->name().c_str() << " " << dstTopLeft << " " << size; kernel.evaluatePixels(region, inputs, &pdi, report ); } }