00001
00032 #include "linden_common.h"
00033
00034 #include "llboost.h"
00035
00036 #include "v4color.h"
00037 #include "v4coloru.h"
00038 #include "v3color.h"
00039 #include "v4math.h"
00040 #include "llmath.h"
00041
00042
00043
00045
00046 LLColor4 LLColor4::red( 1.f, 0.f, 0.f, 1.f);
00047 LLColor4 LLColor4::green( 0.f, 1.f, 0.f, 1.f);
00048 LLColor4 LLColor4::blue( 0.f, 0.f, 1.f, 1.f);
00049 LLColor4 LLColor4::black( 0.f, 0.f, 0.f, 1.f);
00050 LLColor4 LLColor4::yellow( 1.f, 1.f, 0.f, 1.f);
00051 LLColor4 LLColor4::magenta( 1.0f, 0.0f, 1.0f, 1.0f);
00052 LLColor4 LLColor4::cyan( 0.0f, 1.0f, 1.0f, 1.0f);
00053 LLColor4 LLColor4::white( 1.f, 1.f, 1.f, 1.f);
00054 LLColor4 LLColor4::smoke( 0.5f, 0.5f, 0.5f, 0.5f);
00055 LLColor4 LLColor4::grey( 0.5f, 0.5f, 0.5f, 1.0f);
00056 LLColor4 LLColor4::orange( 1.f, 0.5, 0.f, 1.f );
00057 LLColor4 LLColor4::purple( 0.6f, 0.2f, 0.8f, 1.0f);
00058 LLColor4 LLColor4::pink( 1.0f, 0.5f, 0.8f, 1.0f);
00059 LLColor4 LLColor4::transparent( 0.f, 0.f, 0.f, 0.f );
00060
00062
00063 LLColor4 LLColor4::grey1(0.8f, 0.8f, 0.8f, 1.0f);
00064 LLColor4 LLColor4::grey2(0.6f, 0.6f, 0.6f, 1.0f);
00065 LLColor4 LLColor4::grey3(0.4f, 0.4f, 0.4f, 1.0f);
00066 LLColor4 LLColor4::grey4(0.3f, 0.3f, 0.3f, 1.0f);
00067
00068 LLColor4 LLColor4::red1(1.0f, 0.0f, 0.0f, 1.0f);
00069 LLColor4 LLColor4::red2(0.6f, 0.0f, 0.0f, 1.0f);
00070 LLColor4 LLColor4::red3(1.0f, 0.2f, 0.2f, 1.0f);
00071 LLColor4 LLColor4::red4(0.5f, 0.1f, 0.1f, 1.0f);
00072 LLColor4 LLColor4::red5(0.8f, 0.1f, 0.0f, 1.0f);
00073
00074 LLColor4 LLColor4::green1(0.0f, 1.0f, 0.0f, 1.0f);
00075 LLColor4 LLColor4::green2(0.0f, 0.6f, 0.0f, 1.0f);
00076 LLColor4 LLColor4::green3(0.0f, 0.4f, 0.0f, 1.0f);
00077 LLColor4 LLColor4::green4(0.0f, 1.0f, 0.4f, 1.0f);
00078 LLColor4 LLColor4::green5(0.2f, 0.6f, 0.4f, 1.0f);
00079 LLColor4 LLColor4::green6(0.4f, 0.6f, 0.2f, 1.0f);
00080
00081 LLColor4 LLColor4::blue1(0.0f, 0.0f, 1.0f, 1.0f);
00082 LLColor4 LLColor4::blue2(0.0f, 0.4f, 1.0f, 1.0f);
00083 LLColor4 LLColor4::blue3(0.2f, 0.2f, 0.8f, 1.0f);
00084 LLColor4 LLColor4::blue4(0.0f, 0.0f, 0.6f, 1.0f);
00085 LLColor4 LLColor4::blue5(0.4f, 0.2f, 1.0f, 1.0f);
00086 LLColor4 LLColor4::blue6(0.4f, 0.5f, 1.0f, 1.0f);
00087
00088 LLColor4 LLColor4::yellow1(1.0f, 1.0f, 0.0f, 1.0f);
00089 LLColor4 LLColor4::yellow2(0.6f, 0.6f, 0.0f, 1.0f);
00090 LLColor4 LLColor4::yellow3(0.8f, 1.0f, 0.2f, 1.0f);
00091 LLColor4 LLColor4::yellow4(1.0f, 1.0f, 0.4f, 1.0f);
00092 LLColor4 LLColor4::yellow5(0.6f, 0.4f, 0.2f, 1.0f);
00093 LLColor4 LLColor4::yellow6(1.0f, 0.8f, 0.4f, 1.0f);
00094 LLColor4 LLColor4::yellow7(0.8f, 0.8f, 0.0f, 1.0f);
00095 LLColor4 LLColor4::yellow8(0.8f, 0.8f, 0.2f, 1.0f);
00096 LLColor4 LLColor4::yellow9(0.8f, 0.8f, 0.4f, 1.0f);
00097
00098 LLColor4 LLColor4::orange1(1.0f, 0.8f, 0.0f, 1.0f);
00099 LLColor4 LLColor4::orange2(1.0f, 0.6f, 0.0f, 1.0f);
00100 LLColor4 LLColor4::orange3(1.0f, 0.4f, 0.2f, 1.0f);
00101 LLColor4 LLColor4::orange4(0.8f, 0.4f, 0.0f, 1.0f);
00102 LLColor4 LLColor4::orange5(0.9f, 0.5f, 0.0f, 1.0f);
00103 LLColor4 LLColor4::orange6(1.0f, 0.8f, 0.2f, 1.0f);
00104
00105 LLColor4 LLColor4::magenta1(1.0f, 0.0f, 1.0f, 1.0f);
00106 LLColor4 LLColor4::magenta2(0.6f, 0.2f, 0.4f, 1.0f);
00107 LLColor4 LLColor4::magenta3(1.0f, 0.4f, 0.6f, 1.0f);
00108 LLColor4 LLColor4::magenta4(1.0f, 0.2f, 0.8f, 1.0f);
00109
00110 LLColor4 LLColor4::purple1(0.6f, 0.2f, 0.8f, 1.0f);
00111 LLColor4 LLColor4::purple2(0.8f, 0.2f, 1.0f, 1.0f);
00112 LLColor4 LLColor4::purple3(0.6f, 0.0f, 1.0f, 1.0f);
00113 LLColor4 LLColor4::purple4(0.4f, 0.0f, 0.8f, 1.0f);
00114 LLColor4 LLColor4::purple5(0.6f, 0.0f, 0.8f, 1.0f);
00115 LLColor4 LLColor4::purple6(0.8f, 0.0f, 0.6f, 1.0f);
00116
00117 LLColor4 LLColor4::pink1(1.0f, 0.5f, 0.8f, 1.0f);
00118 LLColor4 LLColor4::pink2(1.0f, 0.8f, 0.9f, 1.0f);
00119
00120 LLColor4 LLColor4::cyan1(0.0f, 1.0f, 1.0f, 1.0f);
00121 LLColor4 LLColor4::cyan2(0.4f, 0.8f, 0.8f, 1.0f);
00122 LLColor4 LLColor4::cyan3(0.0f, 1.0f, 0.6f, 1.0f);
00123 LLColor4 LLColor4::cyan4(0.6f, 1.0f, 1.0f, 1.0f);
00124 LLColor4 LLColor4::cyan5(0.2f, 0.6f, 1.0f, 1.0f);
00125 LLColor4 LLColor4::cyan6(0.2f, 0.6f, 0.6f, 1.0f);
00126
00128
00129
00130 LLColor4::operator const LLColor4U() const
00131 {
00132 return LLColor4U(
00133 (U8)llclampb(llround(mV[VRED]*255.f)),
00134 (U8)llclampb(llround(mV[VGREEN]*255.f)),
00135 (U8)llclampb(llround(mV[VBLUE]*255.f)),
00136 (U8)llclampb(llround(mV[VALPHA]*255.f)));
00137 }
00138
00139 LLColor4::LLColor4(const LLColor3 &vec, F32 a)
00140 {
00141 mV[VX] = vec.mV[VX];
00142 mV[VY] = vec.mV[VY];
00143 mV[VZ] = vec.mV[VZ];
00144 mV[VW] = a;
00145 }
00146
00147 LLColor4::LLColor4(const LLColor4U& color4u)
00148 {
00149 const F32 SCALE = 1.f/255.f;
00150 mV[VX] = color4u.mV[VX] * SCALE;
00151 mV[VY] = color4u.mV[VY] * SCALE;
00152 mV[VZ] = color4u.mV[VZ] * SCALE;
00153 mV[VW] = color4u.mV[VW] * SCALE;
00154 }
00155
00156 LLColor4::LLColor4(const LLVector4& vector4)
00157 {
00158 mV[VX] = vector4.mV[VX];
00159 mV[VY] = vector4.mV[VY];
00160 mV[VZ] = vector4.mV[VZ];
00161 mV[VW] = vector4.mV[VW];
00162 }
00163
00164 const LLColor4& LLColor4::setVec(const LLColor4U& color4u)
00165 {
00166 const F32 SCALE = 1.f/255.f;
00167 mV[VX] = color4u.mV[VX] * SCALE;
00168 mV[VY] = color4u.mV[VY] * SCALE;
00169 mV[VZ] = color4u.mV[VZ] * SCALE;
00170 mV[VW] = color4u.mV[VW] * SCALE;
00171 return (*this);
00172 }
00173
00174 const LLColor4& LLColor4::setVec(const LLColor3 &vec)
00175 {
00176 mV[VX] = vec.mV[VX];
00177 mV[VY] = vec.mV[VY];
00178 mV[VZ] = vec.mV[VZ];
00179
00180
00181
00182
00183 return (*this);
00184 }
00185
00186 const LLColor4& LLColor4::setVec(const LLColor3 &vec, F32 a)
00187 {
00188 mV[VX] = vec.mV[VX];
00189 mV[VY] = vec.mV[VY];
00190 mV[VZ] = vec.mV[VZ];
00191 mV[VW] = a;
00192 return (*this);
00193 }
00194
00195 const LLColor4& LLColor4::operator=(const LLColor3 &a)
00196 {
00197 mV[VX] = a.mV[VX];
00198 mV[VY] = a.mV[VY];
00199 mV[VZ] = a.mV[VZ];
00200
00201
00202 mV[VW] = 1.f;
00203 return (*this);
00204 }
00205
00206
00207 std::ostream& operator<<(std::ostream& s, const LLColor4 &a)
00208 {
00209 s << "{ " << a.mV[VX] << ", " << a.mV[VY] << ", " << a.mV[VZ] << ", " << a.mV[VW] << " }";
00210 return s;
00211 }
00212
00213 bool operator==(const LLColor4 &a, const LLColor3 &b)
00214 {
00215 return ( (a.mV[VX] == b.mV[VX])
00216 &&(a.mV[VY] == b.mV[VY])
00217 &&(a.mV[VZ] == b.mV[VZ]));
00218 }
00219
00220 bool operator!=(const LLColor4 &a, const LLColor3 &b)
00221 {
00222 return ( (a.mV[VX] != b.mV[VX])
00223 ||(a.mV[VY] != b.mV[VY])
00224 ||(a.mV[VZ] != b.mV[VZ]));
00225 }
00226
00227 LLColor3 vec4to3(const LLColor4 &vec)
00228 {
00229 LLColor3 temp(vec.mV[VX], vec.mV[VY], vec.mV[VZ]);
00230 return temp;
00231 }
00232
00233 LLColor4 vec3to4(const LLColor3 &vec)
00234 {
00235 LLColor3 temp(vec.mV[VX], vec.mV[VY], vec.mV[VZ]);
00236 return temp;
00237 }
00238
00239 void LLColor4::calcHSL(F32* hue, F32* saturation, F32* luminance) const
00240 {
00241 F32 var_R = mV[VRED];
00242 F32 var_G = mV[VGREEN];
00243 F32 var_B = mV[VBLUE];
00244
00245 F32 var_Min = ( var_R < ( var_G < var_B ? var_G : var_B ) ? var_R : ( var_G < var_B ? var_G : var_B ) );
00246 F32 var_Max = ( var_R > ( var_G > var_B ? var_G : var_B ) ? var_R : ( var_G > var_B ? var_G : var_B ) );
00247
00248 F32 del_Max = var_Max - var_Min;
00249
00250 F32 L = ( var_Max + var_Min ) / 2.0f;
00251 F32 H = 0.0f;
00252 F32 S = 0.0f;
00253
00254 if ( del_Max == 0.0f )
00255 {
00256 H = 0.0f;
00257 S = 0.0f;
00258 }
00259 else
00260 {
00261 if ( L < 0.5 )
00262 S = del_Max / ( var_Max + var_Min );
00263 else
00264 S = del_Max / ( 2.0f - var_Max - var_Min );
00265
00266 F32 del_R = ( ( ( var_Max - var_R ) / 6.0f ) + ( del_Max / 2.0f ) ) / del_Max;
00267 F32 del_G = ( ( ( var_Max - var_G ) / 6.0f ) + ( del_Max / 2.0f ) ) / del_Max;
00268 F32 del_B = ( ( ( var_Max - var_B ) / 6.0f ) + ( del_Max / 2.0f ) ) / del_Max;
00269
00270 if ( var_R >= var_Max )
00271 H = del_B - del_G;
00272 else
00273 if ( var_G >= var_Max )
00274 H = ( 1.0f / 3.0f ) + del_R - del_B;
00275 else
00276 if ( var_B >= var_Max )
00277 H = ( 2.0f / 3.0f ) + del_G - del_R;
00278
00279 if ( H < 0.0f ) H += 1.0f;
00280 if ( H > 1.0f ) H -= 1.0f;
00281 }
00282
00283 if (hue) *hue = H;
00284 if (saturation) *saturation = S;
00285 if (luminance) *luminance = L;
00286 }
00287
00288
00289 BOOL LLColor4::parseColor(const char* buf, LLColor4* color)
00290 {
00291 if( buf == NULL || buf[0] == '\0' || color == NULL)
00292 {
00293 return FALSE;
00294 }
00295
00296 LLString full_string(buf);
00297
00298 boost_tokenizer tokens(full_string, boost::char_separator<char>(", "));
00299 boost_tokenizer::iterator token_iter = tokens.begin();
00300 if (token_iter == tokens.end())
00301 {
00302 return FALSE;
00303 }
00304
00305
00306
00307 LLString color_name( (*token_iter) );
00308 ++token_iter;
00309
00310 if (token_iter != tokens.end())
00311 {
00312
00313 LLColor4 v;
00314 LLString::convertToF32( color_name, v.mV[VX] );
00315 LLString::convertToF32( *token_iter, v.mV[VY] );
00316 v.mV[VZ] = 0.0f;
00317 v.mV[VW] = 1.0f;
00318
00319 ++token_iter;
00320 if (token_iter == tokens.end())
00321 {
00322
00323 llwarns << "LLColor4::parseColor() malformed color " << full_string << llendl;
00324 }
00325 else
00326 {
00327
00328 LLString::convertToF32( *token_iter, v.mV[VZ] );
00329
00330 ++token_iter;
00331 if (token_iter != tokens.end())
00332 {
00333
00334 LLString::convertToF32( *token_iter, v.mV[VW] );
00335 }
00336 }
00337
00338
00339 if (v.mV[VX] > 1.f || v.mV[VY] > 1.f || v.mV[VZ] > 1.f || v.mV[VW] > 1.f)
00340 {
00341 v = v * (1.f / 255.f);
00342 }
00343 color->setVec( v );
00344 }
00345 else
00346 {
00347
00348 if ( "red" == color_name )
00349 {
00350 color->setVec(LLColor4::red);
00351 }
00352 else if ( "red1" == color_name )
00353 {
00354 color->setVec(LLColor4::red1);
00355 }
00356 else if ( "red2" == color_name )
00357 {
00358 color->setVec(LLColor4::red2);
00359 }
00360 else if ( "red3" == color_name )
00361 {
00362 color->setVec(LLColor4::red3);
00363 }
00364 else if ( "red4" == color_name )
00365 {
00366 color->setVec(LLColor4::red4);
00367 }
00368 else if ( "red5" == color_name )
00369 {
00370 color->setVec(LLColor4::red5);
00371 }
00372 else if( "green" == color_name )
00373 {
00374 color->setVec(LLColor4::green);
00375 }
00376 else if( "green1" == color_name )
00377 {
00378 color->setVec(LLColor4::green1);
00379 }
00380 else if( "green2" == color_name )
00381 {
00382 color->setVec(LLColor4::green2);
00383 }
00384 else if( "green3" == color_name )
00385 {
00386 color->setVec(LLColor4::green3);
00387 }
00388 else if( "green4" == color_name )
00389 {
00390 color->setVec(LLColor4::green4);
00391 }
00392 else if( "green5" == color_name )
00393 {
00394 color->setVec(LLColor4::green5);
00395 }
00396 else if( "green6" == color_name )
00397 {
00398 color->setVec(LLColor4::green6);
00399 }
00400 else if( "blue" == color_name )
00401 {
00402 color->setVec(LLColor4::blue);
00403 }
00404 else if( "blue1" == color_name )
00405 {
00406 color->setVec(LLColor4::blue1);
00407 }
00408 else if( "blue2" == color_name )
00409 {
00410 color->setVec(LLColor4::blue2);
00411 }
00412 else if( "blue3" == color_name )
00413 {
00414 color->setVec(LLColor4::blue3);
00415 }
00416 else if( "blue4" == color_name )
00417 {
00418 color->setVec(LLColor4::blue4);
00419 }
00420 else if( "blue5" == color_name )
00421 {
00422 color->setVec(LLColor4::blue5);
00423 }
00424 else if( "blue6" == color_name )
00425 {
00426 color->setVec(LLColor4::blue6);
00427 }
00428 else if( "black" == color_name )
00429 {
00430 color->setVec(LLColor4::black);
00431 }
00432 else if( "white" == color_name )
00433 {
00434 color->setVec(LLColor4::white);
00435 }
00436 else if( "yellow" == color_name )
00437 {
00438 color->setVec(LLColor4::yellow);
00439 }
00440 else if( "yellow1" == color_name )
00441 {
00442 color->setVec(LLColor4::yellow1);
00443 }
00444 else if( "yellow2" == color_name )
00445 {
00446 color->setVec(LLColor4::yellow2);
00447 }
00448 else if( "yellow3" == color_name )
00449 {
00450 color->setVec(LLColor4::yellow3);
00451 }
00452 else if( "yellow4" == color_name )
00453 {
00454 color->setVec(LLColor4::yellow4);
00455 }
00456 else if( "yellow5" == color_name )
00457 {
00458 color->setVec(LLColor4::yellow5);
00459 }
00460 else if( "yellow6" == color_name )
00461 {
00462 color->setVec(LLColor4::yellow6);
00463 }
00464 else if( "magenta" == color_name )
00465 {
00466 color->setVec(LLColor4::magenta);
00467 }
00468 else if( "magenta1" == color_name )
00469 {
00470 color->setVec(LLColor4::magenta1);
00471 }
00472 else if( "magenta2" == color_name )
00473 {
00474 color->setVec(LLColor4::magenta2);
00475 }
00476 else if( "magenta3" == color_name )
00477 {
00478 color->setVec(LLColor4::magenta3);
00479 }
00480 else if( "magenta4" == color_name )
00481 {
00482 color->setVec(LLColor4::magenta4);
00483 }
00484 else if( "purple" == color_name )
00485 {
00486 color->setVec(LLColor4::purple);
00487 }
00488 else if( "purple1" == color_name )
00489 {
00490 color->setVec(LLColor4::purple1);
00491 }
00492 else if( "purple2" == color_name )
00493 {
00494 color->setVec(LLColor4::purple2);
00495 }
00496 else if( "purple3" == color_name )
00497 {
00498 color->setVec(LLColor4::purple3);
00499 }
00500 else if( "purple4" == color_name )
00501 {
00502 color->setVec(LLColor4::purple4);
00503 }
00504 else if( "purple5" == color_name )
00505 {
00506 color->setVec(LLColor4::purple5);
00507 }
00508 else if( "purple6" == color_name )
00509 {
00510 color->setVec(LLColor4::purple6);
00511 }
00512 else if( "pink" == color_name )
00513 {
00514 color->setVec(LLColor4::pink);
00515 }
00516 else if( "pink1" == color_name )
00517 {
00518 color->setVec(LLColor4::pink1);
00519 }
00520 else if( "pink2" == color_name )
00521 {
00522 color->setVec(LLColor4::pink2);
00523 }
00524 else if( "cyan" == color_name )
00525 {
00526 color->setVec(LLColor4::cyan);
00527 }
00528 else if( "cyan1" == color_name )
00529 {
00530 color->setVec(LLColor4::cyan1);
00531 }
00532 else if( "cyan2" == color_name )
00533 {
00534 color->setVec(LLColor4::cyan2);
00535 }
00536 else if( "cyan3" == color_name )
00537 {
00538 color->setVec(LLColor4::cyan3);
00539 }
00540 else if( "cyan4" == color_name )
00541 {
00542 color->setVec(LLColor4::cyan4);
00543 }
00544 else if( "cyan5" == color_name )
00545 {
00546 color->setVec(LLColor4::cyan5);
00547 }
00548 else if( "cyan6" == color_name )
00549 {
00550 color->setVec(LLColor4::cyan6);
00551 }
00552 else if( "smoke" == color_name )
00553 {
00554 color->setVec(LLColor4::smoke);
00555 }
00556 else if( "grey" == color_name )
00557 {
00558 color->setVec(LLColor4::grey);
00559 }
00560 else if( "grey1" == color_name )
00561 {
00562 color->setVec(LLColor4::grey1);
00563 }
00564 else if( "grey2" == color_name )
00565 {
00566 color->setVec(LLColor4::grey2);
00567 }
00568 else if( "grey3" == color_name )
00569 {
00570 color->setVec(LLColor4::grey3);
00571 }
00572 else if( "grey4" == color_name )
00573 {
00574 color->setVec(LLColor4::grey4);
00575 }
00576 else if( "orange" == color_name )
00577 {
00578 color->setVec(LLColor4::orange);
00579 }
00580 else if( "orange1" == color_name )
00581 {
00582 color->setVec(LLColor4::orange1);
00583 }
00584 else if( "orange2" == color_name )
00585 {
00586 color->setVec(LLColor4::orange2);
00587 }
00588 else if( "orange3" == color_name )
00589 {
00590 color->setVec(LLColor4::orange3);
00591 }
00592 else if( "orange4" == color_name )
00593 {
00594 color->setVec(LLColor4::orange4);
00595 }
00596 else if( "orange5" == color_name )
00597 {
00598 color->setVec(LLColor4::orange5);
00599 }
00600 else if( "orange6" == color_name )
00601 {
00602 color->setVec(LLColor4::orange6);
00603 }
00604 else if ( "clear" == color_name )
00605 {
00606 color->setVec(0.f, 0.f, 0.f, 0.f);
00607 }
00608 else
00609 {
00610 llwarns << "invalid color " << color_name << llendl;
00611 }
00612 }
00613
00614 return TRUE;
00615 }
00616
00617
00618 BOOL LLColor4::parseColor4(const char* buf, LLColor4* value)
00619 {
00620 if( buf == NULL || buf[0] == '\0' || value == NULL)
00621 {
00622 return FALSE;
00623 }
00624
00625 LLColor4 v;
00626 S32 count = sscanf( buf, "%f, %f, %f, %f", v.mV + 0, v.mV + 1, v.mV + 2, v.mV + 3 );
00627 if (1 == count )
00628 {
00629
00630 count = sscanf( buf, "%f %f %f %f", v.mV + 0, v.mV + 1, v.mV + 2, v.mV + 3 );
00631 }
00632 if( 4 == count )
00633 {
00634 value->setVec( v );
00635 return TRUE;
00636 }
00637
00638 return FALSE;
00639 }
00640
00641