// -*- c++ -*- /* * Copyright (C) 2003, Richard J. Moore * * This library 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 library 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 library; see the file COPYING.LIB. If not, write to * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include "image_imp.h" namespace KJSEmbed { namespace Bindings { ImageImp::ImageImp( KJS::ExecState *exec, int id ) : JSProxyImp(exec), mid(id) { } ImageImp::~ImageImp() { } void ImageImp::addBindings( KJS::ExecState *exec, KJS::Object &object ) { if( !JSProxy::checkType(object, JSProxy::ValueProxy, "TTQImage") ) return; JSProxy::MethodTable methods[] = { { Methodwidth, "width" }, { Methodheight, "height" }, { Methoddepth, "depth" }, { MethodisOk, "isOk" }, { Methodpixmap, "pixmap" }, { Methodload, "load" }, { Methodsave, "save" }, { MethodsetFormat, "setFormat" }, { MethodsmoothScale, "smoothScale" }, { MethodsmoothScaleMin, "smoothScaleMin" }, { MethodsetPixmap, "setPixmap" }, { MethodinvertPixels, "invertPixels" }, { Methodpixel, "pixel"}, { MethodsetPixel, "setPixel"}, { Methodmirror, "mirror" }, { 0, 0 } }; JSProxy::addMethods(exec, methods, object); } KJS::Value ImageImp::call( KJS::ExecState *exec, KJS::Object &self, const KJS::List &args ) { if( !JSProxy::checkType(self, JSProxy::ValueProxy, "TTQImage") ) return KJS::Value(); JSValueProxy *op = JSProxy::toValueProxy( self.imp() ); img = op->toVariant().toImage(); KJS::Value retValue = KJS::Value(); switch ( mid ) { // case Methodfilename: // retValue = KJS::String(filename()); // break; // case Methodformat: // retValue = KJS::String(format()); // break; case Methodwidth: retValue = KJS::Number(width()); break; case Methodheight: retValue = KJS::Number(height()); break; case Methoddepth: retValue = KJS::Number(depth()); break; case MethodisOk: retValue = KJS::Boolean(isOk()); break; case Methodpixmap: { retValue = convertToValue(exec, pixmap()); break; } case Methodload: { TTQString arg0 = extractTQString( exec, args, 0); retValue = KJS::Boolean( load( arg0 )); break; } case Methodsave: { TTQString arg0 = extractTQString( exec, args, 0); TTQString arg1 = extractTQString( exec, args, 1); retValue = KJS::Boolean( save( arg0, arg1 )); break; } case MethodsetFormat: { TTQString arg0 = extractTQString( exec, args, 0); setFormat( arg0 ); break; } case MethodsmoothScale: { int arg0 = extractInt( exec, args, 0); int arg1 = extractInt( exec, args, 1); smoothScale(arg0, arg1); break; } case MethodsmoothScaleMin: { int arg0 = extractInt( exec, args, 0); int arg1 = extractInt( exec, args, 1); smoothScaleMin(arg0, arg1); break; } case MethodsetPixmap: { TTQPixmap pix = extractTQPixmap(exec, args, 0); setPixmap(pix); break; } case MethodinvertPixels: { bool alpha = extractBool( exec, args, 0); img.invertPixels(alpha); break; } case Methodpixel: { int x = extractInt(exec, args, 0); int y = extractInt(exec, args, 1); retValue = KJS::Number( img.pixel(x, y) ); break; } case MethodsetPixel: { int x = extractInt(exec, args, 0); int y = extractInt(exec, args, 1); uint col = extractUInt(exec, args, 2); img.setPixel(x, y, col); break; } case Methodmirror: { if ( img.isNull()) break; bool arg0 = extractBool( exec, args, 0); bool arg1 = extractBool( exec, args, 1); img = img.mirror( arg0, arg1 ); } default: kdWarning() << "Image has no method " << mid << endl; break; } op->setValue(img); return retValue; } int ImageImp::width() const { return !img.isNull() ? img.width() : 0; } int ImageImp::height() const { return !img.isNull() ? img.height() : 0; } int ImageImp::depth() const { return !img.isNull() ? img.depth() : 0; } bool ImageImp::isOk() const { return !img.isNull(); } TTQPixmap ImageImp::pixmap() const { if ( img.isNull() ) return TTQPixmap(); TTQPixmap pix; pix.convertFromImage( img ); return pix; } void ImageImp::setPixmap( const TTQPixmap &pix ) { if ( img.isNull() ) img = TTQImage(); img = pix.convertToImage(); } TTQString ImageImp::format() const { return fmt; } TTQString ImageImp::filename() const { return nm; } void ImageImp::setFormat( const TTQString &f ) { fmt = f; } bool ImageImp::load( const TTQString &filename ) { if ( !img.isNull() ) img = TTQImage(); nm = filename; fmt = TTQImageIO::imageFormat( filename ); bool ok = img.load( filename ); if ( !ok ) { kdWarning() << "Error loading " << filename << endl; img = TTQImage(); } return ok; } bool ImageImp::save( const TTQString &filename, const TTQString &fmt ) { if ( img.isNull() ) { kdWarning() << "Attempt to save a null image to '" << filename << "'" << endl; return false; } bool ok = img.save( filename, fmt.isNull() ? "PNG" : fmt.ascii() ); if ( ok ) nm = filename; return ok; } void ImageImp::smoothScale( int w, int h ) { if ( img.isNull()) return; img = img.smoothScale( w, h ); } void ImageImp::smoothScaleMin( int w, int h ) { if ( img.isNull()) return; img = img.smoothScale( w, h, TTQImage::ScaleMin ); } } // namespace KJSEmbed::Bindings } // namespace KJSEmbed