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 }