104 lines
3.8 KiB
JavaScript
104 lines
3.8 KiB
JavaScript
import TileQueue from '../../../../../../src/ol/TileQueue.js';
|
|
import TileState from '../../../../../../src/ol/TileState.js';
|
|
import WebGLTileLayer from '../../../../../../src/ol/layer/WebGLTile.js';
|
|
import {DataTile} from '../../../../../../src/ol/source.js';
|
|
import {VOID} from '../../../../../../src/ol/functions.js';
|
|
import {create} from '../../../../../../src/ol/transform.js';
|
|
import {createCanvasContext2D} from '../../../../../../src/ol/dom.js';
|
|
import {get} from '../../../../../../src/ol/proj.js';
|
|
|
|
describe('ol/renderer/webgl/TileLayer', function () {
|
|
/** @type {import("../../../../../../src/ol/renderer/webgl/TileLayer.js").default} */
|
|
let renderer;
|
|
/** @type {WebGLTileLayer} */
|
|
let tileLayer;
|
|
/** @type {import('../../../../../../src/ol/PluggableMap.js').FrameState} */
|
|
let frameState;
|
|
beforeEach(function () {
|
|
const size = 256;
|
|
const context = createCanvasContext2D(size, size);
|
|
|
|
tileLayer = new WebGLTileLayer({
|
|
source: new DataTile({
|
|
loader: function (z, x, y) {
|
|
context.clearRect(0, 0, size, size);
|
|
context.fillStyle = 'rgba(100, 100, 100, 0.5)';
|
|
context.fillRect(0, 0, size, size);
|
|
const data = context.getImageData(0, 0, size, size).data;
|
|
return Promise.resolve(data);
|
|
},
|
|
}),
|
|
});
|
|
|
|
renderer = tileLayer.createRenderer();
|
|
|
|
const proj = get('EPSG:3857');
|
|
frameState = {
|
|
layerStatesArray: [tileLayer.getLayerState()],
|
|
layerIndex: 0,
|
|
extent: proj.getExtent(),
|
|
pixelRatio: 1,
|
|
pixelToCoordinateTransform: create(),
|
|
postRenderFunctions: [],
|
|
time: Date.now(),
|
|
viewHints: [],
|
|
viewState: {
|
|
center: [0, 0],
|
|
resolution: 156543.03392804097,
|
|
projection: proj,
|
|
},
|
|
size: [256, 256],
|
|
usedTiles: {},
|
|
wantedTiles: {},
|
|
tileQueue: new TileQueue(VOID, VOID),
|
|
};
|
|
});
|
|
|
|
it('maintains a cache on the renderer instead of the source', function () {
|
|
expect(tileLayer.getSource().tileCache.highWaterMark).to.be(0.1);
|
|
expect(renderer.tileTextureCache_.highWaterMark).to.be(512);
|
|
});
|
|
|
|
it('#prepareFrame()', function () {
|
|
const source = tileLayer.getSource();
|
|
tileLayer.setSource(null);
|
|
expect(renderer.prepareFrame(frameState)).to.be(false);
|
|
tileLayer.setSource(source);
|
|
expect(renderer.prepareFrame(frameState)).to.be(true);
|
|
const tileGrid = source.getTileGrid();
|
|
tileLayer.setExtent(tileGrid.getTileCoordExtent([2, 0, 0]));
|
|
frameState.resolution = tileGrid.getResolution(2);
|
|
frameState.extent = tileGrid.getTileCoordExtent([2, 2, 2]);
|
|
frameState.layerStatesArray = [tileLayer.getLayerState()];
|
|
expect(renderer.prepareFrame(frameState)).to.be(false);
|
|
});
|
|
|
|
it('#renderFrame()', function () {
|
|
const ready = renderer.prepareFrame(frameState);
|
|
expect(ready).to.be(true);
|
|
|
|
const rendered = renderer.renderFrame(frameState);
|
|
expect(rendered).to.be.a(HTMLCanvasElement);
|
|
expect(frameState.tileQueue.getCount()).to.be(1);
|
|
expect(Object.keys(frameState.wantedTiles).length).to.be(1);
|
|
expect(frameState.postRenderFunctions.length).to.be(1); // clear source cache (use renderer cache)
|
|
expect(renderer.tileTextureCache_.count_).to.be(1);
|
|
});
|
|
|
|
it('#isDrawableTile_()', function (done) {
|
|
const tile = tileLayer.getSource().getTile(0, 0, 0);
|
|
expect(renderer.isDrawableTile_(tile)).to.be(false);
|
|
tileLayer.getSource().on('tileloadend', () => {
|
|
expect(renderer.isDrawableTile_(tile)).to.be(true);
|
|
done();
|
|
});
|
|
tile.load();
|
|
const errorTile = tileLayer.getSource().getTile(1, 0, 1);
|
|
errorTile.setState(TileState.ERROR);
|
|
tileLayer.setUseInterimTilesOnError(false);
|
|
expect(renderer.isDrawableTile_(errorTile)).to.be(true);
|
|
tileLayer.setUseInterimTilesOnError(true);
|
|
expect(renderer.isDrawableTile_(errorTile)).to.be(false);
|
|
});
|
|
});
|