]> Creatis software - creaMaracasVisu.git/blobdiff - lib/maracasVisuLib/src/interface/wxWindows/widgets/ThresholdImageView/ColorLayerImageView.cxx
#2520 creaMaracasVisu - Bug New Normal - Color Layer with double images
[creaMaracasVisu.git] / lib / maracasVisuLib / src / interface / wxWindows / widgets / ThresholdImageView / ColorLayerImageView.cxx
index 91a67553336ac103b545d42bd1bcba3a8f60c2c5..6a6e3ad003e49cb68561152f202056296a13b51c 100644 (file)
@@ -1,3 +1,28 @@
+/*# ---------------------------------------------------------------------
+#
+# Copyright (c) CREATIS (Centre de Recherche en Acquisition et Traitement de l'Image
+#                        pour la Sant�)
+# Authors : Eduardo Davila, Frederic Cervenansky, Claire Mouton
+# Previous Authors : Laurent Guigues, Jean-Pierre Roux
+# CreaTools website : www.creatis.insa-lyon.fr/site/fr/creatools_accueil
+#
+#  This software is governed by the CeCILL-B license under French law and
+#  abiding by the rules of distribution of free software. You can  use,
+#  modify and/ or redistribute the software under the terms of the CeCILL-B
+#  license as circulated by CEA, CNRS and INRIA at the following URL
+#  http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
+#  or in the file LICENSE.txt.
+#
+#  As a counterpart to the access to the source code and  rights to copy,
+#  modify and redistribute granted by the license, users are provided only
+#  with a limited warranty  and the software's author,  the holder of the
+#  economic rights,  and the successive licensors  have only  limited
+#  liability.
+#
+#  The fact that you are presently reading this means that you have had
+#  knowledge of the CeCILL-B license and that you accept its terms.
+# ------------------------------------------------------------------------ */
+
 /**
  *  \file 
  *  \author Eduardo Davila and Claire Mouton.
@@ -20,9 +45,9 @@
 //=========================================================================
 ColorLayerImageView::ColorLayerImageView( )
 {
-  _z2          =       0;
-  _fix_dynamic =       true;
-  _color_type   =       false;
+  _z2                                  =       0;
+  _fix_dynamic         =       true;
+  _color_type          =       false;
 }
 
 //=========================================================================
@@ -38,12 +63,57 @@ void ColorLayerImageView::SetSliceFixDynamic(bool fix_dynamic)
   _fix_dynamic = fix_dynamic;
 }
 
+//----------------------------------------------------------------------------
+void ColorLayerImageView::SetX2(int x2)  
+{
+  _x2 = x2;
+}
+
+//----------------------------------------------------------------------------
+void ColorLayerImageView::SetY2(int y2)  
+{
+  _y2 = y2;
+}
+
+
 //----------------------------------------------------------------------------
 void ColorLayerImageView::SetZ2(int z2)  
 {
   _z2 = z2;
 }
 
+//----------------------------------------------------------------------------
+int ColorLayerImageView::GetX() // virtual 
+{
+  int result=0;
+  if (_fix_dynamic==false)
+    {
+      result = _x2;
+    }
+  else
+    {
+      result = LayerImageBase::GetX();
+    }  
+
+  return result;
+}
+
+//----------------------------------------------------------------------------
+int ColorLayerImageView::GetY() // virtual 
+{
+  int result=0;
+  if (_fix_dynamic==false)
+    {
+      result = _y2;
+    }
+  else
+    {
+      result = LayerImageBase::GetY();
+    }  
+
+  return result;
+}
+
 //----------------------------------------------------------------------------
 int ColorLayerImageView::GetZ() // virtual 
 {
@@ -144,9 +214,9 @@ void ColorLayerImageView::SetDefaultGreyLevelBoundary()
   // By default, the histogram is split into BaseColorNb areas of equal width.
   double delta = (maxTot - minTot)/GetBaseColorNb();
   for (int i = 1; i <= GetBaseColorNb() ; i ++)
-    {
-      _grey_level_boundary.push_back((double)minTot + i * delta);
-    }
+  {
+               _grey_level_boundary.push_back((double)minTot + i * delta);
+  }
 }
 
 //----------------------------------------------------------------------------
@@ -191,108 +261,149 @@ void ColorLayerImageView::SetDefaultBaseColorAndGreyLevelBoundary()
 //----------------------------------------------------------------------------
 void ColorLayerImageView::ConfigLookupTable()  // virtual
 {
-  // CM
+  // CM 2014
+  // EED        28/01/2015 
+       
   // Grey level extrema retrieved from the image grey level extrema.
-  GetImage()->GetScalarRange(_range);
 
+  GetImage()->GetScalarRange(_range);
+  double minRange = _range[0];
+  double maxRange = _range[1];
 
   // ------------------ Setting Default Values
   // Checks the size consistency of vectors _base_color and _grey_level_boundary.
   // In case of inconsistency, an exception should be thrown. Instead, the default values are set.
   if (GetBaseColorNb() == 0)
-    SetDefaultBaseColorAndGreyLevelBoundary();
-
-  // If at least one color has been set, set the grey level boundaries to build an equipartition of the image grey levels, keeping the base colors defined.
-  else
-    if (GetBaseColorNb() != (_grey_level_boundary.size() - 1) )
+       {
+               SetDefaultBaseColorAndGreyLevelBoundary();
+       }
+   else {  // If at least one color has been set, set the grey level boundaries to build an equipartition of the image grey levels, keeping the base colors defined.
+      if (GetBaseColorNb() != ((int)_grey_level_boundary.size() - 1) )
       {
-       std::cout << "CM ColorLayerImageView::ConfigLookupTable : ERROR!!! Inconsistency between the sizes of vectors _base_color and _grey_level_boundary. _base_color.size()/3 (=" <<_base_color.size()/3 << ") should be equal to _grey_level_boundary.size() - 1 (=" << _grey_level_boundary.size() - 1 << ")." << std::endl;
-       std::cout << "CM The default values for the base colors and the grey level boundaries will be set." << std::endl;
-       SetDefaultGreyLevelBoundary();     
+                       std::cout << "CM ColorLayerImageView::ConfigLookupTable : ERROR!!! Inconsistency between the sizes of vectors _base_color and _grey_level_boundary. _base_color.size()/3 (=" <<_base_color.size()/3 << ") should be equal to _grey_level_boundary.size() - 1 (=" << _grey_level_boundary.size() - 1 << ")." << std::endl;
+                       std::cout << "CM The default values for the base colors and the grey level boundaries will be set." << std::endl;
+                       SetDefaultGreyLevelBoundary();     
       }
+   }
   // ------------------ End Of Setting Default Values
 
-
   // ------------------ Defining the Threshold Table
   vtkLookupTable* thresholdTable = GetThresholdTable();
+  double thresholdTable_range[2];
+  double r1,r2,g1,g2,b1,b2;
+  int start,end;
 
   // CM Number of table values consistent with the effective number of values (see loop below).
-  thresholdTable->SetNumberOfTableValues(std::max( GetGreyLevelBoundaries( GetBaseColorNb() ), ceil(_range[1]) ) - std::min(  GetGreyLevelBoundaries(0), floor(_range[0]) ) + 1);
-  thresholdTable->SetTableRange(_range); 
+  thresholdTable_range[1]= std::max(     GetGreyLevelBoundaries( _grey_level_boundary.size()-1 )      ,     ceil(_range[1])      );
+  thresholdTable_range[0]= std::min(     GetGreyLevelBoundaries(0)                                    ,     floor(_range[0])     );
+
+  thresholdTable->SetTableRange(thresholdTable_range); 
   thresholdTable->SetAlphaRange(0, 1);
   thresholdTable->SetValueRange(0, 1);
+
   thresholdTable->SetSaturationRange(0, 0); 
   thresholdTable->SetRampToLinear( );
 
+  maxColorsThresholdTable = 1000;
+  thresholdTable->SetNumberOfTableValues( maxColorsThresholdTable );
+
+
   // Defines the lookup table.
   // If the image has a degradation in one (or both) extremum (lower or higher),
   // sets the corresponding grey levels as transparent white in the lookup table.
-  for (int i = floor(_range[0]); i <= GetGreyLevelBoundaries(0); i++)
-    {
-      thresholdTable -> SetTableValue( i, 0, 0, 0, 0); 
-    }
-  for (int i = GetGreyLevelBoundaries( GetBaseColorNb() ) + 1 ; i <= ceil(_range[1]); i++)
-    {
-      thresholdTable -> SetTableValue( i, 0, 0, 0, 0); 
-    }
-       
-  int delta;
 
   // _color_type true, i.e. plain colors.
   // Sets the plain color for each grey level interval.
   if (_color_type)
-    {
-      for (int i = 0; i < GetBaseColorNb(); i++)
-       {
-         delta = GetGreyLevelBoundaries(i+1) - GetGreyLevelBoundaries(i);
-         for (int ii = 1; ii <= delta; ii++)
-           {
-             thresholdTable->SetTableValue(GetGreyLevelBoundaries(i) + ii,
-                                           GetBaseColors(i*3), 
-                                           GetBaseColors(i*3 + 1),
-                                           GetBaseColors(i*3 + 2),
-                                           1);
-           }
-       }
-    } // End Of if (_color_type)
+  {
+
+     if ( minRange<GetGreyLevelBoundaries(0) )
+         {
+                       start = 0;      
+                       end     = GrayLevel_TO_colorTableIndex( GetGreyLevelBoundaries(0) );  
+                       FillColorTable(start,end, 0,0,0, 0,0,0);
+     }
+
+     if ( maxRange>GetGreyLevelBoundaries(  _grey_level_boundary.size()-1   ) )
+         {
+                       start = GrayLevel_TO_colorTableIndex( GetGreyLevelBoundaries( _grey_level_boundary.size()-1 ) );  
+                       end     = GrayLevel_TO_colorTableIndex( maxRange );  
+                       FillColorTable(start,end, 0,0,0, 0,0,0);
+     }
+
+      for (int iColor = 0; iColor < GetBaseColorNb(); iColor++)
+               {
+                       r1              = GetBaseColors(iColor*3+0);
+                       g1              = GetBaseColors(iColor*3+1);
+                       b1              = GetBaseColors(iColor*3+2);
+                       start = GrayLevel_TO_colorTableIndex( GetGreyLevelBoundaries(iColor) );  
+                       end     = GrayLevel_TO_colorTableIndex( GetGreyLevelBoundaries(iColor+1) );  
+                       FillColorTable(start,end, r1,g1,b1,r1,g1,b1);
+               } // for i
+       } // End Of if (_color_type)
 
-       
   // _color_type false, i.e. gradient color
   else
-    {
-      // First color:
-      // Creates a linear range from white to the first color.
-      delta = GetGreyLevelBoundaries(1) - GetGreyLevelBoundaries(0);
-      for (int ii = 1; ii <= delta ; ii++)
-       {
-         thresholdTable->SetTableValue( GetGreyLevelBoundaries(0) + ii, GetBaseColors(0) * ii/delta,
-                                        GetBaseColors(1) * ii/delta, GetBaseColors(2) * ii/delta, 1);
-       }
-           
-      // If other colors exist:
-      // Creates linear ranges between one color and the following in the color vector.
+  {
+//EED 28/01/2015
       if (GetBaseColorNb() > 1)
-       {
-         for (int i = 1; i < GetBaseColorNb(); i++)
-           {
-             delta = GetGreyLevelBoundaries(i+1) - GetGreyLevelBoundaries(i);
-             for (int ii = 1; ii <= delta; ii++)
                {
-                 // Color computation : previous_color + (current_color - previous_color)/delta * ii
-                 thresholdTable->SetTableValue(GetGreyLevelBoundaries(i) + ii,
-                                               GetBaseColors((i-1)*3) + (GetBaseColors(i*3) - GetBaseColors((i-1)*3)) / delta * ii , 
-                                               GetBaseColors((i-1)*3 + 1) + (GetBaseColors(i*3 + 1) - GetBaseColors((i-1)*3 + 1)) / delta * ii ,
-                                               GetBaseColors((i-1)*3 + 2) + (GetBaseColors(i*3 + 2) - GetBaseColors((i-1)*3 + 2)) / delta * ii ,
-                                               1);
-               }
-           }
-       }
-    } //  End Of if (!_color_type)
-       
+                       for (int iColor = 0; iColor < GetBaseColorNb(); iColor++)
+                  {
+                               if (iColor==0)
+                               {
+                                       r1              = 0;
+                                       g1              = 0;
+                                       b1              = 0;
+                               } else {
+                                       r1              = GetBaseColors((iColor-1)*3+0);
+                                       g1              = GetBaseColors((iColor-1)*3+1);
+                                       b1              = GetBaseColors((iColor-1)*3+2);
+                               } // if iColor == 0
+
+                               r2              = GetBaseColors(iColor*3+0);
+                               g2              = GetBaseColors(iColor*3+1);
+                               b2              = GetBaseColors(iColor*3+2);
+                               start = GrayLevel_TO_colorTableIndex( GetGreyLevelBoundaries(iColor) );  
+                               end     = GrayLevel_TO_colorTableIndex( GetGreyLevelBoundaries(iColor+1) );  
+                               FillColorTable( start,end, r1,g1,b1, r2,g2,b2 );
+                       }// for 
+               } //if                          
+  } //  End Of if (!_color_type)
+
+  thresholdTable->SetRange( minRange, maxRange );
+  thresholdTable->SetValueRange( 0.0, 1.0 );
+
   thresholdTable->Build( );
-  // ------------------ End Of Defining the Threshold Table
 
-  //EO CM
+  //EO CM EED
+}
+
+//----------------------------------------------------------------------------
+int ColorLayerImageView::GrayLevel_TO_colorTableIndex( double VALUE )
+{
+  GetImage()->GetScalarRange(_range);
+  double minRange = _range[0];
+  double maxRange = _range[1];
+  return  maxColorsThresholdTable * (VALUE-minRange) / (maxRange-minRange);    
+}
+
+//----------------------------------------------------------------------------
+void ColorLayerImageView::FillColorTable(int start, int end, double r1, double g1, double b1, double r2, double g2, double b2)
+{
+   vtkLookupTable* thresholdTable = GetThresholdTable();
+       int      iTable;
+       double delta    = end-start;
+       double dr               = (r2-r1)/delta;
+       double dg               = (g2-g1)/delta;
+       double db               = (b2-b1)/delta;
+       for (iTable=0; iTable<=delta; iTable++)
+       {
+               thresholdTable->SetTableValue(  iTable+start , r1+dr*iTable, g1+dg*iTable, b1+db*iTable,1);
+       } // for iTable
+
+       if (start==0) thresholdTable->SetTableValue(  start , r1, g1, b1,0);   // The first color in the table is transparent
+
 }
 
 // EOF