1 /**
  2  * The MIT License (MIT)
  3  *
  4  * Copyright (c) 2016 DeNA Co., Ltd.
  5  *
  6  * Permission is hereby granted, free of charge, to any person obtaining a copy
  7  * of this software and associated documentation files (the "Software"), to deal
  8  * in the Software without restriction, including without limitation the rights
  9  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 10  * copies of the Software, and to permit persons to whom the Software is
 11  * furnished to do so, subject to the following conditions:
 12  *
 13  * The above copyright notice and this permission notice shall be included in
 14  * all copies or substantial portions of the Software.
 15  *
 16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 17  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 18  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 19  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 20  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 21  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 22  * SOFTWARE.
 23  */
 24 
 25 /// <reference path="base.js"/>
 26 /// <reference path="graphics.js"/>
 27 
 28 /**
 29  * An interface used by the createjs.Tween object to change properties of a
 30  * target object.
 31  * @interface
 32  */
 33 createjs.TweenTarget = function() {};
 34 
 35 /**
 36  * Play modes of the tweens attached to a target object.
 37  * @enum {number}
 38  */
 39 createjs.TweenTarget.PlayMode = {
 40   INDEPENDENT: 0,
 41   SINGLE: 1,
 42   SYNCHED: 2
 43 };
 44 
 45 /**
 46  * Orientations used by the createjs.TweenTarget.RotationProperty class.
 47  * @enum {number}
 48  */
 49 createjs.TweenTarget.Orientation = {
 50   NONE: 0,
 51   FIXED: 1,
 52   AUTO: 2,
 53   CLOCKWISE: 3,
 54   COUNTERCLOCKWISE: 4
 55 };
 56 
 57 /**
 58  * An abstract class that changes a property of a createjs.TweenTarget object.
 59  * @constructor
 60  */
 61 createjs.TweenTarget.Property = function() {
 62 };
 63 
 64 /**
 65  * Whether this property is a number property.
 66  * @type {number}
 67  * @private
 68  */
 69 createjs.TweenTarget.Property.prototype.isNumber_ = 0;
 70 
 71 /**
 72  * Sets an interpolated value to the specified createjs.TweenTarget object.
 73  * @param {createjs.TweenTarget} target
 74  * @param {createjs.TweenTarget} proxy
 75  * @param {number} ratio
 76  * @param {createjs.TweenTarget.Property.Listener} listener
 77  * @param {number} position
 78  * @param {Array.<createjs.TweenTarget>} targets
 79  */
 80 createjs.TweenTarget.Property.prototype.setValue =
 81     function(target, proxy, ratio, listener, position, targets) {
 82   /// <param type="createjs.TweenTarget" name="target"/>
 83   /// <param type="createjs.TweenTarget" name="proxy"/>
 84   /// <param type="number" name="ratio"/>
 85   /// <param type="createjs.TweenTarget.Property.Listener" name="listener"/>
 86   /// <param type="number" name="position"/>
 87   /// <param type="Array" elementType="createjs.TweenTarget" name="targets"/>
 88 };
 89 
 90 /**
 91  * Returns whether this property is a number property.
 92  * @return {number}
 93  * @const
 94  */
 95 createjs.TweenTarget.Property.prototype.isNumber = function() {
 96   /// <returns type="number"/>
 97   return this.isNumber_;
 98 };
 99 
