mirror of
https://github.com/scratchfoundation/paper.js.git
synced 2025-01-05 20:32:00 -05:00
Allow creation of rectangles from {point, size} and {center, size} object literals.
This commit is contained in:
parent
24b5f870bd
commit
d0fff09bb0
1 changed files with 67 additions and 45 deletions
|
@ -71,53 +71,75 @@ var Rectangle = this.Rectangle = Base.extend(/** @lends Rectangle# */{
|
||||||
this.x = this.y = this.width = this.height = 0;
|
this.x = this.y = this.width = this.height = 0;
|
||||||
if (this._read)
|
if (this._read)
|
||||||
this._read = arg0 === null ? 1 : 0;
|
this._read = arg0 === null ? 1 : 0;
|
||||||
} else if (arguments.length > 1 && arg0.width == null) {
|
|
||||||
// We're checking arg0.width to rule out Rectangles, which are
|
|
||||||
// handled separately below.
|
|
||||||
// Read a point argument and look at the next value to see wether
|
|
||||||
// it's a size or a point, then read accordingly
|
|
||||||
var point = Point.read(arguments),
|
|
||||||
next = Base.peek(arguments);
|
|
||||||
this.x = point.x;
|
|
||||||
this.y = point.y;
|
|
||||||
if (next && next.x !== undefined) {
|
|
||||||
// new Rectangle(point1, point2)
|
|
||||||
var point2 = Point.read(arguments);
|
|
||||||
this.width = point2.x - point.x;
|
|
||||||
this.height = point2.y - point.y;
|
|
||||||
if (this.width < 0) {
|
|
||||||
this.x = point2.x;
|
|
||||||
this.width = -this.width;
|
|
||||||
}
|
|
||||||
if (this.height < 0) {
|
|
||||||
this.y = point2.y;
|
|
||||||
this.height = -this.height;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// new Rectangle(point, size)
|
|
||||||
var size = Size.read(arguments);
|
|
||||||
this.width = size.width;
|
|
||||||
this.height = size.height;
|
|
||||||
}
|
|
||||||
if (this._read)
|
|
||||||
this._read = arguments._index;
|
|
||||||
} else {
|
} else {
|
||||||
if (Array.isArray(arg0)) {
|
// Handle a couple of cases, with a fallback to reading
|
||||||
this.x = arg0[0];
|
// (Point, Point) or (Point, Size) from the arguments list, in case
|
||||||
this.y = arg0[1];
|
// args is defined.
|
||||||
this.width = arg0[2];
|
var args = arguments,
|
||||||
this.height = arg0[3];
|
center = null;
|
||||||
} else {
|
if (arguments.length == 1) {
|
||||||
// new Rectangle(rect)
|
// This can either be an array, or an object literal. Clear args
|
||||||
// Use 0 as defaults, in case we're not reading from a Rectangle,
|
// since we don't want to read from arguments below, except for
|
||||||
// but a Point or Size instead
|
// when an object literal is converted (e.g. {point, size}...)
|
||||||
this.x = arg0.x || 0;
|
args = null;
|
||||||
this.y = arg0.y || 0;
|
if (Array.isArray(arg0)) {
|
||||||
this.width = arg0.width || 0;
|
this.x = arg0[0];
|
||||||
this.height = arg0.height || 0;
|
this.y = arg0[1];
|
||||||
|
this.width = arg0[2];
|
||||||
|
this.height = arg0[3];
|
||||||
|
} else {
|
||||||
|
// new Rectangle(obj)
|
||||||
|
// See if we define the rectangle by {point, size},
|
||||||
|
// or {center, size}
|
||||||
|
if (arg0.size) {
|
||||||
|
args = [Point.read([arg0.point]), Size.read([arg0.size])];
|
||||||
|
center = Point.read([arg0.center]);
|
||||||
|
} else {
|
||||||
|
// Another rectangle or a simple object literal
|
||||||
|
// describing one. Use duck typing, and 0 as defaults.
|
||||||
|
this.x = arg0.x || 0;
|
||||||
|
this.y = arg0.y || 0;
|
||||||
|
this.width = arg0.width || 0;
|
||||||
|
this.height = arg0.height || 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (this._read)
|
||||||
|
this._read = 1;
|
||||||
}
|
}
|
||||||
if (this._read)
|
// If args is defined, we either haven't been able to handle values
|
||||||
this._read = 1;
|
// above yet, or an object literal was converted to an arguments
|
||||||
|
// list.
|
||||||
|
if (args && args.length > 1) {
|
||||||
|
// Read a point argument and look at the next value to see
|
||||||
|
// wether it's a size or a point, then read accordingly.
|
||||||
|
var point = Point.read(args),
|
||||||
|
next = Base.peek(args);
|
||||||
|
this.x = point.x;
|
||||||
|
this.y = point.y;
|
||||||
|
if (next && next.x !== undefined) {
|
||||||
|
// new Rectangle(point1, point2)
|
||||||
|
var point2 = Point.read(args);
|
||||||
|
this.width = point2.x - point.x;
|
||||||
|
this.height = point2.y - point.y;
|
||||||
|
if (this.width < 0) {
|
||||||
|
this.x = point2.x;
|
||||||
|
this.width = -this.width;
|
||||||
|
}
|
||||||
|
if (this.height < 0) {
|
||||||
|
this.y = point2.y;
|
||||||
|
this.height = -this.height;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// new Rectangle(point, size)
|
||||||
|
var size = Size.read(args);
|
||||||
|
this.width = size.width;
|
||||||
|
this.height = size.height;
|
||||||
|
}
|
||||||
|
if (this._read)
|
||||||
|
this._read = arguments._index;
|
||||||
|
}
|
||||||
|
if (center)
|
||||||
|
this.setCenter(center);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue