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_crash_filter_test.h"
0008 #include "filter/kis_filter.h"
0009 #include "filter/kis_filter_configuration.h"
0010 #include "filter/kis_filter_registry.h"
0011 #include "kis_pixel_selection.h"
0012 #include "kis_processing_information.h"
0013 #include "kis_selection.h"
0014 #include "kis_transaction.h"
0015 #include <KisGlobalResourcesInterface.h>
0016 #include <KoColorProfile.h>
0017 #include <KoColorSpaceRegistry.h>
0018 #include <simpletest.h>
0019 #include <testing_timed_default_bounds.h>
0020 
0021 bool KisCrashFilterTest::applyFilter(const KoColorSpace * cs,  KisFilterSP f)
0022 {
0023 
0024     QImage qimage(QString(FILES_DATA_DIR) + '/' + "carrot.png");
0025 
0026     KisPaintDeviceSP dev = new KisPaintDevice(cs);
0027     dev->setDefaultBounds(new TestUtil::TestingTimedDefaultBounds(qimage.rect()));
0028     dev->convertFromQImage(qimage, 0, 0, 0);
0029 
0030     // Get the predefined configuration from a file
0031     KisFilterConfigurationSP  kfc = f->defaultConfiguration(KisGlobalResourcesInterface::instance());
0032 
0033     QFile file(QString(FILES_DATA_DIR) + '/' + f->id() + ".cfg");
0034     if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
0035         dbgKrita << "creating new file for " << f->id();
0036         file.open(QIODevice::WriteOnly | QIODevice::Text);
0037         QTextStream out(&file);
0038         out.setCodec("UTF-8");
0039         out << kfc->toXML();
0040     } else {
0041         QString s;
0042         QTextStream in(&file);
0043         in.setCodec("UTF-8");
0044         s = in.readAll();
0045         kfc->fromXML(s);
0046     }
0047     dbgKrita << f->id() << ", " << cs->id() << ", " << cs->profile()->name();// << kfc->toXML() << "\n";
0048 
0049     {
0050         kfc->createLocalResourcesSnapshot(KisGlobalResourcesInterface::instance());
0051         KisTransaction t(kundo2_noi18n(f->name()), dev);
0052         f->process(dev, QRect(QPoint(0,0), qimage.size()), kfc);
0053     }
0054 
0055     return true;
0056 
0057 }
0058 
0059 bool KisCrashFilterTest::testFilter(KisFilterSP f)
0060 {
0061     QList<const KoColorSpace*> colorSpaces = KoColorSpaceRegistry::instance()->allColorSpaces(KoColorSpaceRegistry::AllColorSpaces, KoColorSpaceRegistry::OnlyDefaultProfile);
0062     bool ok = false;
0063     Q_FOREACH (const KoColorSpace* colorSpace, colorSpaces) {
0064 
0065         // Alpha color spaces are never processed directly. They are
0066         // first converted into GrayA color space
0067         if (colorSpace->id().startsWith("ALPHA", Qt::CaseInsensitive)) {
0068             continue;
0069         }
0070 
0071         ok = applyFilter(colorSpace, f);
0072     }
0073 
0074     return ok;
0075 }
0076 
0077 void KisCrashFilterTest::testCrashFilters()
0078 {
0079     QStringList excludeFilters;
0080     excludeFilters << "colortransfer";
0081     excludeFilters << "gradientmap";
0082     excludeFilters << "phongbumpmap";
0083     excludeFilters << "perchannel";
0084     excludeFilters << "height to normal";
0085 
0086 
0087     QStringList failures;
0088     QStringList successes;
0089 
0090     QList<QString> filterList = KisFilterRegistry::instance()->keys();
0091     std::sort(filterList.begin(), filterList.end());
0092     for (QList<QString>::Iterator it = filterList.begin(); it != filterList.end(); ++it) {
0093         if (excludeFilters.contains(*it)) continue;
0094 
0095         if (testFilter(KisFilterRegistry::instance()->value(*it)))
0096             successes << *it;
0097         else
0098             failures << *it;
0099     }
0100     dbgKrita << "Success: " << successes;
0101     if (failures.size() > 0) {
0102         QFAIL(QString("Failed filters:\n\t %1").arg(failures.join("\n\t")).toLatin1());
0103     }
0104 }
0105 
0106 #include <testimage.h>
0107 KISTEST_MAIN(KisCrashFilterTest)