[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Gnash-commit] gnash ChangeLog server/asobj/flash/geom/Point_a...
From: |
Sandro Santilli |
Subject: |
[Gnash-commit] gnash ChangeLog server/asobj/flash/geom/Point_a... |
Date: |
Mon, 19 May 2008 14:12:16 +0000 |
CVSROOT: /sources/gnash
Module name: gnash
Changes by: Sandro Santilli <strk> 08/05/19 14:12:16
Modified files:
. : ChangeLog
server/asobj/flash/geom: Point_as.cpp
testsuite/actionscript.all: Point.as
Log message:
Implement flash.geom.Point.interpolate()
CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/gnash/ChangeLog?cvsroot=gnash&r1=1.6647&r2=1.6648
http://cvs.savannah.gnu.org/viewcvs/gnash/server/asobj/flash/geom/Point_as.cpp?cvsroot=gnash&r1=1.10&r2=1.11
http://cvs.savannah.gnu.org/viewcvs/gnash/testsuite/actionscript.all/Point.as?cvsroot=gnash&r1=1.3&r2=1.4
Patches:
Index: ChangeLog
===================================================================
RCS file: /sources/gnash/gnash/ChangeLog,v
retrieving revision 1.6647
retrieving revision 1.6648
diff -u -b -r1.6647 -r1.6648
--- ChangeLog 19 May 2008 14:02:55 -0000 1.6647
+++ ChangeLog 19 May 2008 14:12:14 -0000 1.6648
@@ -1,3 +1,8 @@
+2008-05-19 Sandro Santilli <address@hidden>
+
+ * server/asobj/flash/geom/Point_as.cpp: implement Point.interpolate().
+ * testsuite/actionscript.all/Point.as: test Point.interpolate().
+
2008-05-19 Benjamin Wolsey <address@hidden>
* win32: drop old win32 files in head too. Anyone wanting to update
Index: server/asobj/flash/geom/Point_as.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/asobj/flash/geom/Point_as.cpp,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -b -r1.10 -r1.11
--- server/asobj/flash/geom/Point_as.cpp 19 May 2008 11:51:41 -0000
1.10
+++ server/asobj/flash/geom/Point_as.cpp 19 May 2008 14:12:16 -0000
1.11
@@ -317,6 +317,14 @@
return as_value();
}
+ IF_VERBOSE_ASCODING_ERRORS(
+ if ( fn.nargs > 2 )
+ {
+ std::stringstream ss; fn.dump_args(ss);
+ log_aserror("Point.distance(%s): %s", ss.str(), _("arguments
after first two discarded"));
+ }
+ );
+
as_value& arg1 = fn.arg(0);
if ( ! arg1.is_object() )
{
@@ -374,10 +382,87 @@
static as_value
Point_interpolate(const fn_call& fn)
{
- boost::intrusive_ptr<Point_as> ptr = ensureType<Point_as>(fn.this_ptr);
- UNUSED(ptr);
- LOG_ONCE( log_unimpl (__FUNCTION__) );
- return as_value();
+ as_value x0val;
+ as_value y0val;
+ as_value x1val;
+ as_value y1val;
+ as_value muval;
+
+ if ( fn.nargs < 3 )
+ {
+ IF_VERBOSE_ASCODING_ERRORS(
+ std::stringstream ss; fn.dump_args(ss);
+ log_aserror("Point.interpolate(%s): %s", ss.str(), _("missing
arguments"));
+ );
+ }
+ else
+ {
+ IF_VERBOSE_ASCODING_ERRORS(
+ if ( fn.nargs > 3 )
+ {
+ std::stringstream ss; fn.dump_args(ss);
+ log_aserror("Point.interpolate(%s): %s", ss.str(), _("arguments
after first three discarded"));
+ }
+ );
+
+ as_value& p0val = fn.arg(0);
+ as_object* p0 = p0val.to_object().get();
+ if ( ! p0 )
+ {
+ IF_VERBOSE_ASCODING_ERRORS(
+ std::stringstream ss; fn.dump_args(ss);
+ log_aserror("Point.interpolate(%s): %s", ss.str(),
_("first argument doesn't cast to object"));
+ );
+ }
+ else
+ {
+ p0->get_member(NSV::PROP_X, &x0val);
+ p0->get_member(NSV::PROP_Y, &y0val);
+ }
+
+ as_value& p1val = fn.arg(1);
+ as_object* p1 = p1val.to_object().get();
+ if ( ! p1 )
+ {
+ IF_VERBOSE_ASCODING_ERRORS(
+ std::stringstream ss; fn.dump_args(ss);
+ log_aserror("Point.interpolate(%s): %s", ss.str(),
_("second argument doesn't cast to object"));
+ );
+ }
+ else
+ {
+ p1->get_member(NSV::PROP_X, &x1val);
+ p1->get_member(NSV::PROP_Y, &y1val);
+ }
+
+ muval = fn.arg(2);
+ }
+
+
+ double x0 = x0val.to_number();
+ double y0 = y0val.to_number();
+ double x1 = x1val.to_number();
+ double y1 = y1val.to_number();
+ double mu = muval.to_number();
+
+ // newX = b.x + ( muval * (a.x - b.x) );
+ // newY = b.y + ( muval * (a.y - b.y) );
+
+ as_value xoff = mu * (x0 - x1);
+ as_value yoff = mu * (y0 - y1);
+
+ //log_debug("xoff:%s, yoff:%s, x1val:%s, y1val:%s", xoff, yoff, x1val,
y1val);
+
+ as_value x = x1val; // copy to avoid changing stack value
+ x.newAdd(xoff);
+ as_value y = y1val; // copy to avoid changing stack value
+ y.newAdd(yoff);
+
+ boost::intrusive_ptr<as_object> ret = new Point_as;
+ ret->set_member(NSV::PROP_X, as_value(x));
+ ret->set_member(NSV::PROP_Y, as_value(y));
+
+ return as_value(ret.get());
}
static as_value
Index: testsuite/actionscript.all/Point.as
===================================================================
RCS file: /sources/gnash/gnash/testsuite/actionscript.all/Point.as,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -b -r1.3 -r1.4
--- testsuite/actionscript.all/Point.as 19 May 2008 11:51:41 -0000 1.3
+++ testsuite/actionscript.all/Point.as 19 May 2008 14:12:16 -0000 1.4
@@ -20,7 +20,7 @@
// compile this test case with Ming makeswf, and then
// execute it like this gnash -1 -r 0 -v out.swf
-rcsid="$Id: Point.as,v 1.3 2008/05/19 11:51:41 strk Exp $";
+rcsid="$Id: Point.as,v 1.4 2008/05/19 14:12:16 strk Exp $";
#include "check.as"
@@ -253,6 +253,71 @@
// Test Point.interpolate (static)
//-------------------------------------------------------------
+ret = Point.interpolate();
+check(ret instanceof Point);
+check_equals(ret.toString(), '(x=NaN, y=NaN)');
+
+ret = Point.interpolate(1, 2, 3);
+check(ret instanceof Point);
+check_equals(ret.toString(), '(x=NaN, y=NaN)');
+
+p0 = new Point('x0', 'y0');
+p1 = new Point('x1', 'y1');
+ret = Point.interpolate(p0, p1, 3);
+check(ret instanceof Point);
+check_equals(ret.toString(), '(x=x1NaN, y=y1NaN)');
+
+p0 = new Point('0', '0');
+p1 = new Point('10', '0');
+ret = Point.interpolate(p0, p1, 3);
+check(ret instanceof Point);
+check_equals(ret.toString(), '(x=10-30, y=00)');
+ret = Point.interpolate(p0, p1, 0);
+check(ret instanceof Point);
+check_equals(ret.toString(), '(x=100, y=00)');
+ret = Point.interpolate(p0, p1, 0.5);
+check(ret instanceof Point);
+check_equals(ret.toString(), '(x=10-5, y=00)');
+
+// second arg drives newAdd
+p0 = new Point(0, 0);
+p1 = new Point('10', '0');
+ret = Point.interpolate(p0, p1, 3);
+check(ret instanceof Point);
+check_equals(ret.toString(), '(x=10-30, y=00)');
+
+// second arg drives newAdd
+p0 = new Point('0', '0');
+p1 = new Point(10, 0);
+ret = Point.interpolate(p0, p1, 3);
+check(ret instanceof Point);
+check_equals(ret.toString(), '(x=-20, y=0)');
+
+p0 = new Point(0, 0);
+p1 = new Point(10, 0);
+ret = Point.interpolate(p0, p1, 0.5);
+check(ret instanceof Point);
+check_equals(ret.toString(), '(x=5, y=0)');
+
+p0 = new Point(0, 0);
+p1 = new Point(10, 0);
+ret = Point.interpolate(p0, p1, 1, 'discarder arg');
+check(ret.equals(p0));
+ret = Point.interpolate(p0, p1, 0);
+check(ret.equals(p1));
+ret = Point.interpolate(p0, p1);
+check_equals(ret.toString(), '(x=NaN, y=NaN)');
+
+o0 = {x:0, y:10};
+o1 = {x:10, y:0};
+ret = Point.interpolate(o0, o1, 1);
+check_equals(ret.toString(), '(x=0, y=10)');
+ret = Point.interpolate(o0, o1, 0);
+check_equals(ret.toString(), '(x=10, y=0)');
+ret = Point.interpolate(o0, o1, 0.5);
+check_equals(ret.toString(), '(x=5, y=5)');
+
+
// TODO
//-------------------------------------------------------------
@@ -283,6 +348,6 @@
// END OF TEST
//-------------------------------------------------------------
-check_totals(92);
+check_totals(116);
#endif // OUTPUT_VERSION >= 8
- [Gnash-commit] gnash ChangeLog server/asobj/flash/geom/Point_a..., Sandro Santilli, 2008/05/07
- [Gnash-commit] gnash ChangeLog server/asobj/flash/geom/Point_a..., Sandro Santilli, 2008/05/19
- [Gnash-commit] gnash ChangeLog server/asobj/flash/geom/Point_a..., Sandro Santilli, 2008/05/19
- [Gnash-commit] gnash ChangeLog server/asobj/flash/geom/Point_a...,
Sandro Santilli <=
- [Gnash-commit] gnash ChangeLog server/asobj/flash/geom/Point_a..., Sandro Santilli, 2008/05/19
- [Gnash-commit] gnash ChangeLog server/asobj/flash/geom/Point_a..., Sandro Santilli, 2008/05/19
- [Gnash-commit] gnash ChangeLog server/asobj/flash/geom/Point_a..., Sandro Santilli, 2008/05/19