File indexing completed on 2024-05-12 15:59:48
0001 /* 0002 * SPDX-FileCopyrightText: 2020 Dmitry Kazakov <dimula73@gmail.com> 0003 * 0004 * SPDX-License-Identifier: GPL-2.0-or-later 0005 */ 0006 0007 #include "KisRequiredResourcesOperators.h" 0008 0009 #include <QApplication> 0010 #include <QBuffer> 0011 #include <QThread> 0012 #include <KisLocalStrokeResources.h> 0013 #include <KisResourceLoaderRegistry.h> 0014 #include <KisMimeDatabase.h> 0015 0016 0017 bool KisRequiredResourcesOperators::detail::isLocalResourcesStorage(KisResourcesInterfaceSP resourcesInterface) 0018 { 0019 return resourcesInterface.dynamicCast<KisLocalStrokeResources>(); 0020 } 0021 0022 void KisRequiredResourcesOperators::detail::assertInGuiThread() 0023 { 0024 KIS_SAFE_ASSERT_RECOVER_RETURN(QThread::currentThread() == qApp->thread()); 0025 } 0026 0027 KisResourcesInterfaceSP KisRequiredResourcesOperators::detail::createLocalResourcesStorage(const QList<KoResourceSP> &resources) 0028 { 0029 return QSharedPointer<KisLocalStrokeResources>::create(resources); 0030 } 0031 0032 void KisRequiredResourcesOperators::detail::addResourceOrWarnIfNotLoaded(KoResourceLoadResult loadedResource, QList<KoResourceSP> *resources, KisResourcesInterfaceSP resourcesInterface) 0033 { 0034 switch (loadedResource.type()) { 0035 case KoResourceLoadResult::ExistingResource: 0036 KIS_SAFE_ASSERT_RECOVER(loadedResource.resource()) 0037 { 0038 // XXX: remove once KoResourceLoadResult takes std::monostate 0039 qWarning() << "Attempt to retrieve a resource that is null"; 0040 return; 0041 } 0042 *resources << loadedResource.resource(); 0043 break; 0044 case KoResourceLoadResult::EmbeddedResource: { 0045 /** 0046 * Some resources, like filter configurations may be assigned to the 0047 * layers without being loaded to the resource system. In such a case, 0048 * the embedded resources will be loaded here, when we make a snapshot. 0049 */ 0050 0051 const KoEmbeddedResource embeddedResource = loadedResource.embeddedResource(); 0052 const KoResourceSignature sig = embeddedResource.signature(); 0053 0054 KisResourceLoaderBase *loader = KisResourceLoaderRegistry::instance()->loader(sig.type, KisMimeDatabase::mimeTypeForFile(sig.filename)); 0055 0056 if (!loader) { 0057 qWarning() << "createLocalResourcesSnapshot: Could not create a loader for resource" << sig; 0058 return; 0059 } 0060 0061 QByteArray ba = embeddedResource.data(); 0062 QBuffer buf(&ba); 0063 buf.open(QBuffer::ReadOnly); 0064 0065 KoResourceSP resource = loader->load(sig.filename, buf, resourcesInterface); 0066 0067 if (resource) { 0068 resource->setMD5Sum(sig.md5sum); 0069 resource->setVersion(0); 0070 resource->setDirty(false); 0071 0072 *resources << resource; 0073 } else { 0074 qWarning() << "createLocalResourcesSnapshot: Could not import embedded resource" << sig; 0075 } 0076 break; 0077 } 0078 case KoResourceLoadResult::FailedLink: 0079 qWarning() << "createLocalResourcesSnapshot: failed to load a linked resource:" << loadedResource.signature(); 0080 break; 0081 } 0082 }