summaryrefslogtreecommitdiffstats
path: root/kpovmodeler/pmimagemap.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kpovmodeler/pmimagemap.cpp')
-rw-r--r--kpovmodeler/pmimagemap.cpp522
1 files changed, 522 insertions, 0 deletions
diff --git a/kpovmodeler/pmimagemap.cpp b/kpovmodeler/pmimagemap.cpp
new file mode 100644
index 00000000..7fcaeb64
--- /dev/null
+++ b/kpovmodeler/pmimagemap.cpp
@@ -0,0 +1,522 @@
+/*
+**************************************************************************
+ description
+ --------------------
+ copyright : (C) 2002 by Luis Passos Carvalho
+ email : lpassos@mail.telepac.pt
+**************************************************************************
+
+**************************************************************************
+* *
+* 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 "pmimagemapedit.h"
+#include "pmimagemap.h"
+#include "pmpalettevalue.h"
+#include "pmpalettevaluememento.h"
+
+#include "pmxmlhelper.h"
+#include "pmcompositeobject.h"
+#include "pmmemento.h"
+#include "pmenumproperty.h"
+
+#include <klocale.h>
+
+const PMImageMap::PMBitmapType bitmapTypeDefault = PMImageMap::BitmapSys;
+const char *const bitmapFileDefault = 0;
+const bool enableFilterAllDefault = false;
+const bool enableTransmitAllDefault = false;
+const double filterAllDefault = 0.0;
+const double transmitAllDefault = 0.0;
+const bool onceDefault = false;
+const PMImageMap::PMMapType mapTypeDefault = PMImageMap::MapPlanar;
+const PMImageMap::PMInterpolateType interpolateTypeDefault = PMImageMap::InterpolateNone;
+
+PMDefinePropertyClass( PMImageMap, PMImageMapProperty );
+PMDefineEnumPropertyClass( PMImageMap, PMImageMap::PMBitmapType,
+ PMBitmapTypeProperty );
+PMDefineEnumPropertyClass( PMImageMap, PMImageMap::PMInterpolateType,
+ PMInterpolateTypeProperty );
+PMDefineEnumPropertyClass( PMImageMap, PMImageMap::PMMapType,
+ PMMapTypeProperty );
+
+PMMetaObject* PMImageMap::s_pMetaObject = 0;
+PMObject* createNewImageMap( PMPart* part )
+{
+ return new PMImageMap( part );
+}
+
+PMImageMap::PMImageMap( PMPart* part )
+ : Base( part )
+{
+ m_bitmapType = bitmapTypeDefault;
+ m_bitmapFile = bitmapFileDefault;
+ m_enableFilterAll = enableFilterAllDefault;
+ m_filterAll = filterAllDefault;
+ m_enableTransmitAll = enableTransmitAllDefault;
+ m_transmitAll = transmitAllDefault;
+ m_once = onceDefault;
+ m_mapType = mapTypeDefault;
+ m_interpolateType = interpolateTypeDefault;
+}
+
+PMImageMap::PMImageMap( const PMImageMap& m )
+ : Base( m )
+{
+ m_bitmapType = m.m_bitmapType;
+ m_bitmapFile = m.m_bitmapFile;
+ m_enableFilterAll = m.m_enableFilterAll;
+ m_filterAll = m.m_filterAll;
+ m_enableTransmitAll = m.m_enableTransmitAll;
+ m_transmitAll = m.m_transmitAll;
+ m_once = m.m_once;
+ m_mapType = m.m_mapType;
+ m_interpolateType = m.m_interpolateType;
+ m_filters = m.m_filters;
+ m_transmits = m.m_transmits;
+}
+
+PMImageMap::~PMImageMap( )
+{
+}
+
+void PMImageMap::serialize( QDomElement& e, QDomDocument& doc ) const
+{
+ switch( m_bitmapType )
+ {
+ case BitmapGif:
+ e.setAttribute( "bitmap_type", "gif" );
+ break;
+ case BitmapTga:
+ e.setAttribute( "bitmap_type", "tga" );
+ break;
+ case BitmapIff:
+ e.setAttribute( "bitmap_type", "iff" );
+ break;
+ case BitmapPpm:
+ e.setAttribute( "bitmap_type", "ppm" );
+ break;
+ case BitmapPgm:
+ e.setAttribute( "bitmap_type", "pgm" );
+ break;
+ case BitmapPng:
+ e.setAttribute( "bitmap_type", "png" );
+ break;
+ case BitmapJpeg:
+ e.setAttribute( "bitmap_type", "jpeg" );
+ break;
+ case BitmapTiff:
+ e.setAttribute( "bitmap_type", "tiff" );
+ break;
+ case BitmapSys:
+ e.setAttribute( "bitmap_type", "sys" );
+ break;
+ }
+ e.setAttribute( "file_name", m_bitmapFile );
+ e.setAttribute( "enable_filter_all", m_enableFilterAll );
+ e.setAttribute( "filter_all", m_filterAll );
+ e.setAttribute( "enable_transmit_all", m_enableTransmitAll );
+ e.setAttribute( "transmit_all", m_transmitAll );
+ e.setAttribute( "once", m_once );
+
+ QDomElement extra_data = doc.createElement( "extra_data" );
+
+ QDomElement data = doc.createElement( "indexed_filters" );
+ QDomElement p;
+
+ QValueList<PMPaletteValue>::ConstIterator it;
+ for( it = m_filters.begin( ); it != m_filters.end( ); ++it )
+ {
+ p = doc.createElement( "index_filter" );
+ ( *it ).serialize( p, doc );
+ data.appendChild( p );
+ }
+ extra_data.appendChild( data );
+
+ data = doc.createElement( "indexed_transmits" );
+ for( it = m_transmits.begin( ); it != m_transmits.end( ); ++it )
+ {
+ p = doc.createElement( "index_transmit" );
+ ( *it ).serialize( p, doc );
+ data.appendChild( p );
+ }
+ extra_data.appendChild( data );
+
+ e.appendChild( extra_data );
+
+ switch( m_mapType )
+ {
+ case MapPlanar:
+ e.setAttribute( "map_type", "planar" );
+ break;
+ case MapSpherical:
+ e.setAttribute( "map_type", "spherical" );
+ break;
+ case MapCylindrical:
+ e.setAttribute( "map_type", "cylindrical" );
+ break;
+ case MapToroidal:
+ e.setAttribute( "map_type", "toroidal" );
+ break;
+ }
+ switch( m_interpolateType )
+ {
+ case InterpolateNone:
+ e.setAttribute( "interpolate", "none" );
+ break;
+ case InterpolateBilinear:
+ e.setAttribute( "interpolate", "bilinear" );
+ break;
+ case InterpolateNormalized:
+ e.setAttribute( "interpolate", "normalized" );
+ break;
+ }
+ Base::serialize( e, doc );
+}
+
+void PMImageMap::readAttributes( const PMXMLHelper& h )
+{
+ QString str;
+
+ str = h.stringAttribute( "bitmap_type", "sys" );
+ if( str == "gif" )
+ m_bitmapType = BitmapGif;
+ else if( str == "tga" )
+ m_bitmapType = BitmapTga;
+ else if( str == "iff" )
+ m_bitmapType = BitmapIff;
+ else if( str == "ppm" )
+ m_bitmapType = BitmapPpm;
+ else if( str == "pgm" )
+ m_bitmapType = BitmapPgm;
+ else if( str == "png" )
+ m_bitmapType = BitmapPng;
+ else if( str == "jpeg" )
+ m_bitmapType = BitmapJpeg;
+ else if( str == "tiff" )
+ m_bitmapType = BitmapTiff;
+ else if( str == "sys" )
+ m_bitmapType = BitmapSys;
+
+ m_bitmapFile = h.stringAttribute( "file_name", bitmapFileDefault );
+ m_enableFilterAll = h.boolAttribute( "enable_filter_all", enableFilterAllDefault );
+ m_filterAll = h.doubleAttribute( "filter_all", filterAllDefault );
+ m_enableTransmitAll = h.boolAttribute( "enable_transmit_all", enableTransmitAllDefault );
+ m_transmitAll = h.doubleAttribute( "transmit_all", transmitAllDefault );
+ m_once = h.boolAttribute( "once", onceDefault );
+
+ QDomElement e = h.extraData( );
+ if( !e.isNull( ) )
+ {
+ QDomNode c = e.firstChild( );
+ while( !c.isNull( ) )
+ {
+ if( c.isElement( ) )
+ {
+ QDomElement ce = c.toElement( );
+ if( ce.tagName( ) == "indexed_filters" )
+ {
+ m_filters.clear( );
+ QDomNode cd = ce.firstChild( );
+ while( !cd.isNull( ) )
+ {
+ if( cd.isElement( ) )
+ {
+ PMPaletteValue pv;
+ pv.readAttributes( cd.toElement( ) );
+ m_filters.append( pv );
+ }
+ cd = cd.nextSibling( );
+ }
+ }
+ if( ce.tagName( ) == "indexed_transmits" )
+ {
+ m_transmits.clear( );
+ QDomNode cd = ce.firstChild( );
+ while( !cd.isNull( ) )
+ {
+ if( cd.isElement( ) )
+ {
+ PMPaletteValue pv;
+ pv.readAttributes( cd.toElement( ) );
+ m_transmits.append( pv );
+ }
+ cd = cd.nextSibling( );
+ }
+ }
+ }
+ c = c.nextSibling( );
+ }
+ }
+
+ str = h.stringAttribute( "map_type", "planar" );
+ if( str == "planar" )
+ m_mapType = MapPlanar;
+ else if( str == "spherical" )
+ m_mapType = MapSpherical;
+ else if( str == "cylindrical" )
+ m_mapType = MapCylindrical;
+ else if( str == "toroidal" )
+ m_mapType = MapToroidal;
+
+ str = h.stringAttribute( "interpolate", "none" );
+ if( str == "none" )
+ m_interpolateType = InterpolateNone;
+ else if( str == "bilinear" )
+ m_interpolateType = InterpolateBilinear;
+ else if( str == "normalized" )
+ m_interpolateType = InterpolateNormalized;
+ Base::readAttributes( h );
+}
+
+PMMetaObject* PMImageMap::metaObject( ) const
+{
+ if( !s_pMetaObject )
+ {
+ s_pMetaObject = new PMMetaObject( "ImageMap", Base::metaObject( ),
+ createNewImageMap );
+
+ PMBitmapTypeProperty* bp = new PMBitmapTypeProperty(
+ "bitmapType", &PMImageMap::setBitmapType, &PMImageMap::bitmapType );
+ bp->addEnumValue( "Gif", BitmapGif );
+ bp->addEnumValue( "Tga", BitmapTga );
+ bp->addEnumValue( "Iff", BitmapIff );
+ bp->addEnumValue( "Ppm", BitmapPpm );
+ bp->addEnumValue( "Pgm", BitmapPgm );
+ bp->addEnumValue( "Png", BitmapPng );
+ bp->addEnumValue( "Jpeg", BitmapJpeg );
+ bp->addEnumValue( "Tiff", BitmapTiff );
+ bp->addEnumValue( "Sys", BitmapSys );
+ s_pMetaObject->addProperty( bp );
+
+ PMInterpolateTypeProperty* ip = new PMInterpolateTypeProperty(
+ "interpolateType", &PMImageMap::setInterpolateType,
+ &PMImageMap::interpolateType );
+ ip->addEnumValue( "None", InterpolateNone );
+ ip->addEnumValue( "Bilinear", InterpolateBilinear );
+ ip->addEnumValue( "Normalized", InterpolateNormalized );
+ s_pMetaObject->addProperty( ip );
+
+ PMMapTypeProperty* mp = new PMMapTypeProperty(
+ "mapType", &PMImageMap::setMapType, &PMImageMap::mapType );
+ mp->addEnumValue( "Planar", MapPlanar );
+ mp->addEnumValue( "Spherical", MapSpherical );
+ mp->addEnumValue( "Cylindrical", MapCylindrical );
+ mp->addEnumValue( "Toroidal", MapToroidal );
+ s_pMetaObject->addProperty( mp );
+
+ s_pMetaObject->addProperty(
+ new PMImageMapProperty( "bitmapFile", &PMImageMap::setBitmapFileName,
+ &PMImageMap::bitmapFile ) );
+ s_pMetaObject->addProperty(
+ new PMImageMapProperty( "filterAllEnabled", &PMImageMap::enableFilterAll,
+ &PMImageMap::isFilterAllEnabled ) );
+ s_pMetaObject->addProperty(
+ new PMImageMapProperty( "filterAll", &PMImageMap::setFilterAll,
+ &PMImageMap::filterAll ) );
+ s_pMetaObject->addProperty(
+ new PMImageMapProperty( "transmitAllEnabled", &PMImageMap::enableTransmitAll,
+ &PMImageMap::isTransmitAllEnabled ) );
+ s_pMetaObject->addProperty(
+ new PMImageMapProperty( "transmitAll", &PMImageMap::setTransmitAll,
+ &PMImageMap::transmitAll ) );
+ s_pMetaObject->addProperty(
+ new PMImageMapProperty( "once", &PMImageMap::enableOnce, &PMImageMap::isOnceEnabled ) );
+
+ // TODO: filters and transmits properties
+ }
+ return s_pMetaObject;
+}
+
+void PMImageMap::cleanUp( ) const
+{
+ if( s_pMetaObject )
+ {
+ delete s_pMetaObject;
+ s_pMetaObject = 0;
+ }
+ Base::cleanUp( );
+}
+
+QString PMImageMap::description( ) const
+{
+ return i18n( "imagemap" );
+}
+
+void PMImageMap::setBitmapType( PMBitmapType c )
+{
+ if( c != m_bitmapType )
+ {
+ if( m_pMemento )
+ m_pMemento->addData( s_pMetaObject, PMBitmapTypeID, m_bitmapType );
+ m_bitmapType = c;
+ }
+}
+
+void PMImageMap::setBitmapFileName( const QString& c )
+{
+ if( c != m_bitmapFile )
+ {
+ if( m_pMemento )
+ m_pMemento->addData( s_pMetaObject, PMBitmapFileID, m_bitmapFile );
+ m_bitmapFile = c;
+ }
+}
+
+void PMImageMap::enableFilterAll( bool c )
+{
+ if( c != m_enableFilterAll )
+ {
+ if( m_pMemento )
+ m_pMemento->addData( s_pMetaObject, PMEnableFilterAllID, m_enableFilterAll );
+ m_enableFilterAll = c;
+ }
+}
+
+void PMImageMap::enableTransmitAll( bool c )
+{
+ if( c != m_enableTransmitAll )
+ {
+ if( m_pMemento )
+ m_pMemento->addData( s_pMetaObject, PMEnableTransmitAllID, m_enableTransmitAll );
+ m_enableTransmitAll = c;
+ }
+}
+
+void PMImageMap::setFilterAll( double c )
+{
+ if( c != m_filterAll )
+ {
+ if( m_pMemento )
+ m_pMemento->addData( s_pMetaObject, PMFilterAllID, m_filterAll );
+ m_filterAll = c;
+ }
+}
+
+void PMImageMap::setTransmitAll( double c )
+{
+ if( c != m_transmitAll )
+ {
+ if( m_pMemento )
+ m_pMemento->addData( s_pMetaObject, PMFilterAllID, m_transmitAll );
+ m_transmitAll = c;
+ }
+}
+
+void PMImageMap::enableOnce( bool c )
+{
+ if( c != m_once )
+ {
+ if( m_pMemento )
+ m_pMemento->addData( s_pMetaObject, PMOnceID, m_once );
+ m_once = c;
+ }
+}
+
+void PMImageMap::setMapType( PMMapType c )
+{
+ if( c != m_mapType )
+ {
+ if( m_pMemento )
+ m_pMemento->addData( s_pMetaObject, PMMapTypeID, m_mapType );
+ m_mapType = c;
+ }
+}
+
+void PMImageMap::setInterpolateType( PMInterpolateType c )
+{
+ if( c != m_interpolateType )
+ {
+ if( m_pMemento )
+ m_pMemento->addData( s_pMetaObject, PMInterpolateID, m_interpolateType );
+ m_interpolateType = c;
+ }
+}
+
+void PMImageMap::setFilters( const QValueList<PMPaletteValue>& c )
+{
+ if( m_filters != c )
+ {
+ if( m_pMemento )
+ ( ( PMPaletteValueMemento* ) m_pMemento )->setFilterPaletteValues( m_filters );
+ m_filters = c;
+ }
+}
+
+void PMImageMap::setTransmits( const QValueList<PMPaletteValue>& c )
+{
+ if( m_transmits != c )
+ {
+ if( m_pMemento )
+ ( ( PMPaletteValueMemento* ) m_pMemento )->setTransmitPaletteValues( m_transmits );
+ m_transmits = c;
+ }
+}
+
+PMDialogEditBase* PMImageMap::editWidget( QWidget* parent ) const
+{
+ return new PMImageMapEdit( parent );
+}
+
+void PMImageMap::restoreMemento( PMMemento* s )
+{
+ PMPaletteValueMemento* m = ( PMPaletteValueMemento* ) s;
+ PMMementoDataIterator it( s );
+ PMMementoData* data;
+
+ for( ; it.current( ); ++it )
+ {
+ data = it.current( );
+ if( data->objectType( ) == s_pMetaObject )
+ {
+ switch( data->valueID( ) )
+ {
+ case PMBitmapTypeID:
+ setBitmapType( ( PMBitmapType )data->intData( ) );
+ break;
+ case PMBitmapFileID:
+ setBitmapFileName( data->stringData( ) );
+ break;
+ case PMEnableFilterAllID:
+ enableFilterAll( data->boolData( ) );
+ break;
+ case PMEnableTransmitAllID:
+ enableTransmitAll( data->boolData( ) );
+ break;
+ case PMFilterAllID:
+ setFilterAll( data->doubleData( ) );
+ break;
+ case PMTransmitAllID:
+ setTransmitAll( data->doubleData( ) );
+ break;
+ case PMOnceID:
+ enableOnce( data->boolData( ) );
+ break;
+ case PMMapTypeID:
+ setMapType( ( PMMapType )data->intData( ) );
+ break;
+ case PMInterpolateID:
+ setInterpolateType( ( PMInterpolateType )data->intData( ) );
+ break;
+ default:
+ kdError( PMArea ) << "Wrong ID in PMImageMap::restoreMemento\n";
+ break;
+ }
+ }
+ }
+
+ if( m->filterPaletteValuesSaved( ) )
+ setFilters( m->filterPaletteValues( ) );
+
+ if( m->transmitPaletteValuesSaved( ) )
+ setTransmits( m->transmitPaletteValues( ) );
+
+ Base::restoreMemento( s );
+}
+