2011-03-07 00:50:44 +00:00
|
|
|
/*
|
|
|
|
* Paper.js
|
|
|
|
*
|
|
|
|
* This file is part of Paper.js, a JavaScript Vector Graphics Library,
|
|
|
|
* based on Scriptographer.org and designed to be largely API compatible.
|
2011-03-08 01:41:50 +00:00
|
|
|
* http://paperjs.org/
|
2011-03-07 00:50:44 +00:00
|
|
|
* http://scriptographer.org/
|
|
|
|
*
|
2011-03-08 01:41:50 +00:00
|
|
|
* Distributed under the MIT license. See LICENSE file for details.
|
|
|
|
*
|
2011-03-07 00:50:44 +00:00
|
|
|
* Copyright (c) 2011, Juerg Lehni & Jonathan Puckey
|
|
|
|
* http://lehni.org/ & http://jonathanpuckey.com/
|
|
|
|
*
|
2011-03-08 01:41:50 +00:00
|
|
|
* All rights reserved.
|
2011-03-07 00:50:44 +00:00
|
|
|
*/
|
|
|
|
|
2011-03-04 13:34:31 +00:00
|
|
|
var Size = this.Size = Base.extend({
|
2011-03-06 12:15:15 +00:00
|
|
|
initialize: function(arg0, arg1) {
|
2011-02-13 16:26:24 +00:00
|
|
|
if (arguments.length == 2) {
|
2011-03-06 12:15:15 +00:00
|
|
|
this.width = arg0;
|
|
|
|
this.height = arg1;
|
2011-02-13 16:26:24 +00:00
|
|
|
} else if (arguments.length == 1) {
|
2011-03-06 12:15:15 +00:00
|
|
|
if (arg0 == null) {
|
2011-02-14 10:32:42 +00:00
|
|
|
this.width = this.height = 0;
|
2011-03-06 12:15:15 +00:00
|
|
|
} else if (arg0.width !== undefined) {
|
|
|
|
this.width = arg0.width;
|
|
|
|
this.height = arg0.height;
|
|
|
|
} else if (arg0.x !== undefined) {
|
|
|
|
this.width = arg0.x;
|
|
|
|
this.height = arg0.y;
|
|
|
|
} else if (Array.isArray(arg0)) {
|
|
|
|
this.width = arg0[0];
|
|
|
|
this.height = arg0.length > 1 ? arg0[1] : arg0[0];
|
|
|
|
} else if (typeof arg0 === 'number') {
|
|
|
|
this.width = this.height = arg0;
|
2011-02-07 19:28:09 +01:00
|
|
|
} else {
|
|
|
|
this.width = this.height = 0;
|
|
|
|
}
|
|
|
|
} else {
|
2011-02-13 19:21:56 +00:00
|
|
|
this.width = this.height = 0;
|
2011-02-07 19:28:09 +01:00
|
|
|
}
|
|
|
|
},
|
2011-02-13 19:21:56 +00:00
|
|
|
|
2011-02-28 20:14:10 +01:00
|
|
|
set: function(width, height) {
|
|
|
|
this.width = width;
|
|
|
|
this.height = height;
|
2011-03-05 20:59:06 +00:00
|
|
|
return this;
|
2011-02-28 20:14:10 +01:00
|
|
|
},
|
|
|
|
|
2011-03-13 18:31:00 +01:00
|
|
|
add: function(size) {
|
|
|
|
size = Size.read(arguments);
|
|
|
|
return Size.create(this.width + size.width, this.height + size.height);
|
2011-02-07 19:28:09 +01:00
|
|
|
},
|
|
|
|
|
2011-03-13 18:31:00 +01:00
|
|
|
subtract: function(size) {
|
|
|
|
size = Size.read(arguments);
|
|
|
|
return Size.create(this.width - size.width, this.height - size.height);
|
2011-02-07 19:28:09 +01:00
|
|
|
},
|
|
|
|
|
2011-03-13 18:31:00 +01:00
|
|
|
multiply: function(size) {
|
|
|
|
size = Size.read(arguments);
|
|
|
|
return Size.create(this.width * size.width, this.height * size.height);
|
2011-02-07 19:28:09 +01:00
|
|
|
},
|
|
|
|
|
2011-03-13 18:31:00 +01:00
|
|
|
divide: function(size) {
|
|
|
|
size = Size.read(arguments);
|
|
|
|
return Size.create(this.width / size.width, this.height / size.height);
|
2011-02-07 19:28:09 +01:00
|
|
|
},
|
|
|
|
|
2011-03-13 18:31:00 +01:00
|
|
|
modulo: function(size) {
|
|
|
|
size = Size.read(arguments);
|
|
|
|
return Size.create(this.width % size.width, this.height % size.height);
|
2011-02-07 19:28:09 +01:00
|
|
|
},
|
|
|
|
|
|
|
|
negate: function() {
|
2011-03-03 17:06:35 +00:00
|
|
|
return Size.create(-this.width, -this.height);
|
2011-02-07 19:28:09 +01:00
|
|
|
},
|
|
|
|
|
2011-03-13 18:31:00 +01:00
|
|
|
equals: function(size) {
|
|
|
|
size = Size.read(arguments);
|
|
|
|
return this.width == size.width && this.height == size.height;
|
2011-02-07 19:28:09 +01:00
|
|
|
},
|
|
|
|
|
2011-05-15 20:26:37 +01:00
|
|
|
/**
|
|
|
|
* Checks if this size has both the width and height set to 0.
|
|
|
|
*
|
|
|
|
* @return true if both width and height are 0, false otherwise.
|
|
|
|
*/
|
|
|
|
isZero: function() {
|
|
|
|
return this.width == 0 && this.width == 0;
|
|
|
|
},
|
|
|
|
|
2011-02-07 19:28:09 +01:00
|
|
|
isNaN: function() {
|
|
|
|
return isNaN(this.width) || isNaN(this.height);
|
|
|
|
},
|
|
|
|
|
|
|
|
toString: function() {
|
2011-05-04 19:42:50 +01:00
|
|
|
var format = Base.formatNumber;
|
|
|
|
return '{ x: ' + format(this.width)
|
|
|
|
+ ', y: ' + format(this.height) + ' }';
|
2011-02-07 19:28:09 +01:00
|
|
|
},
|
|
|
|
|
|
|
|
statics: {
|
2011-03-03 17:06:35 +00:00
|
|
|
// See Point.create()
|
|
|
|
create: function(width, height) {
|
2011-03-06 21:02:57 +00:00
|
|
|
return new Size(Size.dont).set(width, height);
|
2011-03-03 17:06:35 +00:00
|
|
|
},
|
|
|
|
|
2011-02-07 19:28:09 +01:00
|
|
|
min: function(Size1, Size2) {
|
2011-03-03 17:06:35 +00:00
|
|
|
return Size.create(
|
2011-02-07 19:28:09 +01:00
|
|
|
Math.min(Size1.width, Size2.width),
|
|
|
|
Math.min(Size1.height, Size2.height));
|
|
|
|
},
|
|
|
|
|
|
|
|
max: function(Size1, Size2) {
|
2011-03-03 17:06:35 +00:00
|
|
|
return Size.create(
|
2011-02-07 19:28:09 +01:00
|
|
|
Math.max(Size1.width, Size2.width),
|
|
|
|
Math.max(Size1.height, Size2.height));
|
|
|
|
},
|
|
|
|
|
|
|
|
random: function() {
|
2011-03-03 17:06:35 +00:00
|
|
|
return Size.create(Math.random(), Math.random());
|
2011-02-07 19:28:09 +01:00
|
|
|
}
|
|
|
|
}
|
2011-05-02 23:09:59 +01:00
|
|
|
}, new function() { // Scope for injecting round, ceil, floor, abs:
|
|
|
|
return Base.each(['round', 'ceil', 'floor', 'abs'], function(name) {
|
|
|
|
var op = Math[name];
|
|
|
|
this[name] = function() {
|
|
|
|
return Size.create(op(this.width), op(this.height));
|
|
|
|
};
|
|
|
|
}, {});
|
2011-02-13 16:26:24 +00:00
|
|
|
});
|