diff --git a/plugins/paintops/libpaintop/kis_embedded_pattern_manager.cpp b/plugins/paintops/libpaintop/kis_embedded_pattern_manager.cpp index eda330e6ce..7213d063f2 100644 --- a/plugins/paintops/libpaintop/kis_embedded_pattern_manager.cpp +++ b/plugins/paintops/libpaintop/kis_embedded_pattern_manager.cpp @@ -1,130 +1,104 @@ /* * 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; + KoResourceServer *server = KoResourceServerProvider::instance()->patternServer(); QByteArray md5 = QByteArray::fromBase64(setting->getString("Texture/Pattern/PatternMD5").toLatin1()); - qDebug() << 1 << md5.toHex(); - - pattern = Private::tryFetchPatternByMd5(md5); + pattern = server->resourceByMD5(md5); if (pattern) return pattern; QString name = setting->getString("Texture/Pattern/Name"); - qDebug() << 2 << name; - - pattern = Private::tryFetchPatternByName(name); + pattern = server->resourceByName(name); if (pattern) return pattern; QString fileName = setting->getString("Texture/Pattern/PatternFileName"); - qDebug() << 3 << fileName; - - pattern = Private::tryFetchPatternByFileName(fileName); + pattern = server->resourceByFilename(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 bfce5c946b..d078b587b5 100644 --- a/plugins/paintops/libpaintop/tests/kis_embedded_pattern_manager_test.cpp +++ b/plugins/paintops/libpaintop/tests/kis_embedded_pattern_manager_test.cpp @@ -1,204 +1,213 @@ /* * 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 #include #include #include "kis_embedded_pattern_manager.h" #include #include #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); - KoPattern *pattern = new KoPattern(image, "__test_pattern", KoResourceServerProvider::instance()->patternServer()->saveLocation()); + 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; } void KisEmbeddedPatternManagerTest::init() { Q_FOREACH(KoPattern *pa, KoResourceServerProvider::instance()->patternServer()->resources()) { if (pa) { KoResourceServerProvider::instance()->patternServer()->removeResourceFile(pa->filename()); } } } KisPropertiesConfigurationSP KisEmbeddedPatternManagerTest::createXML(NameStatus nameStatus, bool hasMd5) { - QString fileName("./__test_pattern_path.pat"); - QString name; + KisPropertiesConfigurationSP setting(new KisPropertiesConfiguration); + switch (nameStatus) { - case VALID: - name = "__test_pattern_name"; + case VALID: { + setting->setProperty("Texture/Pattern/PatternFileName", "./__test_pattern_path.pat"); + setting->setProperty("Texture/Pattern/Name", "__test_pattern"); break; - case PATH: - name = "./path/some_weird_path.pat"; + } + case PATH: { + QString path = KoResourceServerProvider::instance()->patternServer()->saveLocation() + "/__test_pattern.pat"; + setting->setProperty("Texture/Pattern/PatternFileName", path); + setting->setProperty("Texture/Pattern/Name", "__test_pattern"); break; - case EMPTY: - name = ""; + } + case EMPTY: { + setting->setProperty("Texture/Pattern/PatternFileName", "./__test_pattern_path.pat"); + setting->setProperty("Texture/Pattern/Name", ""); break; } - - KisPropertiesConfigurationSP setting(new KisPropertiesConfiguration); + } { KoPattern *pattern = createPattern(); if (hasMd5) { QByteArray patternMD5 = pattern->md5(); + Q_ASSERT(!patternMD5.isEmpty()); 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()) { return KoResourceServerProvider::instance()->patternServer()->resourceByMD5(md5); } return pattern; } 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)); + QVERIFY(pattern->name().startsWith(expectedName)); QFileInfo info(pattern->filename()); QVERIFY(info.baseName().startsWith(expectedName)); QCOMPARE(info.dir().path(), QDir(KoResourceServerProvider::instance()->patternServer()->saveLocation()).path()); - if (isOnServer) { + // We can only find things on the server by name or by md5; the file path as an identifier does not work. + if (isOnServer && nameStatus != EMPTY && !hasMd5) { QCOMPARE(initialPattern, pattern); } // will be deleted by the server // delete pattern; } void KisEmbeddedPatternManagerTest::testLoadingNotOnServerValidName() { - checkOneConfig(VALID, false, "__test_pattern_name", false); + checkOneConfig(VALID, false, "__test_pattern", false); } void KisEmbeddedPatternManagerTest::testLoadingNotOnServerEmptyName() { checkOneConfig(EMPTY, false, "__test_pattern_path", false); } void KisEmbeddedPatternManagerTest::testLoadingNotOnServerPathName() { - checkOneConfig(PATH, false, "__test_pattern_path", false); + checkOneConfig(PATH, false, "__test_pattern", false); } void KisEmbeddedPatternManagerTest::testLoadingOnServerValidName() { KoResourceServerProvider::instance()->patternServer()->addResource(createPattern(), false); - checkOneConfig(VALID, false, "__test_pattern_name", true); + checkOneConfig(VALID, false, "__test_pattern", true); } void KisEmbeddedPatternManagerTest::testLoadingOnServerEmptyName() { KoResourceServerProvider::instance()->patternServer()->addResource(createPattern(), false); checkOneConfig(EMPTY, false, "__test_pattern_path", true); } void KisEmbeddedPatternManagerTest::testLoadingOnServerPathName() { KoResourceServerProvider::instance()->patternServer()->addResource(createPattern(), false); - checkOneConfig(PATH, false, "__test_pattern_path", true); + checkOneConfig(PATH, false, "__test_pattern", true); } void KisEmbeddedPatternManagerTest::testLoadingOnServerValidNameMd5() { KoResourceServerProvider::instance()->patternServer()->addResource(createPattern(), true); checkOneConfig(VALID, true, "__test_pattern", true); } void KisEmbeddedPatternManagerTest::testLoadingOnServerEmptyNameMd5() { 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); } KISTEST_MAIN(KisEmbeddedPatternManagerTest)