Commit 08f2a706 authored by twanvl's avatar twanvl

Fixed conversion from Values to other types: Values now report being of the contained type.

Added toImage function to ScriptValue.
parent 246f6d44
......@@ -8,6 +8,7 @@
#include <util/prec.hpp>
#include <data/field/image.hpp>
#include <gfx/generated_image.hpp>
// ----------------------------------------------------------------------------- : ImageField
......@@ -38,6 +39,16 @@ String ImageValue::toString() const {
return filename.empty() ? wxEmptyString : _("<image>");
}
IMPLEMENT_REFLECTION_NAMELESS(ImageValue) {
if (fieldP->save_value || tag.scripting() || tag.reading()) REFLECT_NAMELESS(filename);
// custom reflection: convert to ScriptImageP for scripting
void ImageValue::reflect(Reader& tag) {
tag.handle(filename);
}
void ImageValue::reflect(Writer& tag) {
if (fieldP->save_value) tag.handle(filename);
}
void ImageValue::reflect(GetMember& tag) {}
void ImageValue::reflect(GetDefaultMember& tag) {
// convert to ScriptImageP for scripting
tag.handle( (ScriptValueP)new_intrusive2<ImageValueToImage>(filename, last_update) );
}
......@@ -19,6 +19,9 @@
ScriptType GeneratedImage::type() const { return SCRIPT_IMAGE; }
String GeneratedImage::typeName() const { return _TYPE_("image"); }
GeneratedImageP GeneratedImage::toImage(const ScriptValueP& thisP) const {
return static_pointer_cast<GeneratedImage>(thisP);
}
Image GeneratedImage::generateConform(const Options& options) const {
return conform_image(generate(options),options);
......
......@@ -61,6 +61,7 @@ class GeneratedImage : public ScriptValue {
virtual ScriptType type() const;
virtual String typeName() const;
virtual GeneratedImageP toImage(const ScriptValueP& thisP) const;
};
/// Resize an image to conform to the options
......
This diff is collapsed.
......@@ -19,25 +19,7 @@
// convert any script value to a GeneratedImageP
GeneratedImageP image_from_script(const ScriptValueP& value) {
ScriptType t = value->type();
if (t == SCRIPT_IMAGE) {
GeneratedImageP img = dynamic_pointer_cast<GeneratedImage>(value);
if (img) return img;
} else if (t == SCRIPT_STRING) {
return new_intrusive1<PackagedImage>(value->toString());
} else if (t == SCRIPT_NIL) {
return new_intrusive<BlankImage>();
} else if (t == SCRIPT_OBJECT) {
// maybe it's an image value?
intrusive_ptr<ScriptObject<ValueP> > v = dynamic_pointer_cast<ScriptObject<ValueP> >(value);
if (v) {
ImageValueP iv = dynamic_pointer_cast<ImageValue>(v->getValue());
if (iv) {
return new_intrusive2<ImageValueToImage>(iv->filename, iv->last_update);
}
}
}
throw ScriptError(_ERROR_2_("can't convert", value->typeName(), _TYPE_("image")));
return value->toImage(value);
}
// ----------------------------------------------------------------------------- : ScriptableImage
......
......@@ -14,6 +14,7 @@
#include <util/reflect.hpp>
#include <util/error.hpp>
#include <util/io/get_member.hpp>
#include <gfx/generated_image.hpp> // we need the dtor of GeneratedImage
// ----------------------------------------------------------------------------- : Overloadable templates
......@@ -246,13 +247,16 @@ template <typename T>
class ScriptObject : public ScriptValue {
public:
inline ScriptObject(const T& v) : value(v) {}
virtual ScriptType type() const { return SCRIPT_OBJECT; }
virtual ScriptType type() const { ScriptValueP d = getDefault(); return d ? d->type() : SCRIPT_OBJECT; }
virtual String typeName() const { return type_name(*value); }
virtual operator String() const { ScriptValueP d = getDefault(); return d ? *d : ScriptValue::operator String(); }
virtual operator double() const { ScriptValueP d = getDefault(); return d ? *d : ScriptValue::operator double(); }
virtual operator int() const { ScriptValueP d = getDefault(); return d ? *d : ScriptValue::operator int(); }
virtual operator bool() const { ScriptValueP d = getDefault(); return d ? *d : ScriptValue::operator bool(); }
virtual operator AColor() const { ScriptValueP d = getDefault(); return d ? *d : ScriptValue::operator AColor(); }
virtual GeneratedImageP toImage(const ScriptValueP& thisP) const {
ScriptValueP d = getDefault(); return d ? d->toImage(d) : ScriptValue::toImage(thisP);
}
virtual ScriptValueP getMember(const String& name) const {
GetMember gm(name);
gm.handle(*value);
......
......@@ -10,6 +10,7 @@
#include <script/value.hpp>
#include <script/to_value.hpp>
#include <script/context.hpp>
#include <gfx/generated_image.hpp>
#include <util/error.hpp>
#include <boost/pool/singleton_pool.hpp>
......@@ -27,6 +28,7 @@ ScriptValueP ScriptValue::eval(Context&) const { return delay
ScriptValueP ScriptValue::next() { throw InternalError(_("Can't convert from ")+typeName()+_(" to iterator")); }
ScriptValueP ScriptValue::makeIterator(const ScriptValueP&) const { return delayError(_ERROR_2_("can't convert", typeName(), _TYPE_("collection"))); }
int ScriptValue::itemCount() const { throw ScriptError(_ERROR_2_("can't convert", typeName(), _TYPE_("collection"))); }
GeneratedImageP ScriptValue::toImage(const ScriptValueP&) const { throw ScriptError(_ERROR_2_("can't convert", typeName(), _TYPE_("image" ))); }
String ScriptValue::toCode() const { return *this; }
CompareWhat ScriptValue::compareAs(String& compare_str, void const*& compare_ptr) const {
compare_str = toCode();
......@@ -271,6 +273,9 @@ class ScriptString : public ScriptValue {
}
return c;
}
virtual GeneratedImageP toImage(const ScriptValueP&) const {
return new_intrusive1<PackagedImage>(value);
}
virtual int itemCount() const { return (int)value.size(); }
virtual ScriptValueP getMember(const String& name) const {
// get member returns characters
......@@ -326,6 +331,9 @@ class ScriptNil : public ScriptValue {
virtual operator double() const { return 0.0; }
virtual operator int() const { return 0; }
virtual operator bool() const { return false; }
virtual GeneratedImageP toImage(const ScriptValueP&) const {
return new_intrusive<BlankImage>();
}
virtual ScriptValueP eval(Context& ctx) const {
// nil(input) == input
return ctx.getVariable(SCRIPT_VAR_input);
......
......@@ -14,6 +14,7 @@
class Context;
class Dependency;
class ScriptClosure;
DECLARE_POINTER_TYPE(GeneratedImage);
// ----------------------------------------------------------------------------- : ScriptValue
......@@ -74,6 +75,8 @@ class ScriptValue : public IntrusivePtrBaseWithDelete {
/** This is sometimes necessary, because wxString has an int constructor,
* which confuses gcc. */
inline String toString() const { return *this; }
/// Convert this value to an image
virtual GeneratedImageP toImage(const ScriptValueP& thisP) const;
/// Get a member variable from this value
virtual ScriptValueP getMember(const String& name) const;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment