blob: 84f28eec24905c00dc750c5f824a9a3c89d2e17c [file] [log] [blame]
/*
* Copyright (C) 2013 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
*/
WebInspector.Point = function(x, y)
{
this.x = x || 0;
this.y = y || 0;
};
WebInspector.Point.fromEvent = function(event)
{
return new WebInspector.Point(event.pageX, event.pageY);
};
WebInspector.Point.fromEventInElement = function(event, element)
{
var wkPoint = window.webkitConvertPointFromPageToNode(element, new WebKitPoint(event.pageX, event.pageY));
return new WebInspector.Point(wkPoint.x, wkPoint.y);
};
WebInspector.Point.prototype = {
constructor: WebInspector.Point,
toString : function()
{
return "WebInspector.Point[" + this.x + "," + this.y + "]";
},
copy: function()
{
return new WebInspector.Point(this.x, this.y);
},
equals: function(anotherPoint)
{
return (this.x === anotherPoint.x && this.y === anotherPoint.y);
}
};
WebInspector.Size = function(width, height)
{
this.width = width || 0;
this.height = height || 0;
};
WebInspector.Size.prototype = {
constructor: WebInspector.Size,
toString: function()
{
return "WebInspector.Size[" + this.width + "," + this.height + "]";
},
copy: function()
{
return new WebInspector.Size(this.width, this.height);
},
equals: function(anotherSize)
{
return (this.width === anotherSize.width && this.height === anotherSize.height);
}
};
WebInspector.Size.ZERO_SIZE = new WebInspector.Size(0, 0);
WebInspector.Rect = function(x, y, width, height)
{
this.origin = new WebInspector.Point(x || 0, y || 0);
this.size = new WebInspector.Size(width || 0, height || 0);
};
WebInspector.Rect.rectFromClientRect = function(clientRect)
{
return new WebInspector.Rect(clientRect.left, clientRect.top, clientRect.width, clientRect.height);
};
WebInspector.Rect.prototype = {
constructor: WebInspector.Rect,
toString: function()
{
return "WebInspector.Rect[" + [this.origin.x, this.origin.y, this.size.width, this.size.height].join(", ") + "]";
},
copy: function()
{
return new WebInspector.Rect(this.origin.x, this.origin.y, this.size.width, this.size.height);
},
equals: function(anotherRect)
{
return (this.origin.equals(anotherRect.origin) && this.size.equals(anotherRect.size));
},
inset: function(insets)
{
return new WebInspector.Rect(
this.origin.x + insets.left,
this.origin.y + insets.top,
this.size.width - insets.left - insets.right,
this.size.height - insets.top - insets.bottom
);
},
pad: function(padding)
{
return new WebInspector.Rect(
this.origin.x - padding,
this.origin.y - padding,
this.size.width + padding * 2,
this.size.height + padding * 2
);
},
minX: function()
{
return this.origin.x;
},
minY: function()
{
return this.origin.y;
},
midX: function()
{
return this.origin.x + (this.size.width / 2);
},
midY: function()
{
return this.origin.y + (this.size.height / 2);
},
maxX: function()
{
return this.origin.x + this.size.width;
},
maxY: function()
{
return this.origin.y + this.size.height;
},
intersectionWithRect: function(rect)
{
var x1 = Math.max(this.minX(), rect.minX());
var x2 = Math.min(this.maxX(), rect.maxX());
if (x1 > x2)
return WebInspector.Rect.ZERO_RECT;
var intersection = new WebInspector.Rect;
intersection.origin.x = x1;
intersection.size.width = x2 - x1;
var y1 = Math.max(this.minY(), rect.minY());
var y2 = Math.min(this.maxY(), rect.maxY());
if (y1 > y2)
return WebInspector.Rect.ZERO_RECT;
intersection.origin.y = y1;
intersection.size.height = y2 - y1;
return intersection;
}
};
WebInspector.Rect.ZERO_RECT = new WebInspector.Rect(0, 0, 0, 0);
WebInspector.EdgeInsets = function(top, right, bottom, left)
{
console.assert(arguments.length === 1 || arguments.length === 4);
if (arguments.length === 1) {
this.top = top;
this.right = top;
this.bottom = top;
this.left = top;
} else if (arguments.length === 4) {
this.top = top;
this.right = right;
this.bottom = bottom;
this.left = left;
}
};
WebInspector.EdgeInsets.prototype = {
constructor: WebInspector.EdgeInsets,
equals: function(anotherInset)
{
return (this.top === anotherInset.top && this.right === anotherInset.right &&
this.bottom === anotherInset.bottom && this.left === anotherInset.left);
},
copy: function()
{
return new WebInspector.EdgeInsets(this.top, this.right, this.bottom, this.left);
}
};
WebInspector.RectEdge = {
MIN_X : 0,
MIN_Y : 1,
MAX_X : 2,
MAX_Y : 3
};
WebInspector.Quad = function(quad)
{
this.points = [
new WebInspector.Point(quad[0], quad[1]), // top left
new WebInspector.Point(quad[2], quad[3]), // top right
new WebInspector.Point(quad[4], quad[5]), // bottom right
new WebInspector.Point(quad[6], quad[7]) // bottom left
];
this.width = Math.round(Math.sqrt(Math.pow(quad[0] - quad[2], 2) + Math.pow(quad[1] - quad[3], 2)));
this.height = Math.round(Math.sqrt(Math.pow(quad[0] - quad[6], 2) + Math.pow(quad[1] - quad[7], 2)));
};
WebInspector.Quad.prototype = {
constructor: WebInspector.Quad,
toProtocol: function()
{
return [
this.points[0].x, this.points[0].y,
this.points[1].x, this.points[1].y,
this.points[2].x, this.points[2].y,
this.points[3].x, this.points[3].y
];
}
};