diff --git a/src/ol/renderer/canvas/tilelayer.js b/src/ol/renderer/canvas/tilelayer.js index 160a0f9609..99dbd59469 100644 --- a/src/ol/renderer/canvas/tilelayer.js +++ b/src/ol/renderer/canvas/tilelayer.js @@ -26,7 +26,7 @@ ol.renderer.canvas.TileLayer = function(tileLayer) { * @protected * @type {CanvasRenderingContext2D} */ - this.context = ol.dom.createCanvasContext2D(); + this.context = this.context === null ? null : ol.dom.createCanvasContext2D(); /** * @private @@ -178,19 +178,20 @@ ol.renderer.canvas.TileLayer.prototype.prepareFrame = function(frameState, layer this.renderedRevision != sourceRevision) || oversampling != this.oversampling_) { - var tilePixelSize = tileSource.getTilePixelSize(z, pixelRatio, projection); - var width = Math.round(tileRange.getWidth() * tilePixelSize[0] / oversampling); - var height = Math.round(tileRange.getHeight() * tilePixelSize[1] / oversampling); var context = this.context; - var canvas = context.canvas; - var opaque = tileSource.getOpaque(projection); - if (canvas.width != width || canvas.height != height) { - this.oversampling_ = oversampling; - canvas.width = width; - canvas.height = height; - } else { - context.clearRect(0, 0, width, height); - oversampling = this.oversampling_; + if (context) { + var tilePixelSize = tileSource.getTilePixelSize(z, pixelRatio, projection); + var width = Math.round(tileRange.getWidth() * tilePixelSize[0] / oversampling); + var height = Math.round(tileRange.getHeight() * tilePixelSize[1] / oversampling); + var canvas = context.canvas; + if (canvas.width != width || canvas.height != height) { + this.oversampling_ = oversampling; + canvas.width = width; + canvas.height = height; + } else { + context.clearRect(0, 0, width, height); + oversampling = this.oversampling_; + } } this.renderedTiles.length = 0; @@ -213,9 +214,6 @@ ol.renderer.canvas.TileLayer.prototype.prepareFrame = function(frameState, layer y = (imageExtent[3] - tileExtent[3]) / tileResolution * tilePixelRatio / oversampling; w = currentTilePixelSize[0] * currentScale / oversampling; h = currentTilePixelSize[1] * currentScale / oversampling; - if (!opaque) { - context.clearRect(x, y, w, h); - } this.drawTileImage(tile, frameState, layerState, x, y, w, h, tileGutter); this.renderedTiles.push(tile); } @@ -261,6 +259,9 @@ ol.renderer.canvas.TileLayer.prototype.prepareFrame = function(frameState, layer * @param {number} gutter Tile gutter. */ ol.renderer.canvas.TileLayer.prototype.drawTileImage = function(tile, frameState, layerState, x, y, w, h, gutter) { + if (!this.getLayer().getSource().getOpaque(frameState.viewState.projection)) { + this.context.clearRect(x, y, w, h); + } var image = tile.getImage(); if (image) { this.context.drawImage(image, gutter, gutter, @@ -273,7 +274,8 @@ ol.renderer.canvas.TileLayer.prototype.drawTileImage = function(tile, frameState * @inheritDoc */ ol.renderer.canvas.TileLayer.prototype.getImage = function() { - return this.context.canvas; + var context = this.context; + return context ? context.canvas : null; }; diff --git a/src/ol/renderer/canvas/vectortilelayer.js b/src/ol/renderer/canvas/vectortilelayer.js index c36e1e1b01..a7f4b38279 100644 --- a/src/ol/renderer/canvas/vectortilelayer.js +++ b/src/ol/renderer/canvas/vectortilelayer.js @@ -1,6 +1,7 @@ goog.provide('ol.renderer.canvas.VectorTileLayer'); goog.require('ol'); +goog.require('ol.dom'); goog.require('ol.extent'); goog.require('ol.proj'); goog.require('ol.proj.Units'); @@ -22,6 +23,8 @@ goog.require('ol.transform'); */ ol.renderer.canvas.VectorTileLayer = function(layer) { + this.context = null; + ol.renderer.canvas.TileLayer.call(this, layer); /** @@ -74,9 +77,17 @@ ol.renderer.canvas.VectorTileLayer.VECTOR_REPLAYS = { * @inheritDoc */ ol.renderer.canvas.VectorTileLayer.prototype.prepareFrame = function(frameState, layerState) { - var layerRevision = this.getLayer().getRevision(); + var layer = this.getLayer(); + var layerRevision = layer.getRevision(); if (this.renderedLayerRevision_ != layerRevision) { this.renderedTiles.length = 0; + var renderMode = layer.getRenderMode(); + if (!this.context && renderMode != ol.layer.VectorTileRenderType.VECTOR) { + this.context = ol.dom.createCanvasContext2D(); + } + if (this.context && renderMode == ol.layer.VectorTileRenderType.VECTOR) { + this.context = null; + } } this.renderedLayerRevision_ = layerRevision; return ol.renderer.canvas.TileLayer.prototype.prepareFrame.apply(this, arguments); @@ -184,11 +195,10 @@ ol.renderer.canvas.VectorTileLayer.prototype.drawTileImage = function( tile, frameState, layerState, x, y, w, h, gutter) { var vectorTile = /** @type {ol.VectorTile} */ (tile); this.createReplayGroup_(vectorTile, frameState); - var layer = this.getLayer(); - if (layer.getRenderMode() != ol.layer.VectorTileRenderType.VECTOR) { + if (this.context) { this.renderTileImage_(vectorTile, frameState, layerState); + ol.renderer.canvas.TileLayer.prototype.drawTileImage.apply(this, arguments); } - ol.renderer.canvas.TileLayer.prototype.drawTileImage.apply(this, arguments); }; diff --git a/src/ol/vectortile.js b/src/ol/vectortile.js index 78598ff023..ade49cf9e2 100644 --- a/src/ol/vectortile.js +++ b/src/ol/vectortile.js @@ -24,7 +24,7 @@ ol.VectorTile = function(tileCoord, state, src, format, tileLoadFunction) { * @private * @type {CanvasRenderingContext2D} */ - this.context_ = ol.dom.createCanvasContext2D(); + this.context_ = null; /** * @private @@ -83,6 +83,9 @@ ol.inherits(ol.VectorTile, ol.Tile); * @return {CanvasRenderingContext2D} The rendering context. */ ol.VectorTile.prototype.getContext = function() { + if (!this.context_) { + this.context_ = ol.dom.createCanvasContext2D(); + } return this.context_; };