File indexing completed on 2024-06-16 04:16:43

0001 /*
0002  *  SPDX-FileCopyrightText: 2008 Boudewijn Rempt <boud@valdyas.org>
0003  *
0004  *  SPDX-License-Identifier: GPL-2.0-or-later
0005  */
0006 
0007 #include "kis_all_filter_test.h"
0008 #include "KisImageResolutionProxy.h"
0009 #include "filter/kis_filter.h"
0010 #include "filter/kis_filter_configuration.h"
0011 #include "filter/kis_filter_registry.h"
0012 #include "kis_default_bounds.h"
0013 #include "kis_pixel_selection.h"
0014 #include "kis_processing_information.h"
0015 #include "kis_selection.h"
0016 #include "kis_transaction.h"
0017 #include <KisGlobalResourcesInterface.h>
0018 #include <KoColorSpaceRegistry.h>
0019 #include <qimage_test_util.h>
0020 #include <simpletest.h>
0021 #include <testing_timed_default_bounds.h>
0022 
0023 
0024 bool testFilterSrcNotIsDev(KisFilterSP f)
0025 {
0026     const KoColorSpace * cs = KoColorSpaceRegistry::instance()->rgb8();
0027 
0028     QImage qimage(QString(FILES_DATA_DIR) + '/' + "carrot.png");
0029     QImage result(QString(FILES_DATA_DIR) + '/' + "carrot_" + f->id() + ".png");
0030     KisPaintDeviceSP dev = new KisPaintDevice(cs);
0031     dev->setDefaultBounds(new TestUtil::TestingTimedDefaultBounds(qimage.rect()));
0032 
0033     KisPaintDeviceSP dstdev = new KisPaintDevice(cs);
0034     dstdev->setDefaultBounds(new TestUtil::TestingTimedDefaultBounds(qimage.rect()));
0035 
0036     dev->convertFromQImage(qimage, 0, 0, 0);
0037 
0038     // Get the predefined configuration from a file
0039     KisFilterConfigurationSP  kfc = f->defaultConfiguration(KisGlobalResourcesInterface::instance());
0040 
0041     QFile file(QString(FILES_DATA_DIR) + '/' + f->id() + ".cfg");
0042     if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
0043         //qDebug() << "creating new file for " << f->id();
0044         file.open(QIODevice::WriteOnly | QIODevice::Text);
0045         QTextStream out(&file);
0046         out.setCodec("UTF-8");
0047         out << kfc->toXML();
0048     } else {
0049         QString s;
0050         QTextStream in(&file);
0051         in.setCodec("UTF-8");
0052         s = in.readAll();
0053         //qDebug() << "Read for " << f->id() << "\n" << s;
0054         kfc->fromXML(s);
0055     }
0056     dbgKrita << f->id();// << "\n" << kfc->toXML() << "\n";
0057 
0058     kfc->createLocalResourcesSnapshot(KisGlobalResourcesInterface::instance());
0059     f->process(dev, dstdev, 0, QRect(QPoint(0,0), qimage.size()), kfc);
0060 
0061     QPoint errpoint;
0062 
0063     QImage actualResult = dstdev->convertToQImage(0, 0, 0, qimage.width(), qimage.height());
0064 
0065     if (!TestUtil::compareQImages(errpoint, result, actualResult, 1, 1)) {
0066         qDebug() << "Failed compare result images for: " << f->id();
0067         qDebug() << errpoint;
0068         actualResult.save(QString("carrot_%1.png").arg(f->id()));
0069         result.save(QString("carrot_%1_expected.png").arg(f->id()));
0070         return false;
0071     }
0072     return true;
0073 }
0074 
0075 bool testFilter(KisFilterSP f)
0076 {
0077     const KoColorSpace * cs = KoColorSpaceRegistry::instance()->rgb8();
0078 
0079     QImage qimage(QString(FILES_DATA_DIR) + '/' + "carrot.png");
0080     QString resultFileName = QString(FILES_DATA_DIR) + '/' + "carrot_" + f->id() + ".png";
0081     QImage result(resultFileName);
0082 
0083     //if (!f->id().contains("hsv")) return true;
0084 
0085     KisPaintDeviceSP dev = new KisPaintDevice(cs);
0086     dev->setDefaultBounds(new TestUtil::TestingTimedDefaultBounds(qimage.rect()));
0087     dev->convertFromQImage(qimage, 0, 0, 0);
0088     KisTransaction * cmd = new KisTransaction(kundo2_noi18n(f->name()), dev);
0089 
0090     // Get the predefined configuration from a file
0091     KisFilterConfigurationSP  kfc = f->defaultConfiguration(KisGlobalResourcesInterface::instance());
0092 
0093     QFile file(QString(FILES_DATA_DIR) + '/' + f->id() + ".cfg");
0094     if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
0095         //qDebug() << "creating new file for " << f->id();
0096         file.open(QIODevice::WriteOnly | QIODevice::Text);
0097         QTextStream out(&file);
0098         out.setCodec("UTF-8");
0099         out << kfc->toXML();
0100     } else {
0101         QString s;
0102         QTextStream in(&file);
0103         in.setCodec("UTF-8");
0104         s = in.readAll();
0105         //qDebug() << "Read for " << f->id() << "\n" << s;
0106         const bool validConfig = kfc->fromXML(s);
0107 
0108 
0109         if (!validConfig) {
0110             qDebug() << QString("Couldn't parse XML settings for filter %1").arg(f->id()).toLatin1();
0111             return false;
0112         }
0113     }
0114     dbgKrita << f->id();// << "\n" << kfc->toXML() << "\n";
0115     kfc->createLocalResourcesSnapshot(KisGlobalResourcesInterface::instance());
0116 
0117     f->process(dev, QRect(QPoint(0,0), qimage.size()), kfc);
0118 
0119     QPoint errpoint;
0120 
0121     delete cmd;
0122 
0123     QImage actualResult = dev->convertToQImage(0, 0, 0, qimage.width(), qimage.height());
0124 
0125     if (!TestUtil::compareQImages(errpoint, result, actualResult, 1, 1)) {
0126         qDebug() << "Failed compare result images for: " << f->id();
0127         qDebug() << errpoint;
0128         actualResult.save(QString("carrot_%1.png").arg(f->id()));
0129         result.save(QString("carrot_%1_expected.png").arg(f->id()));
0130         return false;
0131     }
0132     return true;
0133 }
0134 
0135 
0136 bool testFilterWithSelections(KisFilterSP f)
0137 {
0138     const KoColorSpace * cs = KoColorSpaceRegistry::instance()->rgb8();
0139 
0140     QImage qimage(QString(FILES_DATA_DIR) + '/' + "carrot.png");
0141     QImage result(QString(FILES_DATA_DIR) + '/' + "carrot_" + f->id() + ".png");
0142     KisPaintDeviceSP dev = new KisPaintDevice(cs);
0143     dev->setDefaultBounds(new TestUtil::TestingTimedDefaultBounds(qimage.rect()));
0144     dev->convertFromQImage(qimage, 0, 0, 0);
0145 
0146     // Get the predefined configuration from a file
0147     KisFilterConfigurationSP  kfc = f->defaultConfiguration(KisGlobalResourcesInterface::instance());
0148 
0149     QFile file(QString(FILES_DATA_DIR) + '/' + f->id() + ".cfg");
0150     if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
0151         //qDebug() << "creating new file for " << f->id();
0152         file.open(QIODevice::WriteOnly | QIODevice::Text);
0153         QTextStream out(&file);
0154         out.setCodec("UTF-8");
0155         out << kfc->toXML();
0156     } else {
0157         QString s;
0158         QTextStream in(&file);
0159         in.setCodec("UTF-8");
0160         s = in.readAll();
0161         //qDebug() << "Read for " << f->id() << "\n" << s;
0162         kfc->fromXML(s);
0163     }
0164     dbgKrita << f->id();// << "\n"; << kfc->toXML() << "\n";
0165 
0166     KisSelectionSP sel1 = new KisSelection(new KisSelectionDefaultBounds(dev), KisImageResolutionProxy::identity());
0167     sel1->pixelSelection()->select(qimage.rect());
0168 
0169     kfc->createLocalResourcesSnapshot(KisGlobalResourcesInterface::instance());
0170     f->process(dev, dev, sel1, QRect(QPoint(0,0), qimage.size()), kfc);
0171 
0172     QPoint errpoint;
0173 
0174     QImage actualResult = dev->convertToQImage(0, 0, 0, qimage.width(), qimage.height());
0175 
0176     if (!TestUtil::compareQImages(errpoint, result, actualResult, 1, 1)) {
0177         qDebug() << "Failed compare result images for: " << f->id();
0178         qDebug() << errpoint;
0179         actualResult.save(QString("carrot_%1.png").arg(f->id()));
0180         result.save(QString("carrot_%1_expected.png").arg(f->id()));
0181         return false;
0182     }
0183 
0184     return true;
0185 }
0186 
0187 void KisAllFilterTest::testAllFilters()
0188 {
0189     QStringList excludeFilters;
0190     excludeFilters << "colortransfer";
0191     excludeFilters << "gradientmap";
0192     excludeFilters << "phongbumpmap";
0193     excludeFilters << "raindrops";
0194 
0195     // halftone has some bezier curve painting drifts, so
0196     // let's just exclude it
0197     excludeFilters << "halftone";
0198 
0199     QStringList failures;
0200     QStringList successes;
0201 
0202     QList<QString> filterList = KisFilterRegistry::instance()->keys();
0203     std::sort(filterList.begin(), filterList.end());
0204     for (QList<QString>::Iterator it = filterList.begin(); it != filterList.end(); ++it) {
0205         if (excludeFilters.contains(*it)) continue;
0206 
0207         if (testFilter(KisFilterRegistry::instance()->value(*it)))
0208             successes << *it;
0209         else
0210             failures << *it;
0211     }
0212     dbgKrita << "Success: " << successes;
0213     if (failures.size() > 0) {
0214         QFAIL(QString("Failed filters:\n\t %1").arg(failures.join("\n\t")).toLatin1());
0215     }
0216 }
0217 
0218 void KisAllFilterTest::testAllFiltersSrcNotIsDev()
0219 {
0220     QStringList excludeFilters;
0221     excludeFilters << "colortransfer";
0222     excludeFilters << "gradientmap";
0223     excludeFilters << "phongbumpmap";
0224     excludeFilters << "raindrops";
0225 
0226     // halftone has some bezier curve painting drifts, so
0227     // let's just exclude it
0228     excludeFilters << "halftone";
0229 
0230     QStringList failures;
0231     QStringList successes;
0232 
0233     QList<QString> filterList = KisFilterRegistry::instance()->keys();
0234     std::sort(filterList.begin(), filterList.end());
0235     for (QList<QString>::Iterator it = filterList.begin(); it != filterList.end(); ++it) {
0236         if (excludeFilters.contains(*it)) continue;
0237 
0238         if (testFilterSrcNotIsDev(KisFilterRegistry::instance()->value(*it)))
0239             successes << *it;
0240         else
0241             failures << *it;
0242     }
0243     dbgKrita << "Src!=Dev Success: " << successes;
0244     if (failures.size() > 0) {
0245         QFAIL(QString("Src!=Dev Failed filters:\n\t %1").arg(failures.join("\n\t")).toLatin1());
0246     }
0247 
0248 }
0249 
0250 void KisAllFilterTest::testAllFiltersWithSelections()
0251 {
0252     QStringList excludeFilters;
0253     excludeFilters << "colortransfer";
0254     excludeFilters << "gradientmap";
0255     excludeFilters << "phongbumpmap";
0256     excludeFilters << "raindrops";
0257 
0258     // halftone has some bezier curve painting drifts, so
0259     // let's just exclude it
0260     excludeFilters << "halftone";
0261 
0262     QStringList failures;
0263     QStringList successes;
0264 
0265     QList<QString> filterList = KisFilterRegistry::instance()->keys();
0266     std::sort(filterList.begin(), filterList.end());
0267     for (QList<QString>::Iterator it = filterList.begin(); it != filterList.end(); ++it) {
0268         if (excludeFilters.contains(*it)) continue;
0269 
0270         if (testFilterWithSelections(KisFilterRegistry::instance()->value(*it)))
0271             successes << *it;
0272         else
0273             failures << *it;
0274     }
0275     dbgKrita << "Success: " << successes;
0276     if (failures.size() > 0) {
0277         QFAIL(QString("Failed filters with selections:\n\t %1").arg(failures.join("\n\t")).toLatin1());
0278     }
0279 }
0280 
0281 #include <testimage.h>
0282 KISTEST_MAIN(KisAllFilterTest)