[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    koffice/libs/resources
From:       Sven Langkamp <sven.langkamp () gmail ! com>
Date:       2007-12-29 15:42:13
Message-ID: 1198942933.617938.25345.nullmailer () svn ! kde ! org
[Download RAW message or body]

SVN commit 754325 by langkamp:

added colorAt to KoAbstractGradient so that Krita can paint all gradients

 M  +5 -0      KoAbstractGradient.cpp  
 M  +2 -0      KoAbstractGradient.h  
 M  +39 -0     KoStopGradient.cpp  
 M  +2 -0      KoStopGradient.h  


--- trunk/koffice/libs/resources/KoAbstractGradient.cpp #754324:754325
@@ -37,6 +37,11 @@
    delete d;
 }
 
+void KoAbstractGradient::colorAt(KoColor&, double t) const
+{
+    Q_UNUSED(t);
+}
+
 void KoAbstractGradient::setColorSpace(KoColorSpace* colorSpace)
 {
     d->colorSpace = colorSpace;
--- trunk/koffice/libs/resources/KoAbstractGradient.h #754324:754325
@@ -37,6 +37,8 @@
 
     virtual QGradient* toQGradient() const { return new QGradient(); }
 
+    virtual void colorAt(KoColor&, double t) const;
+
     void setColorSpace(KoColorSpace* colorSpace);
     const KoColorSpace * colorSpace() const;
 
--- trunk/koffice/libs/resources/KoStopGradient.cpp #754324:754325
@@ -20,6 +20,8 @@
 
 #include "KoStopGradient.h"
 
+#include <cfloat>
+
 #include <QColor>
 #include <QFile>
 #include <QDomDocument>
@@ -147,6 +149,43 @@
     return gradient;
 }
 
+void KoStopGradient::colorAt(KoColor& dst, double t) const
+{
+    QList<KoGradientStop>::const_iterator iter = m_stops.begin();
+    while( (iter != m_stops.end() || (iter+1) != m_stops.end()) && ( t > (iter+1)->first + DBL_EPSILON))
+        iter++;
+
+    if(iter == m_stops.end() || (iter+1) == m_stops.end()) {
+        dst.fromKoColor(m_stops.last().second);
+    }
+    else {
+        KoColor buffer(colorSpace());
+
+        KoGradientStop leftStop = *iter;
+        KoGradientStop rightStop = *(iter+1);
+
+        const quint8 *colors[2];
+        colors[0] = leftStop.second.data();
+        colors[1] = rightStop.second.data();
+
+        double localT;
+        double stopDistance = rightStop.first - leftStop.first;
+        if (stopDistance < DBL_EPSILON) {
+            localT = 0.5;
+        }
+        else {
+            localT = (t - leftStop.first)/stopDistance;
+        }
+        quint8 colorWeights[2];
+        colorWeights[0] = static_cast<quint8>((1.0 - localT) * 255 + 0.5);
+        colorWeights[1] = 255 - colorWeights[0];
+
+        colorSpace()->mixColorsOp()->mixColors(colors, colorWeights, 2, buffer.data());
+
+        dst.fromKoColor(buffer);
+    }
+}
+
 KoStopGradient * KoStopGradient::fromQGradient( QGradient * gradient )
 {
     if( ! gradient )
--- trunk/koffice/libs/resources/KoStopGradient.h #754324:754325
@@ -46,6 +46,8 @@
 
     virtual QGradient* toQGradient() const;
 
+    void colorAt(KoColor&, double t) const;
+
     /// Creates KoStopGradient from a QGradient
     static KoStopGradient * fromQGradient( QGradient * gradient );
 
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic