Main Page | Class Hierarchy | Class List | File List | Class Members

colour.h

00001 /* ************************************************************************* 00002 colour.h - description 00003 ------------------- 00004 begin : Wed Oct 15 2002 00005 copyright : (C) 2002 by Micha Riser 00006 email : mriser@gmx.net 00007 00008 $Id: colour_8h-source.html,v 1.1 2005/02/04 21:02:27 micha Exp $ 00009 00010 ************************************************************************* */ 00011 00012 /* ************************************************************************* 00013 * * 00014 * This program is free software; you can redistribute it and/or modify * 00015 * it under the terms of the GNU General Public License as published by * 00016 * the Free Software Foundation; either version 2 of the License, or * 00017 * (at your option) any later version. * 00018 * * 00019 ************************************************************************* */ 00020 00021 00022 #ifndef COLOUR_H 00023 #define COLOUR_H 00024 00025 #include<cmath> 00026 #include "types.h" 00027 00028 class Colour; 00029 00033 class ColourA { 00034 00035 friend class Colour; 00036 00037 private: // constants 00038 static const CNT8 RED = 0, GREEN = 1, BLUE = 2; 00039 static const CNT8 ALPHA = 3; 00040 00041 public: // Constructors and destructor 00042 00045 ColourA(CLR r, CLR g, CLR b, CLR a) { 00046 c[0]=r; c[1]=g; c[2]=b; c[3]=a; 00047 } 00048 00051 ColourA(const CLR& a) { 00052 for(int i=0; i<4; i++) c[i]=a; 00053 } 00054 00057 ColourA(const Colour& d); 00058 00059 private: // Private constructor 00060 ColourA() {}; 00061 00062 public: // Public methods 00063 00064 CLR red() const {return c[RED];} 00065 CLR green() const {return c[GREEN];} 00066 CLR blue() const {return c[BLUE];} 00067 CLR alpha() const {return c[ALPHA];} 00068 00069 00073 void add(const ColourA &d) {for(int i=0; i<4; i++) c[i] += d.c[i];} 00074 00078 void sub(const ColourA &d) {for(int i=0; i<4; i++) c[i] -= d.c[i];} 00079 00083 void scale(CLR s) {for(int i=0; i<4; i++) c[i] *= s;} 00084 00088 void scale(const ColourA& d) {for(int i=0; i<4; i++) c[i] *= d.c[i];} 00089 00093 void scale(const Colour& d); 00094 00099 ColourA scaled(CLR s) const {ColourA ret; for(int i=0; i<4; i++) ret.c[i]=c[i]*s; return ret;} 00100 00104 CLR norm() const { 00105 // calculate maximum (infinity) norm / what with alpha? 00106 CLR ret = c[0]; 00107 for(int i=1; i<3; i++) if (c[i]>ret) ret = c[i]; 00108 return ret; 00109 } 00110 00111 private: // Private attributes 00112 CLR c[4]; // colour RGBA 00113 00114 }; 00115 00116 00120 class Colour { 00121 00122 friend class ColourA; 00123 00124 public: // Private constants 00125 static const char RGB_LOOP = 3; 00126 private: 00127 static const CNT8 RED = 0, GREEN = 1, BLUE = 2; 00128 00129 public: // Constructors and destructor 00130 00133 Colour(CLR r, CLR g, CLR b) {c[0]=r; c[1]=g; c[2]=b;} 00134 00138 Colour(const CLR& a) {for(int i=0; i<RGB_LOOP; i++) c[i]=a;} 00139 00142 Colour(const ColourA& a) {for(int i=0; i<RGB_LOOP; i++) c[i]=a.c[i];} 00143 00144 private: 00147 Colour() {}; 00148 00149 public: // Public methods 00150 00151 CLR red() const {return c[RED];} 00152 CLR green() const {return c[GREEN];} 00153 CLR blue() const {return c[BLUE];} 00154 00158 void add(const Colour &d) {for(int i=0; i<RGB_LOOP; i++) c[i] += d.c[i];} 00159 00163 void add(const ColourA &d) {for(int i=0; i<RGB_LOOP; i++) c[i] += d.c[i];} 00164 00168 void sub(const Colour &d) {for(int i=0; i<RGB_LOOP; i++) c[i] -= d.c[i];} 00169 00173 void scale(CLR s) {for(int i=0; i<RGB_LOOP; i++) c[i] *= s;} 00174 00178 void scale(const ColourA& d) {for(int i=0; i<RGB_LOOP; i++) c[i] *= d.c[i];} 00179 00183 void scale(const Colour& d) {for(int i=0; i<RGB_LOOP; i++) c[i] *= d.c[i];} 00184 00187 void exp() {for(int i=0; i<RGB_LOOP; i++) c[i] = std::exp(c[i]);} 00188 00191 void negExp() {for(int i=0; i<RGB_LOOP; i++) c[i] = std::exp(-c[i]);} 00192 00197 Colour scaled(CLR s) const {Colour ret; for(int i=0; i<RGB_LOOP; i++) ret.c[i]=c[i]*s; return ret;} 00198 00203 Colour scaled(const Colour &d) const { 00204 Colour ret; 00205 for(int i=0; i<RGB_LOOP; i++) ret.c[i] = c[i]*d.c[i]; 00206 return ret; 00207 } 00208 00209 Colour divided(const Colour& d) const { 00210 Colour ret; 00211 for(int i=0; i<RGB_LOOP; i++) ret.c[i] = c[i]/d.c[i]; 00212 return ret; 00213 } 00214 00219 Colour scaled(const ColourA &d) const { 00220 Colour ret; 00221 for(int i=0; i<RGB_LOOP; i++) ret.c[i] = c[i]*d.c[i]; 00222 return ret; 00223 } 00224 00228 CLR norm() const { 00229 CLR ret = fabs(c[0]); 00230 for(int i=1; i<RGB_LOOP; i++) if (fabs(c[i])>ret) ret = fabs(c[i]); 00231 return ret; 00232 } 00233 00237 CLR minElement() const { 00238 CLR ret = c[0]; 00239 for(int i=1; i<RGB_LOOP; i++) if (c[1]<ret) ret = c[1]; 00240 return ret; 00241 } 00242 00246 CLR maxElement() const { 00247 CLR ret = c[0]; 00248 for(int i=1; i<RGB_LOOP; i++) if (c[1]>ret) ret = c[1]; 00249 return ret; 00250 } 00251 00252 public: // Static methods 00253 00256 static Colour add(const Colour& c1, const Colour& c2) { 00257 Colour ret; 00258 for(int i=0; i<RGB_LOOP; i++) ret.c[i]=c1.c[i]+c2.c[i]; 00259 return ret; 00260 } 00261 00262 Colour operator+(const Colour& c1) const { 00263 00264 return add(*this,c1); 00265 } 00266 00267 Colour operator*(const CLR d) const { 00268 00269 return scaled(d); 00270 } 00271 00272 Colour operator*(const Colour& d) const { 00273 00274 return scaled(d); 00275 } 00276 00277 Colour operator/(const Colour& d) const { 00278 00279 return divided(d); 00280 } 00281 00282 Colour operator-(const Colour& d) const { 00283 00284 return sub(*this,d); 00285 } 00286 00289 static Colour sub(const Colour& c1, const Colour& c2) { 00290 Colour ret; 00291 for(int i=0; i<RGB_LOOP; i++) ret.c[i]=c1.c[i]-c2.c[i]; 00292 return ret; 00293 } 00294 00297 static Colour sqrt(const Colour& d) { 00298 Colour ret; 00299 for(int i=0; i<RGB_LOOP; i++) ret.c[i]=std::sqrt(d.c[i]); 00300 return ret; 00301 } 00302 00305 static Colour exp(const Colour& d) { 00306 Colour ret; 00307 for(int i=0; i<RGB_LOOP; i++) ret.c[i]=std::exp(d.c[i]); 00308 return ret; 00309 } 00310 00311 static Colour negExp(const Colour& d) { 00312 Colour ret; 00313 for(int i=0; i<RGB_LOOP; i++) ret.c[i]=std::exp(-d.c[i]); 00314 return ret; 00315 } 00316 00317 00318 private: // Public members 00320 CLR c[RGB_LOOP]; 00321 00322 }; 00323 00324 #endif

Generated on Thu Jan 27 12:16:05 2005 for raytracer.kdevelop by doxygen 1.3.8