diff --git a/src/ol/color.js b/src/ol/color.js
index 5d6286f6f9..368e23fdda 100644
--- a/src/ol/color.js
+++ b/src/ol/color.js
@@ -1,6 +1,7 @@
goog.provide('ol.Color');
goog.require('goog.color');
+goog.require('goog.math');
@@ -9,29 +10,29 @@ goog.require('goog.color');
* @param {number} r Red, 0 to 255.
* @param {number} g Green, 0 to 255.
* @param {number} b Blue, 0 to 255.
- * @param {number} a Alpha, 0 (fully transparent) to 255 (fully opaque).
+ * @param {number} a Alpha, 0 (fully transparent) to 1 (fully opaque).
*/
ol.Color = function(r, g, b, a) {
/**
* @type {number}
*/
- this.r = r;
+ this.r = goog.math.clamp(r, 0, 255);
/**
* @type {number}
*/
- this.g = g;
+ this.g = goog.math.clamp(g, 0, 255);
/**
* @type {number}
*/
- this.b = b;
+ this.b = goog.math.clamp(b, 0, 255);
/**
* @type {number}
*/
- this.a = a;
+ this.a = goog.math.clamp(a, 0, 1);
};
diff --git a/src/ol/map.js b/src/ol/map.js
index cdd492f45a..a0400327e3 100644
--- a/src/ol/map.js
+++ b/src/ol/map.js
@@ -618,7 +618,7 @@ ol.Map.prototype.renderFrame_ = function(time) {
frameState = {
animate: false,
backgroundColor: goog.isDef(backgroundColor) ?
- backgroundColor : new ol.Color(1, 1, 1, 1),
+ backgroundColor : new ol.Color(255, 255, 255, 1),
coordinateToPixelMatrix: this.coordinateToPixelMatrix_,
extent: null,
layersArray: layersArray,
diff --git a/src/ol/renderer/canvas/canvasmaprenderer.js b/src/ol/renderer/canvas/canvasmaprenderer.js
index b664dc977a..2798b18c62 100644
--- a/src/ol/renderer/canvas/canvasmaprenderer.js
+++ b/src/ol/renderer/canvas/canvasmaprenderer.js
@@ -138,7 +138,7 @@ ol.renderer.canvas.Map.prototype.renderFrame = function(frameState) {
backgroundColor.r.toFixed(0) + ',' +
backgroundColor.g.toFixed(0) + ',' +
backgroundColor.b.toFixed(0) + ')';
- context.globalAlpha = 1;
+ context.globalAlpha = backgroundColor.a;
context.fillRect(0, 0, size.width, size.height);
goog.array.forEach(frameState.layersArray, function(layer) {
diff --git a/src/ol/renderer/webgl/webglmaprenderer.js b/src/ol/renderer/webgl/webglmaprenderer.js
index 3a071a686e..6e2e6c3990 100644
--- a/src/ol/renderer/webgl/webglmaprenderer.js
+++ b/src/ol/renderer/webgl/webglmaprenderer.js
@@ -490,7 +490,8 @@ ol.renderer.webgl.Map.prototype.renderFrame = function(frameState) {
gl.bindFramebuffer(goog.webgl.FRAMEBUFFER, null);
var clearColor = frameState.backgroundColor;
- gl.clearColor(clearColor.r, clearColor.g, clearColor.b, clearColor.a);
+ gl.clearColor(clearColor.r / 255, clearColor.g / 255,
+ clearColor.b / 255, clearColor.a);
gl.clear(goog.webgl.COLOR_BUFFER_BIT);
gl.enable(goog.webgl.BLEND);
gl.viewport(0, 0, size.width, size.height);
diff --git a/test/ol.html b/test/ol.html
index 9c00d22ecd..b0e05e2f6d 100644
--- a/test/ol.html
+++ b/test/ol.html
@@ -72,6 +72,7 @@
+
diff --git a/test/spec/ol/color.test.js b/test/spec/ol/color.test.js
new file mode 100644
index 0000000000..157a64788a
--- /dev/null
+++ b/test/spec/ol/color.test.js
@@ -0,0 +1,73 @@
+describe('ol.Color', function() {
+
+ describe('constructor', function() {
+
+ it('limits r to 0-255', function() {
+ var c;
+
+ // legit r
+ c = new ol.Color(10.5, 11, 12, 0.5);
+ expect(c.r).toBe(10.5);
+
+ // under r
+ c = new ol.Color(-10, 11, 12, 0.5);
+ expect(c.r).toBe(0);
+
+ // over r
+ c = new ol.Color(300, 11, 12, 0.5);
+ expect(c.r).toBe(255);
+ });
+
+ it('limits g to 0-255', function() {
+ var c;
+
+ // legit g
+ c = new ol.Color(10, 11.5, 12, 0.5);
+ expect(c.g).toBe(11.5);
+
+ // under g
+ c = new ol.Color(10, -11, 12, 0.5);
+ expect(c.g).toBe(0);
+
+ // over g
+ c = new ol.Color(10, 275, 12, 0.5);
+ expect(c.g).toBe(255);
+ });
+
+ it('limits b to 0-255', function() {
+ var c;
+
+ // legit b
+ c = new ol.Color(10, 11, 12.5, 0.5);
+ expect(c.b).toBe(12.5);
+
+ // under b
+ c = new ol.Color(10, 11, -12, 0.5);
+ expect(c.b).toBe(0);
+
+ // over b
+ c = new ol.Color(10, 11, 500, 0.5);
+ expect(c.b).toBe(255);
+ });
+
+ it('limits 1 to 0-1', function() {
+ var c;
+
+ // legit a
+ c = new ol.Color(10, 11, 12, 0.5);
+ expect(c.a).toBe(0.5);
+
+ // under a
+ c = new ol.Color(10, 11, 12, -0.5);
+ expect(c.a).toBe(0);
+
+ // over a
+ c = new ol.Color(10, 11, 12, 2.5);
+ expect(c.a).toBe(1);
+ });
+
+ });
+
+});
+
+goog.require('ol.array');