Replaces clip.test.js with new tests
Transforms the old rendering test for layer clipping to the new rendering test approach.
This commit is contained in:
BIN
rendering/cases/layer-clipping/expected.png
Normal file
BIN
rendering/cases/layer-clipping/expected.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 6.6 KiB |
61
rendering/cases/layer-clipping/main.js
Normal file
61
rendering/cases/layer-clipping/main.js
Normal file
@@ -0,0 +1,61 @@
|
||||
import Map from '../../../src/ol/Map.js';
|
||||
import View from '../../../src/ol/View.js';
|
||||
import XYZ from '../../../src/ol/source/XYZ.js';
|
||||
import TileLayer from '../../../src/ol/layer/Tile.js';
|
||||
import MultiPolygon from '../../../src/ol/geom/MultiPolygon.js';
|
||||
import Style from '../../../src/ol/style/Style.js';
|
||||
import Stroke from '../../../src/ol/style/Stroke.js';
|
||||
import {getVectorContext} from '../../../src/ol/render.js';
|
||||
|
||||
const source = new XYZ({
|
||||
url: '/data/tiles/osm/{z}/{x}/{y}.png',
|
||||
transition: 0
|
||||
});
|
||||
|
||||
const layer = new TileLayer({
|
||||
source: source
|
||||
});
|
||||
|
||||
const geometry = new MultiPolygon([
|
||||
[[[-80, -40], [-40, 0], [-80, 40], [-120, 0], [-80, -40]]],
|
||||
[[[80, -40], [120, 0], [80, 40], [40, 0], [80, -40]]]
|
||||
]).transform('EPSG:4326', 'EPSG:3857');
|
||||
|
||||
const style = new Style({
|
||||
stroke: new Stroke({
|
||||
width: 2,
|
||||
color: 'blue'
|
||||
})
|
||||
});
|
||||
|
||||
layer.on('prerender', function(event) {
|
||||
const context = event.context;
|
||||
context.save();
|
||||
|
||||
const vectorContext = getVectorContext(event);
|
||||
vectorContext.setStyle(style);
|
||||
vectorContext.drawGeometry(geometry);
|
||||
|
||||
context.clip();
|
||||
});
|
||||
|
||||
layer.on('postrender', function(event) {
|
||||
const context = event.context;
|
||||
context.restore();
|
||||
|
||||
const vectorContext = getVectorContext(event);
|
||||
vectorContext.setStyle(style);
|
||||
vectorContext.drawGeometry(geometry);
|
||||
});
|
||||
|
||||
new Map({
|
||||
pixelRatio: 1,
|
||||
target: 'map',
|
||||
layers: [layer],
|
||||
view: new View({
|
||||
center: [0, 0],
|
||||
zoom: 0
|
||||
})
|
||||
});
|
||||
|
||||
render();
|
||||
@@ -1,110 +0,0 @@
|
||||
import Map from '../../../../src/ol/Map.js';
|
||||
import View from '../../../../src/ol/View.js';
|
||||
import MultiPolygon from '../../../../src/ol/geom/MultiPolygon.js';
|
||||
import TileLayer from '../../../../src/ol/layer/Tile.js';
|
||||
import XYZ from '../../../../src/ol/source/XYZ.js';
|
||||
import Stroke from '../../../../src/ol/style/Stroke.js';
|
||||
import Style from '../../../../src/ol/style/Style.js';
|
||||
|
||||
|
||||
describe('layer clipping', function() {
|
||||
|
||||
function onLoad(source, callback) {
|
||||
let loading = 0;
|
||||
let loaded = 0;
|
||||
let called = false;
|
||||
|
||||
function check() {
|
||||
if (!called && loading > 0 && loaded === loading) {
|
||||
callback();
|
||||
}
|
||||
}
|
||||
|
||||
source.on('tileloadstart', function() {
|
||||
++loading;
|
||||
});
|
||||
source.on('tileloadend', function() {
|
||||
++loaded;
|
||||
setTimeout(check, 10);
|
||||
});
|
||||
source.on('tileloaderror', function() {
|
||||
callback(new Error('Tile loading failed'));
|
||||
called = true;
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
describe('MultiPolygon clipping', function() {
|
||||
|
||||
let map = null;
|
||||
beforeEach(function() {
|
||||
map = new Map({
|
||||
pixelRatio: 1,
|
||||
target: createMapDiv(256, 256),
|
||||
view: new View({
|
||||
center: [0, 0],
|
||||
zoom: 0
|
||||
})
|
||||
});
|
||||
});
|
||||
|
||||
afterEach(function() {
|
||||
disposeMap(map);
|
||||
map = null;
|
||||
});
|
||||
|
||||
it('clips to all parts of the MultiPolygon', function(done) {
|
||||
|
||||
const source = new XYZ({
|
||||
url: 'rendering/ol/data/tiles/osm/{z}/{x}/{y}.png',
|
||||
transition: 0
|
||||
});
|
||||
|
||||
const layer = new TileLayer({
|
||||
source: source
|
||||
});
|
||||
|
||||
const geometry = new MultiPolygon([
|
||||
[[[-80, -40], [-40, 0], [-80, 40], [-120, 0], [-80, -40]]],
|
||||
[[[80, -40], [120, 0], [80, 40], [40, 0], [80, -40]]]
|
||||
]).transform('EPSG:4326', 'EPSG:3857');
|
||||
|
||||
const style = new Style({
|
||||
stroke: new Stroke({
|
||||
width: 2,
|
||||
color: 'blue'
|
||||
})
|
||||
});
|
||||
|
||||
layer.on('precompose', function(event) {
|
||||
const context = event.context;
|
||||
context.save();
|
||||
|
||||
const vectorContext = event.vectorContext;
|
||||
vectorContext.setStyle(style);
|
||||
vectorContext.drawGeometry(geometry);
|
||||
|
||||
context.clip();
|
||||
});
|
||||
|
||||
layer.on('postcompose', function(event) {
|
||||
const context = event.context;
|
||||
context.restore();
|
||||
|
||||
const vectorContext = event.vectorContext;
|
||||
vectorContext.setStyle(style);
|
||||
vectorContext.drawGeometry(geometry);
|
||||
});
|
||||
|
||||
onLoad(source, function(err) {
|
||||
if (err) {
|
||||
return done(err);
|
||||
}
|
||||
expectResemble(map, 'rendering/ol/layer/expected/multipolygon-clip.png', IMAGE_TOLERANCE, done);
|
||||
});
|
||||
|
||||
map.addLayer(layer);
|
||||
|
||||
});
|
||||
});
|
||||
});
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 5.5 KiB |
Reference in New Issue
Block a user