You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
koffice/chalk/plugins/viewplugins/scripting/chalkcore/krs_paint_layer.cpp

208 lines
7.7 KiB

/*
* 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;
}
}
}