diff --git a/plugins/paintops/libpaintop/kis_embedded_pattern_manager.cpp b/plugins/paintops/libpaintop/kis_embedded_pattern_manager.cpp index d1973ff581..eda330e6ce 100644 --- a/plugins/paintops/libpaintop/kis_embedded_pattern_manager.cpp +++ b/plugins/paintops/libpaintop/kis_embedded_pattern_manager.cpp @@ -1,123 +1,130 @@ /* * Copyright (c) 2013 Dmitry Kazakov * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "kis_embedded_pattern_manager.h" #include #include #include #include #include struct KisEmbeddedPatternManager::Private { static KoPattern* tryLoadEmbeddedPattern(const KisPropertiesConfigurationSP setting) { KoPattern *pattern = 0; QByteArray ba = QByteArray::fromBase64(setting->getString("Texture/Pattern/Pattern").toLatin1()); QImage img; img.loadFromData(ba, "PNG"); QString name = setting->getString("Texture/Pattern/Name"); QString filename = setting->getString("Texture/Pattern/PatternFileName"); if (name.isEmpty() || name != QFileInfo(name).fileName()) { QFileInfo info(filename); name = info.baseName(); } if (!img.isNull()) { pattern = new KoPattern(img, name, KoResourceServerProvider::instance()->patternServer()->saveLocation()); } return pattern; } static KoPattern* tryFetchPatternByMd5(const QByteArray &md5) { KoResourceServer *server = KoResourceServerProvider::instance()->patternServer(); return server->resourceByMD5(md5); } static KoPattern* tryFetchPatternByName(const QString &name) { KoResourceServer *server = KoResourceServerProvider::instance()->patternServer(); return server->resourceByName(name); } static KoPattern* tryFetchPatternByFileName(const QString &fileName) { KoResourceServer *server = KoResourceServerProvider::instance()->patternServer(); return server->resourceByFilename(fileName); } }; void KisEmbeddedPatternManager::saveEmbeddedPattern(KisPropertiesConfigurationSP setting, const KoPattern *pattern) { QByteArray patternMD5 = pattern->md5(); /** * The process of saving a pattern may be quite expensive, so * we won't rewrite the pattern if has the same md5-sum and at * least some data is present */ QByteArray existingMD5 = QByteArray::fromBase64(setting->getString("Texture/Pattern/PatternMD5").toLatin1()); QString existingPatternBase64 = setting->getString("Texture/Pattern/PatternMD5").toLatin1(); if (patternMD5 == existingMD5 && !existingPatternBase64.isEmpty()) { return; } setting->setProperty("Texture/Pattern/PatternMD5", patternMD5.toBase64()); setting->setProperty("Texture/Pattern/PatternFileName", pattern->filename()); setting->setProperty("Texture/Pattern/Name", pattern->name()); QByteArray ba; QBuffer buffer(&ba); buffer.open(QIODevice::WriteOnly); pattern->pattern().save(&buffer, "PNG"); setting->setProperty("Texture/Pattern/Pattern", ba.toBase64()); } KoPattern* KisEmbeddedPatternManager::loadEmbeddedPattern(const KisPropertiesConfigurationSP setting) { KoPattern *pattern = 0; QByteArray md5 = QByteArray::fromBase64(setting->getString("Texture/Pattern/PatternMD5").toLatin1()); + qDebug() << 1 << md5.toHex(); + pattern = Private::tryFetchPatternByMd5(md5); if (pattern) return pattern; QString name = setting->getString("Texture/Pattern/Name"); + qDebug() << 2 << name; + pattern = Private::tryFetchPatternByName(name); if (pattern) return pattern; QString fileName = setting->getString("Texture/Pattern/PatternFileName"); + qDebug() << 3 << fileName; + pattern = Private::tryFetchPatternByFileName(fileName); if (pattern) return pattern; pattern = Private::tryLoadEmbeddedPattern(setting); + qDebug() << 4 << pattern->md5().toHex(); + if (pattern) { KoResourceServerProvider::instance()->patternServer()->addResource(pattern, false); } - return pattern; } diff --git a/plugins/paintops/libpaintop/tests/kis_embedded_pattern_manager_test.cpp b/plugins/paintops/libpaintop/tests/kis_embedded_pattern_manager_test.cpp index 9fd4a2ecca..bfce5c946b 100644 --- a/plugins/paintops/libpaintop/tests/kis_embedded_pattern_manager_test.cpp +++ b/plugins/paintops/libpaintop/tests/kis_embedded_pattern_manager_test.cpp @@ -1,232 +1,204 @@ /* * Copyright (c) 2013 Dmitry Kazakov * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "kis_embedded_pattern_manager_test.h" #include - -#include "kis_embedded_pattern_manager.h" - #include #include #include +#include "kis_embedded_pattern_manager.h" + #include #include -KoPattern *createPattern() +#include "sdk/tests/kistest.h" + +KoPattern *KisEmbeddedPatternManagerTest::createPattern() { QImage image(512, 512, QImage::Format_ARGB32); image.fill(255); QPainter gc(&image); gc.fillRect(100, 100, 312, 312, Qt::red); - return new KoPattern(image, "__test_pattern", KoResourceServerProvider::instance()->patternServer()->saveLocation()); -} - -void KisEmbeddedPatternManagerTest::initTestCase() -{ - // touch all the barriers - KisResourceServerProvider::instance()->paintOpPresetServer(); - KoResourceServerProvider::instance()->patternServer(); - KisResourceServerProvider::instance()->workspaceServer(); -} - -void KisEmbeddedPatternManagerTest::init() -{ - cleanUp(); -} - -void KisEmbeddedPatternManagerTest::cleanUp() -{ - Q_FOREACH (KoPattern * p, KoResourceServerProvider::instance()->patternServer()->resources()) { - if (p->filename().contains("__test_pattern")) { - QFile file(p->filename()); - file.remove(); - } - QVERIFY(KoResourceServerProvider::instance()->patternServer()->removeResourceFromServer(p)); - } + KoPattern *pattern = new KoPattern(image, "__test_pattern", KoResourceServerProvider::instance()->patternServer()->saveLocation()); + return pattern; } void KisEmbeddedPatternManagerTest::testRoundTrip() { KoPattern *pattern = createPattern(); KisPropertiesConfigurationSP config(new KisPropertiesConfiguration); KisEmbeddedPatternManager::saveEmbeddedPattern(config, pattern); KoPattern *newPattern = KisEmbeddedPatternManager::loadEmbeddedPattern(config); QCOMPARE(newPattern->pattern(), pattern->pattern()); QCOMPARE(newPattern->name(), pattern->name()); QCOMPARE(QFileInfo(newPattern->filename()).fileName(), QFileInfo(pattern->filename()).fileName()); delete pattern; // will be deleted by the server // delete newPattern; } -enum NameStatus { - VALID, - PATH, - EMPTY -}; +void KisEmbeddedPatternManagerTest::init() +{ + Q_FOREACH(KoPattern *pa, KoResourceServerProvider::instance()->patternServer()->resources()) { + if (pa) { + KoResourceServerProvider::instance()->patternServer()->removeResourceFile(pa->filename()); + } + } +} -KisPropertiesConfigurationSP createXML(NameStatus nameStatus, - bool hasMd5) +KisPropertiesConfigurationSP KisEmbeddedPatternManagerTest::createXML(NameStatus nameStatus, bool hasMd5) { QString fileName("./__test_pattern_path.pat"); QString name; switch (nameStatus) { case VALID: name = "__test_pattern_name"; break; case PATH: name = "./path/some_weird_path.pat"; break; case EMPTY: name = ""; break; } KisPropertiesConfigurationSP setting(new KisPropertiesConfiguration); { KoPattern *pattern = createPattern(); if (hasMd5) { QByteArray patternMD5 = pattern->md5(); setting->setProperty("Texture/Pattern/PatternMD5", patternMD5.toBase64()); } QByteArray ba; QBuffer buffer(&ba); buffer.open(QIODevice::WriteOnly); pattern->pattern().save(&buffer, "PNG"); setting->setProperty("Texture/Pattern/Pattern", ba.toBase64()); delete pattern; } setting->setProperty("Texture/Pattern/PatternFileName", fileName); setting->setProperty("Texture/Pattern/Name", name); return setting; } KoPattern* findOnServer(QByteArray md5) { KoPattern *pattern = 0; if (!md5.isEmpty()) { - Q_FOREACH (KoResource * res, KoResourceServerProvider::instance()->patternServer()->resources()) { - KoPattern *pat = static_cast(res); - if (pat->md5() == md5) { - pattern = pat; - break; - } - } + return KoResourceServerProvider::instance()->patternServer()->resourceByMD5(md5); } return pattern; } -void checkOneConfig(NameStatus nameStatus, bool hasMd5, - QString expectedName, bool isOnServer) +void KisEmbeddedPatternManagerTest::checkOneConfig(NameStatus nameStatus, bool hasMd5, QString expectedName, bool isOnServer) { QScopedPointer basePattern(createPattern()); KoPattern *initialPattern = findOnServer(basePattern->md5()); QCOMPARE((bool)initialPattern, isOnServer); KisPropertiesConfigurationSP setting = createXML(nameStatus, hasMd5); KoPattern *pattern = KisEmbeddedPatternManager::loadEmbeddedPattern(setting); QVERIFY(pattern); QCOMPARE(pattern->pattern(), basePattern->pattern()); QCOMPARE(pattern->name(), QString(expectedName)); QFileInfo info(pattern->filename()); QVERIFY(info.baseName().startsWith(expectedName)); QCOMPARE(info.dir().path(), QDir(KoResourceServerProvider::instance()->patternServer()->saveLocation()).path()); if (isOnServer) { QCOMPARE(initialPattern, pattern); } // will be deleted by the server // delete pattern; } - -void KisEmbeddedPatternManagerTest::testLoadingNoOnServerValidName() +void KisEmbeddedPatternManagerTest::testLoadingNotOnServerValidName() { checkOneConfig(VALID, false, "__test_pattern_name", false); } -void KisEmbeddedPatternManagerTest::testLoadingNoOnServerEmptyName() +void KisEmbeddedPatternManagerTest::testLoadingNotOnServerEmptyName() { checkOneConfig(EMPTY, false, "__test_pattern_path", false); } -void KisEmbeddedPatternManagerTest::testLoadingNoOnServerPathName() +void KisEmbeddedPatternManagerTest::testLoadingNotOnServerPathName() { checkOneConfig(PATH, false, "__test_pattern_path", false); } void KisEmbeddedPatternManagerTest::testLoadingOnServerValidName() { KoResourceServerProvider::instance()->patternServer()->addResource(createPattern(), false); - checkOneConfig(VALID, false, "__test_pattern", true); + checkOneConfig(VALID, false, "__test_pattern_name", true); } void KisEmbeddedPatternManagerTest::testLoadingOnServerEmptyName() { KoResourceServerProvider::instance()->patternServer()->addResource(createPattern(), false); - checkOneConfig(EMPTY, false, "__test_pattern", true); + checkOneConfig(EMPTY, false, "__test_pattern_path", true); } void KisEmbeddedPatternManagerTest::testLoadingOnServerPathName() { KoResourceServerProvider::instance()->patternServer()->addResource(createPattern(), false); - checkOneConfig(PATH, false, "__test_pattern", true); + checkOneConfig(PATH, false, "__test_pattern_path", true); } void KisEmbeddedPatternManagerTest::testLoadingOnServerValidNameMd5() { - KoResourceServerProvider::instance()->patternServer()->addResource(createPattern(), false); + KoResourceServerProvider::instance()->patternServer()->addResource(createPattern(), true); checkOneConfig(VALID, true, "__test_pattern", true); } void KisEmbeddedPatternManagerTest::testLoadingOnServerEmptyNameMd5() { - KoResourceServerProvider::instance()->patternServer()->addResource(createPattern(), false); + KoResourceServerProvider::instance()->patternServer()->addResource(createPattern(), true); checkOneConfig(EMPTY, true, "__test_pattern", true); } void KisEmbeddedPatternManagerTest::testLoadingOnServerPathNameMd5() { KoResourceServerProvider::instance()->patternServer()->addResource(createPattern(), false); checkOneConfig(PATH, true, "__test_pattern", true); } -QTEST_MAIN(KisEmbeddedPatternManagerTest) +KISTEST_MAIN(KisEmbeddedPatternManagerTest) diff --git a/plugins/paintops/libpaintop/tests/kis_embedded_pattern_manager_test.h b/plugins/paintops/libpaintop/tests/kis_embedded_pattern_manager_test.h index 7902954d7b..8a363bcbbc 100644 --- a/plugins/paintops/libpaintop/tests/kis_embedded_pattern_manager_test.h +++ b/plugins/paintops/libpaintop/tests/kis_embedded_pattern_manager_test.h @@ -1,48 +1,60 @@ /* * Copyright (c) 2013 Dmitry Kazakov * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef __KIS_EMBEDDED_PATTERN_MANAGER_TEST_H #define __KIS_EMBEDDED_PATTERN_MANAGER_TEST_H #include +#include + +class KoPattern; + class KisEmbeddedPatternManagerTest : public QObject { Q_OBJECT private Q_SLOTS: void testRoundTrip(); - void testLoadingNoOnServerValidName(); - void testLoadingNoOnServerEmptyName(); - void testLoadingNoOnServerPathName(); + void init(); + + void testLoadingNotOnServerValidName(); + void testLoadingNotOnServerEmptyName(); + void testLoadingNotOnServerPathName(); void testLoadingOnServerValidName(); void testLoadingOnServerEmptyName(); void testLoadingOnServerPathName(); void testLoadingOnServerValidNameMd5(); void testLoadingOnServerEmptyNameMd5(); void testLoadingOnServerPathNameMd5(); - void init(); - void cleanUp(); +private: - void initTestCase(); + enum NameStatus { + VALID, + PATH, + EMPTY + }; + void checkOneConfig(NameStatus nameStatus, bool hasMd5, QString expectedName, bool isOnServer); + KisPropertiesConfigurationSP createXML(NameStatus nameStatus, bool hasMd5); + KoPattern *createPattern(); }; #endif /* __KIS_EMBEDDED_PATTERN_MANAGER_TEST_H */