00001 #ifndef Impala_Core_Array_Element_Color_h
00002 #define Impala_Core_Array_Element_Color_h
00003
00004 #include "Core/Array/Element/Vec3Real64.h"
00005 #include "Core/Array/Element/ColConvert.h"
00006
00007 namespace Impala
00008 {
00009 namespace Core
00010 {
00011 namespace Array
00012 {
00013 namespace Element
00014 {
00015
00016
00020 enum ColorModel
00021 {
00022 RGB,
00023 CMY,
00024 XYZ,
00025 Lab,
00026 Luv,
00027 OOO,
00028 HSI
00029 };
00030
00033 class Color {
00034 public:
00035
00037 Color(): mValue(0,0,0), mSpace(RGB)
00038 {
00039 }
00040
00042 Color(Vec3Real64 color, ColorModel space = RGB) : mValue(color),
00043 mSpace(space)
00044 {
00045 }
00046
00048 Color(const Color& rhs): mValue(rhs.mValue), mSpace(rhs.mSpace)
00049 {
00050 }
00051
00053 Color&
00054 operator=(const Color& rhs)
00055 {
00056 mValue = rhs.mValue;
00057 mSpace = rhs.mSpace;
00058 return *this;
00059 }
00060
00062 const Vec3Real64&
00063 Value() const
00064 {
00065 return mValue;
00066 }
00067
00071 Color
00072 Convert(const ColorModel space) const
00073 {
00074 switch (space) {
00075 case RGB: return ToRGB();
00076 case CMY: return ToCMY();
00077 case XYZ: return ToXYZ();
00078 case Lab: return ToLab();
00079 case Luv: return ToLuv();
00080 case OOO: return ToOOO();
00081 case HSI: return ToHSI();
00082 }
00083 return Color();
00084 }
00085
00087 Color
00088 ToRGB() const
00089 {
00090 switch (mSpace) {
00091 case RGB:
00092 return *this;
00093 case CMY:
00094 return Color(ColCMY2RGB(mValue), RGB);
00095 case XYZ:
00096 return Color(ColXYZ2RGB(mValue), RGB);
00097 case Lab: {
00098 Vec3Real64 xyz = ColLab2XYZ(mValue);
00099 return Color(ColXYZ2RGB(xyz), RGB);
00100 }
00101 case Luv: {
00102 Vec3Real64 xyz = ColLuv2XYZ(mValue);
00103 return Color(ColXYZ2RGB(xyz), RGB);
00104 }
00105 case OOO:
00106 return Color(ColOOO2RGB(mValue), RGB);
00107 case HSI:
00108 return Color(ColHSI2RGB(mValue), RGB);
00109 }
00110
00111 return Color();
00112 }
00113
00115 Color
00116 ToCMY() const
00117 {
00118 switch (mSpace) {
00119 case RGB:
00120 return Color(ColRGB2CMY(mValue), CMY);
00121 case CMY:
00122 return *this;
00123 case XYZ:
00124 return Color(ColXYZ2CMY(mValue), CMY);
00125 case Lab: {
00126 Vec3Real64 xyz = ColLab2XYZ(mValue);
00127 return Color(ColXYZ2CMY(xyz), CMY);
00128 }
00129 case Luv: {
00130 Vec3Real64 xyz = ColLuv2XYZ(mValue);
00131 return Color(ColXYZ2CMY(xyz), CMY);
00132 }
00133 case OOO: {
00134 Vec3Real64 rgb = ColOOO2RGB(mValue);
00135 return Color(ColRGB2CMY(rgb), CMY);
00136 }
00137 case HSI: {
00138 Vec3Real64 rgb = ColHSI2RGB(mValue);
00139 return Color(ColRGB2CMY(rgb), CMY);
00140 }
00141 }
00142
00143 return Color();
00144 }
00145
00147 Color
00148 ToXYZ() const
00149 {
00150 switch (mSpace) {
00151 case RGB:
00152 return Color(ColRGB2XYZ(mValue), XYZ);
00153 case CMY:
00154 return Color(ColCMY2XYZ(mValue), XYZ);
00155 case XYZ:
00156 return *this;
00157 case Lab:
00158 return Color(ColLab2XYZ(mValue), XYZ);
00159 case Luv:
00160 return Color(ColLuv2XYZ(mValue), XYZ);
00161 case OOO:
00162 return Color(ColOOO2XYZ(mValue), XYZ);
00163 case HSI: {
00164 Vec3Real64 rgb = ColHSI2RGB(mValue);
00165 return Color(ColRGB2XYZ(rgb), XYZ);
00166 }
00167 }
00168
00169 return Color();
00170 }
00171
00173 Color
00174 ToLab() const
00175 {
00176 switch (mSpace) {
00177 case RGB: {
00178 Vec3Real64 xyz = ColRGB2XYZ(mValue);
00179 return Color(ColXYZ2Lab(xyz), Lab);
00180 }
00181 case CMY: {
00182 Vec3Real64 xyz = ColCMY2XYZ(mValue);
00183 return Color(ColXYZ2Lab(xyz), Lab);
00184 }
00185 case XYZ:
00186 return Color(ColXYZ2Lab(mValue), Lab);
00187 case Lab:
00188 return *this;
00189 case Luv: {
00190 Vec3Real64 xyz = ColLuv2XYZ(mValue);
00191 return Color(ColXYZ2Lab(xyz), Lab);
00192 }
00193 case OOO: {
00194 Vec3Real64 xyz = ColOOO2XYZ(mValue);
00195 return Color(ColXYZ2Lab(xyz), Lab);
00196 }
00197 case HSI: {
00198 Vec3Real64 rgb = ColHSI2RGB(mValue);
00199 Vec3Real64 xyz = ColRGB2XYZ(rgb);
00200 return Color(ColXYZ2Lab(xyz), Lab);
00201 }
00202 }
00203
00204 return Color();
00205 }
00206
00208 Color
00209 ToLuv() const
00210 {
00211 switch (mSpace) {
00212 case RGB: {
00213 Vec3Real64 xyz = ColRGB2XYZ(mValue);
00214 return Color(ColXYZ2Luv(xyz), Luv);
00215 }
00216 case CMY: {
00217 Vec3Real64 xyz = ColCMY2XYZ(mValue);
00218 return Color(ColXYZ2Luv(xyz), Luv);
00219 }
00220 case XYZ:
00221 return Color(ColXYZ2Luv(mValue), Luv);
00222 case Lab: {
00223 Vec3Real64 xyz = ColLab2XYZ(mValue);
00224 return Color(ColXYZ2Luv(xyz), Luv);
00225 }
00226 case Luv:
00227 return *this;
00228 case OOO: {
00229 Vec3Real64 xyz = ColOOO2XYZ(mValue);
00230 return Color(ColXYZ2Luv(xyz), Luv);
00231 }
00232 case HSI: {
00233 Vec3Real64 rgb = ColHSI2RGB(mValue);
00234 Vec3Real64 xyz = ColRGB2XYZ(rgb);
00235 return Color(ColXYZ2Luv(xyz), Luv);
00236 }
00237 }
00238
00239 return Color();
00240 }
00241
00243 Color
00244 ToOOO() const
00245 {
00246 switch (mSpace) {
00247 case RGB:
00248 return Color(ColRGB2OOO(mValue), OOO);
00249 case CMY: {
00250 Vec3Real64 rgb = ColCMY2RGB(mValue);
00251 return Color(ColRGB2OOO(rgb), OOO);
00252 }
00253 case XYZ:
00254 return Color(ColXYZ2OOO(mValue), OOO);
00255 case Lab: {
00256 Vec3Real64 xyz = ColLab2XYZ(mValue);
00257 return Color(ColXYZ2OOO(mValue), OOO);
00258 }
00259 case Luv: {
00260 Vec3Real64 xyz = ColLuv2XYZ(mValue);
00261 return Color(ColXYZ2OOO(mValue), OOO);
00262 }
00263 case OOO:
00264 return *this;
00265 case HSI: {
00266 Vec3Real64 rgb = ColHSI2RGB(mValue);
00267 return Color(ColRGB2OOO(rgb), OOO);
00268 }
00269 }
00270
00271 return Color();
00272 }
00273
00275 Color
00276 ToHSI() const
00277 {
00278 switch (mSpace) {
00279 case RGB:
00280 return Color(ColRGB2HSI(mValue), HSI);
00281 case CMY: {
00282 Vec3Real64 rgb = ColCMY2RGB(mValue);
00283 return Color(ColRGB2HSI(rgb), HSI);
00284 }
00285 case XYZ: {
00286 Vec3Real64 rgb = ColXYZ2RGB(mValue);
00287 return Color(ColRGB2HSI(rgb), HSI);
00288 }
00289 case Lab: {
00290 Vec3Real64 xyz = ColLab2XYZ(mValue);
00291 Vec3Real64 rgb = ColXYZ2RGB(xyz);
00292 return Color(ColRGB2HSI(rgb), HSI);
00293 }
00294 case Luv: {
00295 Vec3Real64 xyz = ColLuv2XYZ(mValue);
00296 Vec3Real64 rgb = ColXYZ2RGB(xyz);
00297 return Color(ColRGB2HSI(rgb), HSI);
00298 }
00299 case OOO: {
00300 Vec3Real64 rgb = ColOOO2RGB(mValue);
00301 return Color(ColRGB2HSI(rgb), HSI);
00302 }
00303 case HSI:
00304 return *this;
00305 }
00306
00307 return Color();
00308 }
00309
00311 int
00312 operator==(const Color& c) const
00313 {
00314 return (mSpace == c.mSpace) && (mValue == c.mValue);
00315 }
00316
00318 int
00319 operator!=(const Color& c) const
00320 {
00321 return !(*this == c);
00322 }
00323
00324 private:
00325 Vec3Real64 mValue;
00326 ColorModel mSpace;
00327 };
00328
00329 }
00330 }
00331 }
00332 }
00333
00334 #endif