[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