File indexing completed on 2024-06-09 04:21:54
0001 /* 0002 * SPDX-FileCopyrightText: 2015 Thorsten Zachmann <zachmann@kde.org> 0003 * 0004 * SPDX-License-Identifier: GPL-2.0-or-later 0005 */ 0006 0007 #include "filter/kis_color_transformation_configuration.h" 0008 0009 #include <QMutexLocker> 0010 #include <QMap> 0011 #include <QThread> 0012 #include "filter/kis_color_transformation_filter.h" 0013 0014 struct Q_DECL_HIDDEN KisColorTransformationConfiguration::Private { 0015 Private() 0016 {} 0017 0018 ~Private() 0019 { 0020 destroyCache(); 0021 } 0022 0023 void destroyCache() 0024 { 0025 QMutexLocker locker(&mutex); 0026 qDeleteAll(colorTransformation); 0027 colorTransformation.clear(); 0028 } 0029 0030 // XXX: Threadlocal storage!!! 0031 QMap<QThread*, KoColorTransformation*> colorTransformation; 0032 QMutex mutex; 0033 }; 0034 0035 KisColorTransformationConfiguration::KisColorTransformationConfiguration(const QString & name, qint32 version, KisResourcesInterfaceSP resourcesInterface) 0036 : KisFilterConfiguration(name, version, resourcesInterface) 0037 , d(new Private()) 0038 { 0039 } 0040 0041 KisColorTransformationConfiguration::KisColorTransformationConfiguration(const KisColorTransformationConfiguration &rhs) 0042 : KisFilterConfiguration(rhs) 0043 , d(new Private()) 0044 { 0045 } 0046 0047 KisColorTransformationConfiguration::~KisColorTransformationConfiguration() 0048 { 0049 delete d; 0050 } 0051 0052 KisFilterConfigurationSP KisColorTransformationConfiguration::clone() const 0053 { 0054 return new KisColorTransformationConfiguration(*this); 0055 } 0056 0057 /** 0058 * Invalidate the cache by default when setProperty is called. This forces 0059 * regenerating the color transforms also when a property of this object 0060 * changes, not only when the object is copied 0061 */ 0062 void KisColorTransformationConfiguration::setProperty(const QString &name, const QVariant &value) 0063 { 0064 KisFilterConfiguration::setProperty(name, value); 0065 invalidateColorTransformationCache(); 0066 } 0067 0068 KoColorTransformation* KisColorTransformationConfiguration::colorTransformation(const KoColorSpace *cs, const KisColorTransformationFilter *filter) const 0069 { 0070 QMutexLocker locker(&d->mutex); 0071 KoColorTransformation *transformation = d->colorTransformation.value(QThread::currentThread(), 0); 0072 if (!transformation) { 0073 KisFilterConfigurationSP config(clone().data()); 0074 transformation = filter->createTransformation(cs, config); 0075 d->colorTransformation.insert(QThread::currentThread(), transformation); 0076 } 0077 locker.unlock(); 0078 return transformation; 0079 } 0080 0081 void KisColorTransformationConfiguration::invalidateColorTransformationCache() 0082 { 0083 d->destroyCache(); 0084 }