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(R)/255.0 ;
00239
double B= double(R)/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