Merge pull request #4894 from tschaub/raster-tests
Only run raster operations after image sources have loaded.
This commit is contained in:
@@ -202,5 +202,5 @@ ol.renderer.canvas.ImageLayer.prototype.prepareFrame = function(frameState, laye
|
||||
this.updateLogos(frameState, imageSource);
|
||||
}
|
||||
|
||||
return true;
|
||||
return !!this.image_;
|
||||
};
|
||||
|
||||
@@ -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_) {
|
||||
|
||||
@@ -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');
|
||||
|
||||
Reference in New Issue
Block a user