/* This file contains proprietary software owned by Motorola Mobility, Inc.
No rights, expressed or implied, whatsoever to this software are provided by Motorola Mobility, Inc. hereunder.
(c) Copyright 2011 Motorola Mobility, Inc. All Rights Reserved.
*/ /////////////////////////////////////////////////////////////////////// // Class Rectangle // 2D rectangle /////////////////////////////////////////////////////////////////////// var Rectangle = exports.Rectangle = Object.create(Object.prototype, { /////////////////////////////////////////////////////////////////////// // Instance variables /////////////////////////////////////////////////////////////////////// m_top: { value: null, writable: true }, m_left: { value: null, writable: true }, m_width: { value: null, writable: true }, m_height: { value: null, writable: true }, /////////////////////////////////////////////////////////////////////// // Property accessors /////////////////////////////////////////////////////////////////////// set: { value: function(l,t,w,h) { this.m_left = l; this.m_top = t; this.m_width = w; this.m_height = h; } }, getLeft: { value: function() { return this.m_left; } }, setLeft: { value: function(l) { this.m_left = l; } }, getRight: { value: function() { return this.m_left + this.m_width; } }, setRight: { value: function(r) { this.m_width = r - this.m_left; } }, getBottom: { value: function() { return this.m_top + this.m_height; } }, setBottom: { value: function(b) { this.m_height = b - this.m_top; } }, getTop: { value: function() { return this.m_top; } }, setTop: { value: function(t) { this.m_top = t; } }, getCenter: { value: function() { return [this.m_left + 0.5*this.m_width, this.m_top + 0.5*this.m_height]; } }, getWidth: { value: function() { return this.m_width; } }, setWidth: { value: function(w) { this.m_width = w; } }, getHeight: { value: function() { return this.m_height; } }, setHeight: { value: function(h) { this.m_height = h; } }, geomType: { value: function() { return this.GEOM_TYPE_RECTANGLE; } }, /////////////////////////////////////////////////////////////////////// // Methods /////////////////////////////////////////////////////////////////////// contains: { value: function( x, y ) { if (x < this.getLeft()) return false; if (x > this.getRight()) return false; if (y < this.getTop()) return false; if (y > this.getBottom()) return false; return true; } }, dup: { value: function() { var rtnRec = Object.create(Rectangle, {}); rtnRec.m_top = this.m_top; rtnRec.m_left = this.m_left; rtnRec.m_width = this.m_width; rtnRec.m_height = this.m_height; return rtnRec; } }, onBoundary: { value: function( x, y ) { if ((MathUtils.fpCmp(y,this.getTop()) >= 0) && (MathUtils.fpCmp(y,this.getBottom()) <= 0)) { if ((MathUtils.fpCmp(x, this.getLeft()) == 0) || (MathUtils.fpCmp(x, this.getRight()) == 0)) return true; if ((MathUtils.fpCmp(x,this.getLeft()) >= 0) && (MathUtils.fpCmp(x,this.getRight()) <= 0)) { if ((MathUtils.fpCmp(y, this.getTop()) == 0) || (MathUtils.fpCmp(y, this.getBottom()) == 0)) return true; } } return false; } }, setToPoint: { value: function( pt ) { this.m_left = pt[0]; this.m_top = pt[1]; this.m_width = 0; this.m_height = 0; } }, setToBounds: { value: function( bounds ) { var pt = bounds[0]; this.setToPoint( pt ); for (var i=1; i<4; i++) this.unionPoint( bounds[i] ); } }, getPoint: { value: function(i) { if (i < 0) throw( "invalid point index in Rectangle.getPoint: " + i ); i = i % 4; var pt = [0,0]; switch (i) { case 0: pt[0] = this.getLeft(); pt[1] = this.getTop(); break; case 1: pt[0] = this.getLeft(); pt[1] = this.getBottom(); break; case 2: pt[0] = this.getRight(); pt[1] = this.getBottom(); break; case 3: pt[0] = this.getRight(); pt[1] = this.getTop(); break; } return pt; } }, getQuadrant: { value: function( iQuad ) { // quadrant ordering starts at upper left and continues around counter-clockwise var rtnQuad = this.dup(); var hw = 0.5*this.m_width, hh = 0.5*this.m_height; rtnQuad.m_width = hw; rtnQuad.m_height = hh; switch (iQuad) { case 0: // no-op break; case 1: rtnQuad.m_top += hh; break; case 2: rtnQuad.m_left += hw; rtnQuad.m_top += hh; break; case 3: rtnQuad.m_left += hw; break; default: throw new Error( "invalid quadrant to Rectangle.getQuadrant: " + iQuad ); break; } return rtnQuad; } }, unionPoint: { value: function( pt ) { var x = pt[0]; var xMin = this.getLeft(), xMax = this.getRight(); if (x < xMin) xMin =x; else if (x > xMax) xMax = x; var y = pt[1]; var yMin = this.getTop(), yMax = this.getBottom(); if (y < yMin) yMin = y; else if (y > yMax) yMax = y; this.setLeft( xMin ); this.setWidth( xMax - xMin ); this.setTop( yMin ); this.setHeight( yMax - yMin ); } }, translate: { value: function( dx, dy ) { this.m_left += dx; this.m_top += dy; } } });