From 1924e2b9b370080c02306d38514127c32619beb7 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Tue, 11 Feb 2014 16:34:45 +0100 Subject: [PATCH 1/4] Add detection of canvas line dash support --- src/ol/browserfeature.js | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/src/ol/browserfeature.js b/src/ol/browserfeature.js index c5802a3e48..1695160557 100644 --- a/src/ol/browserfeature.js +++ b/src/ol/browserfeature.js @@ -73,6 +73,14 @@ ol.IS_LEGACY_IE = goog.userAgent.IE && ol.BrowserFeature.DEVICE_PIXEL_RATIO = goog.global.devicePixelRatio || 1; +/** + * True if the browser's Canvas implementation implements {get,set}LineDash. + * @type {boolean} + * @todo stability experimental + */ +ol.BrowserFeature.HAS_CANVAS_LINE_DASH = false; + + /** * True if browser supports Canvas. * @const @@ -90,7 +98,16 @@ ol.BrowserFeature.HAS_CANVAS = ol.ENABLE_CANVAS && ( try { var canvas = /** @type {HTMLCanvasElement} */ (goog.dom.createElement(goog.dom.TagName.CANVAS)); - return !goog.isNull(canvas.getContext('2d')); + var context = /** @type {CanvasRenderingContext2D} */ + (canvas.getContext('2d')); + if (goog.isNull(context)) { + return false; + } else { + if (goog.isDef(context.setLineDash)) { + ol.BrowserFeature.HAS_CANVAS_LINE_DASH = true; + } + return true; + } } catch (e) { return false; } From a74da436d251fd94768180322bd1651f050f12ea Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Wed, 12 Feb 2014 17:57:29 +0100 Subject: [PATCH 2/4] Use ol.BrowserFeature.HAS_CANVAS_LINE_DASH in ol.render.canvas.Replay --- src/ol/render/canvas/canvasreplay.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/ol/render/canvas/canvasreplay.js b/src/ol/render/canvas/canvasreplay.js index 1e3ea1abf1..3908ffb5a2 100644 --- a/src/ol/render/canvas/canvasreplay.js +++ b/src/ol/render/canvas/canvasreplay.js @@ -10,6 +10,7 @@ goog.require('goog.dom'); goog.require('goog.dom.TagName'); goog.require('goog.object'); goog.require('goog.vec.Mat4'); +goog.require('ol.BrowserFeature'); goog.require('ol.array'); goog.require('ol.color'); goog.require('ol.extent'); @@ -344,7 +345,7 @@ ol.render.canvas.Replay.prototype.replay_ = context.lineCap = /** @type {string} */ (instruction[3]); context.lineJoin = /** @type {string} */ (instruction[4]); context.miterLimit = /** @type {number} */ (instruction[5]); - if (goog.isDef(context.setLineDash)) { + if (ol.BrowserFeature.HAS_CANVAS_LINE_DASH) { context.setLineDash(/** @type {Array.} */ (instruction[6])); } ++i; From 5cc3983cdb8b703ca5bd50ca7ccde2e2ab5996de Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Wed, 12 Feb 2014 17:59:11 +0100 Subject: [PATCH 3/4] Fix handling of line dash state in ol.render.canvas.Replay --- src/ol/render/canvas/canvasreplay.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/ol/render/canvas/canvasreplay.js b/src/ol/render/canvas/canvasreplay.js index 3908ffb5a2..b0d472a04a 100644 --- a/src/ol/render/canvas/canvasreplay.js +++ b/src/ol/render/canvas/canvasreplay.js @@ -851,7 +851,7 @@ ol.render.canvas.LineStringReplay.prototype.setStrokeStyle_ = function() { goog.asserts.assert(goog.isDef(miterLimit)); if (state.currentStrokeStyle != strokeStyle || state.currentLineCap != lineCap || - state.currentLineDash != lineDash || + !goog.array.equals(state.currentLineDash, lineDash) || state.currentLineJoin != lineJoin || state.currentLineWidth != lineWidth || state.currentMiterLimit != miterLimit) { @@ -1249,7 +1249,7 @@ ol.render.canvas.PolygonReplay.prototype.setFillStrokeStyle = strokeStyleLineCap : ol.render.canvas.defaultLineCap; var strokeStyleLineDash = strokeStyle.getLineDash(); state.lineDash = !goog.isNull(strokeStyleLineDash) ? - strokeStyleLineDash : ol.render.canvas.defaultLineDash; + strokeStyleLineDash.slice() : ol.render.canvas.defaultLineDash; var strokeStyleLineJoin = strokeStyle.getLineJoin(); state.lineJoin = goog.isDef(strokeStyleLineJoin) ? strokeStyleLineJoin : ol.render.canvas.defaultLineJoin; @@ -1553,7 +1553,7 @@ ol.render.canvas.TextReplay.prototype.setTextStyle = function(textStyle) { var lineCap = goog.isDef(textStrokeStyleLineCap) ? textStrokeStyleLineCap : ol.render.canvas.defaultLineCap; var lineDash = goog.isDefAndNotNull(textStrokeStyleLineDash) ? - textStrokeStyleLineDash : ol.render.canvas.defaultLineDash; + textStrokeStyleLineDash.slice() : ol.render.canvas.defaultLineDash; var lineJoin = goog.isDef(textStrokeStyleLineJoin) ? textStrokeStyleLineJoin : ol.render.canvas.defaultLineJoin; var lineWidth = goog.isDef(textStrokeStyleWidth) ? From dfc57e9db42124c8371801c66c1b771ecc298866 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Wed, 12 Feb 2014 17:59:25 +0100 Subject: [PATCH 4/4] Fix handling of line dash state in ol.render.canvas.Immediate --- src/ol/render/canvas/canvasimmediate.js | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/ol/render/canvas/canvasimmediate.js b/src/ol/render/canvas/canvasimmediate.js index 16f82bf057..b026a5ea7a 100644 --- a/src/ol/render/canvas/canvasimmediate.js +++ b/src/ol/render/canvas/canvasimmediate.js @@ -8,6 +8,7 @@ goog.require('goog.array'); goog.require('goog.asserts'); goog.require('goog.object'); goog.require('goog.vec.Mat4'); +goog.require('ol.BrowserFeature'); goog.require('ol.color'); goog.require('ol.extent'); goog.require('ol.geom.flat'); @@ -638,7 +639,9 @@ ol.render.canvas.Immediate.prototype.setContextStrokeState_ = var contextStrokeState = this.contextStrokeState_; if (goog.isNull(contextStrokeState)) { context.lineCap = strokeState.lineCap; - context.lineDash = strokeState.lineDash; + if (ol.BrowserFeature.HAS_CANVAS_LINE_DASH) { + context.setLineDash(strokeState.lineDash); + } context.lineJoin = strokeState.lineJoin; context.lineWidth = strokeState.lineWidth; context.miterLimit = strokeState.miterLimit; @@ -655,8 +658,11 @@ ol.render.canvas.Immediate.prototype.setContextStrokeState_ = if (contextStrokeState.lineCap != strokeState.lineCap) { contextStrokeState.lineCap = context.lineCap = strokeState.lineCap; } - if (contextStrokeState.lineDash != strokeState.lineDash) { - contextStrokeState.lineDash = context.lineDash = strokeState.lineDash; + if (ol.BrowserFeature.HAS_CANVAS_LINE_DASH) { + if (!goog.array.equals( + contextStrokeState.lineDash, strokeState.lineDash)) { + context.setLineDash(contextStrokeState.lineDash = strokeState.lineDash); + } } if (contextStrokeState.lineJoin != strokeState.lineJoin) { contextStrokeState.lineJoin = context.lineJoin = strokeState.lineJoin; @@ -734,7 +740,7 @@ ol.render.canvas.Immediate.prototype.setFillStrokeStyle = this.strokeState_ = { lineCap: goog.isDef(strokeStyleLineCap) ? strokeStyleLineCap : ol.render.canvas.defaultLineCap, - lineDash: goog.isDef(strokeStyleLineDash) ? + lineDash: goog.isDefAndNotNull(strokeStyleLineDash) ? strokeStyleLineDash : ol.render.canvas.defaultLineDash, lineJoin: goog.isDef(strokeStyleLineJoin) ? strokeStyleLineJoin : ol.render.canvas.defaultLineJoin,