/* * 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 ]; } };