0023024: Update headers of OCCT files
[occt.git] / src / Aspect / Aspect_ColorCubeColorMap.cxx
1 // Copyright (c) 1995-1999 Matra Datavision
2 // Copyright (c) 1999-2012 OPEN CASCADE SAS
3 //
4 // The content of this file is subject to the Open CASCADE Technology Public
5 // License Version 6.5 (the "License"). You may not use the content of this file
6 // except in compliance with the License. Please obtain a copy of the License
7 // at http://www.opencascade.org and read it completely before using this file.
8 //
9 // The Initial Developer of the Original Code is Open CASCADE S.A.S., having its
10 // main offices at: 1, place des Freres Montgolfier, 78280 Guyancourt, France.
11 //
12 // The Original Code and all software distributed under the License is
13 // distributed on an "AS IS" basis, without warranty of any kind, and the
14 // Initial Developer hereby disclaims all such warranties, including without
15 // limitation, any warranties of merchantability, fitness for a particular
16 // purpose or non-infringement. Please see the License for the specific terms
17 // and conditions governing the rights and limitations under the License.
18
19 // Modified : GG ; 14/09/01 Implements the new AddEntry method
20
21 #include <Aspect_ColorCubeColorMap.ixx>
22 #include <Aspect_ColorMapEntry.hxx>
23
24 #ifdef TRACE
25 static int Tlevel = 0 ;
26 #endif
27
28 Aspect_ColorCubeColorMap::Aspect_ColorCubeColorMap( 
29         const Standard_Integer basepixel ,
30         const Standard_Integer red_max ,
31         const Standard_Integer red_mult ,
32         const Standard_Integer green_max ,
33         const Standard_Integer green_mult ,
34         const Standard_Integer blue_max ,
35         const Standard_Integer blue_mult )
36         :Aspect_ColorMap( Aspect_TOC_ColorCube )
37
38 { Standard_Integer      r,g,b,i ;
39   Aspect_ColorMapEntry value ;
40   Quantity_Color        rgb ;
41   Standard_Integer      max[3], mult[3], ti[3];
42
43   mybasepixel = basepixel ;
44   myredmax    = red_max ;
45   myredmult   = red_mult ;
46   mygreenmax  = green_max ;
47   mygreenmult = green_mult ;
48   mybluemax   = blue_max ;
49   mybluemult  = blue_mult ;
50
51   r = 0 ; g = 1 ; b = 2 ;
52
53   if ( ( myredmult < mygreenmult ) && ( myredmult < mybluemult ) ) {
54         r = 0 ; 
55         if ( mygreenmult < mybluemult ) { g = 1 ; b = 2 ; }
56         else                            { b = 1 ; g = 2 ; }
57   }
58   if ( ( mygreenmult < myredmult ) && ( mygreenmult < mybluemult ) ) {
59         g = 0 ; 
60         if ( myredmult < mybluemult ) { r = 1 ; b = 2 ; }
61         else                          { b = 1 ; r = 2 ; }
62   }
63   if ( ( mybluemult < myredmult ) && ( mybluemult < mygreenmult ) ) {
64         b = 0 ; 
65         if ( myredmult < mygreenmult ) { r = 1 ; g = 2 ; }
66         else                           { g = 1 ; r = 2 ; }
67   }
68
69 #ifdef TRACE
70   if ( Tlevel ) 
71         cout << "ColorCubeColorMap constructor (r,g,b) :" 
72                 << r << "," << g << "," << b << endl << flush ;
73 #endif
74
75   mult[r] = myredmult ;         max[r] = myredmax ;
76   mult[g] = mygreenmult ;       max[g] = mygreenmax ;
77   mult[b] = mybluemult ;        max[b] = mybluemax ;
78
79   for( ti[2] = 0 ; ti[2] <= max[2] ; ti[2]++ ) {
80     for( ti[1] = 0 ; ti[1] <= max[1] ; ti[1]++ ) {
81       for( ti[0] = 0 ; ti[0] <= max[0] ; ti[0]++ ) {
82         rgb.SetValues( (Standard_Real) ti[r] / (Standard_Real) max[r],
83                        (Standard_Real) ti[g] / (Standard_Real) max[g],
84                        (Standard_Real) ti[b] / (Standard_Real) max[b],
85                         Quantity_TOC_RGB ) ;
86
87         i = ti[r] * mult[r] + ti[g] * mult[g] + ti[b] * mult[b] ;
88
89         value.SetValue( mybasepixel+i, rgb ) ;
90 #ifdef TRACE
91   if ( Tlevel ) 
92         value.Dump() ;
93 #endif
94         mydata.Append( value ) ;
95       }
96     }
97   }
98 }
99
100 const Aspect_ColorMapEntry& Aspect_ColorCubeColorMap::NearestEntry( 
101                                 const Quantity_Color&  color ) const
102
103
104   return( Entry( NearestColorMapIndex( color ) ) ) ;
105 }
106
107 Standard_Integer Aspect_ColorCubeColorMap::NearestColorMapIndex( 
108                                         const Quantity_Color&  color ) const
109
110 { Standard_Integer      r,g,b ;
111
112   r = (Standard_Integer ) ( color.Red()   * myredmax   + 0.5) ;
113   g = (Standard_Integer ) ( color.Green() * mygreenmax + 0.5) ;
114   b = (Standard_Integer ) ( color.Blue()  * mybluemax  + 0.5) ;
115
116   return( r*myredmult+g*mygreenmult+b*mybluemult + 1 ) ;
117 }
118
119 const Aspect_ColorMapEntry& Aspect_ColorCubeColorMap::FindEntry( 
120                 const Standard_Integer index ) const 
121
122
123   return( Entry( FindColorMapIndex( index ) ) ) ;
124 }
125
126 Standard_Integer Aspect_ColorCubeColorMap::FindColorMapIndex( 
127                 const Standard_Integer index ) const 
128 {
129
130   if (  index < mybasepixel || 
131         index >= ( mybasepixel+Size() ) ){
132          Aspect_BadAccess::Raise ("FindEntryIndex() index not found.");
133   }
134
135   return( index - mybasepixel + 1 ) ;
136 }
137
138 void Aspect_ColorCubeColorMap::ColorCubeDefinition(
139          Standard_Integer& basepixel ,
140          Standard_Integer& red_max ,
141          Standard_Integer& red_mult ,
142          Standard_Integer& green_max ,
143          Standard_Integer& green_mult ,
144          Standard_Integer& blue_max ,
145          Standard_Integer& blue_mult ) const
146
147 {
148   basepixel = mybasepixel ;
149   red_max    = myredmax ;
150   red_mult   = myredmult ;
151   green_max  = mygreenmax ;
152   green_mult = mygreenmult ;
153   blue_max   = mybluemax ;
154   blue_mult  = mybluemult ;
155 }
156
157 Standard_Integer Aspect_ColorCubeColorMap::AddEntry (const Quantity_Color &aColor) {
158
159     return mybasepixel + NearestColorMapIndex(aColor) - 1;
160 }