Fix source band calculation when configured with multiple sources

This commit is contained in:
Andreas Hocevar
2022-06-13 14:35:16 +02:00
parent 9b6f94e194
commit 04ffcbfd08
2 changed files with 31 additions and 3 deletions

View File

@@ -69,7 +69,7 @@ import {assign} from '../obj.js';
* of sources for this layer. Takes precedence over `source`. Can either be an array of sources, or a function that * of sources for this layer. Takes precedence over `source`. Can either be an array of sources, or a function that
* expects an extent and a resolution (in view projection units per pixel) and returns an array of sources. See * expects an extent and a resolution (in view projection units per pixel) and returns an array of sources. See
* {@link module:ol/source.sourcesFromTileGrid} for a helper function to generate sources that are organized in a * {@link module:ol/source.sourcesFromTileGrid} for a helper function to generate sources that are organized in a
* pyramid following the same pattern as a tile grid. * pyramid following the same pattern as a tile grid. **Note:** All sources must have the same band count and content.
* @property {import("../PluggableMap.js").default} [map] Sets the layer as overlay on a map. The map will not manage * @property {import("../PluggableMap.js").default} [map] Sets the layer as overlay on a map. The map will not manage
* this layer in its layers collection, and the layer will be rendered on top. This is useful for * this layer in its layers collection, and the layer will be rendered on top. This is useful for
* temporary layers. The standard way to add a layer to a map and have it managed by the map is to * temporary layers. The standard way to add a layer to a map and have it managed by the map is to
@@ -404,8 +404,11 @@ class WebGLTileLayer extends BaseTileLayer {
* @return {number} The number of source bands. * @return {number} The number of source bands.
*/ */
getSourceBandCount_() { getSourceBandCount_() {
const source = this.getSource(); const max = Number.MAX_SAFE_INTEGER;
return source && 'bandCount' in source ? source.bandCount : 4; const sources = this.getSources([-max, -max, max, max], max);
return sources && sources.length && 'bandCount' in sources[0]
? sources[0].bandCount
: 4;
} }
createRenderer() { createRenderer() {

View File

@@ -545,6 +545,31 @@ describe('ol/layer/WebGLTile', function () {
}); });
}); });
describe('multiple sources', () => {
it('can determine the correct band count for static sources array', () => {
const layer = new WebGLTileLayer({
sources: [
new DataTileSource({
bandCount: 7,
}),
],
});
expect(layer.getSourceBandCount_()).to.be(7);
});
it('can determine the correct band count for sources function', () => {
const layer = new WebGLTileLayer({
sources: sourcesFromTileGrid(
createXYZ(),
([z, x, y]) =>
new DataTileSource({
bandCount: 7,
})
),
});
expect(layer.getSourceBandCount_()).to.be(7);
});
});
it('dispatches a precompose event with WebGL context', (done) => { it('dispatches a precompose event with WebGL context', (done) => {
let called = false; let called = false;
layer.on('precompose', (event) => { layer.on('precompose', (event) => {