diff options
Diffstat (limited to 'kpovmodeler/pmcolor.cpp')
-rw-r--r-- | kpovmodeler/pmcolor.cpp | 196 |
1 files changed, 196 insertions, 0 deletions
diff --git a/kpovmodeler/pmcolor.cpp b/kpovmodeler/pmcolor.cpp new file mode 100644 index 00000000..0eb38b79 --- /dev/null +++ b/kpovmodeler/pmcolor.cpp @@ -0,0 +1,196 @@ +/* +************************************************************************** + description + -------------------- + copyright : (C) 2000-2001 by Andreas Zehender + email : [email protected] +************************************************************************** + +************************************************************************** +* * +* 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. * +* * +**************************************************************************/ + + +#include "pmcolor.h" +#include "pmvector.h" +#include "pmmath.h" + +#include "pmdebug.h" + +#include <qtextstream.h> +#include <qstring.h> + +PMColor::PMColor( ) +{ + int i; + for( i = 0; i < 5; i++ ) + m_colorValue[i] = 0; +} + +PMColor::PMColor( const double red, const double green, const double blue, + const double filter, const double transmit ) +{ + m_colorValue[0] = red; + m_colorValue[1] = green; + m_colorValue[2] = blue; + m_colorValue[3] = filter; + m_colorValue[4] = transmit; +} + +PMColor::PMColor( const double red, const double green, const double blue ) +{ + m_colorValue[0] = red; + m_colorValue[1] = green; + m_colorValue[2] = blue; + m_colorValue[3] = 0; + m_colorValue[4] = 0; +} + +PMColor::PMColor( const PMVector& v ) +{ + int i; + if( v.size( ) != 5 ) + { + kdError( PMArea ) << "Vector has wrong size in PMColor::PMColor( const PMVector& v )\n"; + for( i = 0; i < 5; i++ ) + m_colorValue[i] = 0; + } + else + { + for( i = 0; i < 5; i++ ) + m_colorValue[i] = v[i]; + } +} + +PMColor::PMColor( const QColor& c ) +{ + m_colorValue[0] = c.red( ) / 255.0; + m_colorValue[1] = c.green( ) / 255.0; + m_colorValue[2] = c.blue( ) / 255.0; + m_colorValue[3] = 0.0; + m_colorValue[4] = 0.0; +} + +QColor PMColor::toQColor( ) const +{ + double r, g, b, max = 0; + r = red( ); + g = green( ); + b = blue( ); + + if( r < 0 ) r = 0; + if( g < 0 ) g = 0; + if( b < 0 ) b = 0; + + if( r > max ) + max = r; + if( g > max ) + max = g; + if( b > max ) + max = b; + if( max > 1 ) + { + r /= max; + g /= max; + b /= max; + } + return QColor( ( int ) ( r * 255 + 0.5 ), ( int ) ( g * 255 + 0.5 ), + ( int ) ( b * 255 + 0.5 ) ); +} + +QString PMColor::serialize( bool addColorKeyword ) const +{ + QString result; + QTextStream str( &result, IO_WriteOnly ); + + if( addColorKeyword ) + str << "color "; + + if( approxZero( m_colorValue[4] ) ) + { + if( approxZero( m_colorValue[3] ) ) + { + // rgb + str << "rgb <" << m_colorValue[0] << ", " << m_colorValue[1] << ", " + << m_colorValue[2] << '>'; + } + else + { + // rgbf + str << "rgbf <" << m_colorValue[0] << ", " << m_colorValue[1] << ", " + << m_colorValue[2] << ", " << m_colorValue[3] << '>'; + } + } + else + { + if( approxZero( m_colorValue[3] ) ) + { + // rgbt + str << "rgbt <" << m_colorValue[0] << ", " << m_colorValue[1] << ", " + << m_colorValue[2] << ", " << m_colorValue[4] << '>'; + } + else + { + // rgbft + str << "rgbft <" << m_colorValue[0] << ", " << m_colorValue[1] << ", " + << m_colorValue[2] << ", " << m_colorValue[3] + << ", " << m_colorValue[4] << '>'; + } + } + + return result; +} + +QString PMColor::serializeXML( ) const +{ + QString result; + QTextStream str( &result, IO_WriteOnly ); + int i; + + for( i = 0; i < 5; i++ ) + { + if( i != 0 ) + str << ' '; + str << m_colorValue[i]; + } + + return result; +} + +bool PMColor::operator!= ( const PMColor& c ) const +{ + return !( *this == c ); +} + +bool PMColor::operator== ( const PMColor& c ) const +{ + unsigned int i; + + for( i = 0; i < 5; i++ ) + if( c.m_colorValue[i] != m_colorValue[i] ) + return false; + return true; +} + +bool PMColor::loadXML( const QString& str ) +{ + QString tmp( str ); + QTextStream s( &tmp, IO_ReadOnly ); + QString val; + bool ok; + int i; + + for( i = 0; i < 5; i++ ) + { + s >> val; + m_colorValue[i] = val.toDouble( &ok ); + if( !ok ) + return false; + } + return true; +} |