00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
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:
00038
static const CNT8 RED = 0, GREEN = 1, BLUE = 2;
00039
static const CNT8 ALPHA = 3;
00040
00041
public:
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:
00060
ColourA() {};
00061
00062
public:
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
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:
00112 CLR c[4];
00113
00114 };
00115
00116
00120 class Colour {
00121
00122
friend class ColourA;
00123
00124
public:
00125
static const char RGB_LOOP = 3;
00126
private:
00127
static const CNT8 RED = 0, GREEN = 1, BLUE = 2;
00128
00129
public:
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:
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:
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:
00320 CLR c[RGB_LOOP];
00321
00322 };
00323
00324
#endif