/*
* Copyright ( c ) 2005 Cyrille Berger < cberger @ cberger . net >
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU Library 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 Library General Public License for more details .
*
* You should have received a copy of the GNU Library General Public License
* along with this program ; if not , write to the Free Software
* Foundation , Inc . , 51 Franklin Street , Fifth Floor , Boston , MA 02110 - 1301 , USA .
*/
# include "krs_paint_layer.h"
# include <tdelocale.h>
# include <kis_colorspace_factory_registry.h>
# include <kis_doc.h>
# include <kis_layer.h>
# include <kis_meta_registry.h>
# include <kis_iterators_pixel.h>
# include <kis_transaction.h>
# include <kis_math_toolbox.h>
# include "krs_iterator.h"
# include "krs_histogram.h"
# include "krs_painter.h"
# include "krs_wavelet.h"
namespace Kross {
namespace ChalkCore {
PaintLayer : : PaintLayer ( KisPaintLayerSP layer , KisDoc * doc )
: Kross : : Api : : Class < PaintLayer > ( " ChalkLayer " ) , m_layer ( layer ) , m_doc ( doc ) , m_cmd ( 0 )
{
addFunction ( " createRectIterator " , & PaintLayer : : createRectIterator ) ;
addFunction ( " createHLineIterator " , & PaintLayer : : createHLineIterator ) ;
addFunction ( " createVLineIterator " , & PaintLayer : : createVLineIterator ) ;
addFunction ( " getWidth " , & PaintLayer : : getWidth ) ;
addFunction ( " getHeight " , & PaintLayer : : getHeight ) ;
addFunction ( " createHistogram " , & PaintLayer : : createHistogram ) ;
addFunction ( " createPainter " , & PaintLayer : : createPainter ) ;
addFunction ( " beginPainting " , & PaintLayer : : beginPainting ) ;
addFunction ( " endPainting " , & PaintLayer : : endPainting ) ;
addFunction ( " convertToColorspace " , & PaintLayer : : convertToColorspace ) ;
addFunction ( " fastWaveletTransformation " , & PaintLayer : : fastWaveletTransformation ) ;
addFunction ( " fastWaveletUntransformation " , & PaintLayer : : fastWaveletUntransformation ) ;
addFunction ( " colorSpaceId " , & PaintLayer : : colorSpaceId ) ;
}
PaintLayer : : ~ PaintLayer ( )
{
}
const TQString PaintLayer : : getClassName ( ) const {
return " Kross::ChalkCore::PaintLayer " ;
}
Kross : : Api : : Object : : Ptr PaintLayer : : createRectIterator ( Kross : : Api : : List : : Ptr args )
{
return new Iterator < KisRectIteratorPixel > (
paintLayer ( ) - > paintDevice ( ) - > createRectIterator ( Kross : : Api : : Variant : : toUInt ( args - > item ( 0 ) ) ,
Kross : : Api : : Variant : : toUInt ( args - > item ( 1 ) ) ,
Kross : : Api : : Variant : : toUInt ( args - > item ( 2 ) ) ,
Kross : : Api : : Variant : : toUInt ( args - > item ( 3 ) ) , true ) ,
paintLayer ( ) ) ;
}
Kross : : Api : : Object : : Ptr PaintLayer : : createHLineIterator ( Kross : : Api : : List : : Ptr args )
{
return new Iterator < KisHLineIteratorPixel > (
paintLayer ( ) - > paintDevice ( ) - > createHLineIterator ( Kross : : Api : : Variant : : toUInt ( args - > item ( 0 ) ) ,
Kross : : Api : : Variant : : toUInt ( args - > item ( 1 ) ) ,
Kross : : Api : : Variant : : toUInt ( args - > item ( 2 ) ) , true ) ,
paintLayer ( ) ) ;
}
Kross : : Api : : Object : : Ptr PaintLayer : : createVLineIterator ( Kross : : Api : : List : : Ptr args )
{
return new Iterator < KisVLineIteratorPixel > (
paintLayer ( ) - > paintDevice ( ) - > createVLineIterator ( Kross : : Api : : Variant : : toUInt ( args - > item ( 0 ) ) ,
Kross : : Api : : Variant : : toUInt ( args - > item ( 1 ) ) ,
Kross : : Api : : Variant : : toUInt ( args - > item ( 2 ) ) , true ) ,
paintLayer ( ) ) ;
}
Kross : : Api : : Object : : Ptr PaintLayer : : getWidth ( Kross : : Api : : List : : Ptr )
{
TQRect r1 = paintLayer ( ) - > extent ( ) ;
TQRect r2 = paintLayer ( ) - > image ( ) - > bounds ( ) ;
TQRect rect = r1 . intersect ( r2 ) ;
return new Kross : : Api : : Variant ( rect . width ( ) ) ;
}
Kross : : Api : : Object : : Ptr PaintLayer : : getHeight ( Kross : : Api : : List : : Ptr )
{
TQRect r1 = paintLayer ( ) - > extent ( ) ;
TQRect r2 = paintLayer ( ) - > image ( ) - > bounds ( ) ;
TQRect rect = r1 . intersect ( r2 ) ;
return new Kross : : Api : : Variant ( rect . height ( ) ) ;
}
Kross : : Api : : Object : : Ptr PaintLayer : : createHistogram ( Kross : : Api : : List : : Ptr args )
{
TQString histoname = Kross : : Api : : Variant : : toString ( args - > item ( 0 ) ) ;
KisHistogramProducerFactory * factory = KisHistogramProducerFactoryRegistry : : instance ( ) - > get ( histoname ) ;
/* KisIDList listID = KisHistogramProducerFactoryRegistry::instance()->listKeys();
for ( KisIDList : : iterator it = listID . begin ( ) ; it ! = listID . end ( ) ; it + + )
{
kdDebug ( 41011 ) < < ( * it ) . name ( ) < < " " < < ( * it ) . id ( ) < < endl ;
} */
enumHistogramType type ;
switch ( Kross : : Api : : Variant : : toUInt ( args - > item ( 1 ) ) )
{
case 1 :
type = LOGARITHMIC ;
break ;
case 0 :
default :
type = LINEAR ;
break ;
}
if ( factory & & factory - > isCompatibleWith ( paintLayer ( ) - > paintDevice ( ) - > colorSpace ( ) ) )
{
return new Histogram ( paintLayer ( ) . data ( ) , factory - > generate ( ) , type ) ;
} else {
throw Kross : : Api : : Exception : : Ptr ( new Kross : : Api : : Exception ( i18n ( " An error has occured in %1 " ) . arg ( " createHistogram " ) + " \n " + i18n ( " The histogram %1 is not available " ) . arg ( histoname ) ) ) ;
}
return 0 ;
}
Kross : : Api : : Object : : Ptr PaintLayer : : createPainter ( Kross : : Api : : List : : Ptr )
{
return new Painter ( paintLayer ( ) ) ;
}
Kross : : Api : : Object : : Ptr PaintLayer : : beginPainting ( Kross : : Api : : List : : Ptr args )
{
TQString name = Kross : : Api : : Variant : : toString ( args - > item ( 0 ) ) ;
if ( m_cmd ! = 0 )
{
delete m_cmd ;
}
m_cmd = new KisTransaction ( name , paintLayer ( ) - > paintDevice ( ) ) ;
TQ_CHECK_PTR ( m_cmd ) ;
return 0 ;
}
Kross : : Api : : Object : : Ptr PaintLayer : : endPainting ( Kross : : Api : : List : : Ptr )
{
if ( doc ( ) ! = 0 )
{
doc ( ) - > setModified ( true ) ;
doc ( ) - > currentImage ( ) - > activeLayer ( ) - > setDirty ( ) ;
}
if ( m_cmd ! = 0 )
{
paintLayer ( ) - > image ( ) - > undoAdapter ( ) - > addCommand ( m_cmd ) ;
}
return 0 ;
}
Kross : : Api : : Object : : Ptr PaintLayer : : convertToColorspace ( Kross : : Api : : List : : Ptr args )
{
KisColorSpace * dstCS = KisMetaRegistry : : instance ( ) - > csRegistry ( ) - > getColorSpace ( KisID ( Kross : : Api : : Variant : : toString ( args - > item ( 0 ) ) , " " ) , " " ) ;
if ( ! dstCS )
{
// FIXME: inform user
throw Kross : : Api : : Exception : : Ptr ( new Kross : : Api : : Exception ( i18n ( " An error has occured in %1 " ) . arg ( " convertToColorspace " ) + " \n " + i18n ( " Colorspace %1 is not available, please check your installation. " ) . arg ( Kross : : Api : : Variant : : toString ( args - > item ( 0 ) ) ) ) ) ;
return 0 ;
}
paintLayer ( ) - > paintDevice ( ) - > convertTo ( dstCS ) ;
return 0 ;
}
Kross : : Api : : Object : : Ptr PaintLayer : : colorSpaceId ( Kross : : Api : : List : : Ptr )
{
return new Kross : : Api : : Variant ( paintLayer ( ) - > paintDevice ( ) - > colorSpace ( ) - > id ( ) . id ( ) ) ;
}
Kross : : Api : : Object : : Ptr PaintLayer : : fastWaveletTransformation ( Kross : : Api : : List : : Ptr )
{
KisMathToolbox * mathToolbox = KisMetaRegistry : : instance ( ) - > mtRegistry ( ) - > get ( paintLayer ( ) - > paintDevice ( ) - > colorSpace ( ) - > mathToolboxID ( ) ) ;
TQRect rect = paintLayer ( ) - > exactBounds ( ) ;
KisMathToolbox : : KisWavelet * wav = mathToolbox - > fastWaveletTransformation ( paintLayer ( ) - > paintDevice ( ) , rect ) ;
return new Wavelet ( wav ) ;
}
Kross : : Api : : Object : : Ptr PaintLayer : : fastWaveletUntransformation ( Kross : : Api : : List : : Ptr args )
{
Wavelet * wav = ( Wavelet * ) args - > item ( 0 ) . data ( ) ;
KisMathToolbox * mathToolbox = KisMetaRegistry : : instance ( ) - > mtRegistry ( ) - > get ( paintLayer ( ) - > paintDevice ( ) - > colorSpace ( ) - > mathToolboxID ( ) ) ;
TQRect rect = paintLayer ( ) - > exactBounds ( ) ;
mathToolbox - > fastWaveletUntransformation ( paintLayer ( ) - > paintDevice ( ) , rect , wav - > wavelet ( ) ) ;
return 0 ;
}
}
}