From b3e5ac2717e218f2ebd221cf72f582834f56625a Mon Sep 17 00:00:00 2001 From: Frederic Junod Date: Fri, 26 Apr 2013 10:24:58 +0200 Subject: [PATCH] Optimize canvas renderer. Only use setTransform when it's needed (ie. when the view is rotated) --- src/ol/renderer/canvas/canvasmaprenderer.js | 30 ++++++++++++++------- 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/src/ol/renderer/canvas/canvasmaprenderer.js b/src/ol/renderer/canvas/canvasmaprenderer.js index 469d0fce22..4f233dc91a 100644 --- a/src/ol/renderer/canvas/canvasmaprenderer.js +++ b/src/ol/renderer/canvas/canvasmaprenderer.js @@ -128,16 +128,28 @@ ol.renderer.canvas.Map.prototype.renderFrame = function(frameState) { image = layerRenderer.getImage(); if (!goog.isNull(image)) { transform = layerRenderer.getTransform(); - context.setTransform( - goog.vec.Mat4.getElement(transform, 0, 0), - goog.vec.Mat4.getElement(transform, 1, 0), - goog.vec.Mat4.getElement(transform, 0, 1), - goog.vec.Mat4.getElement(transform, 1, 1), - goog.vec.Mat4.getElement(transform, 0, 3), - goog.vec.Mat4.getElement(transform, 1, 3)); - context.globalAlpha = layerState.opacity; - context.drawImage(image, 0, 0); + + // for performance reasons, context.setTransform is only used + // when the view is rotated. see http://jsperf.com/canvas-transform + if (frameState.view2DState.rotation == 0) { + var dx = goog.vec.Mat4.getElement(transform, 0, 3); + var dy = goog.vec.Mat4.getElement(transform, 1, 3); + var dw = image.width * goog.vec.Mat4.getElement(transform, 0, 0); + var dh = image.height * goog.vec.Mat4.getElement(transform, 1, 1); + context.drawImage(image, 0, 0, image.width, image.height, + dx, dy, dw, dh); + } else { + context.setTransform( + goog.vec.Mat4.getElement(transform, 0, 0), + goog.vec.Mat4.getElement(transform, 1, 0), + goog.vec.Mat4.getElement(transform, 0, 1), + goog.vec.Mat4.getElement(transform, 1, 1), + goog.vec.Mat4.getElement(transform, 0, 3), + goog.vec.Mat4.getElement(transform, 1, 3)); + + context.drawImage(image, 0, 0); + } } }