1 (function() {
  2   
  3   /* Adaptation of work of Kevin Lindsey (kevin@kevlindev.com) */
  4   
  5   var fabric = this.fabric || (this.fabric = { });
  6 
  7   if (fabric.Point) {    
  8     fabric.warn('fabric.Point is already defined');
  9     return;
 10   }
 11 
 12   fabric.Point = Point;
 13   
 14   /**
 15    * @name Point
 16    * @memberOf fabric
 17    * @constructor
 18    * @param {Number} x
 19    * @param {Number} y
 20    * @return {fabric.Point} thisArg
 21    */
 22   function Point(x, y) {
 23     if (arguments.length > 0) {
 24       this.init(x, y);
 25     }
 26   }
 27   
 28   Point.prototype = /** @scope fabric.Point.prototype */ {
 29     
 30     constructor: Point,
 31     
 32     /**
 33      * @method init
 34      * @param {Number} x
 35      * @param {Number} y
 36      */
 37     init: function (x, y) {
 38       this.x = x;
 39       this.y = y;
 40     },
 41     
 42     /**
 43      * @method add
 44      * @param {fabric.Point} that
 45      * @return {fabric.Point} new Point instance with added values
 46      */
 47     add: function (that) {
 48       return new Point(this.x + that.x, this.y + that.y);
 49     },
 50     
 51     /**
 52      * @method addEquals
 53      * @param {fabric.Point} that
 54      * @return {fabric.Point} thisArg
 55      */
 56     addEquals: function (that) {
 57       this.x += that.x;
 58       this.y += that.y;
 59       return this;
 60     },
 61     
 62     /**
 63      * @method scalarAdd
 64      * @param {Number} scalar
 65      * @return {fabric.Point} new Point with added value
 66      */
 67     scalarAdd: function (scalar) {
 68       return new Point(this.x + scalar, this.y + scalar);
 69     },
 70     
 71     /**
 72      * @method scalarAddEquals
 73      * @param {Number} scalar
 74      * @param {fabric.Point} thisArg
 75      */
 76     scalarAddEquals: function (scalar) {
 77       this.x += scalar;
 78       this.y += scalar;
 79       return this;
 80     },
 81     
 82     /**
 83      * @method subtract
 84      * @param {fabric.Point} that
 85      * @return {fabric.Point} new Point object with subtracted values
 86      */
 87     subtract: function (that) {
 88       return new Point(this.x - that.x, this.y - that.y);
 89     },
 90     
 91     /**
 92      * @method subtractEquals
 93      * @param {fabric.Point} that
 94      * @return {fabric.Point} thisArg
 95      */
 96     subtractEquals: function (that) {
 97       this.x -= that.x;
 98       this.y -= that.y;
 99       return this;
100     },
101     
102     scalarSubtract: function (scalar) {
103       return new Point(this.x - scalar, this.y - scalar);
104     },
105     
106     scalarSubtractEquals: function (scalar) {
107       this.x -= scalar;
108       this.y -= scalar;
109       return this;
110     },
111     
112     multiply: function (scalar) {
113       return new Point(this.x * scalar, this.y * scalar);
114     },
115     
116     multiplyEquals: function (scalar) {
117       this.x *= scalar;
118       this.y *= scalar;
119       return this;
120     },
121     
122     divide: function (scalar) {
123       return new Point(this.x / scalar, this.y / scalar);
124     },
125     
126     divideEquals: function (scalar) {
127       this.x /= scalar;
128       this.y /= scalar;
129       return this;
130     },
131     
132     eq: function (that) {
133       return (this.x == that.x && this.y == that.y);
134     },
135     
136     lt: function (that) {
137       return (this.x < that.x && this.y < that.y);
138     },
139     
140     lte: function (that) {
141       return (this.x <= that.x && this.y <= that.y);
142     },
143     
144     gt: function (that) {
145       return (this.x > that.x && this.y > that.y);
146     },
147     
148     gte: function (that) {
149       return (this.x >= that.x && this.y >= that.y);
150     },
151     
152     lerp: function (that, t) {
153       return new Point(this.x + (that.x - this.x) * t, this.y + (that.y - this.y) * t);
154     },
155     
156     distanceFrom: function (that) {
157       var dx = this.x - that.x,
158           dy = this.y - that.y;
159       return Math.sqrt(dx * dx + dy * dy);
160     },
161     
162     min: function (that) {
163       return new Point(Math.min(this.x, that.x), Math.min(this.y, that.y));
164     },
165     
166     max: function (that) {
167       return new Point(Math.max(this.x, that.x), Math.max(this.y, that.y));
168     },
169     
170     toString: function () {
171       return this.x + "," + this.y;
172     },
173     
174     setXY: function (x, y) {
175       this.x = x;
176       this.y = y;
177     },
178     
179     setFromPoint: function (that) {
180       this.x = that.x;
181       this.y = that.y;
182     },
183     
184     swap: function (that) {
185       var x = this.x,
186           y = this.y;
187       this.x = that.x;
188       this.y = that.y;
189       that.x = x;
190       that.y = y;
191     }
192   };
193   
194 })();