Krita Source Code Documentation
Loading...
Searching...
No Matches
KoColorConversionCache.cpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2007 Cyrille Berger <cberger@cberger.net>
3 *
4 * SPDX-License-Identifier: LGPL-2.0-or-later
5*/
6
8
9#include <QList>
10#include <QMutex>
11#include <QMutexLocker>
12#include <QThreadStorage>
13
14#include <KoColorSpace.h>
15
17
19 const KoColorSpace* _dst,
21 KoColorConversionTransformation::ConversionFlags _conversionFlags)
22 : src(_src)
23 , dst(_dst)
24 , renderingIntent(_renderingIntent)
25 , conversionFlags(_conversionFlags)
26 {
27 }
28
29 bool operator==(const KoColorConversionCacheKey& rhs) const {
30 return (*src == *(rhs.src)) && (*dst == *(rhs.dst))
33 }
34
38 KoColorConversionTransformation::ConversionFlags conversionFlags;
39};
40
42{
43 return qHash(key.src) + qHash(key.dst) + qHash(key.renderingIntent) + qHash(key.conversionFlags);
44}
45
63
64typedef QPair<KoColorConversionCacheKey, KoCachedColorConversionTransformation> FastPathCacheItem;
65
67 QMultiHash< KoColorConversionCacheKey, CachedTransformation*> cache;
68 QMutex cacheMutex;
69
70 QThreadStorage<FastPathCacheItem*> fastStorage;
71};
72
73
77
79{
80 Q_FOREACH (CachedTransformation* transfo, d->cache) {
81 delete transfo;
82 }
83 delete d;
84}
85
87 const KoColorSpace* dst,
89 KoColorConversionTransformation::ConversionFlags _conversionFlags)
90{
91 KoColorConversionCacheKey key(src, dst, _renderingIntent, _conversionFlags);
92
93 FastPathCacheItem *cacheItem =
94 d->fastStorage.localData();
95
96 if (cacheItem) {
97 if (cacheItem->first == key) {
98 return cacheItem->second;
99 }
100 }
101
102 cacheItem = 0;
103
104 QMutexLocker lock(&d->cacheMutex);
105 QList< CachedTransformation* > cachedTransfos = d->cache.values(key);
106 if (cachedTransfos.size() != 0) {
107 Q_FOREACH (CachedTransformation* ct, cachedTransfos) {
108 ct->transfo->setSrcColorSpace(src);
109 ct->transfo->setDstColorSpace(dst);
110
112 break;
113 }
114 }
115 if (!cacheItem) {
116 KoColorConversionTransformation* transfo = src->createColorConverter(dst, _renderingIntent, _conversionFlags);
118 d->cache.insert(key, ct);
120 }
121
122 d->fastStorage.setLocalData(cacheItem);
123 return cacheItem->second;
124}
125
127{
128 d->fastStorage.setLocalData(0);
129
130 QMutexLocker lock(&d->cacheMutex);
131 QMultiHash< KoColorConversionCacheKey, CachedTransformation*>::iterator endIt = d->cache.end();
132 for (QMultiHash< KoColorConversionCacheKey, CachedTransformation*>::iterator it = d->cache.begin(); it != endIt;) {
133 if (it.key().src == cs || it.key().dst == cs) {
134 Q_ASSERT(it.value()->isNotInUse()); // That's terribly evil, if that assert fails, that means that someone is using a color transformation with a color space which is currently being deleted
135 delete it.value();
136 it = d->cache.erase(it);
137 } else {
138 ++it;
139 }
140 }
141}
142
143//--------- KoCachedColorConversionTransformation ----------//
144
151
157
163
168
uint qHash(const KoColorConversionCacheKey &key)
QPair< KoColorConversionCacheKey, KoCachedColorConversionTransformation > FastPathCacheItem
unsigned int uint
KoColorConversionCache::CachedTransformation * m_transfo
KoCachedColorConversionTransformation(KoColorConversionCache::CachedTransformation *transfo)
const KoColorConversionTransformation * transformation() const
KoCachedColorConversionTransformation cachedConverter(const KoColorSpace *src, const KoColorSpace *dst, KoColorConversionTransformation::Intent _renderingIntent, KoColorConversionTransformation::ConversionFlags conversionFlags)
void colorSpaceIsDestroyed(const KoColorSpace *src)
bool operator==(const KoColorConversionCacheKey &rhs) const
KoColorConversionTransformation::ConversionFlags conversionFlags
KoColorConversionTransformation::Intent renderingIntent
KoColorConversionCacheKey(const KoColorSpace *_src, const KoColorSpace *_dst, KoColorConversionTransformation::Intent _renderingIntent, KoColorConversionTransformation::ConversionFlags _conversionFlags)
CachedTransformation(KoColorConversionTransformation *_transfo)
QThreadStorage< FastPathCacheItem * > fastStorage
QMultiHash< KoColorConversionCacheKey, CachedTransformation * > cache
void setDstColorSpace(const KoColorSpace *) const
void setSrcColorSpace(const KoColorSpace *) const