goog.provide('ol.renderer.canvas.VectorLayer'); goog.require('goog.vec.Mat4'); goog.require('ol.filter.Geometry'); goog.require('ol.geom.GeometryType'); goog.require('ol.layer.Vector'); /** * @constructor * @extends {ol.renderer.canvas.Layer} * @param {ol.renderer.Map} mapRenderer Map renderer. * @param {ol.layer.Vector} layer Vector layer. */ ol.renderer.canvas.VectorLayer = function(mapRenderer, layer) { goog.base(this, mapRenderer, layer); /** * @private * @type {HTMLCanvasElement} */ this.canvas_ = null; /** * @private * @type {ol.Size} */ this.canvasSize_ = null; /** * @private * @type {CanvasRenderingContext2D} */ this.context_ = null; /** * @private * @type {!goog.vec.Mat4.Number} */ this.transform_ = goog.vec.Mat4.createNumber(); goog.vec.Mat4.makeIdentity(this.transform_); /** * Geometry filters in rendering order. * @private * @type {Array.} * TODO: deal with multis */ this.geometryFilters_ = [ new ol.filter.Geometry(ol.geom.GeometryType.POLYGON), new ol.filter.Geometry(ol.geom.GeometryType.LINESTRING), new ol.filter.Geometry(ol.geom.GeometryType.POINT) ]; }; goog.inherits(ol.renderer.canvas.VectorLayer, ol.renderer.canvas.Layer); /** * @inheritDoc */ ol.renderer.canvas.VectorLayer.prototype.getImage = function() { return this.canvas_; }; /** * @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.getTransform = function() { return this.transform_; }; /** * @inheritDoc */ ol.renderer.canvas.VectorLayer.prototype.renderFrame = function(frameState, layerState) { var view2DState = frameState.view2DState; var layer = this.getVectorLayer(); var source = layer.getVectorSource(); var extent = frameState.extent; var canvasSize = frameState.size; var canvas, context; if (goog.isNull(this.canvas_)) { canvas = /** @type {HTMLCanvasElement} */ (goog.dom.createElement(goog.dom.TagName.CANVAS)); canvas.width = canvasSize.width; canvas.height = canvasSize.height; context = /** @type {CanvasRenderingContext2D} */ (canvas.getContext('2d')); this.canvas_ = canvas; this.canvasSize_ = canvasSize; this.context_ = context; } else { canvas = this.canvas_; context = this.context_; // force clear the canvas canvas.width = canvasSize.width; canvas.height = canvasSize.height; this.canvasSize_ = canvasSize; } /** * For now, we create a canvas renderer and have it render all features with * every call to renderFrame. * TODO: only render newly visible/dirty areas */ var canvasRenderer = new ol.renderer.canvas.Renderer( canvas, frameState.coordinateToPixelMatrix); // TODO: get these elsewhere var symbolizers = { point: new ol.style.LiteralShape({ type: ol.style.ShapeType.CIRCLE, size: 10, fillStyle: '#ffcc99', strokeStyle: '#ff9933', strokeWidth: 2, opacity: 0.75 }), linestring: new ol.style.LiteralLine({ strokeStyle: '#ff9933', strokeWidth: 2, opacity: 1 }), polygon: new ol.style.LiteralPolygon({ fillStyle: '#ffcc99', strokeStyle: '#ff9933', strokeWidth: 2, opacity: 0.5 }) }; // render features by geometry type var filters = this.geometryFilters_, numFilters = filters.length, i, filter, type, features, symbolizer; for (i = 0; i < numFilters; ++i) { filter = filters[i]; type = filter.getType(); features = source.getFeatures(filter); symbolizer = symbolizers[type]; canvasRenderer.renderFeaturesByGeometryType(type, features, symbolizer); } };