XTColorRef.cpp
上传用户:szled88
上传日期:2015-04-09
资源大小:43957k
文件大小:7k
源码类别:

对话框与窗口

开发平台:

Visual C++

  1. // XTColorRef.cpp: implementation of the CXTColorRef class.
  2. //
  3. // This file is a part of the XTREME CONTROLS MFC class library.
  4. // (c)1998-2008 Codejock Software, All Rights Reserved.
  5. //
  6. // THIS SOURCE FILE IS THE PROPERTY OF CODEJOCK SOFTWARE AND IS NOT TO BE
  7. // RE-DISTRIBUTED BY ANY MEANS WHATSOEVER WITHOUT THE EXPRESSED WRITTEN
  8. // CONSENT OF CODEJOCK SOFTWARE.
  9. //
  10. // THIS SOURCE CODE CAN ONLY BE USED UNDER THE TERMS AND CONDITIONS OUTLINED
  11. // IN THE XTREME TOOLKIT PRO LICENSE AGREEMENT. CODEJOCK SOFTWARE GRANTS TO
  12. // YOU (ONE SOFTWARE DEVELOPER) THE LIMITED RIGHT TO USE THIS SOFTWARE ON A
  13. // SINGLE COMPUTER.
  14. //
  15. // CONTACT INFORMATION:
  16. // support@codejock.com
  17. // http://www.codejock.com
  18. //
  19. /////////////////////////////////////////////////////////////////////////////
  20. #include "stdafx.h"
  21. #include <math.h>
  22. #include "Common/XTPColorManager.h"
  23. #include "Common/XTPDrawHelpers.h"
  24. #include "XTDefines.h"
  25. #include "XTColorRef.h"
  26. #ifdef _DEBUG
  27. #define new DEBUG_NEW
  28. #undef THIS_FILE
  29. static char THIS_FILE[] = __FILE__;
  30. #endif
  31. const CXTColorRef CXTColorRef::BLACK  (0, 0, 0);
  32. const CXTColorRef CXTColorRef::WHITE  (255, 255, 255);
  33. const CXTColorRef CXTColorRef::GRAY_25(64, 64, 64);
  34. const CXTColorRef CXTColorRef::GRAY_50(128, 128, 128);
  35. const CXTColorRef CXTColorRef::GRAY_75(192, 192, 192);
  36. //////////////////////////////////////////////////////////////////////
  37. // Construction/Destruction
  38. //////////////////////////////////////////////////////////////////////
  39. void CXTColorRef::toHSL(double& h, double& s, double& l) const
  40. {
  41. CXTPDrawHelpers::RGBtoHSL(m_ColorRef, h, s, l);
  42. }
  43. void CXTColorRef::toHSB(double& h, double& s, double& b) const
  44. {
  45. int red = getRValue();
  46. int green = getGValue();
  47. int blue = getBValue();
  48. int cmax = __max(red, __max(green, blue));
  49. int cmin = __min(red, __min(green, blue));
  50. b = ((double) cmax) / 255.0;
  51. if (cmax != 0)
  52. s = ((double) (cmax - cmin)) / ((double) cmax);
  53. else
  54. s = 0;
  55. if (s == 0)
  56. h = 0;
  57. else
  58. {
  59. double redc = ((double) (cmax - red))   / ((double) (cmax - cmin));
  60. double greenc = ((double) (cmax - green)) / ((double) (cmax - cmin));
  61. double bluec = ((double) (cmax - blue))  / ((double) (cmax - cmin));
  62. if (red == cmax)
  63. h = bluec - greenc;
  64. else if (green == cmax)
  65. h = 2.0 + redc - bluec;
  66. else
  67. h = 4.0 + greenc - redc;
  68. h /= 6.0;
  69. if (h < 0)
  70. h = h + 1.0;
  71. }
  72. }
  73. void CXTColorRef::setHSL(double h, double s, double l)
  74. {
  75. *this = CXTPDrawHelpers::HSLtoRGB(h, s, l);
  76. }
  77. void CXTColorRef::setHSB(double hue, double saturation, double brightness)
  78. {
  79. int r = 0, g = 0, b = 0;
  80. if (saturation == 0)
  81. {
  82. r = g = b = (int) (brightness * 255.0 + 0.5);
  83. }
  84. else
  85. {
  86. double h = (hue - floor(hue)) * 6.0;
  87. double f = h - floor(h);
  88. double p = brightness * (1.0 - saturation);
  89. double q = brightness * (1.0 - saturation * f);
  90. double t = brightness * (1.0 - (saturation * (1.0 - f)));
  91. switch ((int) h)
  92. {
  93. case 0:
  94. r = (int) (brightness * 255.0 + 0.5);
  95. g = (int) (t * 255.0 + 0.5);
  96. b = (int) (p * 255.0 + 0.5);
  97. break;
  98. case 1:
  99. r = (int) (q * 255.0 + 0.5);
  100. g = (int) (brightness * 255.0 + 0.5);
  101. b = (int) (p * 255.0 + 0.5);
  102. break;
  103. case 2:
  104. r = (int) (p * 255.0 + 0.5);
  105. g = (int) (brightness * 255.0 + 0.5);
  106. b = (int) (t * 255.0 + 0.5);
  107. break;
  108. case 3:
  109. r = (int) (p * 255.0 + 0.5);
  110. g = (int) (q * 255.0 + 0.5);
  111. b = (int) (brightness * 255.0 + 0.5);
  112. break;
  113. case 4:
  114. r = (int) (t * 255.0 + 0.5);
  115. g = (int) (p * 255.0 + 0.5);
  116. b = (int) (brightness * 255.0 + 0.5);
  117. break;
  118. case 5:
  119. r = (int) (brightness * 255.0 + 0.5);
  120. g = (int) (p * 255.0 + 0.5);
  121. b = (int) (q * 255.0 + 0.5);
  122. break;
  123. }
  124. }
  125. *this = RGB(r, g, b);
  126. }
  127. CXTColorRef CXTColorRef::fromHSB(double h, double s, double b)
  128. {
  129. CXTColorRef cr;
  130. cr.setHSB(h, s, b);
  131. return cr;
  132. }
  133. CXTColorRef CXTColorRef::fromHSL(double h, double s, double l)
  134. {
  135. CXTColorRef cr;
  136. cr.setHSL(h, s, l);
  137. return cr;
  138. }
  139. CXTColorRef& CXTColorRef::blend(const CXTColorRef& clr, int opacity)
  140. {
  141. *this = RGB(BlendColor(clr.getRValue(), getRValue(), opacity),
  142. BlendColor(clr.getGValue(), getGValue(), opacity),
  143. BlendColor(clr.getBValue(), getBValue(), opacity));
  144. return *this;
  145. }
  146. CXTColorRef& CXTColorRef::add(const CXTColorRef& clr)
  147. {
  148. *this = RGB(addColorValue(clr.getRValue(), getRValue()),
  149. addColorValue(clr.getGValue(), getGValue()),
  150. addColorValue(clr.getBValue(), getBValue()));
  151. return *this;
  152. }
  153. CXTColorRef& CXTColorRef::subtract(const CXTColorRef& clr)
  154. {
  155. *this = RGB(addColorValue(-clr.getRValue(), getRValue()),
  156. addColorValue(-clr.getGValue(), getGValue()),
  157. addColorValue(-clr.getBValue(), getBValue()));
  158. return *this;
  159. }
  160. COLORREF CXTColorRef::SafeRGB(int r, int g, int b)
  161. {
  162. return RGB(fixColorValue(r), fixColorValue(g), fixColorValue(b));
  163. }
  164. CXTColorRef CXTColorRef::operator+(int val) const
  165. {
  166. val = fixColorValue(val);
  167. return operator+(RGB(val, val, val));
  168. }
  169. CXTColorRef CXTColorRef::operator-(int val) const
  170. {
  171. val = fixColorValue(val);
  172. return operator-(RGB(val, val, val));
  173. }
  174. CXTColorRef CXTColorRef::operator*(int val) const
  175. {
  176. val = fixColorValue(val);
  177. return operator*(RGB(val, val, val));
  178. }
  179. CXTColorRef CXTColorRef::operator/(int val) const
  180. {
  181. val = fixColorValue(val);
  182. return operator/(RGB(val, val, val));
  183. }
  184. CXTColorRef CXTColorRef::operator+(COLORREF cr) const
  185. {
  186. CXTColorRef temp(*this);
  187. return (temp += cr);
  188. }
  189. CXTColorRef CXTColorRef::operator-(COLORREF cr) const
  190. {
  191. CXTColorRef temp(*this);
  192. return (temp -= cr);
  193. }
  194. CXTColorRef CXTColorRef::operator*(COLORREF cr) const
  195. {
  196. CXTColorRef temp(*this);
  197. return (temp *= cr);
  198. }
  199. CXTColorRef CXTColorRef::operator/(COLORREF cr) const
  200. {
  201. CXTColorRef temp(*this);
  202. return (temp -= cr);
  203. }
  204. CXTColorRef& CXTColorRef::operator+=(int val)
  205. {
  206. val = fixColorValue(val);
  207. return operator+=(RGB(val, val, val));
  208. }
  209. CXTColorRef& CXTColorRef::operator-=(int val)
  210. {
  211. val = fixColorValue(val);
  212. return operator-=(RGB(val, val, val));
  213. }
  214. CXTColorRef& CXTColorRef::operator*=(int val)
  215. {
  216. val = fixColorValue(val);
  217. return operator*=(RGB(val, val, val));
  218. }
  219. CXTColorRef& CXTColorRef::operator/=(int val)
  220. {
  221. val = fixColorValue(val);
  222. return operator/=(RGB(val, val, val));
  223. }
  224. CXTColorRef& CXTColorRef::operator+=(COLORREF cr)
  225. {
  226. m_ColorRef = SafeRGB(
  227. getRValue() + GetRValue(cr),
  228. getGValue() + GetGValue(cr),
  229. getBValue() + GetBValue(cr));
  230. return *this;
  231. }
  232. CXTColorRef& CXTColorRef::operator-=(COLORREF cr)
  233. {
  234. m_ColorRef = SafeRGB(
  235. getRValue() - GetRValue(cr),
  236. getGValue() - GetGValue(cr),
  237. getBValue() - GetBValue(cr));
  238. return *this;
  239. }
  240. CXTColorRef& CXTColorRef::operator*=(COLORREF cr)
  241. {
  242. m_ColorRef = SafeRGB(
  243. getRValue() * GetRValue(cr),
  244. getGValue() * GetGValue(cr),
  245. getBValue() * GetBValue(cr));
  246. return *this;
  247. }
  248. CXTColorRef& CXTColorRef::operator/=(COLORREF cr)
  249. {
  250. m_ColorRef = SafeRGB(
  251. getRValue() / GetRValue(cr),
  252. getGValue() / GetGValue(cr),
  253. getBValue() / GetBValue(cr));
  254. return *this;
  255. }
  256. ////  XP Colors Routings
  257. COLORREF CXTColorRef::GetColor(int nIndex)
  258. {
  259. return XTPColorManager()->GetColor(nIndex);
  260. }
  261. void CXTColorRef::RefreshColors()
  262. {
  263. RefreshXtremeColors();
  264. }