00001
00002
00003
00004
00005
00012 #ifndef HCOLOR_H
00013 #define HCOLOR_H
00014
00015
00016
00020 namespace Humble
00021 {
00023 const COLOR kClrDebug = MAKE_COLOR(255,0,255);
00025 const COLOR kClrWindowDark = MAKE_COLOR(85,85,85);
00027 const COLOR kClrWindowFrame = MAKE_COLOR(170,170,170);
00029 const COLOR kClrWindowLight = MAKE_COLOR(210,210,210);
00031 const COLOR kClrWindowBack = MAKE_COLOR(204,204,204);
00032
00033 const float NO_TINT = 1.0F;
00034
00035 const float LIGHTEN_1 = 0.590F;
00036 const float LIGHTEN_2 = 0.385F;
00037 const float LIGHTEN_MAX = 0.0F;
00038
00039 const float DARKEN_1 = 1.147F;
00040 const float DARKEN_2 = 1.295F;
00041 const float DARKEN_3 = 1.407F;
00042 const float DARKEN_4 = 1.555F;
00043 const float DARKEN_MAX = 2.0F;
00044 };
00270 class HColor : public HObj
00271 {
00272 typedef HObj base_class;
00273 static StringPtr ClassName(void)
00274 { return "HColor"; }
00275
00276
00277
00278 protected:
00279 COLOR m_color;
00280 public:
00281 typedef enum
00282 {
00283 none = MAKE_COLOR(0xFF, 0x00, 0xFF),
00284 aliceblue = MAKE_COLOR(0xF0, 0xF8, 0xFF),
00285 antiquewhite = MAKE_COLOR(0xFA, 0xEB, 0xD7),
00286 aqua = MAKE_COLOR(0x00, 0xFF, 0xFF),
00287 aquamarine = MAKE_COLOR(0x7F, 0xFF, 0xD4),
00288 azure = MAKE_COLOR(0xF0, 0xFF, 0xFF),
00289 beige = MAKE_COLOR(0xF5, 0xF5, 0xDC),
00290 bisque = MAKE_COLOR(0xFF, 0xE4, 0xC4),
00291 black = MAKE_COLOR(0x00, 0x00, 0x00),
00292 blanchedalmond = MAKE_COLOR(0xFF, 0xEB, 0xCD),
00293 blue = MAKE_COLOR(0x00, 0x00, 0xFF),
00294 blueviolet = MAKE_COLOR(0x8A, 0x2B, 0xE2),
00295 brown = MAKE_COLOR(0xA5, 0x2A, 0x2A),
00296 burlywood = MAKE_COLOR(0xDE, 0xB8, 0x87),
00297 cadetblue = MAKE_COLOR(0x5F, 0x9E, 0xA0),
00298 chartreuse = MAKE_COLOR(0x7F, 0xFF, 0x00),
00299 chocolate = MAKE_COLOR(0xD2, 0x69, 0x1E),
00300 coral = MAKE_COLOR(0xFF, 0x7F, 0x50),
00301 cornflower = MAKE_COLOR(0x64, 0x95, 0xED),
00302 cornsilk = MAKE_COLOR(0xFF, 0xF8, 0xDC),
00303 crimson = MAKE_COLOR(0xDC, 0x14, 0x3C),
00304 cyan = MAKE_COLOR(0x00, 0xFF, 0xFF),
00305 darkblue = MAKE_COLOR(0x00, 0x00, 0x8B),
00306 darkcyan = MAKE_COLOR(0x00, 0x8B, 0x8B),
00307 darkgoldenrod = MAKE_COLOR(0xB8, 0x86, 0x0B),
00308 darkgray = MAKE_COLOR(0xA9, 0xA9, 0xA9),
00309 darkgreen = MAKE_COLOR(0x00, 0x64, 0x00),
00310 darkkhaki = MAKE_COLOR(0xBD, 0xB7, 0x6B),
00311 darkmagenta = MAKE_COLOR(0x8B, 0x00, 0x8B),
00312 darkolivegreen = MAKE_COLOR(0x55, 0x6B, 0x2F),
00313 darkorange = MAKE_COLOR(0xFF, 0x8C, 0x00),
00314 darkorchid = MAKE_COLOR(0x99, 0x32, 0xCC),
00315 darkred = MAKE_COLOR(0x8B, 0x00, 0x00),
00316 darksalmon = MAKE_COLOR(0xE9, 0x96, 0x7A),
00317 darkseagreen = MAKE_COLOR(0x8F, 0xBC, 0x8B),
00318 darkslateblue = MAKE_COLOR(0x48, 0x3D, 0x8B),
00319 darkslategray = MAKE_COLOR(0x2F, 0x4F, 0x4F),
00320 darkturquoise = MAKE_COLOR(0x00, 0xCE, 0xD1),
00321 darkviolet = MAKE_COLOR(0x94, 0x00, 0xD3),
00322 deeppink = MAKE_COLOR(0xFF, 0x14, 0x93),
00323 deepskyblue = MAKE_COLOR(0x00, 0xBF, 0xFF),
00324 dimgray = MAKE_COLOR(0x69, 0x69, 0x69),
00325 dodgerblue = MAKE_COLOR(0x1E, 0x90, 0xFF),
00326 firebrick = MAKE_COLOR(0xB2, 0x22, 0x22),
00327 floralwhite = MAKE_COLOR(0xFF, 0xFA, 0xF0),
00328 forestgreen = MAKE_COLOR(0x22, 0x8B, 0x22),
00329 fuchsia = MAKE_COLOR(0xFF, 0x00, 0xFF),
00330 gainsboro = MAKE_COLOR(0xDC, 0xDC, 0xDC),
00331 ghostwhite = MAKE_COLOR(0xF8, 0xF8, 0xFF),
00332 gold = MAKE_COLOR(0xFF, 0xD7, 0x00),
00333 goldenrod = MAKE_COLOR(0xDA, 0xA5, 0x20),
00334 gray = MAKE_COLOR(0x80, 0x80, 0x80),
00335 green = MAKE_COLOR(0x00, 0x80, 0x00),
00336 greenyellow = MAKE_COLOR(0xAD, 0xFF, 0x2F),
00337 honeydew = MAKE_COLOR(0xF0, 0xFF, 0xF0),
00338 hotpink = MAKE_COLOR(0xFF, 0x69, 0xB4),
00339 indianred = MAKE_COLOR(0xCD, 0x5C, 0x5C),
00340 indigo = MAKE_COLOR(0x4B, 0x00, 0x82),
00341 ivory = MAKE_COLOR(0xFF, 0xFF, 0xF0),
00342 khaki = MAKE_COLOR(0xF0, 0xE6, 0x8C),
00343 lavender = MAKE_COLOR(0xE6, 0xE6, 0xFA),
00344 lavenderblush = MAKE_COLOR(0xFF, 0xF0, 0xF5),
00345 lawngreen = MAKE_COLOR(0x7C, 0xFC, 0x00),
00346 lemonchiffon = MAKE_COLOR(0xFF, 0xFA, 0xCD),
00347 lightblue = MAKE_COLOR(0xAD, 0xD8, 0xE6),
00348 lightcoral = MAKE_COLOR(0xF0, 0x80, 0x80),
00349 lightcyan = MAKE_COLOR(0xE0, 0xFF, 0xFF),
00350 lightgoldenrodyellow = MAKE_COLOR(0xFA, 0xFA, 0xD2),
00351 lightgreen = MAKE_COLOR(0x90, 0xEE, 0x90),
00352 lightgrey = MAKE_COLOR(0xD3, 0xD3, 0xD3),
00353 lightpink = MAKE_COLOR(0xFF, 0xB6, 0xC1),
00354 lightsalmon = MAKE_COLOR(0xFF, 0xA0, 0x7A),
00355 lightseagreen = MAKE_COLOR(0x20, 0xB2, 0xAA),
00356 lightskyblue = MAKE_COLOR(0x87, 0xCE, 0xFA),
00357 lightslategray = MAKE_COLOR(0x77, 0x88, 0x99),
00358 lightsteelblue = MAKE_COLOR(0xB0, 0xC4, 0xDE),
00359 lightyellow = MAKE_COLOR(0xFF, 0xFF, 0xE0),
00360 lime = MAKE_COLOR(0x00, 0xFF, 0x00),
00361 limegreen = MAKE_COLOR(0x32, 0xCD, 0x32),
00362 linen = MAKE_COLOR(0xFA, 0xF0, 0xE6),
00363 magenta = MAKE_COLOR(0xFF, 0x00, 0xFF),
00364 maroon = MAKE_COLOR(0x80, 0x00, 0x00),
00365 mediumaquamarine = MAKE_COLOR(0x66, 0xCD, 0xAA),
00366 mediumblue = MAKE_COLOR(0x00, 0x00, 0xCD),
00367 mediumorchid = MAKE_COLOR(0xBA, 0x55, 0xD3),
00368 mediumpurple = MAKE_COLOR(0x93, 0x70, 0xDB),
00369 mediumseagreen = MAKE_COLOR(0x3C, 0xB3, 0x71),
00370 mediumslateblue = MAKE_COLOR(0x7B, 0x68, 0xEE),
00371 mediumspringgreen = MAKE_COLOR(0x00, 0xFA, 0x9A),
00372 mediumturquoise = MAKE_COLOR(0x48, 0xD1, 0xCC),
00373 mediumvioletred = MAKE_COLOR(0xC7, 0x15, 0x85),
00374 midnightblue = MAKE_COLOR(0x19, 0x19, 0x70),
00375 mintcream = MAKE_COLOR(0xF5, 0xFF, 0xFA),
00376 mistyrose = MAKE_COLOR(0xFF, 0xE4, 0xE1),
00377 moccasin = MAKE_COLOR(0xFF, 0xE4, 0xB5),
00378 navajowhite = MAKE_COLOR(0xFF, 0xDE, 0xAD),
00379 navy = MAKE_COLOR(0x00, 0x00, 0x80),
00380 oldlace = MAKE_COLOR(0xFD, 0xF5, 0xE6),
00381 olive = MAKE_COLOR(0x80, 0x80, 0x00),
00382 olivedrab = MAKE_COLOR(0x6B, 0x8E, 0x23),
00383 orange = MAKE_COLOR(0xFF, 0xA5, 0x00),
00384 orangered = MAKE_COLOR(0xFF, 0x45, 0x00),
00385 orchid = MAKE_COLOR(0xDA, 0x70, 0xD6),
00386 palegoldenrod = MAKE_COLOR(0xEE, 0xE8, 0xAA),
00387 palegreen = MAKE_COLOR(0x98, 0xFB, 0x98),
00388 paleturquoise = MAKE_COLOR(0xAF, 0xEE, 0xEE),
00389 palevioletred = MAKE_COLOR(0xDB, 0x70, 0x93),
00390 papayawhip = MAKE_COLOR(0xFF, 0xEF, 0xD5),
00391 peachpuff = MAKE_COLOR(0xFF, 0xDA, 0xB9),
00392 peru = MAKE_COLOR(0xCD, 0x85, 0x3F),
00393 pink = MAKE_COLOR(0xFF, 0xC0, 0xCB),
00394 plum = MAKE_COLOR(0xDD, 0xA0, 0xDD),
00395 powderblue = MAKE_COLOR(0xB0, 0xE0, 0xE6),
00396 purple = MAKE_COLOR(0x80, 0x00, 0x80),
00397 red = MAKE_COLOR(0xFF, 0x00, 0x00),
00398 rosybrown = MAKE_COLOR(0xBC, 0x8F, 0x8F),
00399 royalblue = MAKE_COLOR(0x41, 0x69, 0xE1),
00400 saddlebrown = MAKE_COLOR(0x8B, 0x45, 0x13),
00401 salmon = MAKE_COLOR(0xFA, 0x80, 0x72),
00402 sandybrown = MAKE_COLOR(0xF4, 0xA4, 0x60),
00403 seagreen = MAKE_COLOR(0x2E, 0x8B, 0x57),
00404 seashell = MAKE_COLOR(0xFF, 0xF5, 0xEE),
00405 sienna = MAKE_COLOR(0xA0, 0x52, 0x2D),
00406 silver = MAKE_COLOR(0xC0, 0xC0, 0xC0),
00407 skyblue = MAKE_COLOR(0x87, 0xCE, 0xEB),
00408 slateblue = MAKE_COLOR(0x6A, 0x5A, 0xCD),
00409 slategray = MAKE_COLOR(0x70, 0x80, 0x90),
00410 snow = MAKE_COLOR(0xFF, 0xFA, 0xFA),
00411 springgreen = MAKE_COLOR(0x00, 0xFF, 0x7F),
00412 steelblue = MAKE_COLOR(0x46, 0x82, 0xB4),
00413 tan = MAKE_COLOR(0xD2, 0xB4, 0x8C),
00414 teal = MAKE_COLOR(0x00, 0x80, 0x80),
00415 thistle = MAKE_COLOR(0xD8, 0xBF, 0xD8),
00416 tomato = MAKE_COLOR(0xFF, 0x63, 0x47),
00417 turquoise = MAKE_COLOR(0x40, 0xE0, 0xD0),
00418 violet = MAKE_COLOR(0xEE, 0x82, 0xEE),
00419 wheat = MAKE_COLOR(0xF5, 0xDE, 0xB3),
00420 white = MAKE_COLOR(0xFF, 0xFF, 0xFF),
00421 whitesmoke = MAKE_COLOR(0xF5, 0xF5, 0xF5),
00422 yellow = MAKE_COLOR(0xFF, 0xFF, 0x00),
00423 yellowgreen = MAKE_COLOR(0x9A, 0xCD, 0x32)
00424 } NamedColor;
00425
00426
00427
00428 public:
00429 HColor(void) : m_color(cBlack)
00430 { }
00431 HColor(const COLOR & color) : m_color(color)
00432 { }
00433 HColor(int32 nR, int32 nG, int32 nB)
00434 { SetRGB(nR, nG, nB); }
00435 virtual
00436 ~HColor(void)
00437 { }
00438
00439
00440
00441 protected:
00451 static uint8
00452 boundRGB(int32 nVal)
00453 { return max(min(nVal, UINT8_MAX), 0); }
00462 static uint8
00463 toRGB(float rm1, float rm2, float rh)
00464 {
00465 while (rh > 360.0f)
00466 rh -= 360.0f;
00467
00468 while (rh < 0.0f)
00469 rh += 360.0f;
00470
00471 if (rh < 60.0f)
00472 rm1 = rm1 + (rm2 - rm1) * rh / 60.0f;
00473 else if (rh < 180.0f)
00474 rm1 = rm2;
00475 else if (rh < 240.0f)
00476 rm1 = rm1 + (rm2 - rm1) * (240.0f - rh) / 60.0f;
00477
00478 return boundRGB( int32(rm1 * UINT8_MAX) );
00479 }
00480 public:
00488 static COLOR
00489 Tint(COLOR color, float fAmount)
00490 {
00491 if (fAmount)
00492 {
00493 int32 nR, nG, nB;
00494
00495 #define LIGHTEN(x) (uint8(255.0f - (255.0f - x) * fAmount))
00496 #define DARKEN(x) (uint8(x * (2 - fAmount)))
00497
00498 if (fAmount < 1.0f)
00499 {
00500 nR = LIGHTEN( COLOR_RED(color) );
00501 nG = LIGHTEN( COLOR_GREEN(color) );
00502 nB = LIGHTEN( COLOR_BLUE(color) );
00503 }
00504 else
00505 {
00506 nR = DARKEN( COLOR_RED(color) );
00507 nG = DARKEN( COLOR_GREEN(color) );
00508 nB = DARKEN( COLOR_BLUE(color) );
00509 }
00510
00511 #undef LIGHTEN
00512 #undef DARKEN
00513
00514 color = MAKE_COLOR( boundRGB(nR),
00515 boundRGB(nG),
00516 boundRGB(nB));
00517 }
00518 else
00519 {
00520 DEBUG_LOG("HColor::Brighten() => zero adjustment\n");
00521 }
00522
00523 return color;
00524 }
00540 static void
00541 ConvertToHLS(const COLOR & color, float & fHue, float & fLum, float & fSat) throw()
00542 {
00543 const int32 nR = COLOR_RED(color),
00544 nG = COLOR_GREEN(color),
00545 nB = COLOR_BLUE(color),
00546 nMax = max(nR, max(nG, nB)),
00547 nMin = min(nR, min(nG, nB));
00548 const float fDiff = float(nMax) - float(nMin),
00549 fSum = float(nMax) + float(nMin);
00550
00551 fLum = fSum / 510.0f;
00552
00553 if (fDiff != 0.0)
00554 {
00555 const float fNormR = (nMax - nR) / fDiff,
00556 fNormG = (nMax - nG) / fDiff,
00557 fNormB = (nMax - nB) / fDiff;
00558
00559 if (fLum <= 0.5f)
00560 {
00561 if (fSum == 0.0)
00562 HError::Throw(ERR_DIV_ZERO, __FILE__,__LINE__);
00563
00564 fSat = fDiff / fSum;
00565 }
00566 else
00567 fSat = fDiff / (510.0f - fSum);
00568
00569 if (nR == nMax)
00570 fHue = 60.0f * (6.0f + fNormB - fNormG);
00571 if (nG == nMax)
00572 fHue = 60.0f * (2.0f + fNormR - fNormB);
00573 if (nB == nMax)
00574 fHue = 60.0f * (4.0f + fNormG - fNormR);
00575
00576 while (fHue > 360.0f)
00577 fHue -= 360.0f;
00578 }
00579 else
00580 fHue = fSat = 0.0f;
00581 }
00597 static COLOR
00598 ConvertToRGB(float fHue, float fLum, float fSat)
00599 {
00600 int32 nR, nG, nB;
00601
00602 if (fSat)
00603 {
00604 float rm1, rm2;
00605
00606 if (fLum <= 0.5f)
00607 rm2 = fLum + fLum * fSat;
00608 else
00609 rm2 = fLum + fSat - fLum * fSat;
00610
00611 rm1 = 2.0f * fLum - rm2;
00612 nR = toRGB(rm1, rm2, fHue + 120.0f);
00613 nG = toRGB(rm1, rm2, fHue);
00614 nB = toRGB(rm1, rm2, fHue - 120.0f);
00615 }
00616 else
00617 nR = nG = nB = boundRGB( int32(fLum * UINT8_MAX) );
00618
00619 return MAKE_COLOR(nR, nG, nB);
00620 }
00626 virtual StringPtr
00627 ToString(void) const
00628 {
00629 HString strTmp;
00630
00631 (void) strTmp.Format("R: %d G: %d B: %d",
00632 COLOR_RED(m_color),
00633 COLOR_GREEN(m_color),
00634 COLOR_BLUE(m_color));
00635 return strTmp.GetString();
00636 }
00637
00638
00639
00642 COLOR Get(void) const
00643 { return m_color; }
00653 void GetHLS(float & fHue, float & fLum, float & fSat) const
00654 { ConvertToHLS(m_color, fHue, fLum, fSat); }
00664 static COLOR GetNamedColor(HColor::NamedColor namedColor)
00665 { return COLOR(namedColor); }
00668 inline uint8 GetRed(void) const
00669 { return COLOR_RED(m_color); }
00672 inline uint8 GetGreen(void) const
00673 { return COLOR_GREEN(m_color); }
00676 inline uint8 GetBlue(void) const
00677 { return COLOR_BLUE(m_color); }
00680 inline void Set(COLOR clr)
00681 { m_color = clr; }
00684 inline void SetRed(int32 nR)
00685 { SetRGB( nR, GetGreen(), GetBlue()); }
00688 inline void SetGreen(int32 nG)
00689 { SetRGB(GetRed(), nG, GetBlue()); }
00692 inline void SetBlue(int32 nB)
00693 { SetRGB(GetRed(), GetGreen(), nB); }
00703 inline void SetHLS(float fHue, float fLum, float fSat)
00704 { m_color = ConvertToRGB(fHue, fLum, fSat); }
00716 inline void SetRGB(int32 nR, int32 nG, int32 nB)
00717 { m_color = MAKE_COLOR(boundRGB(nR), boundRGB(nG), boundRGB(nB)); }
00718
00719
00720
00721 operator COLOR () const
00722 { return m_color; }
00723
00724 HColor & operator = (const COLOR & color)
00725 { m_color = color; return *this; }
00726
00727 bool operator == (const COLOR & color)
00728 {
00729 return (GetRed() == COLOR_RED(color) &&
00730 GetGreen() == COLOR_GREEN(color) &&
00731 GetBlue() == COLOR_BLUE(color));
00732 }
00733
00734 bool operator == (const HColor & rhs)
00735 {
00736 return (GetRed() == rhs.GetRed() &&
00737 GetGreen() == rhs.GetGreen() &&
00738 GetBlue() == rhs.GetBlue());
00739 }
00740
00741 bool operator != (const COLOR & color)
00742 {
00743 return (GetRed() != COLOR_RED(color) ||
00744 GetGreen() != COLOR_GREEN(color) ||
00745 GetBlue() != COLOR_BLUE(color));
00746 }
00747
00748 bool operator != (const HColor & rhs)
00749 {
00750 return (GetRed() != rhs.GetRed() ||
00751 GetGreen() != rhs.GetGreen() ||
00752 GetBlue() != rhs.GetBlue());
00753 }
00754 };
00766 class HColorable : HObj
00767 {
00768 typedef HObj base_class;
00769 static StringPtr ClassName(void) { return "HColorable"; }
00770
00771
00772
00773 protected:
00774 HColor m_clrBG;
00775 HColor m_clrFG;
00776
00777
00778
00779 public:
00780 HColorable(COLOR clrBG = Humble::kClrWindowFrame, COLOR clrFG = cBlack)
00781 { SetColors(clrBG, clrFG); }
00782
00783 virtual
00784 ~HColorable(void)
00785 { }
00786
00787
00788
00791 inline COLOR GetBackColor(void) const
00792 { return COLOR(m_clrBG); }
00795 inline COLOR GetForeColor(void) const
00796 { return COLOR(m_clrFG); }
00800 COLOR SetBackColor(COLOR clrBG)
00801 {
00802 COLOR clrOld = COLOR(m_clrBG);
00803
00804 m_clrBG.Set(clrBG);
00805 return clrOld;
00806 }
00810 COLOR SetForeColor(COLOR clrFG)
00811 {
00812 COLOR clrOld = COLOR(m_clrFG);
00813 m_clrFG.Set(clrFG);
00814 return clrOld;
00815 }
00819 void SetColors(COLOR clrBG, COLOR clrFG)
00820 { m_clrBG = clrBG; m_clrFG = clrFG; }
00821 };
00822
00823 #endif // HCOLOR_H
00824
00825
00826
00827
00828
00829
00830
00831
00832
00833
00834
00835
00836
00837
00838
00839
00840
00841
00842
00843
00844
00845
00846
00847
00848
00849
00850
00851
00852
00853
00854
00855
00856
00857
00858
00859
00860