/*************************************************************************** stylecolour.cpp - description ------------------- begin : Die Nov 5 2002 copyright : (C) 2002 by Andre Simon email : andre.simon1@gmx.de ***************************************************************************/ /* This file is part of Highlight. Highlight 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 3 of the License, or (at your option) any later version. Highlight 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 Highlight. If not, see . */ #include "stylecolour.h" #include "stringtools.h" #include #include #include using std::string; namespace highlight { Colour::Colour ( const string & red, const string & green, const string & blue ) { ostringstream rgbStream; rgbStream << red << " " << green << " " << blue; setRGB ( rgbStream.str() ); } Colour::Colour() { rgb.iRed = rgb.iGreen = rgb.iBlue = 0; } Colour::Colour ( const string & colourString ) { setRGB ( colourString ); } void Colour::setRGB ( const string & colourString ) { if ( colourString.empty() ) return; istringstream valueStream ( colourString.c_str() ); string r, g, b; char c='\0'; valueStream >> c; if ( c=='#' ) { string htmlNotation; valueStream >> htmlNotation; if ( htmlNotation.size() < 6 ) return; r = htmlNotation.substr ( 0, 2 ); g = htmlNotation.substr ( 2, 2 ); b = htmlNotation.substr ( 4, 2 ); } else { valueStream.putback ( c ); valueStream >> r; valueStream >> g; valueStream >> b; } StringTools::str2num ( rgb.iRed, r, std::hex ); StringTools::str2num ( rgb.iGreen, g, std::hex ); StringTools::str2num ( rgb.iBlue, b, std::hex ); } void Colour::setRed ( const string & red ) { StringTools::str2num ( rgb.iRed, red, std::hex ); } void Colour::setGreen ( const string & green ) { StringTools::str2num ( rgb.iGreen, green, std::hex ); } void Colour::setBlue ( const string & blue ) { StringTools::str2num ( rgb.iBlue, blue, std::hex ); } string Colour::getRed ( OutputType type ) const { switch ( type ) { case RTF: return int2str ( rgb.iRed, std::dec ); case LATEX: return float2str ( ( float ) rgb.iRed / 255 ); case TEX: return float2str ( 1 - ( float ) rgb.iRed / 255 ); default: return int2str ( rgb.iRed, std::hex ); } } string Colour::getGreen ( OutputType type ) const { switch ( type ) { case RTF: return int2str ( rgb.iGreen, std::dec ); case LATEX: return float2str ( ( float ) rgb.iGreen / 255 ); case TEX: return float2str ( 1 - ( float ) rgb.iGreen / 255 ); default: return int2str ( rgb.iGreen, std::hex ); } } string Colour::getBlue ( OutputType type ) const { switch ( type ) { case RTF: return int2str ( rgb.iBlue, std::dec ); case LATEX: return float2str ( ( float ) rgb.iBlue / 255 ); case TEX: return float2str ( 1 - ( float ) rgb.iBlue / 255 ); default: return int2str ( rgb.iBlue, std::hex ); } } string Colour::int2str ( const int num, std::ios_base& ( *f ) ( std::ios_base& ) ) const { std::ostringstream outStream; outStream.width ( 2 ); outStream.fill ( '0' ); outStream << f << num; return outStream.str(); } string Colour::float2str ( const double num ) const { std::ostringstream outStream; outStream << ( floor ( num * 100 + .5 ) / 100 ); return outStream.str(); } }