/indra/llmath/v4color.cpp

https://bitbucket.org/lindenlab/viewer-beta/ · C++ · 738 lines · 616 code · 71 blank · 51 comment · 246 complexity · a94c6b4fdd45a712343d6d3660847a1b MD5 · raw file

  1. /**
  2. * @file v4color.cpp
  3. * @brief LLColor4 class implementation.
  4. *
  5. * $LicenseInfo:firstyear=2000&license=viewerlgpl$
  6. * Second Life Viewer Source Code
  7. * Copyright (C) 2010, Linden Research, Inc.
  8. *
  9. * This library is free software; you can redistribute it and/or
  10. * modify it under the terms of the GNU Lesser General Public
  11. * License as published by the Free Software Foundation;
  12. * version 2.1 of the License only.
  13. *
  14. * This library is distributed in the hope that it will be useful,
  15. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  17. * Lesser General Public License for more details.
  18. *
  19. * You should have received a copy of the GNU Lesser General Public
  20. * License along with this library; if not, write to the Free Software
  21. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  22. *
  23. * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
  24. * $/LicenseInfo$
  25. */
  26. #include "linden_common.h"
  27. #include "llboost.h"
  28. #include "v4color.h"
  29. #include "v4coloru.h"
  30. #include "v3color.h"
  31. #include "v4math.h"
  32. #include "llmath.h"
  33. // LLColor4
  34. //////////////////////////////////////////////////////////////////////////////
  35. LLColor4 LLColor4::red( 1.f, 0.f, 0.f, 1.f);
  36. LLColor4 LLColor4::green( 0.f, 1.f, 0.f, 1.f);
  37. LLColor4 LLColor4::blue( 0.f, 0.f, 1.f, 1.f);
  38. LLColor4 LLColor4::black( 0.f, 0.f, 0.f, 1.f);
  39. LLColor4 LLColor4::yellow( 1.f, 1.f, 0.f, 1.f);
  40. LLColor4 LLColor4::magenta( 1.0f, 0.0f, 1.0f, 1.0f);
  41. LLColor4 LLColor4::cyan( 0.0f, 1.0f, 1.0f, 1.0f);
  42. LLColor4 LLColor4::white( 1.f, 1.f, 1.f, 1.f);
  43. LLColor4 LLColor4::smoke( 0.5f, 0.5f, 0.5f, 0.5f);
  44. LLColor4 LLColor4::grey( 0.5f, 0.5f, 0.5f, 1.0f);
  45. LLColor4 LLColor4::orange( 1.f, 0.5, 0.f, 1.f );
  46. LLColor4 LLColor4::purple( 0.6f, 0.2f, 0.8f, 1.0f);
  47. LLColor4 LLColor4::pink( 1.0f, 0.5f, 0.8f, 1.0f);
  48. LLColor4 LLColor4::transparent( 0.f, 0.f, 0.f, 0.f );
  49. //////////////////////////////////////////////////////////////////////////////
  50. LLColor4 LLColor4::grey1(0.8f, 0.8f, 0.8f, 1.0f);
  51. LLColor4 LLColor4::grey2(0.6f, 0.6f, 0.6f, 1.0f);
  52. LLColor4 LLColor4::grey3(0.4f, 0.4f, 0.4f, 1.0f);
  53. LLColor4 LLColor4::grey4(0.3f, 0.3f, 0.3f, 1.0f);
  54. LLColor4 LLColor4::red1(1.0f, 0.0f, 0.0f, 1.0f);
  55. LLColor4 LLColor4::red2(0.6f, 0.0f, 0.0f, 1.0f);
  56. LLColor4 LLColor4::red3(1.0f, 0.2f, 0.2f, 1.0f);
  57. LLColor4 LLColor4::red4(0.5f, 0.1f, 0.1f, 1.0f);
  58. LLColor4 LLColor4::red5(0.8f, 0.1f, 0.0f, 1.0f);
  59. LLColor4 LLColor4::green1(0.0f, 1.0f, 0.0f, 1.0f);
  60. LLColor4 LLColor4::green2(0.0f, 0.6f, 0.0f, 1.0f);
  61. LLColor4 LLColor4::green3(0.0f, 0.4f, 0.0f, 1.0f);
  62. LLColor4 LLColor4::green4(0.0f, 1.0f, 0.4f, 1.0f);
  63. LLColor4 LLColor4::green5(0.2f, 0.6f, 0.4f, 1.0f);
  64. LLColor4 LLColor4::green6(0.4f, 0.6f, 0.2f, 1.0f);
  65. LLColor4 LLColor4::blue1(0.0f, 0.0f, 1.0f, 1.0f);
  66. LLColor4 LLColor4::blue2(0.0f, 0.4f, 1.0f, 1.0f);
  67. LLColor4 LLColor4::blue3(0.2f, 0.2f, 0.8f, 1.0f);
  68. LLColor4 LLColor4::blue4(0.0f, 0.0f, 0.6f, 1.0f);
  69. LLColor4 LLColor4::blue5(0.4f, 0.2f, 1.0f, 1.0f);
  70. LLColor4 LLColor4::blue6(0.4f, 0.5f, 1.0f, 1.0f);
  71. LLColor4 LLColor4::yellow1(1.0f, 1.0f, 0.0f, 1.0f);
  72. LLColor4 LLColor4::yellow2(0.6f, 0.6f, 0.0f, 1.0f);
  73. LLColor4 LLColor4::yellow3(0.8f, 1.0f, 0.2f, 1.0f);
  74. LLColor4 LLColor4::yellow4(1.0f, 1.0f, 0.4f, 1.0f);
  75. LLColor4 LLColor4::yellow5(0.6f, 0.4f, 0.2f, 1.0f);
  76. LLColor4 LLColor4::yellow6(1.0f, 0.8f, 0.4f, 1.0f);
  77. LLColor4 LLColor4::yellow7(0.8f, 0.8f, 0.0f, 1.0f);
  78. LLColor4 LLColor4::yellow8(0.8f, 0.8f, 0.2f, 1.0f);
  79. LLColor4 LLColor4::yellow9(0.8f, 0.8f, 0.4f, 1.0f);
  80. LLColor4 LLColor4::orange1(1.0f, 0.8f, 0.0f, 1.0f);
  81. LLColor4 LLColor4::orange2(1.0f, 0.6f, 0.0f, 1.0f);
  82. LLColor4 LLColor4::orange3(1.0f, 0.4f, 0.2f, 1.0f);
  83. LLColor4 LLColor4::orange4(0.8f, 0.4f, 0.0f, 1.0f);
  84. LLColor4 LLColor4::orange5(0.9f, 0.5f, 0.0f, 1.0f);
  85. LLColor4 LLColor4::orange6(1.0f, 0.8f, 0.2f, 1.0f);
  86. LLColor4 LLColor4::magenta1(1.0f, 0.0f, 1.0f, 1.0f);
  87. LLColor4 LLColor4::magenta2(0.6f, 0.2f, 0.4f, 1.0f);
  88. LLColor4 LLColor4::magenta3(1.0f, 0.4f, 0.6f, 1.0f);
  89. LLColor4 LLColor4::magenta4(1.0f, 0.2f, 0.8f, 1.0f);
  90. LLColor4 LLColor4::purple1(0.6f, 0.2f, 0.8f, 1.0f);
  91. LLColor4 LLColor4::purple2(0.8f, 0.2f, 1.0f, 1.0f);
  92. LLColor4 LLColor4::purple3(0.6f, 0.0f, 1.0f, 1.0f);
  93. LLColor4 LLColor4::purple4(0.4f, 0.0f, 0.8f, 1.0f);
  94. LLColor4 LLColor4::purple5(0.6f, 0.0f, 0.8f, 1.0f);
  95. LLColor4 LLColor4::purple6(0.8f, 0.0f, 0.6f, 1.0f);
  96. LLColor4 LLColor4::pink1(1.0f, 0.5f, 0.8f, 1.0f);
  97. LLColor4 LLColor4::pink2(1.0f, 0.8f, 0.9f, 1.0f);
  98. LLColor4 LLColor4::cyan1(0.0f, 1.0f, 1.0f, 1.0f);
  99. LLColor4 LLColor4::cyan2(0.4f, 0.8f, 0.8f, 1.0f);
  100. LLColor4 LLColor4::cyan3(0.0f, 1.0f, 0.6f, 1.0f);
  101. LLColor4 LLColor4::cyan4(0.6f, 1.0f, 1.0f, 1.0f);
  102. LLColor4 LLColor4::cyan5(0.2f, 0.6f, 1.0f, 1.0f);
  103. LLColor4 LLColor4::cyan6(0.2f, 0.6f, 0.6f, 1.0f);
  104. //////////////////////////////////////////////////////////////////////////////
  105. // conversion
  106. LLColor4::operator const LLColor4U() const
  107. {
  108. return LLColor4U(
  109. (U8)llclampb(llround(mV[VRED]*255.f)),
  110. (U8)llclampb(llround(mV[VGREEN]*255.f)),
  111. (U8)llclampb(llround(mV[VBLUE]*255.f)),
  112. (U8)llclampb(llround(mV[VALPHA]*255.f)));
  113. }
  114. LLColor4::LLColor4(const LLColor3 &vec, F32 a)
  115. {
  116. mV[VX] = vec.mV[VX];
  117. mV[VY] = vec.mV[VY];
  118. mV[VZ] = vec.mV[VZ];
  119. mV[VW] = a;
  120. }
  121. LLColor4::LLColor4(const LLColor4U& color4u)
  122. {
  123. const F32 SCALE = 1.f/255.f;
  124. mV[VX] = color4u.mV[VX] * SCALE;
  125. mV[VY] = color4u.mV[VY] * SCALE;
  126. mV[VZ] = color4u.mV[VZ] * SCALE;
  127. mV[VW] = color4u.mV[VW] * SCALE;
  128. }
  129. LLColor4::LLColor4(const LLVector4& vector4)
  130. {
  131. mV[VX] = vector4.mV[VX];
  132. mV[VY] = vector4.mV[VY];
  133. mV[VZ] = vector4.mV[VZ];
  134. mV[VW] = vector4.mV[VW];
  135. }
  136. const LLColor4& LLColor4::set(const LLColor4U& color4u)
  137. {
  138. const F32 SCALE = 1.f/255.f;
  139. mV[VX] = color4u.mV[VX] * SCALE;
  140. mV[VY] = color4u.mV[VY] * SCALE;
  141. mV[VZ] = color4u.mV[VZ] * SCALE;
  142. mV[VW] = color4u.mV[VW] * SCALE;
  143. return (*this);
  144. }
  145. const LLColor4& LLColor4::set(const LLColor3 &vec)
  146. {
  147. mV[VX] = vec.mV[VX];
  148. mV[VY] = vec.mV[VY];
  149. mV[VZ] = vec.mV[VZ];
  150. // no change to alpha!
  151. // mV[VW] = 1.f;
  152. return (*this);
  153. }
  154. const LLColor4& LLColor4::set(const LLColor3 &vec, F32 a)
  155. {
  156. mV[VX] = vec.mV[VX];
  157. mV[VY] = vec.mV[VY];
  158. mV[VZ] = vec.mV[VZ];
  159. mV[VW] = a;
  160. return (*this);
  161. }
  162. // deprecated -- use set()
  163. const LLColor4& LLColor4::setVec(const LLColor4U& color4u)
  164. {
  165. const F32 SCALE = 1.f/255.f;
  166. mV[VX] = color4u.mV[VX] * SCALE;
  167. mV[VY] = color4u.mV[VY] * SCALE;
  168. mV[VZ] = color4u.mV[VZ] * SCALE;
  169. mV[VW] = color4u.mV[VW] * SCALE;
  170. return (*this);
  171. }
  172. // deprecated -- use set()
  173. const LLColor4& LLColor4::setVec(const LLColor3 &vec)
  174. {
  175. mV[VX] = vec.mV[VX];
  176. mV[VY] = vec.mV[VY];
  177. mV[VZ] = vec.mV[VZ];
  178. // no change to alpha!
  179. // mV[VW] = 1.f;
  180. return (*this);
  181. }
  182. // deprecated -- use set()
  183. const LLColor4& LLColor4::setVec(const LLColor3 &vec, F32 a)
  184. {
  185. mV[VX] = vec.mV[VX];
  186. mV[VY] = vec.mV[VY];
  187. mV[VZ] = vec.mV[VZ];
  188. mV[VW] = a;
  189. return (*this);
  190. }
  191. void LLColor4::setValue(const LLSD& sd)
  192. {
  193. #if 0
  194. // Clamping on setValue from LLSD is inconsistent with other set behavior
  195. F32 val;
  196. bool out_of_range = false;
  197. val = sd[0].asReal();
  198. mV[0] = llclamp(val, 0.f, 1.f);
  199. out_of_range = mV[0] != val;
  200. val = sd[1].asReal();
  201. mV[1] = llclamp(val, 0.f, 1.f);
  202. out_of_range |= mV[1] != val;
  203. val = sd[2].asReal();
  204. mV[2] = llclamp(val, 0.f, 1.f);
  205. out_of_range |= mV[2] != val;
  206. val = sd[3].asReal();
  207. mV[3] = llclamp(val, 0.f, 1.f);
  208. out_of_range |= mV[3] != val;
  209. if (out_of_range)
  210. {
  211. llwarns << "LLSD color value out of range!" << llendl;
  212. }
  213. #else
  214. mV[0] = (F32) sd[0].asReal();
  215. mV[1] = (F32) sd[1].asReal();
  216. mV[2] = (F32) sd[2].asReal();
  217. mV[3] = (F32) sd[3].asReal();
  218. #endif
  219. }
  220. const LLColor4& LLColor4::operator=(const LLColor3 &a)
  221. {
  222. mV[VX] = a.mV[VX];
  223. mV[VY] = a.mV[VY];
  224. mV[VZ] = a.mV[VZ];
  225. // converting from an rgb sets a=1 (opaque)
  226. mV[VW] = 1.f;
  227. return (*this);
  228. }
  229. std::ostream& operator<<(std::ostream& s, const LLColor4 &a)
  230. {
  231. s << "{ " << a.mV[VX] << ", " << a.mV[VY] << ", " << a.mV[VZ] << ", " << a.mV[VW] << " }";
  232. return s;
  233. }
  234. bool operator==(const LLColor4 &a, const LLColor3 &b)
  235. {
  236. return ( (a.mV[VX] == b.mV[VX])
  237. &&(a.mV[VY] == b.mV[VY])
  238. &&(a.mV[VZ] == b.mV[VZ]));
  239. }
  240. bool operator!=(const LLColor4 &a, const LLColor3 &b)
  241. {
  242. return ( (a.mV[VX] != b.mV[VX])
  243. ||(a.mV[VY] != b.mV[VY])
  244. ||(a.mV[VZ] != b.mV[VZ]));
  245. }
  246. LLColor3 vec4to3(const LLColor4 &vec)
  247. {
  248. LLColor3 temp(vec.mV[VX], vec.mV[VY], vec.mV[VZ]);
  249. return temp;
  250. }
  251. LLColor4 vec3to4(const LLColor3 &vec)
  252. {
  253. LLColor3 temp(vec.mV[VX], vec.mV[VY], vec.mV[VZ]);
  254. return temp;
  255. }
  256. static F32 hueToRgb ( F32 val1In, F32 val2In, F32 valHUeIn )
  257. {
  258. if ( valHUeIn < 0.0f ) valHUeIn += 1.0f;
  259. if ( valHUeIn > 1.0f ) valHUeIn -= 1.0f;
  260. if ( ( 6.0f * valHUeIn ) < 1.0f ) return ( val1In + ( val2In - val1In ) * 6.0f * valHUeIn );
  261. if ( ( 2.0f * valHUeIn ) < 1.0f ) return ( val2In );
  262. if ( ( 3.0f * valHUeIn ) < 2.0f ) return ( val1In + ( val2In - val1In ) * ( ( 2.0f / 3.0f ) - valHUeIn ) * 6.0f );
  263. return ( val1In );
  264. }
  265. void LLColor4::setHSL ( F32 hValIn, F32 sValIn, F32 lValIn)
  266. {
  267. if ( sValIn < 0.00001f )
  268. {
  269. mV[VRED] = lValIn;
  270. mV[VGREEN] = lValIn;
  271. mV[VBLUE] = lValIn;
  272. }
  273. else
  274. {
  275. F32 interVal1;
  276. F32 interVal2;
  277. if ( lValIn < 0.5f )
  278. interVal2 = lValIn * ( 1.0f + sValIn );
  279. else
  280. interVal2 = ( lValIn + sValIn ) - ( sValIn * lValIn );
  281. interVal1 = 2.0f * lValIn - interVal2;
  282. mV[VRED] = hueToRgb ( interVal1, interVal2, hValIn + ( 1.f / 3.f ) );
  283. mV[VGREEN] = hueToRgb ( interVal1, interVal2, hValIn );
  284. mV[VBLUE] = hueToRgb ( interVal1, interVal2, hValIn - ( 1.f / 3.f ) );
  285. }
  286. }
  287. void LLColor4::calcHSL(F32* hue, F32* saturation, F32* luminance) const
  288. {
  289. F32 var_R = mV[VRED];
  290. F32 var_G = mV[VGREEN];
  291. F32 var_B = mV[VBLUE];
  292. F32 var_Min = ( var_R < ( var_G < var_B ? var_G : var_B ) ? var_R : ( var_G < var_B ? var_G : var_B ) );
  293. F32 var_Max = ( var_R > ( var_G > var_B ? var_G : var_B ) ? var_R : ( var_G > var_B ? var_G : var_B ) );
  294. F32 del_Max = var_Max - var_Min;
  295. F32 L = ( var_Max + var_Min ) / 2.0f;
  296. F32 H = 0.0f;
  297. F32 S = 0.0f;
  298. if ( del_Max == 0.0f )
  299. {
  300. H = 0.0f;
  301. S = 0.0f;
  302. }
  303. else
  304. {
  305. if ( L < 0.5 )
  306. S = del_Max / ( var_Max + var_Min );
  307. else
  308. S = del_Max / ( 2.0f - var_Max - var_Min );
  309. F32 del_R = ( ( ( var_Max - var_R ) / 6.0f ) + ( del_Max / 2.0f ) ) / del_Max;
  310. F32 del_G = ( ( ( var_Max - var_G ) / 6.0f ) + ( del_Max / 2.0f ) ) / del_Max;
  311. F32 del_B = ( ( ( var_Max - var_B ) / 6.0f ) + ( del_Max / 2.0f ) ) / del_Max;
  312. if ( var_R >= var_Max )
  313. H = del_B - del_G;
  314. else
  315. if ( var_G >= var_Max )
  316. H = ( 1.0f / 3.0f ) + del_R - del_B;
  317. else
  318. if ( var_B >= var_Max )
  319. H = ( 2.0f / 3.0f ) + del_G - del_R;
  320. if ( H < 0.0f ) H += 1.0f;
  321. if ( H > 1.0f ) H -= 1.0f;
  322. }
  323. if (hue) *hue = H;
  324. if (saturation) *saturation = S;
  325. if (luminance) *luminance = L;
  326. }
  327. // static
  328. BOOL LLColor4::parseColor(const std::string& buf, LLColor4* color)
  329. {
  330. if( buf.empty() || color == NULL)
  331. {
  332. return FALSE;
  333. }
  334. boost_tokenizer tokens(buf, boost::char_separator<char>(", "));
  335. boost_tokenizer::iterator token_iter = tokens.begin();
  336. if (token_iter == tokens.end())
  337. {
  338. return FALSE;
  339. }
  340. // Grab the first token into a string, since we don't know
  341. // if this is a float or a color name.
  342. std::string color_name( (*token_iter) );
  343. ++token_iter;
  344. if (token_iter != tokens.end())
  345. {
  346. // There are more tokens to read. This must be a vector.
  347. LLColor4 v;
  348. LLStringUtil::convertToF32( color_name, v.mV[VX] );
  349. LLStringUtil::convertToF32( *token_iter, v.mV[VY] );
  350. v.mV[VZ] = 0.0f;
  351. v.mV[VW] = 1.0f;
  352. ++token_iter;
  353. if (token_iter == tokens.end())
  354. {
  355. // This is a malformed vector.
  356. llwarns << "LLColor4::parseColor() malformed color " << buf << llendl;
  357. }
  358. else
  359. {
  360. // There is a z-component.
  361. LLStringUtil::convertToF32( *token_iter, v.mV[VZ] );
  362. ++token_iter;
  363. if (token_iter != tokens.end())
  364. {
  365. // There is an alpha component.
  366. LLStringUtil::convertToF32( *token_iter, v.mV[VW] );
  367. }
  368. }
  369. // Make sure all values are between 0 and 1.
  370. if (v.mV[VX] > 1.f || v.mV[VY] > 1.f || v.mV[VZ] > 1.f || v.mV[VW] > 1.f)
  371. {
  372. v = v * (1.f / 255.f);
  373. }
  374. color->set( v );
  375. }
  376. else // Single value. Read as a named color.
  377. {
  378. // We have a color name
  379. if ( "red" == color_name )
  380. {
  381. color->set(LLColor4::red);
  382. }
  383. else if ( "red1" == color_name )
  384. {
  385. color->set(LLColor4::red1);
  386. }
  387. else if ( "red2" == color_name )
  388. {
  389. color->set(LLColor4::red2);
  390. }
  391. else if ( "red3" == color_name )
  392. {
  393. color->set(LLColor4::red3);
  394. }
  395. else if ( "red4" == color_name )
  396. {
  397. color->set(LLColor4::red4);
  398. }
  399. else if ( "red5" == color_name )
  400. {
  401. color->set(LLColor4::red5);
  402. }
  403. else if( "green" == color_name )
  404. {
  405. color->set(LLColor4::green);
  406. }
  407. else if( "green1" == color_name )
  408. {
  409. color->set(LLColor4::green1);
  410. }
  411. else if( "green2" == color_name )
  412. {
  413. color->set(LLColor4::green2);
  414. }
  415. else if( "green3" == color_name )
  416. {
  417. color->set(LLColor4::green3);
  418. }
  419. else if( "green4" == color_name )
  420. {
  421. color->set(LLColor4::green4);
  422. }
  423. else if( "green5" == color_name )
  424. {
  425. color->set(LLColor4::green5);
  426. }
  427. else if( "green6" == color_name )
  428. {
  429. color->set(LLColor4::green6);
  430. }
  431. else if( "blue" == color_name )
  432. {
  433. color->set(LLColor4::blue);
  434. }
  435. else if( "blue1" == color_name )
  436. {
  437. color->set(LLColor4::blue1);
  438. }
  439. else if( "blue2" == color_name )
  440. {
  441. color->set(LLColor4::blue2);
  442. }
  443. else if( "blue3" == color_name )
  444. {
  445. color->set(LLColor4::blue3);
  446. }
  447. else if( "blue4" == color_name )
  448. {
  449. color->set(LLColor4::blue4);
  450. }
  451. else if( "blue5" == color_name )
  452. {
  453. color->set(LLColor4::blue5);
  454. }
  455. else if( "blue6" == color_name )
  456. {
  457. color->set(LLColor4::blue6);
  458. }
  459. else if( "black" == color_name )
  460. {
  461. color->set(LLColor4::black);
  462. }
  463. else if( "white" == color_name )
  464. {
  465. color->set(LLColor4::white);
  466. }
  467. else if( "yellow" == color_name )
  468. {
  469. color->set(LLColor4::yellow);
  470. }
  471. else if( "yellow1" == color_name )
  472. {
  473. color->set(LLColor4::yellow1);
  474. }
  475. else if( "yellow2" == color_name )
  476. {
  477. color->set(LLColor4::yellow2);
  478. }
  479. else if( "yellow3" == color_name )
  480. {
  481. color->set(LLColor4::yellow3);
  482. }
  483. else if( "yellow4" == color_name )
  484. {
  485. color->set(LLColor4::yellow4);
  486. }
  487. else if( "yellow5" == color_name )
  488. {
  489. color->set(LLColor4::yellow5);
  490. }
  491. else if( "yellow6" == color_name )
  492. {
  493. color->set(LLColor4::yellow6);
  494. }
  495. else if( "magenta" == color_name )
  496. {
  497. color->set(LLColor4::magenta);
  498. }
  499. else if( "magenta1" == color_name )
  500. {
  501. color->set(LLColor4::magenta1);
  502. }
  503. else if( "magenta2" == color_name )
  504. {
  505. color->set(LLColor4::magenta2);
  506. }
  507. else if( "magenta3" == color_name )
  508. {
  509. color->set(LLColor4::magenta3);
  510. }
  511. else if( "magenta4" == color_name )
  512. {
  513. color->set(LLColor4::magenta4);
  514. }
  515. else if( "purple" == color_name )
  516. {
  517. color->set(LLColor4::purple);
  518. }
  519. else if( "purple1" == color_name )
  520. {
  521. color->set(LLColor4::purple1);
  522. }
  523. else if( "purple2" == color_name )
  524. {
  525. color->set(LLColor4::purple2);
  526. }
  527. else if( "purple3" == color_name )
  528. {
  529. color->set(LLColor4::purple3);
  530. }
  531. else if( "purple4" == color_name )
  532. {
  533. color->set(LLColor4::purple4);
  534. }
  535. else if( "purple5" == color_name )
  536. {
  537. color->set(LLColor4::purple5);
  538. }
  539. else if( "purple6" == color_name )
  540. {
  541. color->set(LLColor4::purple6);
  542. }
  543. else if( "pink" == color_name )
  544. {
  545. color->set(LLColor4::pink);
  546. }
  547. else if( "pink1" == color_name )
  548. {
  549. color->set(LLColor4::pink1);
  550. }
  551. else if( "pink2" == color_name )
  552. {
  553. color->set(LLColor4::pink2);
  554. }
  555. else if( "cyan" == color_name )
  556. {
  557. color->set(LLColor4::cyan);
  558. }
  559. else if( "cyan1" == color_name )
  560. {
  561. color->set(LLColor4::cyan1);
  562. }
  563. else if( "cyan2" == color_name )
  564. {
  565. color->set(LLColor4::cyan2);
  566. }
  567. else if( "cyan3" == color_name )
  568. {
  569. color->set(LLColor4::cyan3);
  570. }
  571. else if( "cyan4" == color_name )
  572. {
  573. color->set(LLColor4::cyan4);
  574. }
  575. else if( "cyan5" == color_name )
  576. {
  577. color->set(LLColor4::cyan5);
  578. }
  579. else if( "cyan6" == color_name )
  580. {
  581. color->set(LLColor4::cyan6);
  582. }
  583. else if( "smoke" == color_name )
  584. {
  585. color->set(LLColor4::smoke);
  586. }
  587. else if( "grey" == color_name )
  588. {
  589. color->set(LLColor4::grey);
  590. }
  591. else if( "grey1" == color_name )
  592. {
  593. color->set(LLColor4::grey1);
  594. }
  595. else if( "grey2" == color_name )
  596. {
  597. color->set(LLColor4::grey2);
  598. }
  599. else if( "grey3" == color_name )
  600. {
  601. color->set(LLColor4::grey3);
  602. }
  603. else if( "grey4" == color_name )
  604. {
  605. color->set(LLColor4::grey4);
  606. }
  607. else if( "orange" == color_name )
  608. {
  609. color->set(LLColor4::orange);
  610. }
  611. else if( "orange1" == color_name )
  612. {
  613. color->set(LLColor4::orange1);
  614. }
  615. else if( "orange2" == color_name )
  616. {
  617. color->set(LLColor4::orange2);
  618. }
  619. else if( "orange3" == color_name )
  620. {
  621. color->set(LLColor4::orange3);
  622. }
  623. else if( "orange4" == color_name )
  624. {
  625. color->set(LLColor4::orange4);
  626. }
  627. else if( "orange5" == color_name )
  628. {
  629. color->set(LLColor4::orange5);
  630. }
  631. else if( "orange6" == color_name )
  632. {
  633. color->set(LLColor4::orange6);
  634. }
  635. else if ( "clear" == color_name )
  636. {
  637. color->set(0.f, 0.f, 0.f, 0.f);
  638. }
  639. else
  640. {
  641. llwarns << "invalid color " << color_name << llendl;
  642. }
  643. }
  644. return TRUE;
  645. }
  646. // static
  647. BOOL LLColor4::parseColor4(const std::string& buf, LLColor4* value)
  648. {
  649. if( buf.empty() || value == NULL)
  650. {
  651. return FALSE;
  652. }
  653. LLColor4 v;
  654. S32 count = sscanf( buf.c_str(), "%f, %f, %f, %f", v.mV + 0, v.mV + 1, v.mV + 2, v.mV + 3 );
  655. if (1 == count )
  656. {
  657. // try this format
  658. count = sscanf( buf.c_str(), "%f %f %f %f", v.mV + 0, v.mV + 1, v.mV + 2, v.mV + 3 );
  659. }
  660. if( 4 == count )
  661. {
  662. value->setVec( v );
  663. return TRUE;
  664. }
  665. return FALSE;
  666. }
  667. // EOF