From fb7ccc9d1687c14cf4e3bbc61a41e7ebdd4cac99 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Thu, 7 Nov 2013 15:06:35 +0100 Subject: [PATCH] Add initial canvas vector layer renderer --- .../canvas/canvasvectorlayerrenderer.js | 137 ++++++++++++++++++ 1 file changed, 137 insertions(+) create mode 100644 src/ol/renderer/canvas/canvasvectorlayerrenderer.js diff --git a/src/ol/renderer/canvas/canvasvectorlayerrenderer.js b/src/ol/renderer/canvas/canvasvectorlayerrenderer.js new file mode 100644 index 0000000000..3ed41c9a4d --- /dev/null +++ b/src/ol/renderer/canvas/canvasvectorlayerrenderer.js @@ -0,0 +1,137 @@ +goog.provide('ol.renderer.canvas.VectorLayer'); + +goog.require('goog.vec.Mat4'); +goog.require('ol.extent'); +goog.require('ol.renderer.canvas.Layer'); +goog.require('ol.renderer.vector'); +goog.require('ol.replay.canvas.BatchGroup'); +goog.require('ol.style.DefaultStyleFunction'); + + + +/** + * @constructor + * @extends {ol.renderer.canvas.Layer} + * @param {ol.renderer.Map} mapRenderer Map renderer. + * @param {ol.layer.Vector} vectorLayer Vector layer. + */ +ol.renderer.canvas.VectorLayer = function(mapRenderer, vectorLayer) { + + goog.base(this, mapRenderer, vectorLayer); + + /** + * @private + * @type {!goog.vec.Mat4.Number} + */ + this.transform_ = goog.vec.Mat4.createNumber(); + + /** + * @private + * @type {number} + */ + this.renderedRevision_ = -1; + + /** + * @private + * @type {number} + */ + this.renderedResolution_ = NaN; + + /** + * @private + * @type {ol.Extent} + */ + this.renderedExtent_ = ol.extent.createEmpty(); + + /** + * @private + * @type {ol.replay.canvas.BatchGroup} + */ + this.batchGroup_ = null; + +}; +goog.inherits(ol.renderer.canvas.VectorLayer, ol.renderer.canvas.Layer); + + +/** + * @inheritDoc + */ +ol.renderer.canvas.VectorLayer.prototype.composeFrame = + function(frameState, layerState, context) { + + var batchGroup = this.batchGroup_; + if (goog.isNull(batchGroup)) { + return; + } + + var view2DState = frameState.view2DState; + var viewCenter = view2DState.center; + var viewResolution = view2DState.resolution; + var viewRotation = view2DState.rotation; + + var transform = this.transform_; + goog.vec.Mat4.makeIdentity(transform); + goog.vec.Mat4.translate(transform, + frameState.size[0] / 2, + frameState.size[1] / 2, + 0); + goog.vec.Mat4.scale(transform, + 1 / viewResolution, + -1 / viewResolution, + 1); + goog.vec.Mat4.rotateZ(transform, -viewRotation); + goog.vec.Mat4.translate(transform, + -viewCenter[0], + -viewCenter[1], + 0); + + batchGroup.draw(context, transform); + +}; + + +/** + * @return {ol.layer.Vector} Vector layer. + */ +ol.renderer.canvas.VectorLayer.prototype.getVectorLayer = function() { + return /** @type {ol.layer.Vector} */ (this.getLayer()); +}; + + +/** + * @inheritDoc + */ +ol.renderer.canvas.VectorLayer.prototype.prepareFrame = + function(frameState, layerState) { + + var vectorLayer = this.getVectorLayer(); + var vectorSource = vectorLayer.getVectorSource(); + + if (this.renderedResolution_ == frameState.view2DState.resolution && + this.renderedRevision_ == vectorSource.getRevision() && + ol.extent.containsExtent(this.renderedExtent_, frameState.extent)) { + return; + } + + // FIXME dispose of old batchGroup in post render + goog.dispose(this.batchGroup_); + this.batchGroup = null; + + var styleFunction = vectorLayer.getStyleFunction(); + if (!goog.isDef(styleFunction)) { + styleFunction = ol.style.DefaultStyleFunction; + } + var batchGroup = new ol.replay.canvas.BatchGroup(); + vectorSource.forEachFeatureInExtent(frameState.extent, function(feature) { + var style = styleFunction(feature); + ol.renderer.vector.renderFeature(batchGroup, feature, style); + }, this); + + this.renderedResolution_ = frameState.view2DState.resolution; + this.renderedRevision_ = vectorSource.getRevision(); + this.renderedExtent_ = frameState.extent; + if (!batchGroup.isEmpty()) { + this.batchGroup_ = batchGroup; + } + +};