Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include "toonz/scriptbinding.h"
Toshihiro Shimizu 890ddd
#include "toonz/scriptbinding_scene.h"
Toshihiro Shimizu 890ddd
#include "toonz/scriptbinding_image.h"
Toshihiro Shimizu 890ddd
#include "toonz/scriptbinding_level.h"
Toshihiro Shimizu 890ddd
#include "toonz/scriptbinding_files.h"
Toshihiro Shimizu 890ddd
#include "toonz/scriptbinding_renderer.h"
Toshihiro Shimizu 890ddd
#include "toonz/scriptbinding_outline_vectorizer.h"
Toshihiro Shimizu 890ddd
#include "toonz/scriptbinding_centerline_vectorizer.h"
Toshihiro Shimizu 890ddd
#include "toonz/scriptbinding_rasterizer.h"
Toshihiro Shimizu 890ddd
#include "toonz/scriptbinding_toonz_raster_converter.h"
Toshihiro Shimizu 890ddd
#include "toonz/scriptbinding_image_builder.h"
Toshihiro Shimizu 890ddd
#include <QScriptEngine>
Toshihiro Shimizu 890ddd
#include "tlevel_io.h"
Toshihiro Shimizu 890ddd
#include "tlevel.h"
Toshihiro Shimizu 890ddd
#include "toonz/tcenterlinevectorizer.h"
Toshihiro Shimizu 890ddd
#include "toonz/tcamera.h"
Toshihiro Shimizu 890ddd
#include "trop.h"
Toshihiro Shimizu 890ddd
#include "trasterimage.h"
Toshihiro Shimizu 890ddd
#include "ttoonzimage.h"
Toshihiro Shimizu 890ddd
#include "tvectorimage.h"
Toshihiro Shimizu 890ddd
#include "tpalette.h"
Toshihiro Shimizu 890ddd
#include "tofflinegl.h"
Toshihiro Shimizu 890ddd
#include "tvectorrenderdata.h"
Toshihiro Shimizu 890ddd
#include "tgeometry.h"
Toshihiro Shimizu 890ddd
#include "toonz/stage.h"
Toshihiro Shimizu 890ddd
#include "toonz/tcamera.h"
Toshihiro Shimizu 890ddd
#include "toonz/txshleveltypes.h"
Toshihiro Shimizu 890ddd
#include "toonz/levelproperties.h"
Toshihiro Shimizu 890ddd
#include "toonz/toonzscene.h"
Toshihiro Shimizu 890ddd
#include "tfiletype.h"
Toshihiro Shimizu 890ddd
#include <QRegExp>
Toshihiro Shimizu 890ddd
#include <QColor>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
namespace TScriptBinding
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//===========================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
WRAPPER_STD_CTOR_IMPL(Void)
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//===========================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
int Wrapper::m_count = 0;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Wrapper::Wrapper()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	m_id = ++m_count;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Wrapper::~Wrapper()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void Wrapper::print(const QString &msg)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	QScriptValueList lst;
Toshihiro Shimizu 890ddd
	lst << msg;
Toshihiro Shimizu 890ddd
	print(lst);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void Wrapper::print(const QScriptValueList &lst)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	QScriptValue print = engine()->globalObject().property("print");
Toshihiro Shimizu 890ddd
	print.call(print, lst);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void Wrapper::warning(const QString &msg)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	QScriptValueList lst;
Toshihiro Shimizu 890ddd
	lst << msg;
Toshihiro Shimizu 890ddd
	QScriptValue f = engine()->globalObject().property("warning");
Toshihiro Shimizu 890ddd
	f.call(f, lst);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//===========================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
QScriptValue checkArgumentCount(QScriptContext *context, const QString &name, int minCount, int maxCount)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	int count = context->argumentCount();
Toshihiro Shimizu 890ddd
	if (minCount <= count && count <= maxCount)
Toshihiro Shimizu 890ddd
		return QScriptValue();
Toshihiro Shimizu 890ddd
	QString range;
Toshihiro Shimizu 890ddd
	if (minCount != maxCount)
Toshihiro Shimizu 890ddd
		range = QObject::tr("%1-%2").arg(minCount).arg(maxCount);
Toshihiro Shimizu 890ddd
	else
Toshihiro Shimizu 890ddd
		range = QObject::tr("%1").arg(minCount);
Toshihiro Shimizu 890ddd
	return context->throwError(QObject::tr("Expected %1 argument(s) in %2, got %3").arg(range).arg(name).arg(count));
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
QScriptValue checkArgumentCount(QScriptContext *context, const QString &name, int count)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return checkArgumentCount(context, name, count, count);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
QScriptValue checkColor(QScriptContext *context, const QString &colorName, QColor &color)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	color.setNamedColor(colorName);
Toshihiro Shimizu 890ddd
	if (!color.isValid())
