53
54
int fl=0; // flags...
55
o.init_member("add", new builtin_function(Point_add), fl);
56
o.init_member("clone", new builtin_function(Point_clone), fl);
57
o.init_member("equals", new builtin_function(Point_equals), fl);
58
o.init_member("normalize", new builtin_function(Point_normalize), fl);
59
o.init_member("offset", new builtin_function(Point_offset), fl);
60
o.init_member("subtract", new builtin_function(Point_subtract), fl);
61
o.init_member("toString", new builtin_function(Point_toString), fl);
56
Global_as* gl = getGlobal(o);
57
o.init_member("add", gl->createFunction(Point_add), fl);
58
o.init_member("clone", gl->createFunction(Point_clone), fl);
59
o.init_member("equals", gl->createFunction(Point_equals), fl);
60
o.init_member("normalize", gl->createFunction(Point_normalize), fl);
61
o.init_member("offset", gl->createFunction(Point_offset), fl);
62
o.init_member("subtract", gl->createFunction(Point_subtract), fl);
63
o.init_member("toString", gl->createFunction(Point_toString), fl);
62
64
o.init_property("length", Point_length_getset, Point_length_getset, fl);
66
68
attachPointStaticProperties(as_object& o)
68
o.init_member("distance", new builtin_function(Point_distance), 0);
69
o.init_member("interpolate", new builtin_function(Point_interpolate), 0);
70
o.init_member("polar", new builtin_function(Point_polar), 0);
70
Global_as* gl = getGlobal(o);
71
o.init_member("distance", gl->createFunction(Point_distance), 0);
72
o.init_member("interpolate", gl->createFunction(Point_interpolate), 0);
73
o.init_member("polar", gl->createFunction(Point_polar), 0);
74
77
getPointInterface()
76
static boost::intrusive_ptr<as_object> o;
80
// TODO: check if this class should inherit from Object
81
// or from a different class
82
o = new as_object(getObjectInterface());
83
VM::get().addStatic(o.get());
85
attachPointInterface(*o);
79
static boost::intrusive_ptr<as_object> o;
83
// TODO: check if this class should inherit from Object
84
// or from a different class
85
o = new as_object(getObjectInterface());
86
VM::get().addStatic(o.get());
88
attachPointInterface(*o);
93
96
class Point_as: public as_object
98
as_object(getPointInterface())
101
as_object(getPointInterface())
105
108
Point_add(const fn_call& fn)
107
boost::intrusive_ptr<as_object> ptr = ensureType<as_object>(fn.this_ptr);
110
ptr->get_member(NSV::PROP_X, &x);
111
ptr->get_member(NSV::PROP_Y, &y);
117
IF_VERBOSE_ASCODING_ERRORS(
118
log_aserror(_("%s: missing arguments"), "Point.add()");
123
IF_VERBOSE_ASCODING_ERRORS(
126
std::stringstream ss; fn.dump_args(ss);
127
log_aserror("Point.add(%s): %s", ss.str(), _("arguments after first discarded"));
130
const as_value& arg1 = fn.arg(0);
131
as_object* o = arg1.to_object().get();
134
IF_VERBOSE_ASCODING_ERRORS(
135
std::stringstream ss; fn.dump_args(ss);
136
log_aserror("Point.add(%s): %s", ss.str(), _("first argument doesn't cast to object"));
141
if ( ! o->get_member(NSV::PROP_X, &x1) )
143
IF_VERBOSE_ASCODING_ERRORS(
144
std::stringstream ss; fn.dump_args(ss);
145
log_aserror("Point.add(%s): %s", ss.str(),
146
_("first argument cast to object doesn't contain an 'x' member"));
149
if ( ! o->get_member(NSV::PROP_Y, &y1) )
151
IF_VERBOSE_ASCODING_ERRORS(
152
std::stringstream ss; fn.dump_args(ss);
153
log_aserror("Point.add(%s): %s", ss.str(),
154
_("first argument cast to object doesn't contain an 'y' member"));
163
boost::intrusive_ptr<as_object> ret = new Point_as;
164
ret->set_member(NSV::PROP_X, x);
165
ret->set_member(NSV::PROP_Y, y);
167
return as_value(ret.get());
110
boost::intrusive_ptr<as_object> ptr = ensureType<as_object>(fn.this_ptr);
113
ptr->get_member(NSV::PROP_X, &x);
114
ptr->get_member(NSV::PROP_Y, &y);
120
IF_VERBOSE_ASCODING_ERRORS(
121
log_aserror(_("%s: missing arguments"), "Point.add()");
126
IF_VERBOSE_ASCODING_ERRORS(
129
std::stringstream ss; fn.dump_args(ss);
130
log_aserror("Point.add(%s): %s", ss.str(), _("arguments after first discarded"));
133
const as_value& arg1 = fn.arg(0);
134
as_object* o = arg1.to_object(*getGlobal(fn)).get();
137
IF_VERBOSE_ASCODING_ERRORS(
138
std::stringstream ss; fn.dump_args(ss);
139
log_aserror("Point.add(%s): %s", ss.str(), _("first argument doesn't cast to object"));
144
if ( ! o->get_member(NSV::PROP_X, &x1) )
146
IF_VERBOSE_ASCODING_ERRORS(
147
std::stringstream ss; fn.dump_args(ss);
148
log_aserror("Point.add(%s): %s", ss.str(),
149
_("first argument cast to object doesn't contain an 'x' member"));
152
if ( ! o->get_member(NSV::PROP_Y, &y1) )
154
IF_VERBOSE_ASCODING_ERRORS(
155
std::stringstream ss; fn.dump_args(ss);
156
log_aserror("Point.add(%s): %s", ss.str(),
157
_("first argument cast to object doesn't contain an 'y' member"));
166
boost::intrusive_ptr<as_object> ret = new Point_as;
167
ret->set_member(NSV::PROP_X, x);
168
ret->set_member(NSV::PROP_Y, y);
170
return as_value(ret.get());
171
174
Point_clone(const fn_call& fn)
173
boost::intrusive_ptr<as_object> ptr = ensureType<as_object>(fn.this_ptr);
176
ptr->get_member(NSV::PROP_X, &x);
177
ptr->get_member(NSV::PROP_Y, &y);
179
boost::intrusive_ptr<as_object> ret = new Point_as;
180
ret->set_member(NSV::PROP_X, x);
181
ret->set_member(NSV::PROP_Y, y);
183
return as_value(ret.get());
176
boost::intrusive_ptr<as_object> ptr = ensureType<as_object>(fn.this_ptr);
179
ptr->get_member(NSV::PROP_X, &x);
180
ptr->get_member(NSV::PROP_Y, &y);
182
boost::intrusive_ptr<as_object> ret = new Point_as;
183
ret->set_member(NSV::PROP_X, x);
184
ret->set_member(NSV::PROP_Y, y);
186
return as_value(ret.get());
187
190
Point_equals(const fn_call& fn)
189
boost::intrusive_ptr<as_object> ptr = ensureType<as_object>(fn.this_ptr);
193
IF_VERBOSE_ASCODING_ERRORS(
194
log_aserror(_("%s: missing arguments"), "Point.equals()");
196
return as_value(false);
199
const as_value& arg1 = fn.arg(0);
200
if ( ! arg1.is_object() )
202
IF_VERBOSE_ASCODING_ERRORS(
203
std::stringstream ss; fn.dump_args(ss);
204
log_aserror("Point.equals(%s): %s", ss.str(), _("First arg must be an object"));
206
return as_value(false);
208
as_object* o = arg1.to_object().get();
210
if ( ! o->instanceOf(getFlashGeomPointConstructor()) )
212
IF_VERBOSE_ASCODING_ERRORS(
213
std::stringstream ss; fn.dump_args(ss);
214
log_aserror("Point.equals(%s): %s %s", ss.str(), _("First arg must be an instance of"), "flash.geom.Point");
216
return as_value(false);
220
ptr->get_member(NSV::PROP_X, &x);
221
ptr->get_member(NSV::PROP_Y, &y);
224
o->get_member(NSV::PROP_X, &x1);
225
o->get_member(NSV::PROP_Y, &y1);
227
return as_value(x.equals(x1) && y.equals(y1));
192
boost::intrusive_ptr<as_object> ptr = ensureType<as_object>(fn.this_ptr);
196
IF_VERBOSE_ASCODING_ERRORS(
197
log_aserror(_("%s: missing arguments"), "Point.equals()");
199
return as_value(false);
202
const as_value& arg1 = fn.arg(0);
203
if ( ! arg1.is_object() )
205
IF_VERBOSE_ASCODING_ERRORS(
206
std::stringstream ss; fn.dump_args(ss);
207
log_aserror("Point.equals(%s): %s", ss.str(),
208
_("First arg must be an object"));
210
return as_value(false);
212
as_object* o = arg1.to_object(*getGlobal(fn)).get();
214
if ( ! o->instanceOf(getFlashGeomPointConstructor(fn)) )
216
IF_VERBOSE_ASCODING_ERRORS(
217
std::stringstream ss; fn.dump_args(ss);
218
log_aserror("Point.equals(%s): %s %s", ss.str(),
219
_("First arg must be an instance of"), "flash.geom.Point");
221
return as_value(false);
225
ptr->get_member(NSV::PROP_X, &x);
226
ptr->get_member(NSV::PROP_Y, &y);
229
o->get_member(NSV::PROP_X, &x1);
230
o->get_member(NSV::PROP_Y, &y1);
232
return as_value(x.equals(x1) && y.equals(y1));
231
236
Point_normalize(const fn_call& fn)
233
boost::intrusive_ptr<Point_as> ptr = ensureType<Point_as>(fn.this_ptr);
239
IF_VERBOSE_ASCODING_ERRORS(
240
log_aserror(_("%s: missing arguments"), "Point.normalize()");
246
IF_VERBOSE_ASCODING_ERRORS(
249
std::stringstream ss; fn.dump_args(ss);
250
log_aserror("Point.normalize(%s): %s", ss.str(), _("arguments after first discarded"));
257
// newlen may be NaN, and we'd still be updating x/y
258
// see actionscript.all/Point.as
259
double newlen = argval.to_number();
262
ptr->get_member(NSV::PROP_X, &xval);
263
ptr->get_member(NSV::PROP_Y, &yval);
265
double x = xval.to_number();
266
if ( ! utility::isFinite(x) ) return as_value();
267
double y = yval.to_number();
268
if ( ! utility::isFinite(y) ) return as_value();
270
if ( x == 0 && y == 0 ) return as_value();
272
double curlen = std::sqrt(x*x+y*y);
273
double fact = newlen/curlen;
276
xval.set_double( xval.to_number() * fact );
277
yval.set_double( yval.to_number() * fact );
278
ptr->set_member(NSV::PROP_X, xval);
279
ptr->set_member(NSV::PROP_Y, yval);
238
boost::intrusive_ptr<Point_as> ptr = ensureType<Point_as>(fn.this_ptr);
244
IF_VERBOSE_ASCODING_ERRORS(
245
log_aserror(_("%s: missing arguments"), "Point.normalize()");
251
IF_VERBOSE_ASCODING_ERRORS(
254
std::stringstream ss; fn.dump_args(ss);
255
log_aserror("Point.normalize(%s): %s", ss.str(), _("arguments after first discarded"));
262
// newlen may be NaN, and we'd still be updating x/y
263
// see actionscript.all/Point.as
264
double newlen = argval.to_number();
267
ptr->get_member(NSV::PROP_X, &xval);
268
ptr->get_member(NSV::PROP_Y, &yval);
270
double x = xval.to_number();
271
if (!isFinite(x)) return as_value();
272
double y = yval.to_number();
273
if (!isFinite(y)) return as_value();
275
if ( x == 0 && y == 0 ) return as_value();
277
double curlen = std::sqrt(x*x+y*y);
278
double fact = newlen/curlen;
281
xval.set_double( xval.to_number() * fact );
282
yval.set_double( yval.to_number() * fact );
283
ptr->set_member(NSV::PROP_X, xval);
284
ptr->set_member(NSV::PROP_Y, yval);
285
290
Point_offset(const fn_call& fn)
287
boost::intrusive_ptr<Point_as> ptr = ensureType<Point_as>(fn.this_ptr);
290
ptr->get_member(NSV::PROP_X, &x);
291
ptr->get_member(NSV::PROP_Y, &y);
297
if ( fn.nargs > 1 ) yoff = fn.arg(1);
303
ptr->set_member(NSV::PROP_X, x);
304
ptr->set_member(NSV::PROP_Y, y);
292
boost::intrusive_ptr<Point_as> ptr = ensureType<Point_as>(fn.this_ptr);
295
ptr->get_member(NSV::PROP_X, &x);
296
ptr->get_member(NSV::PROP_Y, &y);
302
if ( fn.nargs > 1 ) yoff = fn.arg(1);
308
ptr->set_member(NSV::PROP_X, x);
309
ptr->set_member(NSV::PROP_Y, y);
310
315
Point_subtract(const fn_call& fn)
312
boost::intrusive_ptr<Point_as> ptr = ensureType<Point_as>(fn.this_ptr);
315
ptr->get_member(NSV::PROP_X, &x);
316
ptr->get_member(NSV::PROP_Y, &y);
322
IF_VERBOSE_ASCODING_ERRORS(
323
log_aserror(_("%s: missing arguments"), "Point.add()");
328
IF_VERBOSE_ASCODING_ERRORS(
331
std::stringstream ss; fn.dump_args(ss);
332
log_aserror("Point.add(%s): %s", ss.str(), _("arguments after first discarded"));
335
const as_value& arg1 = fn.arg(0);
336
as_object* o = arg1.to_object().get();
339
IF_VERBOSE_ASCODING_ERRORS(
340
std::stringstream ss; fn.dump_args(ss);
341
log_aserror("Point.add(%s): %s", ss.str(), _("first argument doesn't cast to object"));
346
if ( ! o->get_member(NSV::PROP_X, &x1) )
348
IF_VERBOSE_ASCODING_ERRORS(
349
std::stringstream ss; fn.dump_args(ss);
350
log_aserror("Point.add(%s): %s", ss.str(),
351
_("first argument casted to object doesn't contain an 'x' member"));
354
if ( ! o->get_member(NSV::PROP_Y, &y1) )
356
IF_VERBOSE_ASCODING_ERRORS(
357
std::stringstream ss; fn.dump_args(ss);
358
log_aserror("Point.add(%s): %s", ss.str(),
359
_("first argument casted to object doesn't contain an 'y' member"));
365
x.set_double(x.to_number() - x1.to_number());
366
y.set_double(y.to_number() - y1.to_number());
368
boost::intrusive_ptr<as_object> ret = new Point_as;
369
ret->set_member(NSV::PROP_X, x);
370
ret->set_member(NSV::PROP_Y, y);
372
return as_value(ret.get());
317
boost::intrusive_ptr<Point_as> ptr = ensureType<Point_as>(fn.this_ptr);
320
ptr->get_member(NSV::PROP_X, &x);
321
ptr->get_member(NSV::PROP_Y, &y);
327
IF_VERBOSE_ASCODING_ERRORS(
328
log_aserror(_("%s: missing arguments"), "Point.add()");
333
IF_VERBOSE_ASCODING_ERRORS(
336
std::stringstream ss; fn.dump_args(ss);
337
log_aserror("Point.add(%s): %s", ss.str(), _("arguments after first discarded"));
340
const as_value& arg1 = fn.arg(0);
341
as_object* o = arg1.to_object(*getGlobal(fn)).get();
344
IF_VERBOSE_ASCODING_ERRORS(
345
std::stringstream ss; fn.dump_args(ss);
346
log_aserror("Point.add(%s): %s", ss.str(), _("first argument doesn't cast to object"));
351
if ( ! o->get_member(NSV::PROP_X, &x1) )
353
IF_VERBOSE_ASCODING_ERRORS(
354
std::stringstream ss; fn.dump_args(ss);
355
log_aserror("Point.add(%s): %s", ss.str(),
356
_("first argument casted to object doesn't contain an 'x' member"));
359
if ( ! o->get_member(NSV::PROP_Y, &y1) )
361
IF_VERBOSE_ASCODING_ERRORS(
362
std::stringstream ss; fn.dump_args(ss);
363
log_aserror("Point.add(%s): %s", ss.str(),
364
_("first argument casted to object doesn't contain an 'y' member"));
370
x.set_double(x.to_number() - x1.to_number());
371
y.set_double(y.to_number() - y1.to_number());
373
boost::intrusive_ptr<as_object> ret = new Point_as;
374
ret->set_member(NSV::PROP_X, x);
375
ret->set_member(NSV::PROP_Y, y);
377
return as_value(ret.get());
376
381
Point_toString(const fn_call& fn)
378
boost::intrusive_ptr<Point_as> ptr = ensureType<Point_as>(fn.this_ptr);
381
ptr->get_member(NSV::PROP_X, &x);
382
ptr->get_member(NSV::PROP_Y, &y);
384
std::stringstream ss;
385
ss << "(x=" << x.to_string()
386
<< ", y=" << y.to_string()
389
return as_value(ss.str());
383
boost::intrusive_ptr<Point_as> ptr = ensureType<Point_as>(fn.this_ptr);
386
ptr->get_member(NSV::PROP_X, &x);
387
ptr->get_member(NSV::PROP_Y, &y);
389
int version = getSWFVersion(fn);
391
std::stringstream ss;
392
ss << "(x=" << x.to_string_versioned(version)
393
<< ", y=" << y.to_string_versioned(version)
396
return as_value(ss.str());
393
400
Point_length_getset(const fn_call& fn)
395
boost::intrusive_ptr<Point_as> ptr = ensureType<Point_as>(fn.this_ptr);
397
if ( ! fn.nargs ) // getter
400
ptr->get_member(NSV::PROP_X, &xval);
401
ptr->get_member(NSV::PROP_Y, &yval);
402
double x = xval.to_number();
403
double y = yval.to_number();
405
double l = std::sqrt(x*x+y*y);
410
IF_VERBOSE_ASCODING_ERRORS(
411
log_aserror(_("Attempt to set read-only property %s"), "Point.length");
402
boost::intrusive_ptr<Point_as> ptr = ensureType<Point_as>(fn.this_ptr);
404
if ( ! fn.nargs ) // getter
407
ptr->get_member(NSV::PROP_X, &xval);
408
ptr->get_member(NSV::PROP_Y, &yval);
409
double x = xval.to_number();
410
double y = yval.to_number();
412
double l = std::sqrt(x*x+y*y);
417
IF_VERBOSE_ASCODING_ERRORS(
418
log_aserror(_("Attempt to set read-only property %s"), "Point.length");
418
425
Point_distance(const fn_call& fn)
422
IF_VERBOSE_ASCODING_ERRORS(
423
std::stringstream ss; fn.dump_args(ss);
424
log_aserror("Point.distance(%s): %s", ss.str(), _("missing arguments"));
429
IF_VERBOSE_ASCODING_ERRORS(
432
std::stringstream ss; fn.dump_args(ss);
433
log_aserror("Point.distance(%s): %s", ss.str(), _("arguments after first two discarded"));
437
const as_value& arg1 = fn.arg(0);
438
if ( ! arg1.is_object() )
440
IF_VERBOSE_ASCODING_ERRORS(
441
std::stringstream ss; fn.dump_args(ss);
442
log_aserror("Point.distance(%s): %s", ss.str(), _("First arg must be an object"));
446
as_object* o1 = arg1.to_object().get();
448
if ( ! o1->instanceOf(getFlashGeomPointConstructor()) )
450
IF_VERBOSE_ASCODING_ERRORS(
451
std::stringstream ss; fn.dump_args(ss);
452
log_aserror("Point.equals(%s): %s %s", ss.str(), _("First arg must be an instance of"), "flash.geom.Point");
457
const as_value& arg2 = fn.arg(1);
458
as_object* o2 = arg2.to_object().get();
460
// it seems there's no need to check arg2 (see actionscript.all/Point.as)
463
o1->get_member(NSV::PROP_X, &x1val);
464
double x1 = x1val.to_number();
465
//if ( ! utility::isFinite(x1) ) return as_value(NaN);
468
o1->get_member(NSV::PROP_Y, &y1val);
469
double y1 = y1val.to_number();
470
//if ( ! utility::isFinite(y1) ) return as_value(NaN);
473
o2->get_member(NSV::PROP_X, &x2val);
474
double x2 = x2val.to_number();
475
//if ( ! utility::isFinite(x2) ) return as_value(NaN);
478
o2->get_member(NSV::PROP_Y, &y2val);
479
double y2 = y2val.to_number();
480
//if ( ! utility::isFinite(y2) ) return as_value(NaN);
482
double hside = x2 - x1; // p1.x - p0.x;
483
double vside = y2 - y1; // p1.y - p0.y;
485
double sqdist = hside*hside + vside*vside;
486
double dist = std::sqrt(sqdist);
488
return as_value(dist);
429
IF_VERBOSE_ASCODING_ERRORS(
430
std::stringstream ss; fn.dump_args(ss);
431
log_aserror("Point.distance(%s): %s", ss.str(), _("missing arguments"));
436
IF_VERBOSE_ASCODING_ERRORS(
439
std::stringstream ss; fn.dump_args(ss);
440
log_aserror("Point.distance(%s): %s", ss.str(), _("arguments after first two discarded"));
444
const as_value& arg1 = fn.arg(0);
445
if ( ! arg1.is_object() )
447
IF_VERBOSE_ASCODING_ERRORS(
448
std::stringstream ss; fn.dump_args(ss);
449
log_aserror("Point.distance(%s): %s", ss.str(), _("First arg must be an object"));
453
as_object* o1 = arg1.to_object(*getGlobal(fn)).get();
455
if ( ! o1->instanceOf(getFlashGeomPointConstructor(fn)) )
457
IF_VERBOSE_ASCODING_ERRORS(
458
std::stringstream ss; fn.dump_args(ss);
459
log_aserror("Point.equals(%s): %s %s", ss.str(), _("First arg must be an instance of"), "flash.geom.Point");
464
const as_value& arg2 = fn.arg(1);
465
as_object* o2 = arg2.to_object(*getGlobal(fn)).get();
467
// it seems there's no need to check arg2 (see actionscript.all/Point.as)
470
o1->get_member(NSV::PROP_X, &x1val);
471
double x1 = x1val.to_number();
472
//if ( ! isFinite(x1) ) return as_value(NaN);
475
o1->get_member(NSV::PROP_Y, &y1val);
476
double y1 = y1val.to_number();
477
//if ( ! isFinite(y1) ) return as_value(NaN);
480
o2->get_member(NSV::PROP_X, &x2val);
481
double x2 = x2val.to_number();
482
//if ( ! isFinite(x2) ) return as_value(NaN);
485
o2->get_member(NSV::PROP_Y, &y2val);
486
double y2 = y2val.to_number();
487
//if ( ! utility::isFinite(y2) ) return as_value(NaN);
489
double hside = x2 - x1; // p1.x - p0.x;
490
double vside = y2 - y1; // p1.y - p0.y;
492
double sqdist = hside*hside + vside*vside;
493
double dist = std::sqrt(sqdist);
495
return as_value(dist);
492
499
Point_interpolate(const fn_call& fn)
502
IF_VERBOSE_ASCODING_ERRORS(
503
std::stringstream ss; fn.dump_args(ss);
504
log_aserror("Point.interpolate(%s): %s", ss.str(), _("missing arguments"));
509
IF_VERBOSE_ASCODING_ERRORS(
512
std::stringstream ss; fn.dump_args(ss);
513
log_aserror("Point.interpolate(%s): %s", ss.str(), _("arguments after first three discarded"));
517
const as_value& p0val = fn.arg(0);
518
as_object* p0 = p0val.to_object().get();
521
IF_VERBOSE_ASCODING_ERRORS(
522
std::stringstream ss; fn.dump_args(ss);
523
log_aserror("Point.interpolate(%s): %s", ss.str(), _("first argument doesn't cast to object"));
528
p0->get_member(NSV::PROP_X, &x0val);
529
p0->get_member(NSV::PROP_Y, &y0val);
532
const as_value& p1val = fn.arg(1);
533
as_object* p1 = p1val.to_object().get();
536
IF_VERBOSE_ASCODING_ERRORS(
537
std::stringstream ss; fn.dump_args(ss);
538
log_aserror("Point.interpolate(%s): %s", ss.str(), _("second argument doesn't cast to object"));
543
p1->get_member(NSV::PROP_X, &x1val);
544
p1->get_member(NSV::PROP_Y, &y1val);
551
double x0 = x0val.to_number();
552
double y0 = y0val.to_number();
553
double x1 = x1val.to_number();
554
double y1 = y1val.to_number();
555
double mu = muval.to_number();
557
// newX = b.x + ( muval * (a.x - b.x) );
558
// newY = b.y + ( muval * (a.y - b.y) );
560
as_value xoff = mu * (x0 - x1);
561
as_value yoff = mu * (y0 - y1);
563
//log_debug("xoff:%s, yoff:%s, x1val:%s, y1val:%s", xoff, yoff, x1val, y1val);
565
as_value x = x1val; // copy to avoid changing stack value
567
as_value y = y1val; // copy to avoid changing stack value
570
boost::intrusive_ptr<as_object> ret = new Point_as;
571
ret->set_member(NSV::PROP_X, as_value(x));
572
ret->set_member(NSV::PROP_Y, as_value(y));
574
return as_value(ret.get());
509
IF_VERBOSE_ASCODING_ERRORS(
510
std::stringstream ss; fn.dump_args(ss);
511
log_aserror("Point.interpolate(%s): %s", ss.str(), _("missing arguments"));
516
IF_VERBOSE_ASCODING_ERRORS(
519
std::stringstream ss; fn.dump_args(ss);
520
log_aserror("Point.interpolate(%s): %s", ss.str(), _("arguments after first three discarded"));
524
const as_value& p0val = fn.arg(0);
525
as_object* p0 = p0val.to_object(*getGlobal(fn)).get();
528
IF_VERBOSE_ASCODING_ERRORS(
529
std::stringstream ss; fn.dump_args(ss);
530
log_aserror("Point.interpolate(%s): %s", ss.str(), _("first argument doesn't cast to object"));
535
p0->get_member(NSV::PROP_X, &x0val);
536
p0->get_member(NSV::PROP_Y, &y0val);
539
const as_value& p1val = fn.arg(1);
540
as_object* p1 = p1val.to_object(*getGlobal(fn)).get();
543
IF_VERBOSE_ASCODING_ERRORS(
544
std::stringstream ss; fn.dump_args(ss);
545
log_aserror("Point.interpolate(%s): %s", ss.str(), _("second argument doesn't cast to object"));
550
p1->get_member(NSV::PROP_X, &x1val);
551
p1->get_member(NSV::PROP_Y, &y1val);
558
double x0 = x0val.to_number();
559
double y0 = y0val.to_number();
560
double x1 = x1val.to_number();
561
double y1 = y1val.to_number();
562
double mu = muval.to_number();
564
// newX = b.x + ( muval * (a.x - b.x) );
565
// newY = b.y + ( muval * (a.y - b.y) );
567
as_value xoff = mu * (x0 - x1);
568
as_value yoff = mu * (y0 - y1);
570
//log_debug("xoff:%s, yoff:%s, x1val:%s, y1val:%s", xoff, yoff, x1val, y1val);
572
as_value x = x1val; // copy to avoid changing stack value
574
as_value y = y1val; // copy to avoid changing stack value
577
boost::intrusive_ptr<as_object> ret = new Point_as;
578
ret->set_member(NSV::PROP_X, as_value(x));
579
ret->set_member(NSV::PROP_Y, as_value(y));
581
return as_value(ret.get());
578
585
Point_polar(const fn_call& fn)
580
as_value lval; // length
581
as_value aval; // angle (radians)
586
if ( fn.nargs > 1 ) aval=fn.arg(1);
589
IF_VERBOSE_ASCODING_ERRORS(
590
std::stringstream ss; fn.dump_args(ss);
591
log_aserror("Point.polar(%s): %s", ss.str(), _("missing arguments"));
597
IF_VERBOSE_ASCODING_ERRORS(
598
std::stringstream ss; fn.dump_args(ss);
599
log_aserror("Point.polar(%s): %s", ss.str(), _("missing arguments"));
603
double len = lval.to_number();
604
double angle = aval.to_number();
606
double x = len * std::cos(angle);
607
double y = len * std::sin(angle);
611
boost::intrusive_ptr<as_object> obj = new Point_as;
613
obj->set_member(NSV::PROP_X, x);
614
obj->set_member(NSV::PROP_Y, y);
616
return as_value(obj.get());
587
as_value lval; // length
588
as_value aval; // angle (radians)
593
if ( fn.nargs > 1 ) aval=fn.arg(1);
596
IF_VERBOSE_ASCODING_ERRORS(
597
std::stringstream ss; fn.dump_args(ss);
598
log_aserror("Point.polar(%s): %s", ss.str(), _("missing arguments"));
604
IF_VERBOSE_ASCODING_ERRORS(
605
std::stringstream ss; fn.dump_args(ss);
606
log_aserror("Point.polar(%s): %s", ss.str(), _("missing arguments"));
610
double len = lval.to_number();
611
double angle = aval.to_number();
613
double x = len * std::cos(angle);
614
double y = len * std::sin(angle);
618
boost::intrusive_ptr<as_object> obj = new Point_as;
620
obj->set_member(NSV::PROP_X, x);
621
obj->set_member(NSV::PROP_Y, y);
623
return as_value(obj.get());
621
628
Point_ctor(const fn_call& fn)
623
boost::intrusive_ptr<as_object> obj = new Point_as;
637
if ( fn.nargs < 2 ) break;
639
if ( fn.nargs < 3 ) break;
640
IF_VERBOSE_ASCODING_ERRORS(
641
std::stringstream ss;
643
log_aserror("flash.geom.Point(%s): %s", ss.str(), _("arguments after the first two discarded"));
648
obj->set_member(NSV::PROP_X, x);
649
obj->set_member(NSV::PROP_Y, y);
651
return as_value(obj.get()); // will keep alive
655
as_function* getFlashGeomPointConstructor()
657
static builtin_function* cl=NULL;
660
cl=new builtin_function(&Point_ctor, getPointInterface());
661
VM::get().addStatic(cl);
662
attachPointStaticProperties(*cl);
667
static as_value get_flash_geom_point_constructor(const fn_call& /*fn*/)
669
log_debug("Loading flash.geom.Point class");
671
return getFlashGeomPointConstructor();
674
boost::intrusive_ptr<as_object> init_Point_instance()
676
return boost::intrusive_ptr<as_object>(new Point_as);
680
void Point_class_init(as_object& where)
682
// Register _global.Point
683
string_table& st = where.getVM().getStringTable();
684
where.init_destructive_property(st.find("Point"), get_flash_geom_point_constructor);
630
boost::intrusive_ptr<as_object> obj = new Point_as;
644
if ( fn.nargs < 2 ) break;
646
if ( fn.nargs < 3 ) break;
647
IF_VERBOSE_ASCODING_ERRORS(
648
std::stringstream ss;
650
log_aserror("flash.geom.Point(%s): %s", ss.str(), _("arguments after the first two discarded"));
655
obj->set_member(NSV::PROP_X, x);
656
obj->set_member(NSV::PROP_Y, y);
658
return as_value(obj.get()); // will keep alive
663
getFlashGeomPointConstructor(const fn_call& fn)
665
as_value point(fn.env().find_object("flash.geom.Point"));
666
return point.to_as_function();
670
as_value get_flash_geom_point_constructor(const fn_call& fn)
672
log_debug("Loading flash.geom.Point class");
673
Global_as* gl = getGlobal(fn);
674
as_object* proto = getPointInterface();
675
as_object* cl = gl->createClass(&Point_ctor, proto);
676
attachPointStaticProperties(*cl);
682
point_class_init(as_object& where, const ObjectURI& uri)
684
// TODO: this may not be correct, but it should be enumerable.
686
where.init_destructive_property(getName(uri),
687
get_flash_geom_point_constructor, flags, getNamespace(uri));
687
690
} // end of gnash namespace