00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #ifndef _Matrix_color_h_
00026 #define _Matrix_color_h_
00027
00028 #include "matrix_global.h"
00029 #include "matrixTool.h"
00030
00033 namespace PLib {
00034
00045 class Color {
00046 public:
00047 unsigned char r,g,b ;
00048 Color(const unsigned char R=0, const unsigned char G=0, const unsigned char B=0) : r(R),g(G),b(B) {}
00049 Color& operator+=(const Color& a) { r+=a.r ; g+=a.g ; b+=a.b; return *this ;}
00050 Color& operator-=(const Color& a) { r+=a.r ; g+=a.g ; b+=a.b; return *this;}
00051 Color& operator*=(double a) { r = (unsigned char)(a*double(r)) ; g = (unsigned char)(a*double(g)) ; b = (unsigned char)(a*double(b)) ; return *this ; }
00052 Color& operator/=(double a) { r = (unsigned char)(double(r)/a) ; g = (unsigned char)(double(g)/a) ; b = (unsigned char)(double(b)/a) ; return *this ; }
00053 Color& operator=(const Color& a) { r=a.r ; g=a.g; b=a.b ; return *this ; }
00054
00055 void fromXYZ(double x, double y, double z) ;
00056 void toXYZ(double& x, double& y, double& z) ;
00057
00058 void fromYIQ(double q, double i, double y);
00059 void toYIQ(double& q, double& i, double& y);
00060
00061 void fromHSV(double h, double s, double v);
00062 void toHSV(double& h, double& s, double& v);
00063
00064
00065 friend Color operator*(const double d, const Color& a) ;
00066 friend Color operator*(const Color& a, const Color& b) ;
00067 friend Color operator+(const Color& a, const Color& b) ;
00068
00069
00070 friend ostream& operator<<(ostream& os, const Color& point);
00071 friend istream& operator>>(istream& os, Color& point);
00072 };
00073
00074
00075 inline int operator==(const Color& a, const Color& b) { return (b.r==a.r)&&(b.g==a.g)&&(b.b==a.b) ; }
00076 inline int operator!=(const Color& a, const Color& b) { return !((b.r==a.r)||(b.g==a.g)||(b.b==a.b));}
00077
00078
00079 inline int operator<(const Color& a, const Color& b){
00080 return (a.r<b.r && a.g<b.g && a.b<b.b) ; }
00081 inline int operator>(const Color& a, const Color& b){
00082 return (a.r>b.r && a.g>b.g && a.b>b.b) ; }
00083 inline int operator<=(const Color& a, const Color& b){
00084 return (a.r<=b.r && a.g<=b.g && a.b<=b.b) ; }
00085 inline int operator>=(const Color& a, const Color& b){
00086 return (a.r>=b.r && a.g>=b.g && a.b>=b.b) ; }
00087
00088 const Color whiteColor(255,255,255);
00089 const Color redColor(255,0,0) ;
00090 const Color blueColor(0,0,255) ;
00091 const Color greenColor(0,255,0) ;
00092 const Color yellowColor(255,255,0) ;
00093 const Color cyanColor(0,255,255) ;
00094 const Color magentaColor(255,0,255);
00095 const Color gray80Color(204,204,204) ;
00096 const Color gray50Color(127,127,127) ;
00097 const Color blackColor(0,0,0) ;
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111 inline Color operator*(const double d, const Color& a) {
00112 Color result ;
00113 result.r = (unsigned char) (d*a.r) ;
00114 result.g = (unsigned char) (d*a.g) ;
00115 result.b = (unsigned char) (d*a.b) ;
00116 return result ;
00117 }
00118
00119 inline Color operator*(const Color& a, const Color& b) {
00120 Color result;
00121 result.r = a.r*b.r ;
00122 result.g = a.g*b.g ;
00123 result.b = a.b*b.b ;
00124 return result ;
00125 }
00126
00127 inline Color operator+(const Color& a, const Color& b) {
00128 Color result(a);
00129 result.r += b.r ;
00130 result.g += b.g ;
00131 result.b += b.b ;
00132 return result ;
00133 }
00134
00145 class ColorF {
00146 public:
00147 float r,g,b ;
00148
00149 ColorF(float R=0.0, float G=0.0, float B=0.0) : r(R),g(G),b(B) {}
00150
00151 ColorF& operator=(const ColorF& a) { r=a.r ; g=a.g; b=a.b ; return *this ; }
00152 };
00153
00154
00155
00156
00157
00168 inline ostream& operator<<(ostream& os,const Color& c)
00169 {
00170 os << (int)c.r << " " << (int)c.g << " " << (int)c.b << " " ;
00171 return os;
00172 }
00173
00185 inline istream& operator>>(istream& os, Color& c){
00186 os >> c.r >> c.g >> c.b ;
00187 return os ;
00188 }
00189
00196 inline void Color::fromXYZ(double x, double y, double z){
00197 r = (unsigned char)(255.0*(3.240479*x-1.537510*y-0.498535*z));
00198 g = (unsigned char)(255.0*(-0.969256*x+1.875992*y+0.041556*z));
00199 b = (unsigned char)(255.0*(0.055648*x-0.204043*y+1.057311*z));
00200 }
00201
00202 inline void Color::toXYZ(double &x, double& y, double& z){
00203
00204 }
00205
00218 inline void Color::fromYIQ(double y, double i, double q){
00219 r = (unsigned char)(255.0*(1.0030893*y+0.954849*i+0.6178597*q));
00220 g = (unsigned char)(255.0*(0.9967760*y-0.27070623*i-0.64478833*q));
00221 b = (unsigned char)(255.0*(1.0084978*y-1.11048518*i+1.69956753125));
00222 }
00223
00236 inline void Color::toYIQ(double &y, double &i, double &q){
00237 double R= double(r)/255.0 ;
00238 double G= double(g)/255.0 ;
00239 double B= double(b)/255.0 ;
00240 y = 0.299*R + 0.587*G + 0.114*B ;
00241 i = 0.596*R - 0.275*G - 0.321*B ;
00242 q = 0.212*R - 0.528*G + 0.311*B ;
00243 }
00244
00255 inline void Color::fromHSV(double h, double s, double v){
00256 if(s==0.0){
00257 r=g=b=0;
00258 return;
00259 }
00260 if(h>=360)
00261 h = 0.0 ;
00262 if(h<=0.0)
00263 h = 0.0 ;
00264 h /= 60.0 ;
00265 int i = int(floor(h)) ;
00266 double f = h-double(i);
00267 double p = v*(1.0-s);
00268 double q = v*(1-(s*f));
00269 double t = v*(1-(s*(1-f)));
00270 switch(i){
00271 case 0:
00272 r = (unsigned char)(255.0*v) ;
00273 g = (unsigned char)(255.0*t) ;
00274 b = (unsigned char)(255.0*p) ; break ;
00275 case 1:
00276 r = (unsigned char)(255.0*q) ;
00277 g = (unsigned char)(255.0*v) ;
00278 b = (unsigned char)(255.0*p) ; break ;
00279 case 2:
00280 r = (unsigned char)(255.0*p) ;
00281 g = (unsigned char)(255.0*v) ;
00282 b = (unsigned char)(255.0*t) ; break ;
00283 case 3:
00284 r = (unsigned char)(255.0*p) ;
00285 g = (unsigned char)(255.0*q) ;
00286 b = (unsigned char)(255.0*v) ; break ;
00287 case 4:
00288 r = (unsigned char)(255.0*t) ;
00289 g = (unsigned char)(255.0*p) ;
00290 b = (unsigned char)(255.0*v) ; break ;
00291 case 5:
00292 default:
00293 r = (unsigned char)(255.0*v) ;
00294 g = (unsigned char)(255.0*p) ;
00295 b = (unsigned char)(255.0*q) ; break ;
00296 }
00297 }
00298
00309 inline void Color::toHSV(double &h, double &s, double &v){
00310 double R = double(r)/255.0;
00311 double G = double(g)/255.0;
00312 double B = double(b)/255.0;
00313
00314 double max = maximum(R,maximum(G,B));
00315 double min = minimum(R,minimum(G,B));
00316
00317 int maxI = maximum(r,maximum(g,b));
00318
00319 v = max ;
00320 s = (max>0) ? (max-min)/max : 0 ;
00321 h = 0 ;
00322 if(s>0){
00323 double delta = max-min ;
00324 if(r==maxI){
00325 h = (G-B)/delta ;
00326 }
00327 else{
00328 if(g==maxI){
00329 h = 2.0 + (B-R)/delta ;
00330 }
00331 else{
00332 h = 4.0 + (R-G)/delta ;
00333 }
00334 }
00335 h *= 60.0 ;
00336 if(h<0)
00337 h += 360.0 ;
00338 }
00339 }
00340
00341
00342 }
00343
00344
00345 #endif