diff --git a/src/ol/renderer/canvas/canvasimagelayerrenderer.js b/src/ol/renderer/canvas/canvasimagelayerrenderer.js index 9b4aeae64b..94cb00d390 100644 --- a/src/ol/renderer/canvas/canvasimagelayerrenderer.js +++ b/src/ol/renderer/canvas/canvasimagelayerrenderer.js @@ -202,5 +202,5 @@ ol.renderer.canvas.ImageLayer.prototype.prepareFrame = function(frameState, laye this.updateLogos(frameState, imageSource); } - return true; + return !!this.image_; }; diff --git a/src/ol/source/rastersource.js b/src/ol/source/rastersource.js index 1a89287129..5eb8ee4890 100644 --- a/src/ol/source/rastersource.js +++ b/src/ol/source/rastersource.js @@ -343,7 +343,9 @@ ol.source.Raster.prototype.onWorkerComplete_ = function(frameState, callback, er * @private */ ol.source.Raster.getImageData_ = function(renderer, frameState, layerState) { - renderer.prepareFrame(frameState, layerState); + if (!renderer.prepareFrame(frameState, layerState)) { + return null; + } var width = frameState.size[0]; var height = frameState.size[1]; if (!ol.source.Raster.context_) { diff --git a/test/spec/ol/source/rastersource.test.js b/test/spec/ol/source/rastersource.test.js index b127f04a33..28a807ee76 100644 --- a/test/spec/ol/source/rastersource.test.js +++ b/test/spec/ol/source/rastersource.test.js @@ -9,13 +9,7 @@ var green = 'data:image/gif;base64,R0lGODlhAQABAPAAAAD/AP///yH5BAAAAAAALAAAA' + var blue = 'data:image/gif;base64,R0lGODlhAQABAPAAAAAA/////yH5BAAAAAAALAAAAA' + 'ABAAEAAAICRAEAOw=='; -function itNoPhantom() { - if (window.checkForMocha) { - return xit.apply(this, arguments); - } else { - return it.apply(this, arguments); - } -} +var itNoPhantom = window.checkForMocha ? xit : it; var hasImageDataConstructor = true; try { @@ -24,286 +18,290 @@ try { hasImageDataConstructor = false; } -(hasImageDataConstructor ? describe : xdescribe)('ol.source.Raster', - function() { +var maybeDescribe = hasImageDataConstructor ? describe : xdescribe; - var target, map, redSource, greenSource, blueSource, raster; +maybeDescribe('ol.source.Raster', function() { - beforeEach(function() { - target = document.createElement('div'); + var target, map, redSource, greenSource, blueSource, raster; - var style = target.style; - style.position = 'absolute'; - style.left = '-1000px'; - style.top = '-1000px'; - style.width = '2px'; - style.height = '2px'; - document.body.appendChild(target); + beforeEach(function() { + target = document.createElement('div'); - var extent = [-1, -1, 1, 1]; + var style = target.style; + style.position = 'absolute'; + style.left = '-1000px'; + style.top = '-1000px'; + style.width = '2px'; + style.height = '2px'; + document.body.appendChild(target); - redSource = new ol.source.ImageStatic({ - url: red, - imageExtent: extent - }); + var extent = [-1, -1, 1, 1]; - greenSource = new ol.source.ImageStatic({ - url: green, - imageExtent: extent - }); + redSource = new ol.source.ImageStatic({ + url: red, + imageExtent: extent + }); - blueSource = new ol.source.ImageStatic({ - url: blue, - imageExtent: extent - }); + greenSource = new ol.source.ImageStatic({ + url: green, + imageExtent: extent + }); - raster = new ol.source.Raster({ - threads: 0, - sources: [redSource, greenSource, blueSource], - operation: function(inputs) { - return inputs[0]; - } - }); + blueSource = new ol.source.ImageStatic({ + url: blue, + imageExtent: extent + }); - map = new ol.Map({ - target: target, - view: new ol.View({ - resolutions: [1], - projection: new ol.proj.Projection({ - code: 'image', - units: 'pixels', - extent: extent - }) - }), - layers: [ - new ol.layer.Image({ - source: raster - }) - ] - }); + raster = new ol.source.Raster({ + threads: 0, + sources: [redSource, greenSource, blueSource], + operation: function(inputs) { + return inputs[0]; + } + }); + + map = new ol.Map({ + target: target, + view: new ol.View({ + resolutions: [1], + projection: new ol.proj.Projection({ + code: 'image', + units: 'pixels', + extent: extent + }) + }), + layers: [ + new ol.layer.Image({ + source: raster + }) + ] + }); + }); + + afterEach(function() { + map.setTarget(null); + map.dispose(); + raster.dispose(); + greenSource.dispose(); + redSource.dispose(); + blueSource.dispose(); + document.body.removeChild(target); + }); + + describe('constructor', function() { + + it('returns a tile source', function() { + var source = new ol.source.Raster({ + threads: 0, + sources: [new ol.source.Tile({})] + }); + expect(source).to.be.a(ol.source.Source); + expect(source).to.be.a(ol.source.Raster); + }); + + itNoPhantom('defaults to "pixel" operation', function(done) { + + var log = []; + + var source = new ol.source.Raster({ + threads: 0, + sources: [redSource, greenSource, blueSource], + operation: function(inputs) { + log.push(inputs); + return inputs[0]; + } }); - afterEach(function() { - goog.dispose(map); - document.body.removeChild(target); + source.once('afteroperations', function() { + expect(log.length).to.equal(4); + var inputs = log[0]; + var pixel = inputs[0]; + expect(pixel).to.be.an('array'); + done(); }); - describe('constructor', function() { + map.getLayers().item(0).setSource(source); + var view = map.getView(); + view.setCenter([0, 0]); + view.setZoom(0); - it('returns a tile source', function() { - var source = new ol.source.Raster({ - threads: 0, - sources: [new ol.source.Tile({})] - }); - expect(source).to.be.a(ol.source.Source); - expect(source).to.be.a(ol.source.Raster); - }); + }); - itNoPhantom('defaults to "pixel" operation', function(done) { - - var log = []; - - raster = new ol.source.Raster({ - threads: 0, - sources: [redSource, greenSource, blueSource], - operation: function(inputs) { - log.push(inputs); - return inputs[0]; - } - }); - - raster.on('afteroperations', function() { - expect(log.length).to.equal(4); - var inputs = log[0]; - var pixel = inputs[0]; - expect(pixel).to.be.an('array'); - done(); - }); - - map.getLayers().item(0).setSource(raster); - var view = map.getView(); - view.setCenter([0, 0]); - view.setZoom(0); - - }); - - itNoPhantom('allows operation type to be set to "image"', - function(done) { - - var log = []; - - raster = new ol.source.Raster({ - operationType: ol.raster.OperationType.IMAGE, - threads: 0, - sources: [redSource, greenSource, blueSource], - operation: function(inputs) { - log.push(inputs); - return inputs[0]; - } - }); - - raster.on('afteroperations', function() { - expect(log.length).to.equal(1); - var inputs = log[0]; - expect(inputs[0]).to.be.an(ImageData); - done(); - }); - - map.getLayers().item(0).setSource(raster); - var view = map.getView(); - view.setCenter([0, 0]); - view.setZoom(0); - - }); + itNoPhantom('allows operation type to be set to "image"', function(done) { + var log = []; + var source = new ol.source.Raster({ + operationType: ol.raster.OperationType.IMAGE, + threads: 0, + sources: [redSource, greenSource, blueSource], + operation: function(inputs) { + log.push(inputs); + return inputs[0]; + } }); - describe('#setOperation()', function() { - - itNoPhantom('allows operation to be set', function(done) { - - var count = 0; - raster.setOperation(function(pixels) { - ++count; - var redPixel = pixels[0]; - var greenPixel = pixels[1]; - var bluePixel = pixels[2]; - expect(redPixel).to.eql([255, 0, 0, 255]); - expect(greenPixel).to.eql([0, 255, 0, 255]); - expect(bluePixel).to.eql([0, 0, 255, 255]); - return pixels[0]; - }); - - var view = map.getView(); - view.setCenter([0, 0]); - view.setZoom(0); - - raster.on('afteroperations', function(event) { - expect(count).to.equal(4); - done(); - }); - - }); - - itNoPhantom('updates and re-runs the operation', function(done) { - - var view = map.getView(); - view.setCenter([0, 0]); - view.setZoom(0); - - var count = 0; - raster.on('afteroperations', function(event) { - ++count; - if (count === 1) { - raster.setOperation(function(inputs) { - return inputs[0]; - }); - } else { - done(); - } - }); - - }); - + source.once('afteroperations', function() { + expect(log.length).to.equal(1); + var inputs = log[0]; + expect(inputs[0]).to.be.an(ImageData); + done(); }); - describe('beforeoperations', function() { + map.getLayers().item(0).setSource(source); + var view = map.getView(); + view.setCenter([0, 0]); + view.setZoom(0); - itNoPhantom('gets called before operations are run', function(done) { + }); - var count = 0; - raster.setOperation(function(inputs) { - ++count; - return inputs[0]; - }); + }); - raster.on('beforeoperations', function(event) { - expect(count).to.equal(0); - expect(!!event).to.be(true); - expect(event.extent).to.be.an('array'); - expect(event.resolution).to.be.a('number'); - expect(event.data).to.be.an('object'); - done(); - }); + describe('#setOperation()', function() { - var view = map.getView(); - view.setCenter([0, 0]); - view.setZoom(0); - - }); - - - itNoPhantom('allows data to be set for the operation', function(done) { - - raster.setOperation(function(inputs, data) { - ++data.count; - return inputs[0]; - }); - - raster.on('beforeoperations', function(event) { - event.data.count = 0; - }); - - raster.on('afteroperations', function(event) { - expect(event.data.count).to.equal(4); - done(); - }); - - var view = map.getView(); - view.setCenter([0, 0]); - view.setZoom(0); - - }); + itNoPhantom('allows operation to be set', function(done) { + var count = 0; + raster.setOperation(function(pixels) { + ++count; + var redPixel = pixels[0]; + var greenPixel = pixels[1]; + var bluePixel = pixels[2]; + expect(redPixel).to.eql([255, 0, 0, 255]); + expect(greenPixel).to.eql([0, 255, 0, 255]); + expect(bluePixel).to.eql([0, 0, 255, 255]); + return pixels[0]; }); - describe('afteroperations', function() { - - itNoPhantom('gets called after operations are run', function(done) { - - var count = 0; - raster.setOperation(function(inputs) { - ++count; - return inputs[0]; - }); - - raster.on('afteroperations', function(event) { - expect(count).to.equal(4); - expect(!!event).to.be(true); - expect(event.extent).to.be.an('array'); - expect(event.resolution).to.be.a('number'); - expect(event.data).to.be.an('object'); - done(); - }); - - var view = map.getView(); - view.setCenter([0, 0]); - view.setZoom(0); - - }); - - itNoPhantom('receives data set by the operation', function(done) { - - raster.setOperation(function(inputs, data) { - data.message = 'hello world'; - return inputs[0]; - }); - - raster.on('afteroperations', function(event) { - expect(event.data.message).to.equal('hello world'); - done(); - }); - - var view = map.getView(); - view.setCenter([0, 0]); - view.setZoom(0); - - }); + var view = map.getView(); + view.setCenter([0, 0]); + view.setZoom(0); + raster.once('afteroperations', function(event) { + expect(count).to.equal(4); + done(); }); }); + itNoPhantom('updates and re-runs the operation', function(done) { + + var view = map.getView(); + view.setCenter([0, 0]); + view.setZoom(0); + + var count = 0; + raster.on('afteroperations', function(event) { + ++count; + if (count === 1) { + raster.setOperation(function(inputs) { + return inputs[0]; + }); + } else { + done(); + } + }); + + }); + + }); + + describe('beforeoperations', function() { + + itNoPhantom('gets called before operations are run', function(done) { + + var count = 0; + raster.setOperation(function(inputs) { + ++count; + return inputs[0]; + }); + + raster.once('beforeoperations', function(event) { + expect(count).to.equal(0); + expect(!!event).to.be(true); + expect(event.extent).to.be.an('array'); + expect(event.resolution).to.be.a('number'); + expect(event.data).to.be.an('object'); + done(); + }); + + var view = map.getView(); + view.setCenter([0, 0]); + view.setZoom(0); + + }); + + + itNoPhantom('allows data to be set for the operation', function(done) { + + raster.setOperation(function(inputs, data) { + ++data.count; + return inputs[0]; + }); + + raster.on('beforeoperations', function(event) { + event.data.count = 0; + }); + + raster.once('afteroperations', function(event) { + expect(event.data.count).to.equal(4); + done(); + }); + + var view = map.getView(); + view.setCenter([0, 0]); + view.setZoom(0); + + }); + + }); + + describe('afteroperations', function() { + + itNoPhantom('gets called after operations are run', function(done) { + + var count = 0; + raster.setOperation(function(inputs) { + ++count; + return inputs[0]; + }); + + raster.once('afteroperations', function(event) { + expect(count).to.equal(4); + expect(!!event).to.be(true); + expect(event.extent).to.be.an('array'); + expect(event.resolution).to.be.a('number'); + expect(event.data).to.be.an('object'); + done(); + }); + + var view = map.getView(); + view.setCenter([0, 0]); + view.setZoom(0); + + }); + + itNoPhantom('receives data set by the operation', function(done) { + + raster.setOperation(function(inputs, data) { + data.message = 'hello world'; + return inputs[0]; + }); + + raster.once('afteroperations', function(event) { + expect(event.data.message).to.equal('hello world'); + done(); + }); + + var view = map.getView(); + view.setCenter([0, 0]); + view.setZoom(0); + + }); + + }); + +}); + goog.require('ol.Map'); goog.require('ol.View'); goog.require('ol.layer.Image');