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

List:       kde-commits
Subject:    koffice/krita/plugins/painterlyframework
From:       Emanuele Tamponi <emanuele () valinor ! it>
Date:       2007-12-31 23:49:31
Message-ID: 1199144971.615101.1800.nullmailer () svn ! kde ! org
[Download RAW message or body]

SVN commit 755289 by tamponi:

Now, in theory, you can even use quint16 and quint8 as channel type for
the colorspace, but it gives very bad conversions (they're not large enough
to store all the values).


 M  +26 -21    channel_converter.h  
 M  +14 -11    kis_ks_colorspace.h  
 M  +7 -7      tests/channel_converter_test.cpp  


--- trunk/koffice/krita/plugins/painterlyframework/channel_converter.h #755288:755289
@@ -25,7 +25,9 @@
 #include <gsl/gsl_matrix.h>
 #include <gsl/gsl_vector.h>
 
-template< typename TYPE >
+#include <KoColorSpaceMaths.h>
+
+template< typename _TYPE_ >
 class ChannelConverter {
 
     public:
@@ -33,8 +35,8 @@
         ChannelConverter(const double &Kblack, const double &Sblack);
         ~ChannelConverter();
 
-        inline void KSToReflectance(const TYPE &K, const TYPE &S, double &R) const;
-        inline void reflectanceToKS(const double &R, TYPE &K, TYPE &S) const;
+        inline void KSToReflectance(const _TYPE_ &K, const _TYPE_ &S, double &R) \
const; +        inline void reflectanceToKS(const double &R, _TYPE_ &K, _TYPE_ &S) \
const;  
     private:
         double Kb, Sb;
@@ -51,14 +53,15 @@
         inline double S(const double &R) const;
 };
 
-template< typename TYPE >
-ChannelConverter<TYPE>::ChannelConverter(const double &Kblack, const double &Sblack)
+template< typename _TYPE_ >
+ChannelConverter<_TYPE_>::ChannelConverter(const double &Kblack, const double \
&Sblack)  : Kb(Kblack), Sb(Sblack)
 {
     double q1, q2, k1, k2, D, Sh;
     double r0; // Represent the reflectance of the reference black (no, it's not \
zero)  
-    KSToReflectance(Kb, Sb, r0);
+    KSToReflectance(KoColorSpaceMaths<double,_TYPE_>::scaleToA(Kb),
+                    KoColorSpaceMaths<double,_TYPE_>::scaleToA(Sb), r0);
     q1 = Kb / ( 1.0 + Kb*PHI(r0) );
     k1 = 1.0 + q1 - sqrt( q1*q1 + 2.0*q1 );
 
@@ -96,13 +99,13 @@
     gsl_vector_free(x);
 }
 
-template< typename TYPE >
-ChannelConverter<TYPE>::~ChannelConverter()
+template< typename _TYPE_ >
+ChannelConverter<_TYPE_>::~ChannelConverter()
 {
 }
 
-template< typename TYPE >
-inline double ChannelConverter<TYPE>::K(const double &R) const
+template< typename _TYPE_ >
+inline double ChannelConverter<_TYPE_>::K(const double &R) const
 {
     if (R <= 0.5)
         return ( 1.0 / (PHI(W(R))-PHI(R)) );
@@ -110,8 +113,8 @@
         return ( S(R)*PSI(R) );
 }
 
-template< typename TYPE >
-inline double ChannelConverter<TYPE>::S(const double &R) const
+template< typename _TYPE_ >
+inline double ChannelConverter<_TYPE_>::S(const double &R) const
 {
     if (R > 0.5)
         return ( Kb - Sb*PSI(B(R)) ) / ( PSI(B(R)) - PSI(R) );
@@ -119,28 +122,30 @@
         return ( K(R)*PHI(R) );
 }
 
