/* * mogltk * Copyright (C) 1999-2004 Nicolas "Pixel" Noble * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /* $Id: mcolor.cc,v 1.10 2006-10-28 16:50:46 pixel Exp $ */ #include #include #include "engine.h" #include "mcolor.h" Color mogltk::ColorP::Min(0, 0, 0, 0), mogltk::ColorP::Max = WHITE; mogltk::ColorP::ColorP(const Color & ac) : c(ac) { } mogltk::ColorP::ColorP(Uint8 ar, Uint8 ag, Uint8 ab, Uint8 aa) : c(ar, ag, ab, aa) { } void mogltk::ColorP::Bind() { glColor4d((double) MIN(MAX(c.R, Min.R), Max.R) / 255, (double) MIN(MAX(c.G, Min.G), Max.G) / 255, (double) MIN(MAX(c.B, Min.B), Max.B) / 255, (double) MIN(MAX(c.A, Min.A), Max.A) / 255); } Uint32 mogltk::ColorP::toSDL(SDL_PixelFormat * f) { if (!f) f = mogltk::engine::base_o->getsurface()->format; return SDL_MapRGBA(f, MIN(MAX(c.R, Min.R), Max.R), MIN(MAX(c.G, Min.G), Max.G), MIN(MAX(c.B, Min.B), Max.B), MIN(MAX(c.A, Min.A), Max.A)); } void mogltk::ColorP::fromSDL(Uint32 p, SDL_PixelFormat * f) { if (!f) f = mogltk::engine::base_o->getsurface()->format; SDL_GetRGBA(p, f, &c.R, &c.G, &c.B, &c.A); } void mogltk::ColorP::fromHSV(double H, double S, double V) { H = H / 60.0; int Hi = ((int) H) % 6; double f = H - Hi; double p = V * (1 - S); double q = V * (1 - f * S); double t = V * (1 - (1 - f) * S); double R, G, B; switch (Hi) { case 0: R = V; G = t; B = p; break; case 1: R = q; G = V; B = p; break; case 2: R = p; G = V; B = t; break; case 3: R = p; G = q; B = V; break; case 4: R = t; G = p; B = V; break; case 5: R = V; G = p; B = q; break; } 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); c.B = MIN(MAX(c.R, Min.B), Max.B); c.A = MIN(MAX(c.R, Min.A), Max.A); } bool mogltk::ColorP::operator==(const ColorP & nc) { return c == nc.c; } Color * mogltk::ColorP::operator->() { return &c; }