Merge pull request #1955 from ahocevar/canvas-no-taint

Test canvas size with an untainted canvas
This commit is contained in:
Andreas Hocevar
2014-04-07 13:52:09 +02:00
2 changed files with 25 additions and 15 deletions

View File

@@ -2,6 +2,7 @@ goog.provide('ol.renderer.canvas.Layer');
goog.require('goog.array'); goog.require('goog.array');
goog.require('goog.vec.Mat4'); goog.require('goog.vec.Mat4');
goog.require('ol.dom');
goog.require('ol.layer.Layer'); goog.require('ol.layer.Layer');
goog.require('ol.render.Event'); goog.require('ol.render.Event');
goog.require('ol.render.EventType'); goog.require('ol.render.EventType');
@@ -167,34 +168,43 @@ ol.renderer.canvas.Layer.prototype.getTransform = function(frameState) {
/** /**
* @param {CanvasRenderingContext2D} context Context.
* @param {ol.Size} size Size. * @param {ol.Size} size Size.
* @return {boolean} True when the canvas with the current size does not exceed * @return {boolean} True when the canvas with the current size does not exceed
* the maximum dimensions. * the maximum dimensions.
*/ */
ol.renderer.canvas.Layer.testCanvasSize = (function() { ol.renderer.canvas.Layer.testCanvasSize = (function() {
/**
* @type {CanvasRenderingContext2D}
*/
var context = null;
/** /**
* @type {ImageData} * @type {ImageData}
*/ */
var testImageData = null; var imageData = null;
return function(context, size) { return function(size) {
var x = size[0] - 1; if (goog.isNull(context)) {
var y = size[1] - 1; context = ol.dom.createCanvasContext2D(1, 1);
var originalImageData = context.getImageData(x, y, 1, 1); imageData = context.createImageData(1, 1);
if (goog.isNull(testImageData)) { var data = imageData.data;
testImageData = context.createImageData(1, 1);
var data = testImageData.data;
data[0] = 42; data[0] = 42;
data[1] = 84; data[1] = 84;
data[2] = 126; data[2] = 126;
data[3] = 255; data[3] = 255;
} }
context.putImageData(testImageData, x, y); var canvas = context.canvas;
var good = size[0] <= canvas.width && size[1] <= canvas.height;
if (!good) {
canvas.width = size[0];
canvas.height = size[1];
var x = size[0] - 1;
var y = size[1] - 1;
context.putImageData(imageData, x, y);
var result = context.getImageData(x, y, 1, 1); var result = context.getImageData(x, y, 1, 1);
var good = goog.array.equals(testImageData.data, result.data); good = goog.array.equals(imageData.data, result.data);
context.putImageData(originalImageData, x, y); }
return good; return good;
}; };
})(); })();

View File

@@ -210,7 +210,7 @@ ol.renderer.canvas.TileLayer.prototype.prepareFrame =
this.canvasSize_ = [canvasWidth, canvasHeight]; this.canvasSize_ = [canvasWidth, canvasHeight];
this.context_ = context; this.context_ = context;
this.canvasTooBig_ = this.canvasTooBig_ =
!ol.renderer.canvas.Layer.testCanvasSize(context, this.canvasSize_); !ol.renderer.canvas.Layer.testCanvasSize(this.canvasSize_);
} else { } else {
goog.asserts.assert(!goog.isNull(this.canvasSize_)); goog.asserts.assert(!goog.isNull(this.canvasSize_));
goog.asserts.assert(!goog.isNull(this.context_)); goog.asserts.assert(!goog.isNull(this.context_));
@@ -226,7 +226,7 @@ ol.renderer.canvas.TileLayer.prototype.prepareFrame =
canvas.height = canvasHeight; canvas.height = canvasHeight;
this.canvasSize_ = [canvasWidth, canvasHeight]; this.canvasSize_ = [canvasWidth, canvasHeight];
this.canvasTooBig_ = this.canvasTooBig_ =
!ol.renderer.canvas.Layer.testCanvasSize(context, this.canvasSize_); !ol.renderer.canvas.Layer.testCanvasSize(this.canvasSize_);
this.renderedCanvasTileRange_ = null; this.renderedCanvasTileRange_ = null;
} else { } else {
canvasWidth = this.canvasSize_[0]; canvasWidth = this.canvasSize_[0];