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)