From 507662af0b462d68e1b3e8faffb7c715283a009f Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Fri, 8 Nov 2013 20:08:58 +0100 Subject: [PATCH] Use arrays instead of objects for canvas instructions --- src/ol/replay/canvas/canvasreplay.js | 102 +++++++++------------------ 1 file changed, 34 insertions(+), 68 deletions(-) diff --git a/src/ol/replay/canvas/canvasreplay.js b/src/ol/replay/canvas/canvasreplay.js index dccee8b341..03cdb624b8 100644 --- a/src/ol/replay/canvas/canvasreplay.js +++ b/src/ol/replay/canvas/canvasreplay.js @@ -17,7 +17,7 @@ goog.require('ol.style.stroke'); /** * @enum {number} */ -ol.replay.canvas.InstructionType = { +ol.replay.canvas.Instruction = { BEGIN_PATH: 0, CLOSE_PATH: 1, FILL: 2, @@ -38,13 +38,6 @@ ol.replay.canvas.InstructionType = { ol.replay.canvas.State; -/** - * @typedef {{argument: ?, - * type: ol.replay.canvas.InstructionType}} - */ -ol.replay.canvas.Instruction; - - /** * @constructor @@ -54,7 +47,7 @@ ol.replay.canvas.Batch = function() { /** * @private - * @type {Array.} + * @type {Array} */ this.instructions_ = []; @@ -114,9 +107,7 @@ ol.replay.canvas.Batch.prototype.appendCoordinates_ = ol.replay.canvas.Batch.prototype.beginPath_ = function() { goog.asserts.assert(!goog.isNull(this.state_)); if (this.state_.beginPath) { - this.instructions_.push({ - type: ol.replay.canvas.InstructionType.BEGIN_PATH - }); + this.instructions_.push([ol.replay.canvas.Instruction.BEGIN_PATH]); this.state_.beginPath = false; } }; @@ -136,36 +127,30 @@ ol.replay.canvas.Batch.prototype.draw = function(context, transform) { var j, jj; for (j = 0, jj = instructions.length; j < jj; ++j) { var instruction = instructions[j]; - if (instruction.type == - ol.replay.canvas.InstructionType.BEGIN_PATH) { + var type = instruction[0]; + if (type == ol.replay.canvas.Instruction.BEGIN_PATH) { context.beginPath(); - } else if (instruction.type == - ol.replay.canvas.InstructionType.CLOSE_PATH) { + } else if (type == ol.replay.canvas.Instruction.CLOSE_PATH) { context.closePath(); - } else if (instruction.type == - ol.replay.canvas.InstructionType.FILL) { + } else if (type == ol.replay.canvas.Instruction.FILL) { context.fill(); - } else if (instruction.type == - ol.replay.canvas.InstructionType.MOVE_TO_LINE_TO) { + } else if (type == ol.replay.canvas.Instruction.MOVE_TO_LINE_TO) { context.moveTo(pixelCoordinates[i], pixelCoordinates[i + 1]); - goog.asserts.assert(goog.isNumber(instruction.argument)); - var end = /** @type {number} */ (instruction.argument); + goog.asserts.assert(goog.isNumber(instruction[1])); + var end = /** @type {number} */ (instruction[1]); for (i += 2; i < end; i += 2) { context.lineTo(pixelCoordinates[i], pixelCoordinates[i + 1]); } - } else if (instruction.type == - ol.replay.canvas.InstructionType.SET_FILL_STYLE) { - goog.asserts.assert(goog.isObject(instruction.argument)); - var fillStyle = /** @type {ol.style.Fill} */ (instruction.argument); + } else if (type == ol.replay.canvas.Instruction.SET_FILL_STYLE) { + goog.asserts.assert(goog.isObject(instruction[1])); + var fillStyle = /** @type {ol.style.Fill} */ (instruction[1]); context.fillStyle = fillStyle.color; - } else if (instruction.type == - ol.replay.canvas.InstructionType.SET_STROKE_STYLE) { - goog.asserts.assert(goog.isObject(instruction.argument)); - var strokeStyle = /** @type {ol.style.Stroke} */ (instruction.argument); + } else if (type == ol.replay.canvas.Instruction.SET_STROKE_STYLE) { + goog.asserts.assert(goog.isObject(instruction[1])); + var strokeStyle = /** @type {ol.style.Stroke} */ (instruction[1]); context.strokeStyle = strokeStyle.color; context.lineWidth = strokeStyle.width; - } else if (instruction.type == - ol.replay.canvas.InstructionType.STROKE) { + } else if (type == ol.replay.canvas.Instruction.STROKE) { context.stroke(); } } @@ -181,10 +166,7 @@ ol.replay.canvas.Batch.prototype.drawLineStringGeometry = goog.asserts.assert(!goog.isNull(this.state_)); this.beginPath_(); var end = this.appendCoordinates_(lineStringGeometry.getCoordinates(), false); - this.instructions_.push({ - type: ol.replay.canvas.InstructionType.MOVE_TO_LINE_TO, - argument: end - }); + this.instructions_.push([ol.replay.canvas.Instruction.MOVE_TO_LINE_TO, end]); this.state_.strokePending = true; }; @@ -200,10 +182,8 @@ ol.replay.canvas.Batch.prototype.drawMultiLineStringGeometry = for (i = 0, ii = coordinatess.length; i < ii; ++i) { this.beginPath_(); var end = this.appendCoordinates_(coordinatess[i], false); - this.instructions_.push({ - type: ol.replay.canvas.InstructionType.MOVE_TO_LINE_TO, - argument: end - }); + this.instructions_.push( + [ol.replay.canvas.Instruction.MOVE_TO_LINE_TO, end]); } this.state_.strokePending = true; }; @@ -222,13 +202,10 @@ ol.replay.canvas.Batch.prototype.drawMultiPolygonGeometry = var j, jj; for (j = 0, jj = rings.length; j < jj; ++j) { this.beginPath_(); - this.instructions_.push({ - type: ol.replay.canvas.InstructionType.MOVE_TO_LINE_TO, - argument: this.appendCoordinates_(rings[j], true) - }); - this.instructions_.push({ - type: ol.replay.canvas.InstructionType.CLOSE_PATH - }); + var end = this.appendCoordinates_(rings[j], true); + this.instructions_.push( + [ol.replay.canvas.Instruction.MOVE_TO_LINE_TO, end], + [ol.replay.canvas.Instruction.CLOSE_PATH]); } } this.state_.fillPending = true; @@ -246,13 +223,10 @@ ol.replay.canvas.Batch.prototype.drawPolygonGeometry = var i, ii; for (i = 0, ii = rings.length; i < ii; ++i) { this.beginPath_(); - this.instructions_.push({ - type: ol.replay.canvas.InstructionType.MOVE_TO_LINE_TO, - argument: this.appendCoordinates_(rings[i], true) - }); - this.instructions_.push({ - type: ol.replay.canvas.InstructionType.CLOSE_PATH - }); + var end = this.appendCoordinates_(rings[i], true); + this.instructions_.push( + [ol.replay.canvas.Instruction.MOVE_TO_LINE_TO, end], + [ol.replay.canvas.Instruction.CLOSE_PATH]); } this.state_.fillPending = true; this.state_.strokePending = true; @@ -277,15 +251,11 @@ ol.replay.canvas.Batch.prototype.flush_ = function(finish) { goog.asserts.assert(!goog.isNull(this.state_)); if (this.state_.fillPending || this.state_.strokePending) { if (this.state_.fillPending) { - this.instructions_.push({ - type: ol.replay.canvas.InstructionType.FILL - }); + this.instructions_.push([ol.replay.canvas.Instruction.FILL]); this.state_.fillPending = false; } if (this.state_.strokePending) { - this.instructions_.push({ - type: ol.replay.canvas.InstructionType.STROKE - }); + this.instructions_.push([ol.replay.canvas.Instruction.STROKE]); this.state_.strokePending = false; } this.state_.beginPath = true; @@ -302,18 +272,14 @@ ol.replay.canvas.Batch.prototype.setFillStrokeStyle = // FIXME should only change styles before draws if (!ol.style.fill.equals(this.state_.fillStyle, fillStyle)) { this.flush_(false); - this.instructions_.push({ - type: ol.replay.canvas.InstructionType.SET_FILL_STYLE, - argument: fillStyle - }); + this.instructions_.push( + [ol.replay.canvas.Instruction.SET_FILL_STYLE, fillStyle]); this.state_.fillStyle = fillStyle; } if (!ol.style.stroke.equals(this.state_.strokeStyle, strokeStyle)) { this.flush_(false); - this.instructions_.push({ - type: ol.replay.canvas.InstructionType.SET_STROKE_STYLE, - argument: strokeStyle - }); + this.instructions_.push( + [ol.replay.canvas.Instruction.SET_STROKE_STYLE, strokeStyle]); this.state_.strokeStyle = strokeStyle; } };