Fix container transform comparison

This commit is contained in:
Andreas Hocevar
2019-10-31 20:14:10 +01:00
parent bb2bdb17aa
commit 3de05c249b
4 changed files with 29 additions and 11 deletions

View File

@@ -7,7 +7,7 @@ import {containsExtent, intersects} from '../../extent.js';
import {fromUserExtent} from '../../proj.js'; import {fromUserExtent} from '../../proj.js';
import {getIntersection, isEmpty} from '../../extent.js'; import {getIntersection, isEmpty} from '../../extent.js';
import CanvasLayerRenderer from './Layer.js'; import CanvasLayerRenderer from './Layer.js';
import {compose as composeTransform, makeInverse, toString as transformToString} from '../../transform.js'; import {compose as composeTransform, makeInverse} from '../../transform.js';
/** /**
* @classdesc * @classdesc
@@ -104,7 +104,9 @@ class CanvasImageLayerRenderer extends CanvasLayerRenderer {
); );
makeInverse(this.inversePixelTransform, this.pixelTransform); makeInverse(this.inversePixelTransform, this.pixelTransform);
this.useContainer(target, this.pixelTransform, layerState.opacity); const canvasTransform = this.createTransformString(this.pixelTransform);
this.useContainer(target, canvasTransform, layerState.opacity);
const context = this.context; const context = this.context;
const canvas = context.canvas; const canvas = context.canvas;
@@ -162,7 +164,6 @@ class CanvasImageLayerRenderer extends CanvasLayerRenderer {
context.restore(); context.restore();
} }
const canvasTransform = transformToString(this.pixelTransform);
if (canvasTransform !== canvas.style.transform) { if (canvasTransform !== canvas.style.transform) {
canvas.style.transform = canvasTransform; canvas.style.transform = canvasTransform;
} }

View File

@@ -7,7 +7,7 @@ import RenderEvent from '../../render/Event.js';
import RenderEventType from '../../render/EventType.js'; import RenderEventType from '../../render/EventType.js';
import {rotateAtOffset} from '../../render/canvas.js'; import {rotateAtOffset} from '../../render/canvas.js';
import LayerRenderer from '../Layer.js'; import LayerRenderer from '../Layer.js';
import {create as createTransform, apply as applyTransform, compose as composeTransform, toString as transformToString} from '../../transform.js'; import {create as createTransform, apply as applyTransform, compose as composeTransform, toString} from '../../transform.js';
/** /**
* @abstract * @abstract
@@ -69,12 +69,18 @@ class CanvasLayerRenderer extends LayerRenderer {
*/ */
this.containerReused = false; this.containerReused = false;
/**
* @type {HTMLCanvasElement}
* @private
*/
this.createTransformStringCanvas_ = createCanvasContext2D(1, 1).canvas;
} }
/** /**
* Get a rendering container from an existing target, if compatible. * Get a rendering container from an existing target, if compatible.
* @param {HTMLElement} target Potential render target. * @param {HTMLElement} target Potential render target.
* @param {import("../../transform").Transform} transform Transform. * @param {string} transform CSS Transform.
* @param {number} opacity Opacity. * @param {number} opacity Opacity.
*/ */
useContainer(target, transform, opacity) { useContainer(target, transform, opacity) {
@@ -86,7 +92,7 @@ class CanvasLayerRenderer extends LayerRenderer {
context = canvas.getContext('2d'); context = canvas.getContext('2d');
} }
} }
if (context && context.canvas.style.transform === transformToString(transform)) { if (context && context.canvas.style.transform === transform) {
// Container of the previous layer renderer can be used. // Container of the previous layer renderer can be used.
this.container = target; this.container = target;
this.context = context; this.context = context;
@@ -263,6 +269,15 @@ class CanvasLayerRenderer extends LayerRenderer {
return data; return data;
} }
/**
* @param {import("../../transform.js").Transform} transform Transform.
* @return {string} CSS transform.
*/
createTransformString(transform) {
this.createTransformStringCanvas_.style.transform = toString(transform);
return this.createTransformStringCanvas_.style.transform;
}
} }
export default CanvasLayerRenderer; export default CanvasLayerRenderer;

View File

@@ -7,7 +7,7 @@ import TileRange from '../../TileRange.js';
import TileState from '../../TileState.js'; import TileState from '../../TileState.js';
import {createEmpty, equals, getIntersection, getTopLeft} from '../../extent.js'; import {createEmpty, equals, getIntersection, getTopLeft} from '../../extent.js';
import CanvasLayerRenderer from './Layer.js'; import CanvasLayerRenderer from './Layer.js';
import {apply as applyTransform, compose as composeTransform, makeInverse, toString as transformToString} from '../../transform.js'; import {apply as applyTransform, compose as composeTransform, makeInverse} from '../../transform.js';
import {numberSafeCompareFunction} from '../../array.js'; import {numberSafeCompareFunction} from '../../array.js';
/** /**
@@ -242,7 +242,9 @@ class CanvasTileLayerRenderer extends CanvasLayerRenderer {
-width / 2, -height / 2 -width / 2, -height / 2
); );
this.useContainer(target, this.pixelTransform, layerState.opacity); const canvasTransform = this.createTransformString(this.pixelTransform);
this.useContainer(target, canvasTransform, layerState.opacity);
const context = this.context; const context = this.context;
const canvas = context.canvas; const canvas = context.canvas;
@@ -368,7 +370,6 @@ class CanvasTileLayerRenderer extends CanvasLayerRenderer {
context.restore(); context.restore();
} }
const canvasTransform = transformToString(this.pixelTransform);
if (canvasTransform !== canvas.style.transform) { if (canvasTransform !== canvas.style.transform) {
canvas.style.transform = canvasTransform; canvas.style.transform = canvasTransform;
} }

View File

@@ -127,7 +127,9 @@ class CanvasVectorLayerRenderer extends CanvasLayerRenderer {
makeScale(this.pixelTransform, 1 / pixelRatio, 1 / pixelRatio); makeScale(this.pixelTransform, 1 / pixelRatio, 1 / pixelRatio);
makeInverse(this.inversePixelTransform, this.pixelTransform); makeInverse(this.inversePixelTransform, this.pixelTransform);
this.useContainer(target, this.pixelTransform, layerState.opacity); const canvasTransform = transformToString(this.pixelTransform);
this.useContainer(target, canvasTransform, layerState.opacity);
const context = this.context; const context = this.context;
const canvas = context.canvas; const canvas = context.canvas;
@@ -145,7 +147,6 @@ class CanvasVectorLayerRenderer extends CanvasLayerRenderer {
if (canvas.width != width || canvas.height != height) { if (canvas.width != width || canvas.height != height) {
canvas.width = width; canvas.width = width;
canvas.height = height; canvas.height = height;
const canvasTransform = transformToString(this.pixelTransform);
if (canvas.style.transform !== canvasTransform) { if (canvas.style.transform !== canvasTransform) {
canvas.style.transform = canvasTransform; canvas.style.transform = canvasTransform;
} }