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)