HSV Color::ToHSV() { RGB color = ToRGB(); float r = (float)(color.r) / 255; float g = (float)(color.g) / 255; float b = (float)(color.b) / 255; float M = fmax(r, fmax(g, b)); float m = fmin(r, fmin(g, b)); float C = M - m; float hPrime; HSV tmp; tmp.v = M; if (M == 0) { tmp.s = 0; tmp.h = -1; return tmp; } else { tmp.s = C / M; } if (C == 0) { // Undefined, but we set to 0 hPrime = 0; } else if (M == r) { hPrime = (g - b) / C; } else if (M == g) { hPrime = (b - r) / C + 2; } else if (M == b) { hPrime = (r - g) / C + 4; } tmp.h = fmod(hPrime * 60 + 360, 360); return tmp; }
void CColor::SetBlue(int blue) { ASSERT(0 <= blue && blue <= 255); ToRGB(); m_color[c_blue] = static_cast<unsigned char>(blue); m_bIsHLS = false; }
void CColor::SetGreen(int green) { ASSERT(0 <= green && green <= 255); ToRGB(); m_color[c_green] = static_cast<unsigned char>(green); m_bIsHLS = false; }
void CColor::SetRed(int red) { ASSERT(0 <= red && red <= 255); ToRGB(); m_color[c_red] = static_cast<unsigned char>(red); m_bIsHLS = false; }
static void CombineChannels( GenericImage<P>& img, int colorSpace, const String& baseId, const Rect& r, const GenericImage<P0>* src0, const GenericImage<P1>* src1, const GenericImage<P2>* src2 ) { bool allChannels = src0 != 0 && src1 != 0 && src2 != 0; typename P::sample* R = img.PixelData( 0 ); typename P::sample* G = img.PixelData( 1 ); typename P::sample* B = img.PixelData( 2 ); const RGBColorSystem& rgbws = img.RGBWorkingSpace(); for ( int y = r.y0; y < r.y1; ++y ) { const typename P0::sample* data0 = (src0 != 0) ? src0->PixelAddress( r.x0, y ) : 0; const typename P1::sample* data1 = (src1 != 0) ? src1->PixelAddress( r.x0, y ) : 0; const typename P2::sample* data2 = (src2 != 0) ? src2->PixelAddress( r.x0, y ) : 0; for ( int x = r.x0; x < r.x1; ++x, ++img.Status() ) { if ( colorSpace == ColorSpaceId::RGB ) { if ( data0 != 0 ) P0::FromSample( *R++, *data0++ ); if ( data1 != 0 ) P1::FromSample( *G++, *data1++ ); if ( data2 != 0 ) P2::FromSample( *B++, *data2++ ); } else { RGBColorSystem::sample ch0, ch1, ch2; RGBColorSystem::sample r, g, b; if ( !allChannels ) { P::FromSample( r, *R ); P::FromSample( g, *G ); P::FromSample( b, *B ); FromRGB( colorSpace, rgbws, ch0, ch1, ch2, r, g, b ); } if ( data0 != 0 ) P0::FromSample( ch0, *data0++ ); if ( data1 != 0 ) P1::FromSample( ch1, *data1++ ); if ( data2 != 0 ) P2::FromSample( ch2, *data2++ ); ToRGB( colorSpace, rgbws, r, g, b, ch0, ch1, ch2 ); *R++ = P::ToSample( r ); *G++ = P::ToSample( g ); *B++ = P::ToSample( b ); } } } }
RGBSpectrum SampledSpectrum::ToRGBSpectrum() const { float rgb[3]; ToRGB(rgb); return RGBSpectrum::FromRGB(rgb); }