Toshihiro Shimizu 890ddd
		return context->throwError(QObject::tr("%1 is not a valid color (valid color names are 'red', 'transparent', '#FF8800', ecc.)").arg(colorName));
Toshihiro Shimizu 890ddd
	else
Toshihiro Shimizu 890ddd
		return QScriptValue();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=============================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
template <class T>
Toshihiro Shimizu 890ddd
void bindClass(QScriptEngine &engine, const QString &name)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	const QMetaObject *metaObj = &T::staticMetaObject;
Toshihiro Shimizu 890ddd
	QScriptValue ctor = engine.newFunction(T::ctor);
Toshihiro Shimizu 890ddd
	QScriptValue proto = engine.newQMetaObject(metaObj, ctor);
Toshihiro Shimizu 890ddd
	engine.globalObject().setProperty(name, proto);
Toshihiro Shimizu 890ddd
	engine.setDefaultPrototype(qMetaTypeId<T *>(), proto);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
template <typename Tp>
Toshihiro Shimizu 890ddd
QScriptValue qScriptValueFromQObject(QScriptEngine *engine, Tp const &qobject) { return engine->newQObject(qobject); }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
template <typename Tp>
Toshihiro Shimizu 890ddd
void qScriptValueToQObject(const QScriptValue &value, Tp &qobject) { qobject = qobject_cast<Tp>(value.toQObject()); }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
template <typename Tp>
Toshihiro Shimizu 890ddd
int qScriptRegisterQObjectMetaType(QScriptEngine *engine, const QScriptValue &prototype = QScriptValue())
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return qScriptRegisterMetaType<Tp>(engine, qScriptValueFromQObject,
Toshihiro Shimizu 890ddd
									   qScriptValueToQObject, prototype);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
template <class T, QScriptValue (T::*Method)(QScriptContext *, QScriptEngine *)>
Toshihiro Shimizu 890ddd
class Dummy
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	static QScriptValue dummy(QScriptContext *context, QScriptEngine *engine)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		T *obj = qscriptvalue_cast<T *>(context->thisObject());
Toshihiro Shimizu 890ddd
		return (obj->*Method)(context, engine);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void deffoo(QScriptEngine &engine)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	QScriptValue f = engine.newFunction(Dummy<ToonzRasterConverter, &ToonzRasterConverter::convert>::dummy);
Toshihiro Shimizu 890ddd
	engine.globalObject().property("ToonzRasterConverter").setProperty("convert", f);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void bindAll(QScriptEngine &engine)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	bindClass<Image>(engine, "Image");
Toshihiro Shimizu 890ddd
	bindClass<Level>(engine, "Level");
Toshihiro Shimizu 890ddd
	bindClass<Scene>(engine, "Scene");
Toshihiro Shimizu 890ddd
	bindClass<Transform>(engine, "Transform");
Toshihiro Shimizu 890ddd
	bindClass<ImageBuilder>(engine, "ImageBuilder");
Toshihiro Shimizu 890ddd
	bindClass<OutlineVectorizer>(engine, "OutlineVectorizer");
Toshihiro Shimizu 890ddd
	bindClass<CenterlineVectorizer>(engine, "CenterlineVectorizer");
Toshihiro Shimizu 890ddd
	bindClass<Rasterizer>(engine, "Rasterizer");
Toshihiro Shimizu 890ddd
	bindClass<ToonzRasterConverter>(engine, "ToonzRasterConverter");
Toshihiro Shimizu 890ddd
	deffoo(engine);
Toshihiro Shimizu 890ddd
	bindClass<FilePath>(engine, "FilePath");
Toshihiro Shimizu 890ddd
	bindClass<Renderer>(engine, "Renderer");
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	qScriptRegisterQObjectMetaType<TScriptBinding::Image *>(&engine);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	engine.evaluate("ToonzVersion='7.1'");
Toshihiro Shimizu 890ddd
	// engine.evaluate("toonz={version:'7.0', }; script={version:'1.0'};");
Toshihiro Shimizu 890ddd
	// engine.globalObject().setProperty("dir","C:\\Users\\gmt\\GMT to vectorize\\");
Toshihiro Shimizu 890ddd
	// QScriptValue test = engine.evaluate("function() { print('ok'); run(dir+'bu.js');}");
Toshihiro Shimizu 890ddd
	// engine.globalObject().setProperty("test",test);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
} // namespace TScriptBinding