[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: koffice/libs/pigment
From: Cyrille Berger <cyb () lepi ! org>
Date: 2007-11-30 21:36:46
Message-ID: 1196458606.133507.9131.nullmailer () svn ! kde ! org
[Download RAW message or body]
SVN commit 743410 by berger:
introduce a global cache for color conversion transformation (it's internal to \
KoColorSpace but shared between instance), it replaced the old code that was specific \
to one instance, and didn't work when a color space is destroyed. On a side note, the \
new cache take into account the rendering intent.
The bug fix can't easily be applied to the stable branch, so next stable release \
won't include, but it's going to be in next major release. BUG:151345
M +1 -0 CMakeLists.txt
A KoColorConversionCache.cpp [License: LGPL (v2+)]
A KoColorConversionCache.h [License: LGPL (v2+)]
M +2 -0 KoColorConversionSystem.h
M +12 -0 KoColorConversionTransformation.cpp
M +5 -0 KoColorConversionTransformation.h
M +4 -40 KoColorSpace.cpp
M +10 -0 KoColorSpaceRegistry.cpp
M +6 -0 KoColorSpaceRegistry.h
--- trunk/koffice/libs/pigment/CMakeLists.txt #743409:743410
@@ -37,6 +37,7 @@
${CMAKE_CURRENT_SOURCE_DIR}/KoFallBackColorTransformation.cpp
${CMAKE_CURRENT_SOURCE_DIR}/KoHistogramProducer.cpp
${CMAKE_CURRENT_SOURCE_DIR}/KoLcmsColorSpace.cpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/KoColorConversionCache.cpp
${CMAKE_CURRENT_SOURCE_DIR}/colorprofiles/KoIccColorProfile.cpp
${CMAKE_CURRENT_SOURCE_DIR}/colorprofiles/KoHdrColorProfile.cpp
${CMAKE_CURRENT_SOURCE_DIR}/colorprofiles/KoLcmsColorProfileContainer.cpp
--- trunk/koffice/libs/pigment/KoColorConversionSystem.h #743409:743410
@@ -36,6 +36,8 @@
* the color spaces. The most usefull functions are createColorConverter to create
* a color conversion between two color spaces, and insertColorSpace which is called
* by KoColorSpaceRegistry each time a new color space is added to the registry.
+ *
+ * This class is not part of public API, and can be changed without notice.
*/
class PIGMENTCMS_EXPORT KoColorConversionSystem {
public:
--- trunk/koffice/libs/pigment/KoColorConversionTransformation.cpp #743409:743410
@@ -53,3 +53,15 @@
{
return d->renderingIntent;
}
+
+void KoColorConversionTransformation::setSrcColorSpace(const KoColorSpace* cs) const
+{
+ Q_ASSERT(*d->srcColorSpace == *cs);
+ d->srcColorSpace = cs;
+}
+
+void KoColorConversionTransformation::setDstColorSpace(const KoColorSpace* cs) const
+{
+ Q_ASSERT(*d->dstColorSpace == *cs);
+ d->dstColorSpace = cs;
+}
--- trunk/koffice/libs/pigment/KoColorConversionTransformation.h #743409:743410
@@ -25,11 +25,13 @@
#include <pigment_export.h>
class KoColorSpace;
+class KoColorConversionCache;
/**
* This is the base class of all color transform that convert the color of a pixel
*/
class PIGMENTCMS_EXPORT KoColorConversionTransformation : KoColorTransformation{
+ friend class KoColorConversionCache;
struct Private;
public:
/**
@@ -65,6 +67,9 @@
*/
virtual void transform(const quint8 *src, quint8 *dst, qint32 nPixels) const \
=0; private:
+ void setSrcColorSpace(const KoColorSpace*) const;
+ void setDstColorSpace(const KoColorSpace*) const;
+ private:
Private * const d;
};
--- trunk/koffice/libs/pigment/KoColorSpace.cpp #743409:743410
@@ -28,6 +28,7 @@
#include "KoColorTransformation.h"
#include "KoColorTransformationFactory.h"
#include "KoColorTransformationFactoryRegistry.h"
+#include "KoColorConversionCache.h"
#include "KoColorConversionSystem.h"
#include "KoColorSpaceRegistry.h"
#include "KoColorProfile.h"
@@ -43,18 +44,12 @@
KoConvolutionOp* convolutionOp;
QThreadStorage< QVector<quint8>* > conversionCache;
- mutable const KoColorSpace *lastUsedDstColorSpace;
- mutable KoColorConversionTransformation* lastUsedTransform;
mutable KoColorConversionTransformation* transfoToRGBA16;
mutable KoColorConversionTransformation* transfoFromRGBA16;
mutable KoColorConversionTransformation* transfoToLABA16;
mutable KoColorConversionTransformation* transfoFromLABA16;
-// cmsHTRANSFORM is a void *, so this should work.
- typedef QMap<const KoColorSpace *, KoColorConversionTransformation*> \
TransformMap;
- mutable TransformMap transforms; // Cache for existing transforms
-
};
KoColorSpace::KoColorSpace()
@@ -69,8 +64,6 @@
d->name = name;
d->mixColorsOp = mixColorsOp;
d->convolutionOp = convolutionOp;
- d->lastUsedDstColorSpace = 0;
- d->lastUsedTransform = 0;
d->transfoToRGBA16 = 0;
d->transfoFromRGBA16 = 0;
d->transfoToLABA16 = 0;
@@ -79,6 +72,7 @@
KoColorSpace::~KoColorSpace()
{
+ KoColorSpaceRegistry::instance()->colorConversionCache()->colorSpaceIsDestroyed(this);
delete d->mixColorsOp;
delete d->convolutionOp;
delete d;
@@ -250,38 +244,8 @@
quint32 numPixels,
KoColorConversionTransformation::Intent renderingIntent) const
{
- if (*dstColorSpace == *this)
- {
- if (src!= dst)
- memcpy (dst, src, numPixels * this->pixelSize());
-
- return true;
- }
-
- KoColorConversionTransformation* tf = 0;
-#if 1
- if (d->lastUsedTransform != 0 && d->lastUsedDstColorSpace != 0) {
- if (*dstColorSpace == *d->lastUsedDstColorSpace) {
- tf = d->lastUsedTransform;
- }
- }
- if (not tf) {
- if (!d->transforms.contains(dstColorSpace)) {
-#endif // XXX: Should we clear the transform cache if it gets too big?
- tf = this->createColorConverter(dstColorSpace, renderingIntent);
-#if 1
- d->transforms[dstColorSpace] = tf;
- }
- else {
- tf = d->transforms[dstColorSpace];
- }
-
- d->lastUsedTransform = tf;
- d->lastUsedDstColorSpace = dstColorSpace;
- }
-#endif
- tf->transform(src, dst, numPixels);
-
+ KoCachedColorConversionTransformation cct = \
KoColorSpaceRegistry::instance()->colorConversionCache()->cachedConverter(this, \
dstColorSpace, renderingIntent); + cct.transformation()->transform(src, dst, \
numPixels); return true;
}
--- trunk/koffice/libs/pigment/KoColorSpaceRegistry.cpp #743409:743410
@@ -35,6 +35,7 @@
#include "KoPluginLoader.h"
#include "KoColorSpace.h"
+#include "KoColorConversionCache.h"
#include "KoColorConversionSystem.h"
#include "KoBasicHistogramProducers.h"
@@ -51,6 +52,7 @@
QMap<QString, PaintActionList> paintDevActionMap;
const KoColorSpace *alphaCs;
KoColorConversionSystem *colorConversionSystem;
+ KoColorConversionCache* colorConversionCache;
static KoColorSpaceRegistry *singleton;
};
@@ -70,6 +72,7 @@
void KoColorSpaceRegistry::init()
{
d->colorConversionSystem = new KoColorConversionSystem;
+ d->colorConversionCache = new KoColorConversionCache;
// prepare a list of the profiles
KGlobal::mainComponent().dirs()->addResourceType("icc_profiles", 0, \
"share/color/icc/");
@@ -144,11 +147,13 @@
KoColorSpaceRegistry::KoColorSpaceRegistry() : d(new Private())
{
d->colorConversionSystem = 0;
+ d->colorConversionCache = 0;
}
KoColorSpaceRegistry::~KoColorSpaceRegistry()
{
delete d->colorConversionSystem;
+ delete d->colorConversionCache;
delete d;
}
@@ -389,4 +394,9 @@
return d->colorConversionSystem;
}
+KoColorConversionCache* KoColorSpaceRegistry::colorConversionCache() const
+{
+ return d->colorConversionCache;
+}
+
#include "KoColorSpaceRegistry.moc"
--- trunk/koffice/libs/pigment/KoColorSpaceRegistry.h #743409:743410
@@ -34,6 +34,7 @@
class KoColorSpaceFactory;
class KoColorProfile;
class KoColorConversionSystem;
+class KoColorConversionCache;
// XXX: USE STATIC DELETER! USE STATIC DELETER!
@@ -242,6 +243,11 @@
*/
const KoColorConversionSystem* colorConversionSystem() const;
+ /**
+ * @return the cache of color conversion transformation to be use by \
KoColorSpace + */
+ KoColorConversionCache* colorConversionCache() const;
+
private:
bool isCached(QString csId, QString profileName) const;
QString idsToCacheName(QString csId, QString profileName) const;
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic