Merge pull request #12958 from mike-000/reuse-temporary-canvas

Reuse temporary canvas in getDataAtPixel()
This commit is contained in:
Andreas Hocevar
2021-11-04 14:30:06 +01:00
committed by GitHub
+20 -9
View File
@@ -76,6 +76,12 @@ class CanvasLayerRenderer extends LayerRenderer {
* @type {boolean} * @type {boolean}
*/ */
this.containerReused = false; this.containerReused = false;
/**
* @private
* @type {CanvasRenderingContext2D}
*/
this.pixelContext_ = null;
} }
/** /**
@@ -264,20 +270,25 @@ class CanvasLayerRenderer extends LayerRenderer {
} }
} }
let data;
try {
const x = Math.round(renderPixel[0]); const x = Math.round(renderPixel[0]);
const y = Math.round(renderPixel[1]); const y = Math.round(renderPixel[1]);
const newCanvas = document.createElement('canvas'); let pixelContext = this.pixelContext_;
const newContext = newCanvas.getContext('2d'); if (!pixelContext) {
newCanvas.width = 1; const pixelCanvas = document.createElement('canvas');
newCanvas.height = 1; pixelCanvas.width = 1;
newContext.clearRect(0, 0, 1, 1); pixelCanvas.height = 1;
newContext.drawImage(context.canvas, x, y, 1, 1, 0, 0, 1, 1); pixelContext = pixelCanvas.getContext('2d');
data = newContext.getImageData(0, 0, 1, 1).data; this.pixelContext_ = pixelContext;
}
pixelContext.clearRect(0, 0, 1, 1);
let data;
try {
pixelContext.drawImage(context.canvas, x, y, 1, 1, 0, 0, 1, 1);
data = pixelContext.getImageData(0, 0, 1, 1).data;
} catch (err) { } catch (err) {
if (err.name === 'SecurityError') { if (err.name === 'SecurityError') {
// tainted canvas, we assume there is data at the given pixel (although there might not be) // tainted canvas, we assume there is data at the given pixel (although there might not be)
this.pixelContext_ = null;
return new Uint8Array(); return new Uint8Array();
} }
return data; return data;