From a24c94487c614f0f8f6f7a881bfa5e3b6ddc1c3b Mon Sep 17 00:00:00 2001 From: Andreas Hocevar Date: Sat, 25 Jan 2020 20:53:28 +0100 Subject: [PATCH 1/3] Cache label instructions for better performance --- src/ol/render/canvas/Executor.js | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/ol/render/canvas/Executor.js b/src/ol/render/canvas/Executor.js index e94f666554..c109c6d04b 100644 --- a/src/ol/render/canvas/Executor.js +++ b/src/ol/render/canvas/Executor.js @@ -173,6 +173,12 @@ class Executor { * @type {Object>} */ this.widths_ = {}; + + /** + * @private + * @type {Object} + */ + this.labels_ = {}; } /** @@ -183,6 +189,10 @@ class Executor { * @return {Label} Label. */ createLabel(text, textKey, fillKey, strokeKey) { + const key = text + textKey + fillKey + strokeKey; + if (this.labels_[key]) { + return this.labels_[key]; + } const strokeState = strokeKey ? this.strokeStates[strokeKey] : null; const fillState = fillKey ? this.fillStates[fillKey] : null; const textState = this.textStates[textKey]; @@ -239,6 +249,7 @@ class Executor { contextInstructions.push('fillText', [lines[i], x + leftRight * widths[i], 0.5 * (strokeWidth + lineHeight) + i * lineHeight]); } } + this.labels_[key] = label; return label; } From 542b77eef89d389c36aa566cce02a33ec4bfc6d5 Mon Sep 17 00:00:00 2001 From: Andreas Hocevar Date: Sat, 25 Jan 2020 20:53:50 +0100 Subject: [PATCH 2/3] Save and restore before rendering labels --- src/ol/render/canvas.js | 21 ++++++--------------- 1 file changed, 6 insertions(+), 15 deletions(-) diff --git a/src/ol/render/canvas.js b/src/ol/render/canvas.js index d4c7498451..726870e053 100644 --- a/src/ol/render/canvas.js +++ b/src/ol/render/canvas.js @@ -401,30 +401,21 @@ export const resetTransform = createTransform(); */ export function drawImageOrLabel(context, transform, opacity, labelOrImage, originX, originY, w, h, x, y, scale) { - let alpha; - if (opacity != 1) { - alpha = context.globalAlpha; - context.globalAlpha = alpha * opacity; - } + context.save(); + if (transform) { context.setTransform.apply(context, transform); } - const isLabel = !!(/** @type {*} */ (labelOrImage).contextInstructions); - - if (isLabel) { + if ((/** @type {*} */ (labelOrImage).contextInstructions)) { + // label context.translate(x, y); context.scale(scale, scale); executeLabelInstructions(/** @type {import("./canvas/Executor.js").Label} */ (labelOrImage), context); } else { + // image context.drawImage(/** @type {HTMLCanvasElement|HTMLImageElement|HTMLVideoElement} */ (labelOrImage), originX, originY, w, h, x, y, w * scale, h * scale); } - if (opacity != 1) { - context.globalAlpha = alpha; - } - - if (transform || isLabel) { - context.setTransform.apply(context, resetTransform); - } + context.restore(); } From 7266f37f85c1f7a77757dd1a37f7a9d12fade8a3 Mon Sep 17 00:00:00 2001 From: Andreas Hocevar Date: Thu, 30 Jan 2020 14:52:04 +0100 Subject: [PATCH 3/3] Remove unused export and variable --- src/ol/render/canvas.js | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/ol/render/canvas.js b/src/ol/render/canvas.js index 726870e053..65b7453920 100644 --- a/src/ol/render/canvas.js +++ b/src/ol/render/canvas.js @@ -4,7 +4,6 @@ import {getFontParameters} from '../css.js'; import {createCanvasContext2D} from '../dom.js'; import {clear} from '../obj.js'; -import {create as createTransform} from '../transform.js'; import {executeLabelInstructions} from './canvas/Executor.js'; import BaseObject from '../Object.js'; import EventTarget from '../events/Target.js'; @@ -383,9 +382,6 @@ export function rotateAtOffset(context, rotation, offsetX, offsetY) { } -export const resetTransform = createTransform(); - - /** * @param {CanvasRenderingContext2D} context Context. * @param {import("../transform.js").Transform|null} transform Transform.