xsi_color4f.h Source File
 
 
 
xsi_color4f.h
Go to the documentation of this file.
00001 //*****************************************************************************
00011 //*****************************************************************************
00012 
00013 #if (_MSC_VER > 1000) || defined(SGI_COMPILER)
00014 #pragma once
00015 #endif
00016 
00017 #ifndef __XSICOLOR4F_H__
00018 #define __XSICOLOR4F_H__
00019 
00020 #include "sicppsdk.h"
00021 #include <xsi_math.h>
00022 
00023 namespace XSI {
00024 
00025 namespace MATH {
00026 
00027 //*****************************************************************************
00032 //*****************************************************************************
00033 class CColor4f
00034 {
00035 public:
00038         enum Type
00039         {
00040                 siRGBA,
00041                 siHSVA,
00042                 siHLSA,
00043         };
00044 
00046         SICPPSDK_INLINE CColor4f();
00047 
00054         SICPPSDK_INLINE CColor4f(float in_R, float in_G, float in_B, float in_A);
00055 
00063         SICPPSDK_INLINE CColor4f(float in_Arg1, float in_Arg2, float in_Arg3, float in_A, Type in_eColorType );
00064 
00068         SICPPSDK_INLINE CColor4f( const CColor4f& in_color );
00069 
00071         ~CColor4f() {};
00072 
00079         SICPPSDK_INLINE void Set(float in_R,float in_G,float in_B,float in_A);
00080 
00088         SICPPSDK_INLINE void Set( float in_Arg1, float in_Arg2, float in_Arg3, float in_A, Type in_eColorType );
00089 
00094         SICPPSDK_INLINE float& PutR( const float in_R );
00095 
00100         SICPPSDK_INLINE float& PutG( const float in_G );
00101 
00106         SICPPSDK_INLINE float& PutB( const float in_B );
00107 
00112         SICPPSDK_INLINE float& PutA( const float in_A );
00113 
00120         SICPPSDK_INLINE void GetAsRGBA( float &out_R, float &out_G, float &out_B, float &out_A ) const;
00121 
00128         SICPPSDK_INLINE void GetAsHLSA( float &out_H, float &out_L, float &out_S, float &out_A ) const;
00129 
00136         SICPPSDK_INLINE void GetAsHSVA( float &out_H, float &out_S, float &out_V, float &out_A) const;
00137 
00141         SICPPSDK_INLINE float GetH() const;
00142 
00146         SICPPSDK_INLINE float GetL() const;
00147 
00151         SICPPSDK_INLINE float GetS_HSVA() const;
00152 
00156         SICPPSDK_INLINE float GetS_HLSA() const;
00157 
00161         SICPPSDK_INLINE float GetV() const;
00162 
00166         SICPPSDK_INLINE float& GetR();
00167 
00171         SICPPSDK_INLINE float& GetG();
00172 
00176         SICPPSDK_INLINE float& GetB();
00177 
00181         SICPPSDK_INLINE float& GetA();
00182 
00186         SICPPSDK_INLINE float* GetRGBA();
00187 
00191         SICPPSDK_INLINE const float& GetR()const;
00192 
00196         SICPPSDK_INLINE const float& GetG()const;
00197 
00201         SICPPSDK_INLINE const float& GetB()const;
00202 
00206         SICPPSDK_INLINE const float& GetA()const;
00207 
00211         SICPPSDK_INLINE const float* GetRGBA()const;
00212 
00216         SICPPSDK_INLINE operator float*();
00217 
00221         SICPPSDK_INLINE bool operator==(const CColor4f& in_rColor4f )const;
00222 
00226         SICPPSDK_INLINE bool operator!=(const CColor4f& in_rColor4f )const ;
00227 
00235         SICPPSDK_INLINE bool operator < (const CColor4f& in_rColor4f )const;
00236 
00241         SICPPSDK_INLINE bool IsNull(float in_fEpsilon) const;
00242 
00247         SICPPSDK_INLINE CColor4f& Add(const CColor4f& in_col);
00248 
00253         SICPPSDK_INLINE CColor4f& Mul(float in_fFactor);
00254 
00259         SICPPSDK_INLINE CColor4f& Mul( const CColor4f& in_col );
00260 
00265         SICPPSDK_INLINE CColor4f& Sub( const CColor4f& in_col );
00266 
00270         SICPPSDK_INLINE CColor4f& Negate();
00271 
00275         SICPPSDK_INLINE void PutNull();
00276 
00280         SICPPSDK_INLINE float GetBrightness()const;
00281 
00285         SICPPSDK_INLINE float GetBrightnessWithAlpha()const;
00286 
00290         SICPPSDK_INLINE float GetGrayscale()const;
00291 
00295         SICPPSDK_INLINE float GetGrayscaleWithAlpha()const;
00296 
00300         SICPPSDK_INLINE CColor4f& InverseRGB();
00301 
00302         private:
00303         SICPPSDK_INLINE LONG RoundDown(float a) const;
00304         SICPPSDK_INLINE void MinMax( float& out_fMin, float& out_fMax ) const;
00305         SICPPSDK_INLINE bool AreAlmostEqual(const CColor4f& in_c1,const CColor4f& in_c2,const float in_fEpsilon = MicroEPS);
00306 
00307         enum Component
00308         {
00309                 R=0,G,B,A,N
00310         };
00311         float m_RGBA[4];
00312 };
00313 
00314 SICPPSDK_INLINE CColor4f::CColor4f()
00315 {
00316         m_RGBA[R] = 0.0f;
00317         m_RGBA[G] = 0.0f;
00318         m_RGBA[B] = 0.0f;
00319         m_RGBA[A] = 0.0f;
00320 }
00321 
00322 SICPPSDK_INLINE CColor4f::CColor4f(float in_R, float in_G, float in_B, float in_A)
00323 {
00324         m_RGBA[R] = in_R;
00325         m_RGBA[G] = in_G;
00326         m_RGBA[B] = in_B;
00327         m_RGBA[A] = in_A;
00328 }
00329 
00330 SICPPSDK_INLINE CColor4f::CColor4f(float in_Arg1, float in_Arg2, float in_Arg3, float in_A, Type in_eColorType )
00331 {
00332         Set( in_Arg1, in_Arg2, in_Arg3, in_A, in_eColorType );
00333 }
00334 
00335 SICPPSDK_INLINE CColor4f::CColor4f( const CColor4f& in_color )
00336 {
00337         const float* pRGBA = in_color.GetRGBA();
00338         if (pRGBA)
00339         {
00340                 Set( pRGBA[R], pRGBA[G], pRGBA[B], pRGBA[A], siRGBA );
00341         }
00342 }
00343 
00344 SICPPSDK_INLINE void CColor4f::Set(float in_R,float in_G,float in_B,float in_A)
00345 {
00346         GetR()=in_R;
00347         GetG()=in_G;
00348         GetB()=in_B;
00349         GetA()=in_A;
00350 }
00351 
00352 SICPPSDK_INLINE float& CColor4f::PutR( const float in_R ){return m_RGBA[R] = in_R;}
00353 SICPPSDK_INLINE float& CColor4f::PutG( const float in_G ){return m_RGBA[G] = in_G;}
00354 SICPPSDK_INLINE float& CColor4f::PutB( const float in_B ){return m_RGBA[B] = in_B;}
00355 SICPPSDK_INLINE float& CColor4f::PutA( const float in_A ){return m_RGBA[A] = in_A;}
00356 
00357 SICPPSDK_INLINE void CColor4f::Set( float in_Arg1, float in_Arg2, float in_Arg3, float in_A, Type in_eColorType )
00358 {
00359         m_RGBA[A] = in_A;
00360 
00361         switch( in_eColorType )
00362         {
00363                 case siRGBA:
00364                 {
00365                         m_RGBA[R] = in_Arg1;
00366                         m_RGBA[G] = in_Arg2;
00367                         m_RGBA[B] = in_Arg3;
00368                         break;
00369                 }
00370                 case siHSVA:
00371                 {
00372                         if (in_Arg2 == 0.0)
00373                         {
00374                                 m_RGBA[R] = in_Arg3;
00375                                 m_RGBA[G] = in_Arg3;
00376                                 m_RGBA[B] = in_Arg3;
00377                         }
00378                         else
00379                         {
00380                                 in_Arg1 *= (float)( 360.0/60.0 );
00381 
00382                                 ULONG  l_ulHueI = (ULONG)RoundDown(in_Arg1);
00383                                 float l_fHueF = in_Arg1 - l_ulHueI;
00384 
00385                                 float l_fP = in_Arg3 * (1.0f - in_Arg2);
00386                                 float l_fQ = in_Arg3 * (1.0f - (in_Arg2*l_fHueF));
00387                                 float l_fT = in_Arg3 * (1.0f - (in_Arg2*(1.0f-l_fHueF)));
00388 
00389                                 switch (l_ulHueI)
00390                                 {
00391                                         case 0 :
00392                                         case 6 : m_RGBA[R] = in_Arg3; m_RGBA[G] = l_fT; m_RGBA[B] = l_fP;
00393                                                 break;
00394                                         case 1 : m_RGBA[R] = l_fQ; m_RGBA[G] = in_Arg3; m_RGBA[B] = l_fP;
00395                                                 break;
00396                                         case 2 : m_RGBA[R] = l_fP; m_RGBA[G] = in_Arg3; m_RGBA[B] = l_fT;
00397                                                 break;
00398                                         case 3 : m_RGBA[R] = l_fP; m_RGBA[G] = l_fQ; m_RGBA[B] = in_Arg3;
00399                                                 break;
00400                                         case 4 : m_RGBA[R] = l_fT; m_RGBA[G] = l_fP; m_RGBA[B] = in_Arg3;
00401                                                 break;
00402                                         case 5 : m_RGBA[R] = in_Arg3; m_RGBA[G] = l_fP; m_RGBA[B] = l_fQ;
00403                                                 break;
00404                                 }
00405                         }
00406 
00407                         break;
00408                 }
00409                 case siHLSA:
00410                 {
00411                         float l_fMax;
00412 
00413                         if (in_Arg2 <= 0.5)
00414                                 l_fMax = in_Arg2 * (1.0f + in_Arg3);
00415                         else
00416                                 l_fMax = in_Arg2 + in_Arg3 - (in_Arg2 * in_Arg3);
00417 
00418                         if (l_fMax == 0.0f)
00419                         {
00420                                 m_RGBA[R] = m_RGBA[G] = m_RGBA[B] = 0.0f;
00421                         }
00422                         else
00423                         {
00424                                 in_Arg1 *= (float)( 360.0/60.0 );
00425 
00426                                 ULONG l_ulHueI = (ULONG)RoundDown(in_Arg1);
00427                                 float l_fHueF = in_Arg1 - l_ulHueI;
00428 
00429                                 float l_fMin  = 2.0f*in_Arg2 - l_fMax;
00430                                 float l_fQ    = l_fMax - ((l_fMax-l_fMin)*l_fHueF);
00431                                 float l_fT    = l_fMin + ((l_fMax-l_fMin)*l_fHueF);
00432 
00433                                 switch (l_ulHueI)
00434                                 {
00435                                         case 0 :
00436                                         case 6 : m_RGBA[R] = l_fMax; m_RGBA[G] = l_fT; m_RGBA[B] = l_fMin;
00437                                                 break;
00438                                         case 1 : m_RGBA[R] = l_fQ; m_RGBA[G] = l_fMax; m_RGBA[B] = l_fMin;
00439                                                 break;
00440                                         case 2 : m_RGBA[R] = l_fMin; m_RGBA[G] = l_fMax; m_RGBA[B] = l_fT;
00441                                                 break;
00442                                         case 3 : m_RGBA[R] = l_fMin; m_RGBA[G] = l_fQ; m_RGBA[B] = l_fMax;
00443                                                 break;
00444                                         case 4 : m_RGBA[R] = l_fT; m_RGBA[G] = l_fMin; m_RGBA[B] = l_fMax;
00445                                                 break;
00446                                         case 5 : m_RGBA[R] = l_fMax; m_RGBA[G] = l_fMin; m_RGBA[B] = l_fQ;
00447                                                 break;
00448                                 }
00449                         }
00450                         break;
00451                 }
00452                 default:
00453                         assert( false );
00454         }
00455 }
00456 
00457 SICPPSDK_INLINE void CColor4f::GetAsRGBA( float &out_fRed, float &out_fGreen, float &out_fBlue, float &out_fAlpha ) const
00458 {
00459         out_fRed = m_RGBA[R]; out_fGreen = m_RGBA[G]; out_fBlue = m_RGBA[B]; out_fAlpha = m_RGBA[A];
00460 }
00461 
00462 SICPPSDK_INLINE void CColor4f::GetAsHLSA( float &out_fHue, float &out_fLuminance, float &out_fSaturation, float &out_fAlpha ) const
00463 {
00464         out_fAlpha = m_RGBA[A];
00465 
00466         float l_fMax , l_fMin;
00467         MinMax( l_fMin, l_fMax );
00468         float l_fDelta = l_fMax - l_fMin;
00469 
00470         out_fLuminance = (l_fMin + l_fMax) / 2.0f;
00471 
00472         if (l_fDelta == 0.0)
00473                 out_fSaturation = 0.0;
00474         else
00475         {
00476                 if (out_fLuminance <= 0.5f)
00477                         out_fSaturation = l_fDelta / (l_fMin + l_fMax);
00478                 else
00479                         out_fSaturation = l_fDelta / (2.0f - (l_fMin + l_fMax));
00480         }
00481 
00482         if (out_fSaturation == 0.0f)
00483                 out_fHue = 0;
00484         else
00485         {
00486                 if (m_RGBA[R] == l_fMax)
00487                         out_fHue = (m_RGBA[G]-m_RGBA[B])/l_fDelta;
00488                 else if (m_RGBA[G] == l_fMax)
00489                         out_fHue = 2+(m_RGBA[B]-m_RGBA[R])/l_fDelta;
00490                 else
00491                         out_fHue = 4+(m_RGBA[R]-m_RGBA[G])/l_fDelta;
00492 
00493                 out_fHue *= 60;
00494 
00495                 if (out_fHue < 0)
00496                         out_fHue += 360.0;
00497 
00498                 out_fHue = out_fHue / 360.0f;
00499         }
00500 }
00501 
00502 SICPPSDK_INLINE void CColor4f::GetAsHSVA( float &out_fHue, float &out_fSaturation, float &out_fValue, float &out_fAlpha ) const
00503 {
00504         out_fAlpha = m_RGBA[A];
00505 
00506         float l_fMax , l_fMin;
00507         MinMax( l_fMin, l_fMax );
00508         float l_fDelta = l_fMax - l_fMin;
00509 
00510         out_fValue = l_fMax;
00511 
00512         if (l_fMax == 0.0)
00513                 out_fSaturation = 0.0;
00514         else
00515                 out_fSaturation = l_fDelta/l_fMax;
00516 
00517         if (out_fSaturation == 0.0)
00518         {
00519                 out_fHue = 0;
00520         }
00521         else
00522         {
00523                 if (m_RGBA[R] == l_fMax)
00524                         out_fHue = (m_RGBA[G]-m_RGBA[B])/l_fDelta;
00525                 else if (m_RGBA[G] == l_fMax)
00526                         out_fHue = 2+(m_RGBA[B]-m_RGBA[R])/l_fDelta;
00527                 else
00528                         out_fHue = 4+(m_RGBA[R]-m_RGBA[G])/l_fDelta;
00529 
00530                 out_fHue *= 60;
00531 
00532                 if (out_fHue < 0)
00533                         out_fHue += 360.0;
00534 
00535                 out_fHue = out_fHue / 360.0f;
00536         }
00537 
00538 }
00539 
00540 SICPPSDK_INLINE float CColor4f::GetH() const
00541 {
00542         float l_fMax , l_fMin;
00543         MinMax( l_fMin, l_fMax );
00544         float l_fDelta = l_fMax - l_fMin;
00545 
00546         if (l_fMax == 0.0f || l_fDelta == 0.0f)
00547         {
00548                 return 0.0f;
00549         }
00550         else
00551         {
00552                 float l_fHue;
00553                 if (m_RGBA[R] == l_fMax)
00554                         l_fHue = (m_RGBA[G]-m_RGBA[B])/l_fDelta;
00555                 else if (m_RGBA[G] == l_fMax)
00556                         l_fHue = 2+(m_RGBA[B]-m_RGBA[R])/l_fDelta;
00557                 else
00558                         l_fHue = 4+(m_RGBA[R]-m_RGBA[G])/l_fDelta;
00559 
00560                 l_fHue *= 60;
00561 
00562                 if (l_fHue < 0)
00563                         l_fHue += 360.0;
00564 
00565                 l_fHue = l_fHue / 360.0f;
00566 
00567                 return l_fHue;
00568         }
00569 }
00570 
00571 SICPPSDK_INLINE float CColor4f::GetL() const
00572 {
00573         float l_fMax , l_fMin;
00574         MinMax( l_fMin, l_fMax );
00575 
00576         return (l_fMin + l_fMax) / 2.0f;
00577 }
00578 
00579 SICPPSDK_INLINE float CColor4f::GetS_HSVA() const
00580 {
00581         float l_fMax , l_fMin;
00582         MinMax( l_fMin, l_fMax );
00583         float l_fDelta = l_fMax - l_fMin;
00584 
00585         // calculate Saturation
00586         if (l_fMax == 0.0)
00587                 return 0.0;
00588         else
00589                 return l_fDelta / l_fMax;
00590 }
00591 
00592 SICPPSDK_INLINE float CColor4f::GetS_HLSA() const
00593 {
00594         float l_fMax , l_fMin;
00595         MinMax( l_fMin, l_fMax );
00596         float l_fDelta = l_fMax - l_fMin;
00597 
00598         // calculate Saturation
00599         if (l_fDelta == 0.0)
00600                 return 0.0;
00601         else
00602         {
00603                 float l_fSumMinMax = l_fMin + l_fMax ;
00604                 if ( l_fSumMinMax <= 1.0f )
00605                         return l_fDelta / l_fSumMinMax;
00606                 else
00607                         return l_fDelta / (2.0f - l_fSumMinMax);
00608         }
00609 }
00610 
00611 SICPPSDK_INLINE float CColor4f::GetV() const
00612 {
00613         if( m_RGBA[R] > m_RGBA[G] )
00614         {
00615                 if( m_RGBA[R] > m_RGBA[B] )
00616                         return m_RGBA[R];
00617                 else
00618                         return m_RGBA[B];
00619         }
00620         else
00621         {
00622                 if( m_RGBA[G] > m_RGBA[B] )
00623                         return m_RGBA[G];
00624                 else
00625                         return m_RGBA[B];
00626         }
00627 }
00628 
00629 SICPPSDK_INLINE float& CColor4f::GetR(){return m_RGBA[R];}
00630 SICPPSDK_INLINE float& CColor4f::GetG(){return m_RGBA[G];}
00631 SICPPSDK_INLINE float& CColor4f::GetB(){return m_RGBA[B];}
00632 SICPPSDK_INLINE float& CColor4f::GetA(){return m_RGBA[A];}
00633 
00634 SICPPSDK_INLINE float* CColor4f::GetRGBA(){return m_RGBA;}
00635 
00636 SICPPSDK_INLINE const float& CColor4f::GetR()const{return m_RGBA[R];}
00637 SICPPSDK_INLINE const float& CColor4f::GetG()const{return m_RGBA[G];}
00638 SICPPSDK_INLINE const float& CColor4f::GetB()const{return m_RGBA[B];}
00639 SICPPSDK_INLINE const float& CColor4f::GetA()const{return m_RGBA[A];}
00640 
00641 SICPPSDK_INLINE const float* CColor4f::GetRGBA()const{return m_RGBA;}
00642 
00643 SICPPSDK_INLINE CColor4f::operator float*(){return &(m_RGBA[0]);}
00644 
00645 SICPPSDK_INLINE bool CColor4f::operator==(const CColor4f& in_rColor4f )const
00646 {
00647         return  (m_RGBA[R] == in_rColor4f.m_RGBA[R]) &&
00648                         (m_RGBA[G] == in_rColor4f.m_RGBA[G]) &&
00649                         (m_RGBA[B] == in_rColor4f.m_RGBA[B]) &&
00650                         (m_RGBA[A] == in_rColor4f.m_RGBA[A]);
00651 }
00652 
00653 SICPPSDK_INLINE bool CColor4f::operator!=(const CColor4f& in_rColor4f )const
00654 {
00655         return !(       (m_RGBA[R] == in_rColor4f.m_RGBA[R]) &&
00656                                 (m_RGBA[G] == in_rColor4f.m_RGBA[G]) &&
00657                                 (m_RGBA[B] == in_rColor4f.m_RGBA[B]) &&
00658                                 (m_RGBA[A] == in_rColor4f.m_RGBA[A]));
00659 }
00660 
00661 SICPPSDK_INLINE bool CColor4f::operator < (const CColor4f& in_rColor4f )const
00662 {
00663         if (m_RGBA[A] != in_rColor4f.m_RGBA[A]) return m_RGBA[A] < in_rColor4f.m_RGBA[A];
00664         if (m_RGBA[B] != in_rColor4f.m_RGBA[B]) return m_RGBA[B] < in_rColor4f.m_RGBA[B];
00665         if (m_RGBA[G] != in_rColor4f.m_RGBA[G]) return m_RGBA[G] < in_rColor4f.m_RGBA[G];
00666         if (m_RGBA[R] != in_rColor4f.m_RGBA[R]) return m_RGBA[R] < in_rColor4f.m_RGBA[R];
00667         return false;
00668 }
00669 
00670 SICPPSDK_INLINE bool CColor4f::IsNull(float in_fEpsilon) const
00671 {
00672         return  fabsf( GetR() ) <= in_fEpsilon &&
00673                         fabsf( GetG() ) <= in_fEpsilon &&
00674                         fabsf( GetB() ) <= in_fEpsilon &&
00675                         fabsf( GetA() ) <= in_fEpsilon;}
00676 
00677 SICPPSDK_INLINE CColor4f& CColor4f::Add(const CColor4f& in_col)
00678 {
00679         GetR() += in_col.GetR();
00680         GetG() += in_col.GetG();
00681         GetB() += in_col.GetB();
00682         GetA() += in_col.GetA();
00683         return *this;
00684 }
00685 
00686 SICPPSDK_INLINE CColor4f& CColor4f::Mul(float in_fFactor)
00687 {
00688         GetR()*=in_fFactor;
00689         GetB()*=in_fFactor;
00690         GetG()*=in_fFactor;
00691         GetA()*=in_fFactor;
00692         return *this;
00693 }
00694 
00695 SICPPSDK_INLINE CColor4f& CColor4f::Sub( const CColor4f& in_col )
00696 {
00697         GetR() -= in_col.GetR();
00698         GetG() -= in_col.GetG();
00699         GetB() -= in_col.GetB();
00700         GetA() -= in_col.GetA();
00701         return *this;
00702 }
00703 
00704 SICPPSDK_INLINE CColor4f& CColor4f::Mul( const CColor4f& in_col )
00705 {
00706         GetR() *= in_col.GetR();
00707         GetG() *= in_col.GetG();
00708         GetB() *= in_col.GetB();
00709         GetA() *= in_col.GetA();
00710         return *this;
00711 }
00712 
00713 SICPPSDK_INLINE CColor4f& CColor4f::Negate()
00714 {
00715         GetR()=-GetR();
00716         GetG()=-GetG();
00717         GetB()=-GetB();
00718         GetA()=-GetA();
00719         return *this;
00720 }
00721 
00722 SICPPSDK_INLINE void CColor4f::PutNull()
00723 {
00724         GetR()=0;
00725         GetG()=0;
00726         GetB()=0;
00727         GetA()=0;
00728 }
00729 
00730 SICPPSDK_INLINE float CColor4f::GetBrightness()const
00731 {
00732         return (GetR()+GetG()+GetB())*(1.0f/3.0f);
00733 }
00734 
00735 SICPPSDK_INLINE float CColor4f::GetBrightnessWithAlpha()const
00736 {
00737         return GetBrightness()*GetA();
00738 }
00739 
00740 SICPPSDK_INLINE float CColor4f::GetGrayscale()const
00741 {
00742         return GetR()*0.3f+GetG()*0.59f+GetB()*0.11f;
00743 }
00744 
00745 SICPPSDK_INLINE float CColor4f::GetGrayscaleWithAlpha()const
00746 {
00747         return GetGrayscale()*GetA();
00748 }
00749 
00750 SICPPSDK_INLINE CColor4f& CColor4f::InverseRGB()
00751 {
00752         GetR()=1.0f-GetR();
00753         GetG()=1.0f-GetG();
00754         GetB()=1.0f-GetB();
00755         return *this;
00756 }
00757 
00758 SICPPSDK_INLINE LONG CColor4f::RoundDown(float a) const
00759 {
00760         return (((a)<0) ? (((a)==(LONG)(a))?((LONG)(a)):((LONG)((a)-1))) : ((LONG)(a)));
00761 }
00762 
00763 SICPPSDK_INLINE void CColor4f::MinMax( float& out_fMin, float& out_fMax ) const
00764 {
00765         if( m_RGBA[R] > m_RGBA[G] )
00766         {
00767                 if( m_RGBA[R] > m_RGBA[B] )
00768                 {
00769                         out_fMax = m_RGBA[R];
00770 
00771                         if( m_RGBA[B] > m_RGBA[G] )
00772                                 out_fMin = m_RGBA[G];
00773                         else
00774                                 out_fMin = m_RGBA[B];
00775                 }
00776                 else
00777                 {
00778                         out_fMax = m_RGBA[B];
00779                         out_fMin = m_RGBA[G];
00780                 }
00781         }
00782         else
00783         {
00784                 if( m_RGBA[G] > m_RGBA[B] )
00785                 {
00786                         out_fMax = m_RGBA[G];
00787 
00788                         if( m_RGBA[B] > m_RGBA[R] )
00789                                 out_fMin = m_RGBA[R];
00790                         else
00791                                 out_fMin = m_RGBA[B];
00792                 }
00793                 else
00794                 {
00795                         out_fMax = m_RGBA[B];
00796                         out_fMin = m_RGBA[R];
00797                 }
00798         }
00799 }
00800 
00801 SICPPSDK_INLINE bool CColor4f::AreAlmostEqual
00802 (
00803         const CColor4f& in_c1,
00804         const CColor4f& in_c2,
00805         const float in_fEpsilon
00806 )
00807 {
00808         return  fabs( in_c1.GetR()-in_c2.GetR()) <= in_fEpsilon &&
00809                         fabs( in_c1.GetG()-in_c2.GetG()) <= in_fEpsilon &&
00810                         fabs(in_c1.GetB()-in_c2.GetB()) <= in_fEpsilon &&
00811                         fabs(in_c1.GetA()-in_c2.GetA()) <= in_fEpsilon;
00812 }
00813 
00814 };
00815 };
00816 
00817 #endif // __XSICOLOR4F_H__