-template< typename TYPE >
-inline void ChannelConverter<TYPE>::KSToReflectance(const TYPE &K, const TYPE &S, \
double &R) const +template< typename _TYPE_ >
+inline void ChannelConverter<_TYPE_>::KSToReflectance(const _TYPE_ &K, const _TYPE_ \
&S, double &R) const  {
-    if (S == 0.0) {
+    double k = KoColorSpaceMaths<_TYPE_,double>::scaleToA(K);
+    double s = KoColorSpaceMaths<_TYPE_,double>::scaleToA(S);
+    if (s == 0.0) {
         R = 0.0;
         return;
     }
 
-    if (K == 0.0) {
+    if (k == 0.0) {
         R = 1.0;
         return;
     }
 
-    const double Q = (double)(K/S);
+    const double Q = k/s;
     R = 1.0 + Q - sqrt( Q*Q + 2.0*Q );
 }
 
-template< typename TYPE >
-inline void ChannelConverter<TYPE>::reflectanceToKS(const double &R, TYPE &K, TYPE \
&S) const +template< typename _TYPE_ >
+inline void ChannelConverter<_TYPE_>::reflectanceToKS(const double &R, _TYPE_ &K, \
_TYPE_ &S) const  {
-    K = (TYPE)(this->K(R));
-    S = (TYPE)(this->S(R));
+    K = KoColorSpaceMaths<double,_TYPE_>::scaleToA(this->K(R));
+    S = KoColorSpaceMaths<double,_TYPE_>::scaleToA(this->S(R));
 }
 
 #endif // CHANNEL_CONVERTER_H_
--- trunk/koffice/krita/plugins/painterlyframework/kis_ks_colorspace.h #755288:755289
@@ -68,14 +68,17 @@
             QString id;
             QByteArray name;
 
-            if (sizeof(_TYPE_) == 4) {
-                id = QString("F32");
-                name = QString("32 Bits Float").toUtf8();
+            switch (KoColorSpaceMathsTraits<_TYPE_>::channelValueType) {
+                case KoChannelInfo::FLOAT32:
+                    id = QString("F32");
+                    name = QString("32 Bits Float").toUtf8();
+                    break;
+                case KoChannelInfo::FLOAT16:
+                    id = QString("F16");
+                    name = QString("16 Bits Float").toUtf8();
+                    break;
+                default: break;
             }
-            if (sizeof(_TYPE_) == 2) {
-                id = QString("F16");
-                name = QString("16 Bits Float").toUtf8();
-            }
 
             return KoID(id, i18n(name.data()));
         }
@@ -162,8 +165,8 @@
 {
     QDomElement labElt = doc.createElement("KS"+QString::number(_N_));
     for (uint i = 0; i < _N_; i++) {
-        labElt.setAttribute("K"+QString::number(i), (double)CSTrait::K(pixel,i));
-        labElt.setAttribute("S"+QString::number(i), (double)CSTrait::S(pixel,i));
+        labElt.setAttribute("K"+QString::number(i), \
KoColorSpaceMaths<_TYPE_,double>::scaleToA(CSTrait::K(pixel,i))); +        \
labElt.setAttribute("S"+QString::number(i), \
KoColorSpaceMaths<_TYPE_,double>::scaleToA(CSTrait::S(pixel,i)));  }
     labElt.setAttribute("space", profile()->name());
     colorElt.appendChild(labElt);
@@ -173,8 +176,8 @@
 void KisKSColorSpace<_TYPE_,_N_>::colorFromXML(quint8 *pixel, const QDomElement \
&elt) const  {
     for (uint i = 0; i < _N_; i++) {
-        CSTrait::K(pixel,i) = elt.attribute("K"+QString::number(i)).toFloat();
-        CSTrait::S(pixel,i) = elt.attribute("S"+QString::number(i)).toFloat();
+        CSTrait::K(pixel,i) = \
KoColorSpaceMaths<double,_TYPE_>::scaleToA(elt.attribute("K"+QString::number(i)).toDouble());
 +        CSTrait::S(pixel,i) = \
KoColorSpaceMaths<double,_TYPE_>::scaleToA(elt.attribute("S"+QString::number(i)).toDouble());
  }
 }
 
--- trunk/koffice/krita/plugins/painterlyframework/tests/channel_converter_test.cpp \
#755288:755289 @@ -27,27 +27,27 @@
 
 void ChannelConverterTest::testKSReflectance()
 {
-    ChannelConverter<double> c(4.3, 0.14);
-    double K, S, R;
+    ChannelConverter<float> c(4.3, 0.14);
+    float K, S; double R;
 
     R = 0.4999999999999;
     c.reflectanceToKS(R, K, S);
     qDebug() << "Reflectance " << R << "; K = " << K << ", S = " << S;
-    QCOMPARE((S/K), (R*2.0/pow(1-R,2)));
+    QCOMPARE((double)(S/K), (R*2.0/pow(1-R,2)));
 
     R = 0.5000000000001;
     c.reflectanceToKS(R, K, S);
     qDebug() << "Reflectance " << R << "; K = " << K << ", S = " << S;
-    QCOMPARE((S/K), (R*2.0/pow(1-R,2)));
+    QCOMPARE((double)(S/K), (R*2.0/pow(1-R,2)));
 
     for (int i = 0; i <= 100; i++) {
         R = (double)i/100.0;
         c.reflectanceToKS(R, K, S);
         qDebug() << "Reflectance " << R << "; K = " << K << ", S = " << S;
         if ( i <= 50 )
-            QCOMPARE((S/K), (2.0*R*pow(1-R,-2)));
+            QCOMPARE((double)(S/K), (2.0*R*pow(1-R,-2)));
         else
-            QCOMPARE((K/S), (0.5*pow(1-R, 2)/R));
+            QCOMPARE((double)(K/S), (0.5*pow(1-R, 2)/R));
     }
 
     // KSToReflectance
@@ -65,7 +65,7 @@
         c.KSToReflectance(K, S, R);
         qDebug() << "K " << K << ", S " << S << "; R = " << R;
         QVERIFY(R > 0.0 && R < 1.0);
-        QCOMPARE((S/K), (R*2.0/pow(1-R,2)));
+        QCOMPARE((double)(S/K), (R*2.0/pow(1-R,2)));
     }
 }
 


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

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