summaryrefslogtreecommitdiff
path: root/lib/mcolor.cc
diff options
context:
space:
mode:
Diffstat (limited to 'lib/mcolor.cc')
-rw-r--r--lib/mcolor.cc37
1 files changed, 36 insertions, 1 deletions
diff --git a/lib/mcolor.cc b/lib/mcolor.cc
index 618ae4f..a8c6d16 100644
--- a/lib/mcolor.cc
+++ b/lib/mcolor.cc
@@ -17,7 +17,7 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
-/* $Id: mcolor.cc,v 1.9 2006-01-31 17:02:39 pixel Exp $ */
+/* $Id: mcolor.cc,v 1.10 2006-10-28 16:50:46 pixel Exp $ */
#include <SDL.h>
#include <SDL_opengl.h>
@@ -71,6 +71,41 @@ void mogltk::ColorP::fromHSV(double H, double S, double V) {
c.R = R * 255; c.G = G * 255; c.B = B * 255;
}
+void mogltk::ColorP::toHSV(double * H, double * S, double * V) {
+ double R, G, B, cMAX, cMIN;
+
+ R = ((double) c.R) / 255;
+ G = ((double) c.G) / 255;
+ B = ((double) c.B) / 255;
+
+ cMAX = MAX(MAX(R, G), B);
+ cMIN = MIN(MIN(R, G), B);
+
+ if (cMAX == cMIN) {
+ *H = 0;
+ *S = 0;
+ *V = cMAX;
+ return;
+ }
+
+ if ((cMAX == R) && (G >= B)) {
+ *H = 60 * ((G - B) / (cMAX - cMIN));
+ } else if ((cMAX == R) && (G < B)) {
+ *H = 60 * ((G - B) / (cMAX - cMIN)) + 360;
+ } else if (cMAX == G) {
+ *H = 60 * ((B - R) / (cMAX - cMIN)) + 120;
+ } else {
+ *H = 60 * ((R - G) / (cMAX - cMIN)) + 240;
+ }
+
+ if (cMAX == 0) {
+ *S = 0;
+ } else {
+ *S = (cMAX - cMIN) / cMAX;
+ }
+ *V = cMAX;
+}
+
void mogltk::ColorP::Norm() {
c.R = MIN(MAX(c.R, Min.R), Max.R);
c.G = MIN(MAX(c.R, Min.G), Max.G);