100 /**
101  * Returns a clone of this property.
102  * @param {createjs.TweenTarget} target
103  * @param {Array.<createjs.TweenTarget>} targets
104  * @param {*=} opt_value
105  * @return {createjs.TweenTarget.Property}
106  */
107 createjs.TweenTarget.Property.prototype.clone = function(target, targets, opt_value) {
108   /// <param type="createjs.TweenTarget" name="target"/>
109   /// <param type="Array" elementType="createjs.TweenTarget" name="targets"/>
110   /// <param optional="true" name="opt_value"/>
111   /// <returns type="createjs.TweenTarget.Property"/>
112   return null;
113 };
114 
115 /**
116  * Interpolates this property with the specified value and returns a clone.
117  * @param {*} value
118  * @param {number} t0
119  * @param {number} t1
120  * @return {createjs.TweenTarget.Property}
121  */
122 createjs.TweenTarget.Property.prototype.interpolate = function(value, t0, t1) {
123   /// <param name="value"/>
124   /// <param type="number" name="t0"/>
125   /// <param type="number" name="t1"/>
126   return this.clone(null, null);
127 };
128 
129 /**
130  * An interface that listens events from createjs.TweenTarget.Property objects.
131  * @interface
132  */
133 createjs.TweenTarget.Property.Listener = function() {};
134 
135 /**
136  * Called when a createjs.TweenTarget.LoopProperty object changes its value.
137  * @param {boolean} value
138  */
139 createjs.TweenTarget.Property.Listener.prototype.handleLoopChanged =
140     function(value) {};
141 
142 /**
143  * A class that encapsulates a setter function for a property of a
144  * createjs.TweenTarget.Property object. This class is used for creating
145  * createjs.TweenTarget.Property objects.
146  * @param {Function} setter
147  * @constructor
148  */
149 createjs.TweenTarget.Setter = function(setter) {
150   /**
151    * The setter function.
152    * @const {Function}
153    * @private
154    */
155   this.fn_ = setter;
156 };
157 
158 /**
159  * Whether this setter sets a number property.
160  * @const {number}
161  * @private
162  */
163 createjs.TweenTarget.Setter.NUMBER_ = 0;
164 
165 /**
166  * Whether this setter sets a boolean property.
167  * @const {number}
168  * @private
169  */
170 createjs.TweenTarget.Setter.BOOLEAN_ = 1;
171 
172 /**
173  * Whether this setter sets a string property.
174  * @const {number}
175  * @private
176  */
177 createjs.TweenTarget.Setter.STRING_ = 2;
178 
179 /**
180  * Whether this setter sets a loop property.
181  * @const {number}
182  * @private
183  */
184 createjs.TweenTarget.Setter.LOOP_ = 3;
185 
186 /**
187  * Whether this setter sets a Graphics property.
188  * @const {number}
189  * @private
190  */
191 createjs.TweenTarget.Setter.GRAPHICS_ = 4;
192 
193 /**
194  * Whether this setter sets a startPosition property.
195  * @const {number}
196  * @private
197  */
198 createjs.TweenTarget.Setter.POSITION_ = 5;
199 
200 /**
201  * The type of properties created with this setter.
202  * @type {number}
203  * @private
204  */
205 createjs.TweenTarget.Setter.prototype.type_ = -1;
206 
207 /**
208  * The start value for number properties created with this setter.
209  * @type {number}
210  * @private
211  */
212 createjs.TweenTarget.Setter.prototype.number_ = 0;
213 
214 /**
215  * The start value for boolean properties created with this setter.
216  * @type {boolean}
217  * @private
218  */
219 createjs.TweenTarget.Setter.prototype.bool_ = false;
220 
221 /**
222  * The start value for string properties created with this setter.
223  * @type {string}
224  * @private
225  */
226 createjs.TweenTarget.Setter.prototype.text_ = '';
227 
228 /**
229  * The start value for Graphics properties created with this setter.
230  * @type {createjs.Graphics}
231  * @private
232  */
233 createjs.TweenTarget.Setter.prototype.graphics_ = null;
234 
235 /**
236  * Disables this setter.
237  * @const
238  */
239 createjs.TweenTarget.Setter.prototype.setNull = function() {
240   this.type_ = -1;
241 };
242 
243 /**
244  * Sets the start value for number properties created with this setter.
245  * @param {number} value
246  * @const
247  */
248 createjs.TweenTarget.Setter.prototype.setNumber = function(value) {
249   /// <param type="number" name="value"/>
250   this.type_ = createjs.TweenTarget.Setter.NUMBER_;
251   this.number_ = value;
252 };
253 
254 /**
255  * Sets the start value for boolean properties created with this setter.
256  * @param {boolean} value
257  * @const
258  */
259 createjs.TweenTarget.Setter.prototype.setBoolean = function(value) {
260   /// <param type="boolean" name="value"/>
261   this.type_ = createjs.TweenTarget.Setter.BOOLEAN_;
262   this.bool_ = value;
263 };
264 
265 /**
266  * Sets the start value for string properties created with this setter.
267  * @param {string} value
268  * @const
269  */
270 createjs.TweenTarget.Setter.prototype.setString = function(value) {
271   /// <param type="string" name="value"/>
272   this.type_ = createjs.TweenTarget.Setter.STRING_;
273   this.text_ = value;
274 };
275 
276 /**
277  * Sets the start value for 'loop' properties created with this setter.
278  * @param {boolean} value
279  * @const
280  */
281 createjs.TweenTarget.Setter.prototype.setLoop = function(value) {
282   /// <param type="boolean" name="value"/>
283   this.type_ = createjs.TweenTarget.Setter.LOOP_;
284   this.bool_ = value;
285 };
286 
287 /**
288  * Sets the start value for Graphics properties created with this setter.
289  * @param {createjs.Graphics} value
290  * @const
291  */
292 createjs.TweenTarget.Setter.prototype.setGraphics = function(value) {
293   /// <param type="createjs.Graphics" name="value"/>
294   this.type_ = createjs.TweenTarget.Setter.GRAPHICS_;
295   this.graphics_ = value;
296 };
297 
298 /**
299  * Sets the start value for startPosition properties created with this setter.
300  * @param {number} value
301  * @const
302  */
303 createjs.TweenTarget.Setter.prototype.setPosition = function(value) {
304   /// <param type="number" name="value"/>
305   this.type_ = createjs.TweenTarget.Setter.POSITION_;
306   this.number_ = value;
307 };
308 
309 /**
310  * A mapping from a string key to its setter function.
311  * @const {Object.<string,createjs.TweenTarget.Setter>}
312  * @private
313  */
314 createjs.TweenTarget.Property.setters_ = {
315 };
316 
317 /**
318  * A class that changes a property of a createjs.TweenTarget object. This class
319  * is used by the createjs.TweenTarget.StateProperty class to set Object
320  * properties.
321  * @param {Function} setter
322  * @param {*} value
323  * @constructor
324  */
325 createjs.TweenTarget.ValueProperty = function(setter, value) {
326   /**
327    * The function that changes this property.
328    * @const {Function}
329    * @private
330    */
331   this.setter_ = setter;
332 
333   /**
334    * The value of this property.
335    * @const {*}
336    * @private
337    */
338   this.value_ = value;
339 };
340 
341 /**
342  * Creates a list of createjs.TweenTarget.ValueProperty objects from an Object
343  * property.
344  * @param {Object} properties
345  * @return {Array.<createjs.TweenTarget.ValueProperty>}
346  */
347 createjs.TweenTarget.ValueProperty.get = function(properties) {
348   /// <param type="Object" name="properties"/>
349   /// <returns type="Array" elementType="createjs.TweenTarget.ValueProperty"/>
350   var values = [];
351   for (var key in properties) {
352     var setter = createjs.TweenTarget.Property.setters_[key];
353     if (setter) {
354       values.push(new createjs.TweenTarget.ValueProperty(
355           setter.fn_, properties[key]));
356     }
357   }
358   return values;
359 };
360 
361 /**
362  * Sets a property value for the specified createjs.TweenTarget object.
363  * @param {createjs.TweenTarget} target
364  */
365 createjs.TweenTarget.ValueProperty.prototype.setValue = function(target) {
366   /// <param type="createjs.TweenTarget" name="target"/>
367   this.setter_.call(target, this.value_);
368 };
369 
370 /**
371  * A class that changes a number property of a createjs.TweenTarget object.
372  * @param {function(number)} setter
373  * @param {number} start
374  * @param {number} end
375  * @extends {createjs.TweenTarget.Property}
376  * @constructor
377  */
378 createjs.TweenTarget.NumberProperty = function(setter, start, end) {
379   createjs.TweenTarget.Property.call(this);
380 
381   /**
382    * The function that changes this property.
383    * @const {function(number)}
384    * @private
385    */
386   this.setter_ = setter;
387 
388   /**
389    * The start value of this property.
390    * @const {number}
391    * @private
392    */
393   this.start_ = start;
394 
395   /**
396    * The end value of this property.
397    * @const {number}
398    * @private
399    */
400   this.end_ = end;
401 };
402 createjs.inherits('TweenTarget.NumberProperty',
403                   createjs.TweenTarget.NumberProperty,
404                   createjs.TweenTarget.Property);
405 
406 /**
407  * Creates a new createjs.TweenTarget.NumberProperty object.
408  * @param {function(number)} setter
409  * @param {number} start
410  * @return {createjs.TweenTarget.NumberProperty}
411  * @const
412  */
413 createjs.TweenTarget.NumberProperty.get = function(setter, start) {
414   /// <param type="Function" name="setter"/>
415   /// <param type="number" name="start"/>
416   /// <returns type="createjs.TweenTarget.NumberProperty"/>
417   return new createjs.TweenTarget.NumberProperty(setter, start, start);
418 };
419 
420 /**
421  * Creates a copy of the specified createjs.TweenTarget.NumberProperty object.
422  * @param {createjs.TweenTarget.NumberProperty} property
423  * @param {number} end
424  * @return {createjs.TweenTarget.NumberProperty}
425  * @const
426  */
427 createjs.TweenTarget.NumberProperty.clone = function(property, end) {
428   /// <param type="createjs.TweenTarget.NumberProperty" name="property"/>
429   /// <param type="number" name="end"/>
430   /// <returns type="createjs.TweenTarget.NumberProperty"/>
431   return new createjs.TweenTarget.NumberProperty(property.setter_, end, end);
432 };
433 
434 /** @override */
435 createjs.TweenTarget.NumberProperty.prototype.isNumber_ = 1;
436 
437 /** @override */
438 createjs.TweenTarget.NumberProperty.prototype.setValue =
439     function(target, proxy, ratio, listener, position, targets) {
440   /// <param type="createjs.TweenTarget" name="target"/>
441   /// <param type="createjs.TweenTarget" name="proxy"/>
442   /// <param type="number" name="ratio"/>
443   /// <param type="createjs.TweenTarget.Property.Listener" name="listener"/>
444   /// <param type="number" name="position"/>
445   /// <param type="Array" elementType="createjs.TweenTarget" name="targets"/>
446   this.setter_.call(target, this.start_ + (this.end_ - this.start_) * ratio);
447 };
448 
449 /** @override */
450 createjs.TweenTarget.NumberProperty.prototype.clone =
451     function(target, targets, opt_value) {
452   /// <param type="createjs.TweenTarget" name="target"/>
453   /// <param type="Array" elementType="createjs.TweenTarget" name="targets"/>
454   /// <param type="number" name="opt_value"/>
455   /// <returns type="createjs.TweenTarget.NumberProperty"/>
456   if (opt_value == null) {
457     if (this.start_ == this.end_) {
458       return this;
459     }
460     opt_value = this.end_;
461   }
462   var end = createjs.getNumber(opt_value);
463   return new createjs.TweenTarget.NumberProperty(this.setter_, this.end_, end);
464 };
465 
466 /** @override */
467 createjs.TweenTarget.NumberProperty.prototype.interpolate =
468     function(value, t0, t1) {
469   /// <param type="number" name="value"/>
470   /// <param type="number" name="t0"/>
471   /// <param type="number" name="t1"/>
472   /// <returns type="createjs.TweenTarget.NumberProperty"/>
473   if (value == null) {
474     return this.clone(null, null);
475   }
476   var difference = createjs.getNumber(value) - this.end_;
477   var start = this.end_ + difference * t0;
478   var end = this.end_ + difference * t1;
479   return new createjs.TweenTarget.NumberProperty(this.setter_, start, end);
480 };
481 
482 /**
483  * A class that changes the position of a createjs.TweenTarget object so it
484  * moves along the specified quadratic-Bezier path.
485  * @param {createjs.TweenTarget.NumberProperty} x
486  * @param {createjs.TweenTarget.NumberProperty} y
487  * @param {Array.<number>} path
488  * @param {number} index
489  * @param {number} start
490  * @param {number} step
491  * @extends {createjs.TweenTarget.Property}
492  * @constructor
493  */
494 createjs.TweenTarget.PathProperty =
495     function(x, y, path, index, start, step) {
496   createjs.TweenTarget.Property.call(this);
497 
498   /**
499    * The function that changes an 'x' property.
500    * @const {function(number)}
501    * @private
502    */
503   this.setX_ = x.setter_;
504 
505   /**
506    * The function that changes a 'y' property.
507    * @const {function(number)}
508    * @private
509    */
510   this.setY_ = y.setter_;
511 
512   /**
513    * The first value of the x property.
514    * @const {number}
515    * @private
516    */
517   this.x0_ = path[index];
518 
519   /**
520    * The first value of the y property.
521    * @const {number}
522    * @private
523    */
524   this.y0_ = path[index + 1];
525 
526   /**
527    * The second value of the x property.
528    * @const {number}
529    * @private
530    */
531   this.x1_ = path[index + 2];
532 
533   /**
534    * The second value of this property.
535    * @const {number}
536    * @private
537    */
538   this.y1_ = path[index + 3];
539 
540   /**
541    * The third value of this property.
542    * @const {number}
543    * @private
544    */
545   this.x2_ = path[index + 4];
546 
547   /**
548    * The third value of this property.
549    * @const {number}
550    * @private
551    */
552   this.y2_ = path[index + 5];
553 
554   /**
555    * The start position in this path.
556    * @const {number}
557    * @private
558    */
559   this.start_ = start;
560 
561   /**
562    * The step length of this path.
563    * @const {number}
564    * @private
565    */
566   this.step_ = step;
567 };
568 createjs.inherits('TweenTarget.PathProperty',
569                   createjs.TweenTarget.PathProperty,
570                   createjs.TweenTarget.Property);
571 
572 /**
573  * Creates a new createjs.TweenTarget.PathProperty object.
574  * @param {createjs.TweenTarget.NumberProperty} x
575  * @param {createjs.TweenTarget.NumberProperty} y
576  * @param {Array.<number>} path
577  * @param {number} index
578  * @param {number} start
579  * @param {number} step
580  * @return {createjs.TweenTarget.PathProperty}
581  * @const
582  */
583 createjs.TweenTarget.PathProperty.get =
584     function(x, y, path, index, start, step) {
585   /// <param type="createjs.TweenTarget.NumberProperty" name="x"/>
586   /// <param type="createjs.TweenTarget.NumberProperty" name="y"/>
587   /// <param type="Array" elementType="number" name="path"/>
588   /// <param type="number" name="index"/>
589   /// <param type="number" name="start"/>
590   /// <param type="number" name="step"/>
591   /// <returns type="createjs.TweenTarget.GuideProperty"/>
592   return new createjs.TweenTarget.PathProperty(
593       x, y, path, index, start, step);
594 };
595 
596 /** @override */
597 createjs.TweenTarget.PathProperty.prototype.setValue =
598     function(target, proxy, ratio, listener, position, targets) {
599   /// <param type="createjs.TweenTarget" name="target"/>
600   /// <param type="createjs.TweenTarget" name="proxy"/>
601   /// <param type="number" name="ratio"/>
602   /// <param type="createjs.TweenTarget.Property.Listener" name="listener"/>
603   /// <param type="number" name="position"/>
604   /// <param type="Array" elementType="createjs.TweenTarget" name="targets"/>
605   var t = this.start_ + ratio * this.step_;
606   var t_ = 1 - t;
607   var t0 = t_ * t_;
608   var t1 = 2 * t_ * t;
609   var t2 = t * t;
610   var x = t0 * this.x0_ + t1 * this.x1_ + t2 * this.x2_;
611   var y = t0 * this.y0_ + t1 * this.y1_ + t2 * this.y2_;
612   this.setX_.call(target, x);
613   this.setY_.call(target, y);
614 };
615 
616 /**
617  * A class that changes the angle of a createjs.TweenTarget object so it faces
618  * to the tangent of the specified quadratic-Bezier path.
619  * @param {createjs.TweenTarget.NumberProperty} rotation
620  * @param {Array.<number>} path
621  * @param {number} index
622  * @param {number} start
623  * @param {number} step
624  * @param {number} offset
625  * @param {number} delta
626  * @extends {createjs.TweenTarget.Property}
627  * @constructor
628  */
629 createjs.TweenTarget.RotationProperty =
630     function(rotation, path, index, start, step, offset, delta) {
631   /**
632    * The function that changes a 'rotation' property.
633    * @const {function(number)}
634    * @private
635    */
636   this.setter_ = rotation.setter_;
637 
638   /**
639    * The x value of the first vector.
640    * @const {number}
641    * @private
642    */
643   this.x0_ = path[index + 2] - path[index + 0];
644 
645   /**
646    * The y value of the first vector.
647    * @const {number}
648    * @private
649    */
650   this.y0_ = path[index + 3] - path[index + 1];
651 
652   /**
653    * The x value or the second vector.
654    * @const {number}
655    * @private
656    */
657   this.x1_ = path[index + 4] - path[index + 2];
658 
659   /**
660    * The y value of the second vector.
661    * @const {number}
662    * @private
663    */
664   this.y1_ = path[index + 5] - path[index + 3];
665 
666   /**
667    * The start position in this path.
668    * @const {number}
669    * @private
670    */
671   this.start_ = start;
672 
673   /**
674    * The step length of this path.
675    * @const {number}
676    * @private
677    */
678   this.step_ = step;
679 
680   /**
681    * The angle offset to be added to calculated ones.
682    * @const {number}
683    * @private
684    */
685   this.offset_ = rotation.end_ - offset;
686 
687   /**
688    * The delta angle to be added to calculated ones.
689    * @const {number}
690    * @private
691    */
692   this.delta_ = delta;
693 };
694 createjs.inherits('TweenTarget.RotationProperty',
695                   createjs.TweenTarget.RotationProperty,
696                   createjs.TweenTarget.Property);
697 
698 /**
699  * Creates a new createjs.TweenTarget.RotationProperty object.
700  * @param {createjs.TweenTarget.NumberProperty} rotation
701  * @param {Array.<number>} path
702  * @param {number} index
703  * @param {number} start
704  * @param {number} step
705  * @param {number} orientation
706  * @param {number} offset
707  * @return {createjs.TweenTarget.RotationProperty}
708  * @const
709  */
710 createjs.TweenTarget.RotationProperty.get =
711     function(rotation, path, index, start, step, orientation, offset) {
712   /// <param type="createjs.TweenTarget.NumberProperty" name="rotation"/>
713   /// <param type="Array" elementType="number" name="path"/>
714   /// <param type="number" name="index"/>
715   /// <param type="number" name="start"/>
716   /// <param type="number" name="step"/>
717   /// <param type="number" name="orientation"/>
718   /// <param type="number" name="offset"/>
719   /// <returns type="createjs.TweenTarget.RotationProperty"/>
720   var delta = 0;
721   if (orientation != createjs.TweenTarget.Orientation.FIXED) {
722     var angle0 = createjs.atan2(path[index + 2] - path[index],
723                                 path[index + 3] - path[index + 1]);
724     var angle1 = createjs.atan2(path[index + 4] - path[index + 2],
725                                 path[index + 5] - path[index + 3]);
726     delta = angle1 - angle0;
727     if (orientation == createjs.TweenTarget.Orientation.COUNTERCLOCKWISE) {
728       if (delta > 0) {
729         delta -= 360;
730       }
731     } else if (orientation == createjs.TweenTarget.Orientation.CLOCKWISE) {
732       if (delta < 0) {
733         delta += 360;
734       }
735     } else {
736       if (delta > 180) {
737         delta -= 360;
738       } else if (delta < -180) {
739         delta += 360;
740       }
741     }
742   }
743   return new createjs.TweenTarget.RotationProperty(
744       rotation, path, index, start, step, offset, delta);
745 };
746 
747 /**
748  * Retrieves an angle offset. This method is used for creating a list of
749  * createjs.TweenTarget.RotationProperty objects from a path.
750  * @param {Array.<number>} path
751  * @param {number} index
752  * @return {number}
753  */
754 createjs.TweenTarget.RotationProperty.getOffset = function(path, index) {
755   /// <param type="Array" elementType="number" name="path"/>
756   /// <param type="number" name="index"/>
757   /// <returns type="number"/>
758   return createjs.atan2(path[index + 3] - path[index + 1],
759                         path[index + 2] - path[index]);
760 };
761 
762 /** @override */
763 createjs.TweenTarget.RotationProperty.prototype.setValue =
764     function(target, proxy, ratio, listener, position, targets) {
765   /// <param type="createjs.TweenTarget" name="target"/>
766   /// <param type="createjs.TweenTarget" name="proxy"/>
767   /// <param type="number" name="ratio"/>
768   /// <param type="createjs.TweenTarget.Property.Listener" name="listener"/>
769   /// <param type="number" name="position"/>
770   /// <param type="Array" elementType="createjs.TweenTarget" name="targets"/>
771   var t = this.start_ + ratio * this.step_;
772   var t_ = 1 - t;
773   var x = t_ * this.x0_ + t * this.x1_;
774   var y = t_ * this.y0_ + t * this.y1_;
775   var rotation = createjs.atan2(y, x) + this.offset_ + this.delta_ * t;
776   this.setter_.call(target, rotation);
777 };
778 
779 /**
780  * A class that changes a boolean property of a createjs.TweenTarget object.
781  * @param {function(boolean)} setter
782  * @param {boolean} start
783  * @param {boolean} end
784  * @extends {createjs.TweenTarget.Property}
785  * @constructor
786  */
787 createjs.TweenTarget.BooleanProperty = function(setter, start, end) {
788   createjs.TweenTarget.Property.call(this);
789 
790   /**
791    * The function that changes this property.
792    * @const {function(boolean)}
793    * @private
794    */
795   this.setter_ = setter;
796 
797   /**
798    * The start value of this property.
799    * @const {boolean}
800    * @private
801    */
802   this.start_ = start;
803 
804   /**
805    * The end value of this property.
806    * @const {boolean}
807    * @private
808    */
809   this.end_ = end;
810 };
811 createjs.inherits('TweenTarget.BooleanProperty',
812                   createjs.TweenTarget.BooleanProperty,
813                   createjs.TweenTarget.Property);
814 
815 /**
816  * Creates a new createjs.TweenTarget.BooleanProperty object.
817  * @param {function(boolean)} setter
818  * @param {boolean} start
819  * @return {createjs.TweenTarget.BooleanProperty}
820  * @const
821  */
822 createjs.TweenTarget.BooleanProperty.get = function(setter, start) {
823   /// <param type="Function" name="setter"/>
824   /// <param type="boolean" name="start"/>
825   /// <returns type="createjs.TweenTarget.BooleanProperty"/>
826   return new createjs.TweenTarget.BooleanProperty(setter, start, start);
827 };
828 
829 /**
830  * Retrieves the interpolated value.
831  * @param {number} ratio
832  * @return {boolean}
833  * @protected
834  */
835 createjs.TweenTarget.BooleanProperty.prototype.getBoolean = function(ratio) {
836   return (ratio == 1) ? this.end_ : this.start_;
837 };
838 
839 /** @override */
840 createjs.TweenTarget.BooleanProperty.prototype.setValue =
841     function(target, proxy, ratio, listener, position, targets) {
842   /// <param type="createjs.TweenTarget" name="target"/>
843   /// <param type="createjs.TweenTarget" name="proxy"/>
844   /// <param type="number" name="ratio"/>
845   /// <param type="createjs.TweenTarget.Property.Listener" name="listener"/>
846   /// <param type="number" name="position"/>
847   /// <param type="Array" elementType="createjs.TweenTarget" name="targets"/>
848   this.setter_.call(target, this.getBoolean(ratio));
849 };
850 
851 /** @override */
852 createjs.TweenTarget.BooleanProperty.prototype.clone =
853     function(target, targets, opt_value) {
854   /// <param type="createjs.TweenTarget" name="target"/>
855   /// <param type="Array" elementType="createjs.TweenTarget" name="targets"/>
856   /// <param type="boolean" name="opt_value"/>
857   /// <returns type="createjs.TweenTarget.BooleanProperty"/>
858   if (opt_value == null) {
859     if (this.start_ == this.end_) {
860       return this;
861     }
862     opt_value = this.end_;
863   }
864   var end = createjs.getBoolean(opt_value);
865   return new createjs.TweenTarget.BooleanProperty(this.setter_, this.end_, end);
866 };
867 
868 /**
869  * A class that changes a string property of a createjs.TweenTarget object.
870  * @param {Function} setter
871  * @param {string} start
872  * @param {string} end
873  * @extends {createjs.TweenTarget.Property}
874  * @constructor
875  */
876 createjs.TweenTarget.StringProperty = function(setter, start, end) {
877   createjs.TweenTarget.Property.call(this);
878 
879   /**
880    * The function that changes this property.
881    * @const {Function}
882    * @private
883    */
884   this.setter_ = setter;
885 
886   /**
887    * The start value of this property.
888    * @const {string}
889    * @private
890    */
891   this.start_ = start;
892 
893   /**
894    * The end value of this property.
895    * @const {string}
896    * @private
897    */
898   this.end_ = end;
899 };
900 createjs.inherits('TweenTarget.StringProperty',
901                   createjs.TweenTarget.StringProperty,
902                   createjs.TweenTarget.Property);
903 
904 /**
905  * Creates a new createjs.TweenTarget.StringProperty object.
906  * @param {Function} setter
907  * @param {string} start
908  * @return {createjs.TweenTarget.StringProperty}
909  * @const
910  */
911 createjs.TweenTarget.StringProperty.get = function(setter, start) {
912   /// <param type="number" name="key"/>
913   /// <param type="Function" name="setter"/>
914   /// <param type="string" name="start"/>
915   /// <returns type="createjs.TweenTarget.StringProperty"/>
916   return new createjs.TweenTarget.StringProperty(setter, start, start);
917 };
918 
919 /** @override */
920 createjs.TweenTarget.StringProperty.prototype.setValue =
921     function(target, proxy, ratio, listener, position, targets) {
922   /// <param type="createjs.TweenTarget" name="target"/>
923   /// <param type="createjs.TweenTarget" name="proxy"/>
924   /// <param type="number" name="ratio"/>
925   /// <param type="createjs.TweenTarget.Property.Listener" name="listener"/>
926   /// <param type="number" name="position"/>
927   /// <param type="Array" elementType="createjs.TweenTarget" name="targets"/>
928   this.setter_.call(target, (ratio == 1) ? this.end_ : this.start_, proxy);
929 };
930 
931 /** @override */
932 createjs.TweenTarget.StringProperty.prototype.clone =
933     function(target, targets, opt_value) {
934   /// <param type="createjs.TweenTarget" name="target"/>
935   /// <param type="Array" elementType="createjs.TweenTarget" name="targets"/>
936   /// <param type="string" name="value"/>
937   /// <returns type="createjs.TweenTarget.StringProperty"/>
938   if (opt_value == null) {
939     if (this.start_ == this.end_) {
940       return this;
941     }
942     opt_value = this.end_;
943   }
944   var end = createjs.getString(opt_value);
945   return new createjs.TweenTarget.StringProperty(this.setter_, this.end_, end);
946 };
947 
948 /**
949  * A class that changes a loop property of a createjs.MovieClip object.
950  * @param {function(boolean)} setter
951  * @param {boolean} start
952  * @param {boolean} end
953  * @extends {createjs.TweenTarget.BooleanProperty}
954  * @constructor
955  */
956 createjs.TweenTarget.LoopProperty = function(setter, start, end) {
957   createjs.TweenTarget.BooleanProperty.call(this, setter, start, end);
958 };
959 createjs.inherits('TweenTarget.LoopProperty',
960                   createjs.TweenTarget.LoopProperty,
961                   createjs.TweenTarget.BooleanProperty);
962 
963 /**
964  * Creates a new createjs.TweenTarget.LoopProperty object.
965  * @param {function(boolean)} setter
966  * @param {boolean} start
967  * @return {createjs.TweenTarget.LoopProperty}
968  * @const
969  */
970 createjs.TweenTarget.LoopProperty.get = function(setter, start) {
971   /// <param type="Function" name="setter"/>
972   /// <param type="boolean" name="start"/>
973   /// <returns type="createjs.TweenTarget.LoopProperty"/>
974   return new createjs.TweenTarget.LoopProperty(setter, start, start);
975 };
976 
977 /** @override */
978 createjs.TweenTarget.LoopProperty.prototype.setValue =
979     function(target, proxy, ratio, listener, position, targets) {
980   /// <param type="createjs.TweenTarget" name="target"/>
981   /// <param type="createjs.TweenTarget" name="proxy"/>
982   /// <param type="number" name="ratio"/>
983   /// <param type="createjs.TweenTarget.Property.Listener" name="listener"/>
984   /// <param type="number" name="position"/>
985   /// <param type="Array" elementType="createjs.TweenTarget" name="targets"/>
986   createjs.TweenTarget.LoopProperty.superClass_.setValue.call(
987       this, target, proxy, ratio, listener, position, targets);
988   listener.handleLoopChanged(this.getBoolean(ratio));
989 };
990 
991 /** @override */
992 createjs.TweenTarget.LoopProperty.prototype.clone =
993     function(target, targets, opt_value) {
994   /// <param type="createjs.TweenTarget" name="target"/>
995   /// <param type="Array" elementType="createjs.TweenTarget" name="targets"/>
996   /// <param type="boolean" name="opt_value"/>
997   /// <returns type="createjs.TweenTarget.LoopProperty"/>
998   if (opt_value == null) {
999     if (this.start_ == this.end_) {
1000       return this;
1001     }
1002     opt_value = this.end_;
1003   }
1004   var end = createjs.getBoolean(opt_value);
1005   return new createjs.TweenTarget.LoopProperty(this.setter_, this.end_, end);
1006 };
1007 
1008 /**
1009  * A class that changes the 'graphics' property of a createjs.TweenTarget
1010  * object.
1011  * @param {Function} setter
1012  * @param {createjs.Graphics} start
1013  * @param {createjs.Graphics} end
1014  * @extends {createjs.TweenTarget.Property}
1015  * @constructor
1016  */
1017 createjs.TweenTarget.GraphicsProperty = function(setter, start, end) {
1018   createjs.TweenTarget.Property.call(this);
1019 
1020   /**
1021    * The function that changes this property.
1022    * @const {Function}
1023    * @private
1024    */
1025   this.setter_ = setter;
1026 
1027   /**
1028    * The start value of this property.
1029    * @const {createjs.Graphics}
1030    * @private
1031    */
1032   this.start_ = start;
1033 
1034   /**
1035    * The end value of this property.
1036    * @const {createjs.Graphics}
1037    * @private
1038    */
1039   this.end_ = end;
1040 };
1041 createjs.inherits('TweenTarget.GraphicsProperty',
1042                   createjs.TweenTarget.GraphicsProperty,
1043                   createjs.TweenTarget.Property);
1044 
1045 /**
1046  * Creates a new createjs.TweenTarget.GraphicsProperty object.
1047  * @param {Function} setter
1048  * @param {createjs.Graphics} start
1049  * @return {createjs.TweenTarget.GraphicsProperty}
1050  * @const
1051  */
1052 createjs.TweenTarget.GraphicsProperty.get = function(setter, start) {
1053   /// <param type="Function" name="setter"/>
1054   /// <param type="createjs.Graphics" name="start"/>
1055   /// <returns type="createjs.TweenTarget.GraphicsProperty"/>
1056   return new createjs.TweenTarget.GraphicsProperty(setter, start, start);
1057 };
1058 
1059 /** @override */
1060 createjs.TweenTarget.GraphicsProperty.prototype.setValue =
1061     function(target, proxy, ratio, listener, position, targets) {
1062   /// <param type="createjs.TweenTarget" name="target"/>
1063   /// <param type="createjs.TweenTarget" name="proxy"/>
1064   /// <param type="number" name="ratio"/>
1065   /// <param type="createjs.TweenTarget.Property.Listener" name="listener"/>
1066   /// <param type="number" name="position"/>
1067   /// <param type="Array" elementType="createjs.TweenTarget" name="targets"/>
1068   this.setter_.call(target, (ratio == 1) ? this.end_ : this.start_);
1069 };
1070 
1071 /** @override */
1072 createjs.TweenTarget.GraphicsProperty.prototype.clone =
1073     function(target, targets, opt_value) {
1074   /// <param type="createjs.TweenTarget" name="target"/>
1075   /// <param type="Array" elementType="createjs.TweenTarget" name="targets"/>
1076   /// <param type="createjs.Graphics" name="opt_value"/>
1077   /// <returns type="createjs.TweenTarget.GraphicsProperty"/>
1078   if (arguments.length == 2) {
1079     if (this.start_ === this.end_) {
1080       return this;
1081     }
1082     opt_value = this.end_;
1083   }
1084   var end = /** @type {createjs.Graphics} */ (opt_value);
1085   if (target) {
1086     target.addGraphics(end);
1087   }
1088   return new createjs.TweenTarget.GraphicsProperty(this.setter_, this.end_, end);
1089 };
1090 
1091 /**
1092  * A class that changes a startPosition property of a createjs.MovieClip object.
1093  * @param {function(number)} setter
1094  * @param {number} start
1095  * @param {number} end
1096  * @extends {createjs.TweenTarget.NumberProperty}
1097  * @constructor
1098  */
1099 createjs.TweenTarget.PositionProperty = function(setter, start, end) {
1100   createjs.TweenTarget.NumberProperty.call(this, setter, start, end);
1101 };
1102 createjs.inherits('TweenTarget.PositionProperty',
1103                   createjs.TweenTarget.PositionProperty,
1104                   createjs.TweenTarget.NumberProperty);
1105 
1106 /**
1107  * Creates a new createjs.TweenTarget.PositionProperty object.
1108  * @param {function(number)} setter
1109  * @param {number} start
1110  * @return {createjs.TweenTarget.PositionProperty}
1111  * @const
1112  */
1113 createjs.TweenTarget.PositionProperty.get = function(setter, start) {
1114   /// <param type="Function" name="setter"/>
1115   /// <param type="number" name="start"/>
1116   /// <returns type="createjs.TweenTarget.PositionProperty"/>
1117   return new createjs.TweenTarget.PositionProperty(setter, start, start);
1118 };
1119 
1120 /** @override */
1121 createjs.TweenTarget.PositionProperty.prototype.setValue =
1122     function(target, proxy, ratio, listener, position, targets) {
1123   /// <param type="createjs.TweenTarget" name="target"/>
1124   /// <param type="createjs.TweenTarget" name="proxy"/>
1125   /// <param type="number" name="ratio"/>
1126   /// <param type="createjs.TweenTarget.Property.Listener" name="listener"/>
1127   /// <param type="number" name="position"/>
1128   /// <param type="Array" elementType="createjs.TweenTarget" name="targets"/>
1129   if (position >= 0) {
1130     this.setter_.call(
1131         target, this.start_ + (this.end_ - this.start_) * position);
1132   }
1133 };
1134 
1135 /** @override */
1136 createjs.TweenTarget.PositionProperty.prototype.clone =
1137     function(target, targets, opt_value) {
1138   /// <param type="createjs.TweenTarget" name="target"/>
1139   /// <param type="Array" elementType="createjs.TweenTarget" name="targets"/>
1140   /// <param type="number" name="opt_value"/>
1141   /// <returns type="createjs.TweenTarget.NumberProperty"/>
1142   if (opt_value == null) {
1143     if (this.start_ == this.end_) {
1144       return this;
1145     }
1146     opt_value = this.end_;
1147   }
1148   var end = createjs.getNumber(opt_value);
1149   return new createjs.TweenTarget.PositionProperty(
1150       this.setter_, this.end_, end);
1151 };
1152 
1153 /**
1154  * A class that changes a state property of a createjs.TweenTarget object.
1155  * @param {Array.<createjs.TweenTarget>} targets
1156  * @param {Array.<Array.<createjs.TweenTarget.ValueProperty>>} start
1157  * @param {Array.<Array.<createjs.TweenTarget.ValueProperty>>} end
1158  * @extends {createjs.TweenTarget.Property}
1159  * @constructor
1160  */
1161 createjs.TweenTarget.StateProperty = function(targets, start, end) {
1162   createjs.TweenTarget.Property.call(this);
1163 
1164   /**
1165    * The initial properties of the targets.
1166    * @const {Array.<Array.<createjs.TweenTarget.ValueProperty>>}
1167    * @private
1168    */
1169   this.start_ = start;
1170 
1171   /**
1172    * The final properties of the targets.
1173    * @const {Array.<Array.<createjs.TweenTarget.ValueProperty>>}
1174    * @private
1175    */
1176   this.end_ = end;
1177 };
1178 createjs.inherits('TweenTarget.StateProperty',
1179                   createjs.TweenTarget.StateProperty,
1180                   createjs.TweenTarget.Property);
1181 
1182 /**
1183  * Creates a new createjs.TweenTarget.StateProperty object.
1184  * @param {Array.<createjs.TweenTarget>} targets
1185  * @return {createjs.TweenTarget.StateProperty}
1186  * @const
1187  */
1188 createjs.TweenTarget.StateProperty.get = function(targets) {
1189   /// <param type="Array" elementType="createjs.TweenTarget" name="targets"/>
1190   /// <returns type="createjs.TweenTarget.StateProperty"/>
1191   var start = [];
1192   for (var i = 0; i < targets.length; ++i) {
1193     start.push(createjs.TweenTarget.ValueProperty.get({ '_off': true }));
1194   }
1195   return new createjs.TweenTarget.StateProperty(targets, start, start);
1196 };
1197 
1198 /** @override */
1199 createjs.TweenTarget.StateProperty.prototype.setValue =
1200     function(target, proxy, ratio, listener, position, targets) {
1201   /// <param type="createjs.TweenTarget" name="target"/>
1202   /// <param type="createjs.TweenTarget" name="proxy"/>
1203   /// <param type="number" name="ratio"/>
1204   /// <param type="createjs.TweenTarget.Property.Listener" name="listener"/>
1205   /// <param type="number" name="position"/>
1206   /// <param type="Array" elementType="createjs.TweenTarget" name="targets"/>
1207   var properties = ratio == 1 ? this.end_ : this.start_;
1208   for (var i = 0; i < targets.length; ++i) {
1209     var values = properties[i];
1210     for (var j = 0; j < values.length; ++j) {
1211       values[j].setValue(targets[i]);
1212     }
1213   }
1214 };
1215 
1216 /** @override */
1217 createjs.TweenTarget.StateProperty.prototype.clone =
1218     function(target, targets, opt_value) {
1219   /// <param type="createjs.TweenTarget" name="target"/>
1220   /// <param type="Array" elementType="createjs.TweenTarget" name="targets"/>
1221   /// <param name="opt_value"/>
1222   /// <returns type="createjs.TweenTarget.StateProperty"/>
1223   if (opt_value == null) {
1224     // Just create another property with the last state of this property when
1225     // this property is cloned without any arguments, i.e. when the wait()
1226     // method is called for a state tween.
1227     return new createjs.TweenTarget.StateProperty(
1228         targets, this.end_, this.end_);
1229   }
1230   // Normalize this state tween. This code fills implicit parameters to the
1231   // existing steps so each step represents the states of all targets added
1232   // or removed by this tween. For example, consider the code snippet listed
1233   // below.
1234   //   var shape1 = new createjs.Shape();
1235   //   var shape2 = new createjs.Shape();
1236   //     ...
1237   //   createjs.Tween.get({}).
1238   //       to({ state: [{ t: shape1 }]}).to({ state: [{ t: shape2 }]});
1239   // To fill implicit parameters to this tween, it becomes the state tween
1240   // listed below.
1241   //   createjs.Tween.get({}).
1242   //       to({ state: [{ t: shape1, p: { _off: false }},
1243   //                    { t: shape2, p: { _off: true }}]}).
1244   //       to({ state: [{ t: shape1, p: { _off: true }},
1245   //                    { t: shape2, p: { _off: false }}]})
1246   // It is easy to seek normalized tweens and this code converts state tweens
1247   // to normalized ones.
1248   var end = /** @type {Array.<Object>} */ (createjs.getArray(opt_value));
1249   var properties = [];
1250   for (var i = 0; i < targets.length; ++i) {
1251     var off = true;
1252     var property = {};
1253     for (var j = 0; j < end.length; ++j) {
1254       var state = end[j];
1255       if (targets[i] === state['t']) {
1256         if (state['p']) {
1257           property = state['p'];
1258         }
1259         off = false;
1260         break;
1261       }
1262     }
1263     property['_off'] = off;
1264     properties.push(createjs.TweenTarget.ValueProperty.get(property));
1265   }
1266   return new createjs.TweenTarget.StateProperty(
1267       targets, this.end_, properties);
1268 };
1269 
1270 /**
1271  * Adds setters used for creating createjs.TweenTarget.Property objects that
1272  * changes the specified properties.
1273  * @param {Object.<string,Function>} setters
1274  * @const
1275  */
1276 createjs.TweenTarget.Property.addSetters = function(setters) {
1277   for (var key in setters) {
1278     createjs.TweenTarget.Property.setters_[key] =
1279         new createjs.TweenTarget.Setter(setters[key]);
1280   }
1281 };
1282 
1283 /**
1284  * Adds setters used for creating createjs.TweenTarget.Property objects that
1285  * changes the specified properties.
1286  * @return {Object.<string,createjs.TweenTarget.Setter>}
1287  * @const
1288  */
1289 createjs.TweenTarget.Property.getSetters = function() {
1290   /// <return type="Object" elementType="createjs.TweenTarget.Setter"/>
1291   return createjs.TweenTarget.Property.setters_;
1292 };
1293 
1294 /**
1295  * Creates a createjs.TweenTarget.Property object.
1296  * @param {createjs.TweenTarget.Setter} setter
1297  * @return {createjs.TweenTarget.Property}
1298  * @const
1299  */
1300 createjs.TweenTarget.Property.get = function(setter) {
1301   /// <param type="createjs.TweenTarget.Setter" name="setter"/>
1302   /// <return type="createjs.TweenTarget.Property"/>
1303   if (setter.type_ == createjs.TweenTarget.Setter.NUMBER_) {
1304     return createjs.TweenTarget.NumberProperty.get(
1305         /** @type {function(number)} */ (setter.fn_),
1306         setter.number_);
1307   } else if (setter.type_ == createjs.TweenTarget.Setter.BOOLEAN_) {
1308     return createjs.TweenTarget.BooleanProperty.get(
1309         /** @type {function(boolean)} */ (setter.fn_),
1310         setter.bool_);
1311   } else if (setter.type_ == createjs.TweenTarget.Setter.STRING_) {
1312     return createjs.TweenTarget.StringProperty.get(setter.fn_, setter.text_);
1313   } else if (setter.type_ == createjs.TweenTarget.Setter.LOOP_) {
1314     return createjs.TweenTarget.LoopProperty.get(
1315         /** @type {function(boolean)} */ (setter.fn_),
1316         setter.bool_);
1317   } else if (setter.type_ == createjs.TweenTarget.Setter.POSITION_) {
1318     return createjs.TweenTarget.PositionProperty.get(
1319         /** @type {function(number)} */ (setter.fn_),
1320         setter.number_);
1321   } else if (setter.type_ == createjs.TweenTarget.Setter.GRAPHICS_) {
1322     return createjs.TweenTarget.GraphicsProperty.get(
1323         setter.fn_, setter.graphics_);
1324   } else {
1325     return null;
1326   }
1327 };
1328 
1329 /**
1330  * Registers a tween.
1331  * @param {createjs.TweenObject} tween
1332  */
1333 createjs.TweenTarget.prototype.registerTween = function(tween) {};
1334 
1335 /**
1336  * Unregisters a tween.
1337  * @param {createjs.TweenObject} tween
1338  */
1339 createjs.TweenTarget.prototype.unregisterTween = function(tween) {};
1340 
1341 /**
1342  * Removes all tween registered to this target.
1343  */
1344 createjs.TweenTarget.prototype.resetTweens = function() {};
1345 
1346 /**
1347  * Starts playing the tweens attached to this target.
1348  * @param {number} time
1349  */
1350 createjs.TweenTarget.prototype.playTweens = function(time) {};
1351 
1352 /**
1353  * Stops playing the tweens attached to this target.
1354  * @param {number} time
1355  */
1356 createjs.TweenTarget.prototype.stopTweens = function(time) {};
1357 
1358 /**
1359  * Updates the tweens attached to this target.
1360  * @param {number} time
1361  */
1362 createjs.TweenTarget.prototype.updateTweens = function(time) {};
1363 
1364 /**
1365  * Returns whether this target has tweens.
1366  * @return {boolean}
1367  */
1368 createjs.TweenTarget.prototype.hasTweens = function() {};
1369 
1370 /**
1371  * Sets the position of all tweens attached to this target.
1372  * @param {number} position
1373  */
1374 createjs.TweenTarget.prototype.setTweenPosition = function(position) {};
1375 
1376 /**
1377  * Sets the properties of all tweens attached to this target.
1378  * @param {boolean} loop
1379  * @param {number} position
1380  * @param {boolean} single
1381  */
1382 createjs.TweenTarget.prototype.setTweenProperties =
1383     function(loop, position, single) {};
1384 
1385 /**
1386  * Returns whether this target is detached by a tween.
1387  * @return {boolean}
1388  */
1389 createjs.TweenTarget.prototype.getOff = function() {};
1390 
1391 /**
1392  * Attaches this target to an object tree or detaches it.
1393  * @param {boolean} off
1394  */
1395 createjs.TweenTarget.prototype.setOff = function(off) {};
1396 
1397 /**
1398  * Returns the play mode of this target.
1399  * @return {number}
1400  */
1401 createjs.TweenTarget.prototype.getPlayMode = function() {};
1402 
1403 /**
1404  * Sets the play mode of this target.
1405  * @param {number} mode
1406  */
1407 createjs.TweenTarget.prototype.setPlayMode = function(mode) {};
1408 
1409 /**
1410  * Retrieves setters for the createjs.Tween object to change properties of a
1411  * createjs.TweenTarget object.
1412  * @return {Object.<string,createjs.TweenTarget.Setter>}
1413  */
1414 createjs.TweenTarget.prototype.getSetters = function() {};
1415 
1416 /**
1417  * Synchronizes the specified target with this target.
1418  * @param {createjs.TweenTarget} target
1419  * @param {boolean} synchronize
1420  */
1421 createjs.TweenTarget.prototype.synchronize = function(target, synchronize) {};
1422 
1423 /**
1424  * Synchronizes the specified target with this target.
1425  * @param {createjs.Graphics} graphics
1426  */
1427 createjs.TweenTarget.prototype.addGraphics = function(graphics) {};
1428