gnash-commit
[Top][All Lists]
Advanced

[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




reply via email to

[Prev in Thread] Current Thread [Next in Thread]