Reduce the number of clip operations

This commit is contained in:
Andreas Hocevar
2022-02-17 15:18:23 +01:00
parent f99c43db4d
commit c9ff07a695
+28 -14
View File
@@ -20,6 +20,7 @@ import {
equals, equals,
getIntersection, getIntersection,
getTopLeft, getTopLeft,
intersects,
} from '../../extent.js'; } from '../../extent.js';
import {cssOpacity} from '../../css.js'; import {cssOpacity} from '../../css.js';
import {fromUserExtent} from '../../proj.js'; import {fromUserExtent} from '../../proj.js';
@@ -463,26 +464,37 @@ class CanvasTileLayerRenderer extends CanvasLayerRenderer {
const inTransition = const inTransition =
transition && tile.getAlpha(getUid(this), frameState.time) !== 1; transition && tile.getAlpha(getUid(this), frameState.time) !== 1;
let contextSaved = false;
if (!inTransition) { if (!inTransition) {
if (clips) { if (clips) {
// Clip mask for regions in this tile that already filled by a higher z tile // Clip mask for regions in this tile that already filled by a higher z tile
context.save();
currentClip = [x, y, x + w, y, x + w, y + h, x, y + h]; currentClip = [x, y, x + w, y, x + w, y + h, x, y + h];
for (let i = 0, ii = clips.length; i < ii; ++i) { for (let i = 0, ii = clips.length; i < ii; ++i) {
if (z !== currentZ && currentZ < clipZs[i]) { if (z !== currentZ && currentZ < clipZs[i]) {
const clip = clips[i]; const clip = clips[i];
context.beginPath(); if (
// counter-clockwise (outer ring) for current tile intersects(
context.moveTo(currentClip[0], currentClip[1]); [x, y, x + w, y + h],
context.lineTo(currentClip[2], currentClip[3]); [clip[0], clip[3], clip[4], clip[7]]
context.lineTo(currentClip[4], currentClip[5]); )
context.lineTo(currentClip[6], currentClip[7]); ) {
// clockwise (inner ring) for higher z tile if (!contextSaved) {
context.moveTo(clip[6], clip[7]); context.save();
context.lineTo(clip[4], clip[5]); contextSaved = true;
context.lineTo(clip[2], clip[3]); }
context.lineTo(clip[0], clip[1]); context.beginPath();
context.clip(); // counter-clockwise (outer ring) for current tile
context.moveTo(currentClip[0], currentClip[1]);
context.lineTo(currentClip[2], currentClip[3]);
context.lineTo(currentClip[4], currentClip[5]);
context.lineTo(currentClip[6], currentClip[7]);
// clockwise (inner ring) for higher z tile
context.moveTo(clip[6], clip[7]);
context.lineTo(clip[4], clip[5]);
context.lineTo(clip[2], clip[3]);
context.lineTo(clip[0], clip[1]);
context.clip();
}
} }
} }
clips.push(currentClip); clips.push(currentClip);
@@ -502,7 +514,9 @@ class CanvasTileLayerRenderer extends CanvasLayerRenderer {
transition transition
); );
if (clips && !inTransition) { if (clips && !inTransition) {
context.restore(); if (contextSaved) {
context.restore();
}
this.renderedTiles.unshift(tile); this.renderedTiles.unshift(tile);
} else { } else {
this.renderedTiles.push(tile); this.renderedTiles.push(tile);