diff --git a/spec/runner.html b/spec/runner.html
index f24771740..6b2197425 100644
--- a/spec/runner.html
+++ b/spec/runner.html
@@ -18,10 +18,10 @@
-
+
@@ -41,10 +41,10 @@
-
+
diff --git a/spec/suites/geometry/BoundsSpec.js b/spec/suites/geometry/BoundsSpec.js
new file mode 100644
index 000000000..eee05e4bf
--- /dev/null
+++ b/spec/suites/geometry/BoundsSpec.js
@@ -0,0 +1,43 @@
+describe('Bounds', function() {
+ var a, b;
+
+ beforeEach(function() {
+ a = new L.Bounds(
+ new L.Point(14, 12),
+ new L.Point(30, 40));
+ b = new L.Bounds([
+ new L.Point(20, 12),
+ new L.Point(14, 20),
+ new L.Point(30, 40)
+ ]);
+ });
+
+ describe('constructor', function() {
+ it('should create bounds with proper min & max on (Point, Point)', function() {
+ expect(a.min).toEqual(new L.Point(14, 12));
+ expect(a.max).toEqual(new L.Point(30, 40));
+ });
+ it('should create bounds with proper min & max on (Point[])', function() {
+ expect(b.min).toEqual(new L.Point(14, 12));
+ expect(b.max).toEqual(new L.Point(30, 40));
+ });
+ });
+
+ describe('#extend', function() {
+ it('should extend the bounds to contain the given point', function() {
+ a.extend(new L.Point(50, 20));
+ expect(a.min).toEqual(new L.Point(14, 12));
+ expect(a.max).toEqual(new L.Point(50, 40));
+
+ b.extend(new L.Point(25, 50));
+ expect(b.min).toEqual(new L.Point(14, 12));
+ expect(b.max).toEqual(new L.Point(30, 50));
+ });
+ });
+
+ describe('#getCenter', function() {
+ it('should return the center point', function() {
+ expect(a.getCenter()).toEqual(new L.Point(22, 26));
+ });
+ });
+});
\ No newline at end of file
diff --git a/src/geometry/Bounds.js b/src/geometry/Bounds.js
new file mode 100644
index 000000000..e76e6c93d
--- /dev/null
+++ b/src/geometry/Bounds.js
@@ -0,0 +1,38 @@
+/*
+ * L.Bounds represents a rectangular area on the screen in pixel coordinates.
+ */
+
+L.Bounds = L.Class.extend({
+ initialize: function(min, max) { //(Point, Point) or Point[]
+ var points = (min instanceof Array ? min : [min, max]);
+ for (var i = 0, len = points.length; i < len; i++) {
+ this.extend(points[i]);
+ }
+ },
+
+ // extend the bounds to contain the given point
+ extend: function(/*Point*/ point) {
+ if (!this.min && !this.max) {
+ this.min = new L.Point(point.x, point.y);
+ this.max = new L.Point(point.x, point.y);
+ } else {
+ this.min.x = Math.min(point.x, this.min.x);
+ this.max.x = Math.max(point.x, this.max.x);
+ this.min.y = Math.min(point.y, this.min.y);
+ this.max.y = Math.max(point.y, this.max.y);
+ }
+ },
+
+ getCenter: function(round)/*->Point*/ {
+ return new L.Point(
+ (this.min.x + this.max.x) / 2,
+ (this.min.y + this.max.y) / 2, round);
+ },
+
+ contains: function(/*Bounds*/ bounds)/*->Boolean*/ {
+ return (bounds.min.x >= this.min.x) &&
+ (bounds.max.x <= this.max.x) &&
+ (bounds.min.y >= this.min.y) &&
+ (bounds.max.y <= this.max.y);
+ }
+});
\ No newline at end of file