Author: jghali
Date: Sun Mar 11 10:59:27 2018
New Revision: 22430

URL: http://scribus.net/websvn/listing.php?repname=Scribus&sc=1&rev=22430
Log:
modify spectral values convertor so as to make it usable with E308 conversion 
tables

Modified:
    trunk/Scribus/scribus/colormgmt/scspectralvaluesconvertor.cpp
    trunk/Scribus/scribus/colormgmt/scspectralvaluesconvertor.h

Modified: trunk/Scribus/scribus/colormgmt/scspectralvaluesconvertor.cpp
URL: 
http://scribus.net/websvn/diff.php?repname=Scribus&rev=22430&path=/trunk/Scribus/scribus/colormgmt/scspectralvaluesconvertor.cpp
==============================================================================
--- trunk/Scribus/scribus/colormgmt/scspectralvaluesconvertor.cpp       
(original)
+++ trunk/Scribus/scribus/colormgmt/scspectralvaluesconvertor.cpp       Sun Mar 
11 10:59:27 2018
@@ -11,27 +11,36 @@
 #include "scciedata.h"
 
 ScSpectralValuesConvertor::ScSpectralValuesConvertor(eIlluminant illuminant, 
eObserver observer)
-                         : 
m_illuminant(ScCIEData::instance().cieIlluminant(illuminant)),
-                           
m_observer(ScCIEData::instance().cieObserver(observer))
-{
-       m_illuminantWhite = computeIlluminantWhite();
-}
-
-ScXYZ ScSpectralValuesConvertor::computeIlluminantWhite()
+{
+       const ScCIEIlluminant& cieIlluminant = 
ScCIEData::instance().cieIlluminant(illuminant);
+       const ScCIEObserver& cieObserver = 
ScCIEData::instance().cieObserver(observer);
+       m_illuminantWhite = computeIlluminantWhite(cieIlluminant, cieObserver);
+       computeWeights(cieIlluminant, cieObserver);
+}
+
+ScSpectralValuesConvertor::ScSpectralValuesConvertor(const ScE308Table& 
e308table)
+{
+       m_illuminantWhite = computeIlluminantWhite(e308table);
+       m_weightsX = e308table.weightsX();
+       m_weightsY = e308table.weightsY();
+       m_weightsZ = e308table.weightsZ();
+}
+
+ScXYZ ScSpectralValuesConvertor::computeIlluminantWhite(const ScCIEIlluminant& 
illuminant, const ScCIEObserver& observer)
 {
        int wl;
        double illPower;
        ScXYZ illWhite = { 0.0, 0.0, 0.0 };
 
-       const QVector<int> wavelengths = m_illuminant.wavelengths();
-       for (int i = 0; i < wavelengths.count(); ++i)
-       {
-               wl = wavelengths.at(i);
-               illPower = m_illuminant.power(wl);
-
-               illWhite.X += illPower * m_observer.xVal(wl);
-               illWhite.Y += illPower * m_observer.yVal(wl);
-               illWhite.Z += illPower * m_observer.zVal(wl);
+       const QVector<int> wavelengths = illuminant.wavelengths();
+       for (int i = 0; i < wavelengths.count(); ++i)
+       {
+               wl = wavelengths.at(i);
+               illPower = illuminant.power(wl);
+
+               illWhite.X += illPower * observer.xVal(wl);
+               illWhite.Y += illPower * observer.yVal(wl);
+               illWhite.Z += illPower * observer.zVal(wl);
        }
 
        double norm = 1.0 / illWhite.Y;
@@ -40,6 +49,50 @@
        illWhite.Z *= norm;
 
        return illWhite;
+}
+
+ScXYZ ScSpectralValuesConvertor::computeIlluminantWhite(const ScE308Table& 
e380table)
+{
+       int wl;
+       ScXYZ illWhite = { 0.0, 0.0, 0.0 };
+
+       const QVector<int> wavelengths = e380table.wavelengths();
+       for (int i = 0; i < wavelengths.count(); ++i)
+       {
+               wl = wavelengths.at(i);
+
+               illWhite.X += e380table.wX(wl);
+               illWhite.Y += e380table.wY(wl);
+               illWhite.Z += e380table.wZ(wl);
+       }
+
+       double norm = 1.0 / illWhite.Y;
+       illWhite.X *= norm;
+       illWhite.Y = 1.0;
+       illWhite.Z *= norm;
+
+       return illWhite;
+}
+
+void ScSpectralValuesConvertor::computeWeights(const ScCIEIlluminant& 
illuminant, const ScCIEObserver& observer)
+{
+       int wl;
+       double illPower;
+
+       m_weightsX.clear();
+       m_weightsY.clear();
+       m_weightsZ.clear();
+
+       const QVector<int> wavelengths = illuminant.wavelengths();
+       for (int i = 0; i < wavelengths.count(); ++i)
+       {
+               wl = wavelengths.at(i);
+               illPower = illuminant.power(wl);
+
+               m_weightsX[wl] = illPower * observer.xVal(wl);
+               m_weightsY[wl] = illPower * observer.yVal(wl);
+               m_weightsZ[wl] = illPower * observer.zVal(wl);
+       }
 }
 
 ScLab ScSpectralValuesConvertor::toLab(const QMap<int, double>& spectrum) const
@@ -73,7 +126,7 @@
 ScXYZ ScSpectralValuesConvertor::toXYZ(const QMap<int, double>& spectrum) const
 {
        int wl;
-       double illPower, reflectance;
+       double reflectance;
        ScXYZ cieXYZ = { 0.0, 0.0, 0.0 };
        ScXYZ illXYZ = { 0.0, 0.0, 0.0 };
 
@@ -84,11 +137,10 @@
        for (iter = spectrum.begin(); iter != spectrum.end(); iter++)
        {
                wl = iter.key();
-               illPower = m_illuminant.power(wl);
-
-               illXYZ.X += illPower * m_observer.xVal(wl);
-               illXYZ.Y += illPower * m_observer.yVal(wl);
-               illXYZ.Z += illPower * m_observer.zVal(wl);
+
+               illXYZ.X += m_weightsX[wl];
+               illXYZ.Y += m_weightsY[wl];
+               illXYZ.Z += m_weightsZ[wl];
        }
 
        double normX = m_illuminantWhite.X / illXYZ.X;
@@ -100,14 +152,13 @@
        {
                wl = iter.key();
                reflectance = iter.value();
-               illPower = m_illuminant.power(wl);
 
                // Fix possible measurement artifacts
                reflectance = qMax(0.0, reflectance);
 
-               cieXYZ.X += reflectance * illPower * m_observer.xVal(wl);
-               cieXYZ.Y += reflectance * illPower * m_observer.yVal(wl);
-               cieXYZ.Z += reflectance * illPower * m_observer.zVal(wl);
+               cieXYZ.X += reflectance * m_weightsX.value(wl, 0.0);
+               cieXYZ.Y += reflectance * m_weightsY.value(wl, 0.0);
+               cieXYZ.Z += reflectance * m_weightsZ.value(wl, 0.0);
        }
 
        cieXYZ.X *= normX;
@@ -125,7 +176,7 @@
 ScXYZ ScSpectralValuesConvertor::toXYZ(const QVector<int>& wavelengths, const 
QVector<double>& reflectances) const
 {
        int wl;
-       double illPower, reflectance;
+       double reflectance;
        ScXYZ cieXYZ = { 0.0, 0.0, 0.0 };
        ScXYZ illXYZ = { 0.0, 0.0, 0.0 };
 
@@ -137,11 +188,10 @@
        for (int i = 0; i < wavelengths.count(); ++i)
        {
                wl = wavelengths.at(i);
-               illPower = m_illuminant.power(wl);
-
-               illXYZ.X += illPower * m_observer.xVal(wl);
-               illXYZ.Y += illPower * m_observer.yVal(wl);
-               illXYZ.Z += illPower * m_observer.zVal(wl);
+
+               illXYZ.X += m_weightsX[wl];
+               illXYZ.Y += m_weightsY[wl];
+               illXYZ.Z += m_weightsZ[wl];
        }
 
        double normX = m_illuminantWhite.X / illXYZ.X;
@@ -153,14 +203,13 @@
        {
                wl = wavelengths.at(i);
                reflectance = reflectances.at(i);
-               illPower = m_illuminant.power(wl);
 
                // Fix possible measurement artifacts
                reflectance = qMax(0.0, reflectance);
 
-               cieXYZ.X += reflectance * illPower * m_observer.xVal(wl);
-               cieXYZ.Y += reflectance * illPower * m_observer.yVal(wl);
-               cieXYZ.Z += reflectance * illPower * m_observer.zVal(wl);
+               cieXYZ.X += reflectance * m_weightsX.value(wl, 0.0);
+               cieXYZ.Y += reflectance * m_weightsY.value(wl, 0.0);
+               cieXYZ.Z += reflectance * m_weightsZ.value(wl, 0.0);
        }
 
        cieXYZ.X *= normX;

Modified: trunk/Scribus/scribus/colormgmt/scspectralvaluesconvertor.h
URL: 
http://scribus.net/websvn/diff.php?repname=Scribus&rev=22430&path=/trunk/Scribus/scribus/colormgmt/scspectralvaluesconvertor.h
==============================================================================
--- trunk/Scribus/scribus/colormgmt/scspectralvaluesconvertor.h (original)
+++ trunk/Scribus/scribus/colormgmt/scspectralvaluesconvertor.h Sun Mar 11 
10:59:27 2018
@@ -14,6 +14,7 @@
 #include "sccieilluminants.h"
 #include "sccieobservers.h"
 #include "sccolormgmtstructs.h"
+#include "sce308tables.h"
 
 class ScSpectralValuesConvertor
 {
@@ -23,6 +24,11 @@
         * illuminant and observer
         */
        ScSpectralValuesConvertor(eIlluminant illuminant, eObserver observer);
+
+       /**
+       * Construct spectral values to CIEXYZ convertor with specified E308 
table
+       */
+       ScSpectralValuesConvertor(const ScE308Table& e380table);
 
        /**
         * Retrieve CIE XYZ values of illuminant white
@@ -50,11 +56,15 @@
        ScXYZ toXYZ(const QVector<int>& wavelengths, const QVector<double>& 
reflectances) const;
 
 protected:
-       const ScCIEIlluminant& m_illuminant;
-       const ScCIEObserver& m_observer;
        ScXYZ m_illuminantWhite;
 
-       ScXYZ computeIlluminantWhite();
+       QMap<int, double> m_weightsX;
+       QMap<int, double> m_weightsY;
+       QMap<int, double> m_weightsZ;
+
+       ScXYZ computeIlluminantWhite(const ScCIEIlluminant& illuminant, const 
ScCIEObserver& observer);
+       ScXYZ computeIlluminantWhite(const ScE308Table& e380table);
+       void  computeWeights(const ScCIEIlluminant& illuminant, const 
ScCIEObserver& observer);
 };
 
 #endif


_______________________________________________
scribus-commit mailing list
[email protected]
http://lists.scribus.net/mailman/listinfo/scribus-commit

Reply via email to