From 4dce59fe9545e7b4ac4af5157efac101d4d7b4d0 Mon Sep 17 00:00:00 2001 From: ahocevar Date: Wed, 2 Apr 2014 16:44:39 +0200 Subject: [PATCH] Add method for testing whether the canvas size is valid This is a way to detect whether a canvas exceeds the maximum dimensions if these are limited on the target device. See https://developer.apple.com/library/ios/documentation/AppleApplications/Reference/SafariWebContent/CreatingContentforSafarioniPhone/CreatingContentforSafarioniPhone.html for limitations on iOS devices. --- src/ol/renderer/canvas/canvaslayerrenderer.js | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/src/ol/renderer/canvas/canvaslayerrenderer.js b/src/ol/renderer/canvas/canvaslayerrenderer.js index 9022170cd6..b6ae6b6119 100644 --- a/src/ol/renderer/canvas/canvaslayerrenderer.js +++ b/src/ol/renderer/canvas/canvaslayerrenderer.js @@ -1,5 +1,6 @@ goog.provide('ol.renderer.canvas.Layer'); +goog.require('goog.array'); goog.require('goog.vec.Mat4'); goog.require('ol.layer.Layer'); goog.require('ol.render.Event'); @@ -20,6 +21,12 @@ ol.renderer.canvas.Layer = function(mapRenderer, layer) { goog.base(this, mapRenderer, layer); + /** + * @private + * @type {ImageData} + */ + this.testImageData_ = null; + /** * @private * @type {!goog.vec.Mat4.Number} @@ -163,3 +170,30 @@ ol.renderer.canvas.Layer.prototype.getTransform = function(frameState) { -view2DState.rotation, -view2DState.center[0], -view2DState.center[1]); }; + + +/** + * @param {CanvasRenderingContext2D} context Context. + * @param {ol.Size} size Size. + * @return {boolean} True when the canvas with the current size does not exceed + * the maximum dimensions. + * @protected + */ +ol.renderer.canvas.Layer.prototype.testCanvasSize = function(context, size) { + var x = size[0] - 1; + var y = size[1] - 1; + var originalImageData = context.getImageData(x, y, 1, 1); + if (goog.isNull(this.testImageData_)) { + this.testImageData_ = context.createImageData(1, 1); + var data = this.testImageData_.data; + data[0] = 42; + data[1] = 84; + data[2] = 126; + data[3] = 255; + } + context.putImageData(this.testImageData_, x, y); + var result = context.getImageData(x, y, 1, 1); + var good = goog.array.equals(this.testImageData_.data, result.data); + context.putImageData(originalImageData, x, y); + return good; +};