Merge pull request #1877 from tonio/skip_features

Replace renderGeometryFunction by skippedFeatures
This commit is contained in:
Antoine Abt
2014-03-21 09:57:19 +01:00
8 changed files with 198 additions and 179 deletions
+28 -13
View File
@@ -9,6 +9,7 @@ goog.require('ol.source.MapQuest');
goog.require('ol.style.Fill'); goog.require('ol.style.Fill');
goog.require('ol.style.Stroke'); goog.require('ol.style.Stroke');
goog.require('ol.style.Style'); goog.require('ol.style.Style');
goog.require('ol.style.Text');
var raster = new ol.layer.Tile({ var raster = new ol.layer.Tile({
source: new ol.source.MapQuest({layer: 'sat'}) source: new ol.source.MapQuest({layer: 'sat'})
@@ -18,23 +19,37 @@ var vector = new ol.layer.Vector({
source: new ol.source.GeoJSON({ source: new ol.source.GeoJSON({
projection: 'EPSG:3857', projection: 'EPSG:3857',
url: 'data/geojson/countries.geojson' url: 'data/geojson/countries.geojson'
}),
style: new ol.style.Style({
fill: new ol.style.Fill({
color: 'rgba(255,255,255,0.25)'
}),
stroke: new ol.style.Stroke({
color: '#6666ff'
})
}) })
}); });
var styleCache = {};
var select = new ol.interaction.Select({ var select = new ol.interaction.Select({
style: new ol.style.Style({ style: function(feature, resolution) {
fill: new ol.style.Fill({ var text = feature.get('name');
color: 'rgba(255,255,255,0.5)' if (!styleCache[text]) {
}) styleCache[text] = [new ol.style.Style({
}) fill: new ol.style.Fill({
color: 'rgba(255,0,0,0.3)'
}),
stroke: new ol.style.Stroke({
color: 'rgba(255,0,0,1)',
size: 2
}),
text: new ol.style.Text({
font: '12px Calibri,sans-serif',
text: text,
fill: new ol.style.Fill({
color: '#000'
}),
stroke: new ol.style.Stroke({
color: '#fff',
width: 3
})
})
})];
}
return styleCache[text];
}
}); });
var map = new ol.Map({ var map = new ol.Map({
+4
View File
@@ -92,6 +92,10 @@ oli.FrameState.prototype.postRenderFunctions;
oli.FrameState.prototype.size; oli.FrameState.prototype.size;
/** @type {Object.<string, boolean>} */
oli.FrameState.prototype.skippedFeatureUids_;
/** @type {ol.TileQueue} */ /** @type {ol.TileQueue} */
oli.FrameState.prototype.tileQueue; oli.FrameState.prototype.tileQueue;
+76 -45
View File
@@ -1,7 +1,9 @@
goog.provide('ol.interaction.Select'); goog.provide('ol.interaction.Select');
goog.require('goog.array'); goog.require('goog.array');
goog.require('goog.asserts');
goog.require('goog.functions'); goog.require('goog.functions');
goog.require('ol.Feature');
goog.require('ol.FeatureOverlay'); goog.require('ol.FeatureOverlay');
goog.require('ol.events.condition'); goog.require('ol.events.condition');
goog.require('ol.interaction.Interaction'); goog.require('ol.interaction.Interaction');
@@ -111,58 +113,87 @@ ol.interaction.Select.prototype.handleMapBrowserEvent =
var add = this.addCondition_(mapBrowserEvent); var add = this.addCondition_(mapBrowserEvent);
var remove = this.removeCondition_(mapBrowserEvent); var remove = this.removeCondition_(mapBrowserEvent);
var toggle = this.toggleCondition_(mapBrowserEvent); var toggle = this.toggleCondition_(mapBrowserEvent);
var set = !add && !remove && !toggle;
var map = mapBrowserEvent.map; var map = mapBrowserEvent.map;
var feature = map.forEachFeatureAtPixel(mapBrowserEvent.pixel,
/**
* @param {ol.Feature} feature Feature.
* @param {ol.layer.Layer} layer Layer.
*/
function(feature, layer) {
this.addFeature_(feature, add, remove, toggle);
return feature;
}, this, this.layerFilter_);
if (!goog.isDef(feature) && !add && !remove) {
this.removeAllFeatures_();
}
return false;
};
/**
* @param {?ol.Feature|undefined} feature Feature.
* @param {Boolean} add Add
* @param {Boolean} remove Remove
* @param {Boolean} toggle Toggle
* @private
* @todo stability experimental
*/
ol.interaction.Select.prototype.addFeature_ = function(feature, add,
remove, toggle) {
var features = this.featureOverlay_.getFeatures(); var features = this.featureOverlay_.getFeatures();
if (set) { var index = -1;
// Replace the currently selected feature(s) with the feature at the pixel, var i, ii;
// or clear the selected feature(s) if there is no feature at the pixel. if ((!goog.isDef(feature) || goog.isNull(feature)) && !add) {
/** @type {ol.Feature|undefined} */ this.removeAllFeatures_();
var feature = map.forEachFeatureAtPixel(mapBrowserEvent.pixel, return;
/** }
* @param {ol.Feature} feature Feature. goog.asserts.assertInstanceof(feature, ol.Feature);
* @param {ol.layer.Layer} layer Layer. index = features.getArray().indexOf(feature);
*/ if (index == -1) {
function(feature, layer) { if (!add && !remove && (features.getLength() > 0)) {
return feature; for (ii = features.getLength() - 1, i = ii; i >= 0; i--) {
}, undefined, this.layerFilter_); if (features.getAt(i) != feature) {
if (goog.isDef(feature)) { this.removeFeature_(/** @type {ol.Feature} */ (features.getAt(i)));
if (features.getLength() == 1) {
if (features.getAt(0) !== feature) {
features.setAt(0, feature);
} }
} else {
if (features.getLength() != 1) {
features.clear();
}
features.push(feature);
}
} else {
if (features.getLength() !== 0) {
features.clear();
} }
} }
} else { } else {
// Modify the currently selected feature(s). if (toggle || remove) {
map.forEachFeatureAtPixel(mapBrowserEvent.pixel, this.removeFeature_(/** @type {ol.Feature} */ (features.getAt(index)));
/** return;
* @param {ol.Feature} feature Feature. }
* @param {ol.layer.Layer} layer Layer. }
*/ if (remove) {
function(feature, layer) { return;
var index = goog.array.indexOf(features.getArray(), feature); }
if (index == -1) { if (index == -1) {
if (add || toggle) { features.push(feature);
features.push(feature); this.getMap().getSkippedFeatures().push(feature);
} }
} else { };
if (remove || toggle) {
features.removeAt(index);
} /**
} * @param {ol.Feature} feature Feature.
}, undefined, this.layerFilter_); * @private
* @todo stability experimental
*/
ol.interaction.Select.prototype.removeFeature_ = function(feature) {
this.featureOverlay_.getFeatures().remove(feature);
this.getMap().getSkippedFeatures().remove(feature);
};
/**
* @private
* @todo stability experimental
*/
ol.interaction.Select.prototype.removeAllFeatures_ = function() {
var i, ii,
features = this.featureOverlay_.getFeatures();
for (ii = features.getLength() - 1, i = ii; i >= 0; i--) {
this.removeFeature_(/** @type {ol.Feature} */ (features.getAt(i)));
} }
return false;
}; };
+1 -38
View File
@@ -1,18 +1,11 @@
goog.provide('ol.layer.Vector'); goog.provide('ol.layer.Vector');
goog.require('goog.array');
goog.require('goog.object'); goog.require('goog.object');
goog.require('ol.feature'); goog.require('ol.feature');
goog.require('ol.layer.Layer'); goog.require('ol.layer.Layer');
/**
* @enum {string}
*/
ol.layer.VectorProperty = {
RENDER_GEOMETRY_FUNCTIONS: 'renderGeometryFunctions'
};
/** /**
* @constructor * @constructor
@@ -52,20 +45,6 @@ ol.layer.Vector = function(opt_options) {
goog.inherits(ol.layer.Vector, ol.layer.Layer); goog.inherits(ol.layer.Vector, ol.layer.Layer);
/**
* @return {ol.Collection|undefined} Render geometry functions.
* @todo stability experimental
*/
ol.layer.Vector.prototype.getRenderGeometryFunctions = function() {
return /** @type {ol.Collection|undefined} */ (
this.get(ol.layer.VectorProperty.RENDER_GEOMETRY_FUNCTIONS));
};
goog.exportProperty(
ol.layer.Vector.prototype,
'getRenderGeometryFunctions',
ol.layer.Vector.prototype.getRenderGeometryFunctions);
/** /**
* Get the style for features. This returns whatever was passed to the `style` * Get the style for features. This returns whatever was passed to the `style`
* option at construction or to the `setStyle` method. * option at construction or to the `setStyle` method.
@@ -87,22 +66,6 @@ ol.layer.Vector.prototype.getStyleFunction = function() {
}; };
/**
* @param {ol.Collection|undefined} renderGeometryFunctions Render geometry
* functions.
* @todo stability experimental
*/
ol.layer.Vector.prototype.setRenderGeometryFunctions =
function(renderGeometryFunctions) {
this.set(ol.layer.VectorProperty.RENDER_GEOMETRY_FUNCTIONS,
renderGeometryFunctions);
};
goog.exportProperty(
ol.layer.Vector.prototype,
'setRenderGeometryFunctions',
ol.layer.Vector.prototype.setRenderGeometryFunctions);
/** /**
* Set the style for features. This can be a single style object, an array * Set the style for features. This can be a single style object, an array
* of styles, or a function that takes a feature and resolution and returns * of styles, or a function that takes a feature and resolution and returns
+46
View File
@@ -359,6 +359,24 @@ ol.Map = function(options) {
goog.bind(this.getTilePriority, this), goog.bind(this.getTilePriority, this),
goog.bind(this.handleTileChange_, this)); goog.bind(this.handleTileChange_, this));
/**
* Features to skip at rendering time.
* @type {ol.Collection}
* @private
*/
this.skippedFeatures_ = new ol.Collection();
goog.events.listen(this.skippedFeatures_,
[ol.CollectionEventType.ADD, ol.CollectionEventType.REMOVE],
this.handleSkippedFeaturesChange_, false, this);
this.registerDisposable(this.skippedFeatures_);
/**
* Uids of features to skip at rendering time.
* @type {Object.<string, boolean>}
* @private
*/
this.skippedFeatureUids_ = {};
goog.events.listen( goog.events.listen(
this, ol.Object.getChangeEventType(ol.MapProperty.LAYERGROUP), this, ol.Object.getChangeEventType(ol.MapProperty.LAYERGROUP),
this.handleLayerGroupChanged_, false, this); this.handleLayerGroupChanged_, false, this);
@@ -797,6 +815,16 @@ ol.Map.prototype.getTilePriority =
}; };
/**
* Get the collection of features to skip.
* @return {ol.Collection} Features collection.
* @todo stability experimental
*/
ol.Map.prototype.getSkippedFeatures = function() {
return this.skippedFeatures_;
};
/** /**
* @param {goog.events.BrowserEvent} browserEvent Browser event. * @param {goog.events.BrowserEvent} browserEvent Browser event.
* @param {string=} opt_type Type. * @param {string=} opt_type Type.
@@ -896,6 +924,23 @@ ol.Map.prototype.handleSizeChanged_ = function() {
}; };
/**
* @private
*/
ol.Map.prototype.handleSkippedFeaturesChange_ = function() {
this.skippedFeatureUids_ = {};
this.skippedFeatures_.forEach(
/**
* @param {ol.Feature} feature Feature.
* @this {ol.Map}
*/
function(feature) {
this.skippedFeatureUids_[goog.getUid(feature).toString()] = true;
}, this);
this.render();
};
/** /**
* @private * @private
*/ */
@@ -1181,6 +1226,7 @@ ol.Map.prototype.renderFrame_ = function(time) {
pixelToCoordinateMatrix: this.pixelToCoordinateMatrix_, pixelToCoordinateMatrix: this.pixelToCoordinateMatrix_,
postRenderFunctions: [], postRenderFunctions: [],
size: size, size: size,
skippedFeatureUids_: this.skippedFeatureUids_,
tileQueue: this.tileQueue_, tileQueue: this.tileQueue_,
time: time, time: time,
usedTiles: {}, usedTiles: {},
+39 -37
View File
@@ -134,6 +134,12 @@ ol.render.canvas.Replay = function(tolerance, maxExtent, resolution) {
*/ */
this.tmpLocalTransform_ = goog.vec.Mat4.createNumber(); this.tmpLocalTransform_ = goog.vec.Mat4.createNumber();
/**
* @private
* @type {Object}
*/
this.instructionIndices_ = {};
}; };
@@ -197,11 +203,13 @@ ol.render.canvas.Replay.prototype.appendFlatCoordinates =
/** /**
* @protected * @protected
* @param {ol.geom.Geometry} geometry Geometry. * @param {ol.geom.Geometry} geometry Geometry.
* @param {number} uid Data uid
*/ */
ol.render.canvas.Replay.prototype.beginGeometry = function(geometry) { ol.render.canvas.Replay.prototype.beginGeometry = function(geometry, uid) {
this.beginGeometryInstruction1_ = this.beginGeometryInstruction1_ =
[ol.render.canvas.Instruction.BEGIN_GEOMETRY, geometry, 0]; [ol.render.canvas.Instruction.BEGIN_GEOMETRY, geometry, 0];
this.instructions.push(this.beginGeometryInstruction1_); this.instructions.push(this.beginGeometryInstruction1_);
this.instructionIndices_[this.instructions.length - 1] = uid.toString();
this.beginGeometryInstruction2_ = this.beginGeometryInstruction2_ =
[ol.render.canvas.Instruction.BEGIN_GEOMETRY, geometry, 0]; [ol.render.canvas.Instruction.BEGIN_GEOMETRY, geometry, 0];
this.hitDetectionInstructions.push(this.beginGeometryInstruction2_); this.hitDetectionInstructions.push(this.beginGeometryInstruction2_);
@@ -214,8 +222,7 @@ ol.render.canvas.Replay.prototype.beginGeometry = function(geometry) {
* @param {number} pixelRatio Pixel ratio. * @param {number} pixelRatio Pixel ratio.
* @param {goog.vec.Mat4.Number} transform Transform. * @param {goog.vec.Mat4.Number} transform Transform.
* @param {number} viewRotation View rotation. * @param {number} viewRotation View rotation.
* @param {function(ol.geom.Geometry): boolean} renderGeometryFunction Render * @param {Object} skippedFeaturesHash Ids of features to skip.
* geometry function.
* @param {Array.<*>} instructions Instructions array. * @param {Array.<*>} instructions Instructions array.
* @param {function(ol.geom.Geometry, Object): T|undefined} geometryCallback * @param {function(ol.geom.Geometry, Object): T|undefined} geometryCallback
* Geometry callback. * Geometry callback.
@@ -223,7 +230,7 @@ ol.render.canvas.Replay.prototype.beginGeometry = function(geometry) {
* @template T * @template T
*/ */
ol.render.canvas.Replay.prototype.replay_ = function( ol.render.canvas.Replay.prototype.replay_ = function(
context, pixelRatio, transform, viewRotation, renderGeometryFunction, context, pixelRatio, transform, viewRotation, skippedFeaturesHash,
instructions, geometryCallback) { instructions, geometryCallback) {
/** @type {Array.<number>} */ /** @type {Array.<number>} */
var pixelCoordinates; var pixelCoordinates;
@@ -247,7 +254,8 @@ ol.render.canvas.Replay.prototype.replay_ = function(
switch (type) { switch (type) {
case ol.render.canvas.Instruction.BEGIN_GEOMETRY: case ol.render.canvas.Instruction.BEGIN_GEOMETRY:
geometry = /** @type {ol.geom.Geometry} */ (instruction[1]); geometry = /** @type {ol.geom.Geometry} */ (instruction[1]);
if (renderGeometryFunction(geometry)) { if (!goog.isDef(goog.object.get(skippedFeaturesHash,
this.instructionIndices_[i]))) {
++i; ++i;
} else { } else {
i = /** @type {number} */ (instruction[2]); i = /** @type {number} */ (instruction[2]);
@@ -453,16 +461,15 @@ ol.render.canvas.Replay.prototype.replay_ = function(
* @param {number} pixelRatio Pixel ratio. * @param {number} pixelRatio Pixel ratio.
* @param {goog.vec.Mat4.Number} transform Transform. * @param {goog.vec.Mat4.Number} transform Transform.
* @param {number} viewRotation View rotation. * @param {number} viewRotation View rotation.
* @param {function(ol.geom.Geometry): boolean} renderGeometryFunction Render * @param {Object} skippedFeaturesHash Ids of features to skip
* geometry function.
* @return {T|undefined} Callback result. * @return {T|undefined} Callback result.
* @template T * @template T
*/ */
ol.render.canvas.Replay.prototype.replay = function( ol.render.canvas.Replay.prototype.replay = function(
context, pixelRatio, transform, viewRotation, renderGeometryFunction) { context, pixelRatio, transform, viewRotation, skippedFeaturesHash) {
var instructions = this.instructions; var instructions = this.instructions;
return this.replay_(context, pixelRatio, transform, viewRotation, return this.replay_(context, pixelRatio, transform, viewRotation,
renderGeometryFunction, instructions, undefined); skippedFeaturesHash, instructions, undefined);
}; };
@@ -470,19 +477,18 @@ ol.render.canvas.Replay.prototype.replay = function(
* @param {CanvasRenderingContext2D} context Context. * @param {CanvasRenderingContext2D} context Context.
* @param {goog.vec.Mat4.Number} transform Transform. * @param {goog.vec.Mat4.Number} transform Transform.
* @param {number} viewRotation View rotation. * @param {number} viewRotation View rotation.
* @param {function(ol.geom.Geometry): boolean} renderGeometryFunction Render * @param {Object} skippedFeaturesHash Ids of features to skip
* geometry function.
* @param {function(ol.geom.Geometry, Object): T=} opt_geometryCallback * @param {function(ol.geom.Geometry, Object): T=} opt_geometryCallback
* Geometry callback. * Geometry callback.
* @return {T|undefined} Callback result. * @return {T|undefined} Callback result.
* @template T * @template T
*/ */
ol.render.canvas.Replay.prototype.replayHitDetection = function( ol.render.canvas.Replay.prototype.replayHitDetection = function(
context, transform, viewRotation, renderGeometryFunction, context, transform, viewRotation, skippedFeaturesHash,
opt_geometryCallback) { opt_geometryCallback) {
var instructions = this.hitDetectionInstructions; var instructions = this.hitDetectionInstructions;
return this.replay_(context, 1, transform, viewRotation, return this.replay_(context, 1, transform, viewRotation,
renderGeometryFunction, instructions, opt_geometryCallback); skippedFeaturesHash, instructions, opt_geometryCallback);
}; };
@@ -764,7 +770,7 @@ ol.render.canvas.ImageReplay.prototype.drawPointGeometry =
goog.asserts.assert(goog.isDef(this.scale_)); goog.asserts.assert(goog.isDef(this.scale_));
goog.asserts.assert(goog.isDef(this.width_)); goog.asserts.assert(goog.isDef(this.width_));
ol.extent.extend(this.extent_, pointGeometry.getExtent()); ol.extent.extend(this.extent_, pointGeometry.getExtent());
this.beginGeometry(pointGeometry); this.beginGeometry(pointGeometry, goog.getUid(data));
var flatCoordinates = pointGeometry.getFlatCoordinates(); var flatCoordinates = pointGeometry.getFlatCoordinates();
var stride = pointGeometry.getStride(); var stride = pointGeometry.getStride();
var myBegin = this.coordinates.length; var myBegin = this.coordinates.length;
@@ -806,7 +812,7 @@ ol.render.canvas.ImageReplay.prototype.drawMultiPointGeometry =
goog.asserts.assert(goog.isDef(this.scale_)); goog.asserts.assert(goog.isDef(this.scale_));
goog.asserts.assert(goog.isDef(this.width_)); goog.asserts.assert(goog.isDef(this.width_));
ol.extent.extend(this.extent_, multiPointGeometry.getExtent()); ol.extent.extend(this.extent_, multiPointGeometry.getExtent());
this.beginGeometry(multiPointGeometry); this.beginGeometry(multiPointGeometry, goog.getUid(data));
var flatCoordinates = multiPointGeometry.getFlatCoordinates(); var flatCoordinates = multiPointGeometry.getFlatCoordinates();
var stride = multiPointGeometry.getStride(); var stride = multiPointGeometry.getStride();
var myBegin = this.coordinates.length; var myBegin = this.coordinates.length;
@@ -1018,7 +1024,7 @@ ol.render.canvas.LineStringReplay.prototype.drawLineStringGeometry =
} }
ol.extent.extend(this.extent_, lineStringGeometry.getExtent()); ol.extent.extend(this.extent_, lineStringGeometry.getExtent());
this.setStrokeStyle_(); this.setStrokeStyle_();
this.beginGeometry(lineStringGeometry); this.beginGeometry(lineStringGeometry, goog.getUid(data));
this.hitDetectionInstructions.push( this.hitDetectionInstructions.push(
[ol.render.canvas.Instruction.SET_STROKE_STYLE, [ol.render.canvas.Instruction.SET_STROKE_STYLE,
state.strokeStyle, state.lineWidth, state.lineCap, state.lineJoin, state.strokeStyle, state.lineWidth, state.lineCap, state.lineJoin,
@@ -1047,7 +1053,7 @@ ol.render.canvas.LineStringReplay.prototype.drawMultiLineStringGeometry =
} }
ol.extent.extend(this.extent_, multiLineStringGeometry.getExtent()); ol.extent.extend(this.extent_, multiLineStringGeometry.getExtent());
this.setStrokeStyle_(); this.setStrokeStyle_();
this.beginGeometry(multiLineStringGeometry); this.beginGeometry(multiLineStringGeometry, goog.getUid(data));
this.hitDetectionInstructions.push( this.hitDetectionInstructions.push(
[ol.render.canvas.Instruction.SET_STROKE_STYLE, [ol.render.canvas.Instruction.SET_STROKE_STYLE,
state.strokeStyle, state.lineWidth, state.lineCap, state.lineJoin, state.strokeStyle, state.lineWidth, state.lineCap, state.lineJoin,
@@ -1225,7 +1231,7 @@ ol.render.canvas.PolygonReplay.prototype.drawCircleGeometry =
} }
ol.extent.extend(this.extent_, circleGeometry.getExtent()); ol.extent.extend(this.extent_, circleGeometry.getExtent());
this.setFillStrokeStyles_(); this.setFillStrokeStyles_();
this.beginGeometry(circleGeometry); this.beginGeometry(circleGeometry, goog.getUid(data));
// always fill the circle for hit detection // always fill the circle for hit detection
this.hitDetectionInstructions.push( this.hitDetectionInstructions.push(
[ol.render.canvas.Instruction.SET_FILL_STYLE, [ol.render.canvas.Instruction.SET_FILL_STYLE,
@@ -1276,7 +1282,7 @@ ol.render.canvas.PolygonReplay.prototype.drawPolygonGeometry =
} }
ol.extent.extend(this.extent_, polygonGeometry.getExtent()); ol.extent.extend(this.extent_, polygonGeometry.getExtent());
this.setFillStrokeStyles_(); this.setFillStrokeStyles_();
this.beginGeometry(polygonGeometry); this.beginGeometry(polygonGeometry, goog.getUid(data));
// always fill the polygon for hit detection // always fill the polygon for hit detection
this.hitDetectionInstructions.push( this.hitDetectionInstructions.push(
[ol.render.canvas.Instruction.SET_FILL_STYLE, [ol.render.canvas.Instruction.SET_FILL_STYLE,
@@ -1312,7 +1318,7 @@ ol.render.canvas.PolygonReplay.prototype.drawMultiPolygonGeometry =
} }
ol.extent.extend(this.extent_, multiPolygonGeometry.getExtent()); ol.extent.extend(this.extent_, multiPolygonGeometry.getExtent());
this.setFillStrokeStyles_(); this.setFillStrokeStyles_();
this.beginGeometry(multiPolygonGeometry); this.beginGeometry(multiPolygonGeometry, goog.getUid(data));
// always fill the multi-polygon for hit detection // always fill the multi-polygon for hit detection
this.hitDetectionInstructions.push( this.hitDetectionInstructions.push(
[ol.render.canvas.Instruction.SET_FILL_STYLE, [ol.render.canvas.Instruction.SET_FILL_STYLE,
@@ -1564,7 +1570,7 @@ ol.render.canvas.TextReplay.prototype.drawText =
this.setReplayStrokeState_(this.textStrokeState_); this.setReplayStrokeState_(this.textStrokeState_);
} }
this.setReplayTextState_(this.textState_); this.setReplayTextState_(this.textState_);
this.beginGeometry(geometry); this.beginGeometry(geometry, goog.getUid(data));
var myBegin = this.coordinates.length; var myBegin = this.coordinates.length;
var myEnd = var myEnd =
this.appendFlatCoordinates(flatCoordinates, offset, end, stride, false); this.appendFlatCoordinates(flatCoordinates, offset, end, stride, false);
@@ -1844,18 +1850,17 @@ ol.render.canvas.ReplayGroup = function(tolerance, maxExtent, resolution) {
* @param {number} pixelRatio Pixel ratio. * @param {number} pixelRatio Pixel ratio.
* @param {goog.vec.Mat4.Number} transform Transform. * @param {goog.vec.Mat4.Number} transform Transform.
* @param {number} viewRotation View rotation. * @param {number} viewRotation View rotation.
* @param {function(ol.geom.Geometry): boolean} renderGeometryFunction Render * @param {Object} skippedFeaturesHash Ids of features to skip
* geometry function.
* @return {T|undefined} Callback result. * @return {T|undefined} Callback result.
* @template T * @template T
*/ */
ol.render.canvas.ReplayGroup.prototype.replay = function(context, extent, ol.render.canvas.ReplayGroup.prototype.replay = function(context, extent,
pixelRatio, transform, viewRotation, renderGeometryFunction) { pixelRatio, transform, viewRotation, skippedFeaturesHash) {
/** @type {Array.<number>} */ /** @type {Array.<number>} */
var zs = goog.array.map(goog.object.getKeys(this.replaysByZIndex_), Number); var zs = goog.array.map(goog.object.getKeys(this.replaysByZIndex_), Number);
goog.array.sort(zs); goog.array.sort(zs);
return this.replay_(zs, context, extent, pixelRatio, transform, return this.replay_(zs, context, extent, pixelRatio, transform,
viewRotation, renderGeometryFunction); viewRotation, skippedFeaturesHash);
}; };
@@ -1866,15 +1871,14 @@ ol.render.canvas.ReplayGroup.prototype.replay = function(context, extent,
* @param {ol.Extent} extent Extent. * @param {ol.Extent} extent Extent.
* @param {goog.vec.Mat4.Number} transform Transform. * @param {goog.vec.Mat4.Number} transform Transform.
* @param {number} viewRotation View rotation. * @param {number} viewRotation View rotation.
* @param {function(ol.geom.Geometry): boolean} renderGeometryFunction Render * @param {Object} skippedFeaturesHash Ids of features to skip
* geometry function.
* @param {function(ol.geom.Geometry, Object): T} geometryCallback Geometry * @param {function(ol.geom.Geometry, Object): T} geometryCallback Geometry
* callback. * callback.
* @return {T|undefined} Callback result. * @return {T|undefined} Callback result.
* @template T * @template T
*/ */
ol.render.canvas.ReplayGroup.prototype.replayHitDetection_ = function( ol.render.canvas.ReplayGroup.prototype.replayHitDetection_ = function(
zs, context, extent, transform, viewRotation, renderGeometryFunction, zs, context, extent, transform, viewRotation, skippedFeaturesHash,
geometryCallback) { geometryCallback) {
var i, ii, replays, replayType, replay, result; var i, ii, replays, replayType, replay, result;
for (i = 0, ii = zs.length; i < ii; ++i) { for (i = 0, ii = zs.length; i < ii; ++i) {
@@ -1883,7 +1887,7 @@ ol.render.canvas.ReplayGroup.prototype.replayHitDetection_ = function(
replay = replays[replayType]; replay = replays[replayType];
if (ol.extent.intersects(extent, replay.getExtent())) { if (ol.extent.intersects(extent, replay.getExtent())) {
result = replay.replayHitDetection(context, transform, viewRotation, result = replay.replayHitDetection(context, transform, viewRotation,
renderGeometryFunction, geometryCallback); skippedFeaturesHash, geometryCallback);
if (result) { if (result) {
return result; return result;
} }
@@ -1902,14 +1906,13 @@ ol.render.canvas.ReplayGroup.prototype.replayHitDetection_ = function(
* @param {number} pixelRatio Pixel ratio. * @param {number} pixelRatio Pixel ratio.
* @param {goog.vec.Mat4.Number} transform Transform. * @param {goog.vec.Mat4.Number} transform Transform.
* @param {number} viewRotation View rotation. * @param {number} viewRotation View rotation.
* @param {function(ol.geom.Geometry): boolean} renderGeometryFunction Render * @param {Object} skippedFeaturesHash Ids of features to skip
* geometry function.
* @return {T|undefined} Callback result. * @return {T|undefined} Callback result.
* @template T * @template T
*/ */
ol.render.canvas.ReplayGroup.prototype.replay_ = function( ol.render.canvas.ReplayGroup.prototype.replay_ = function(
zs, context, extent, pixelRatio, transform, viewRotation, zs, context, extent, pixelRatio, transform, viewRotation,
renderGeometryFunction) { skippedFeaturesHash) {
var maxExtent = this.maxExtent_; var maxExtent = this.maxExtent_;
var minX = maxExtent[0]; var minX = maxExtent[0];
@@ -1935,7 +1938,7 @@ ol.render.canvas.ReplayGroup.prototype.replay_ = function(
if (goog.isDef(replay) && if (goog.isDef(replay) &&
ol.extent.intersects(extent, replay.getExtent())) { ol.extent.intersects(extent, replay.getExtent())) {
result = replay.replay(context, pixelRatio, transform, viewRotation, result = replay.replay(context, pixelRatio, transform, viewRotation,
renderGeometryFunction); skippedFeaturesHash);
if (result) { if (result) {
return result; return result;
} }
@@ -1953,15 +1956,14 @@ ol.render.canvas.ReplayGroup.prototype.replay_ = function(
* @param {number} resolution Resolution. * @param {number} resolution Resolution.
* @param {number} rotation Rotation. * @param {number} rotation Rotation.
* @param {ol.Coordinate} coordinate Coordinate. * @param {ol.Coordinate} coordinate Coordinate.
* @param {function(ol.geom.Geometry): boolean} renderGeometryFunction Render * @param {Object} skippedFeaturesHash Ids of features to skip
* geometry function.
* @param {function(ol.geom.Geometry, Object): T} callback Geometry callback. * @param {function(ol.geom.Geometry, Object): T} callback Geometry callback.
* @return {T|undefined} Callback result. * @return {T|undefined} Callback result.
* @template T * @template T
*/ */
ol.render.canvas.ReplayGroup.prototype.forEachGeometryAtPixel = function( ol.render.canvas.ReplayGroup.prototype.forEachGeometryAtPixel = function(
extent, resolution, rotation, coordinate, extent, resolution, rotation, coordinate,
renderGeometryFunction, callback) { skippedFeaturesHash, callback) {
var transform = this.hitDetectionTransform_; var transform = this.hitDetectionTransform_;
ol.vec.Mat4.makeTransform2D(transform, 0.5, 0.5, ol.vec.Mat4.makeTransform2D(transform, 0.5, 0.5,
@@ -1976,7 +1978,7 @@ ol.render.canvas.ReplayGroup.prototype.forEachGeometryAtPixel = function(
context.clearRect(0, 0, 1, 1); context.clearRect(0, 0, 1, 1);
return this.replayHitDetection_(zs, context, extent, transform, return this.replayHitDetection_(zs, context, extent, transform,
rotation, renderGeometryFunction, rotation, skippedFeaturesHash,
/** /**
* @param {ol.geom.Geometry} geometry Geometry. * @param {ol.geom.Geometry} geometry Geometry.
* @param {Object} data Opaque data object. * @param {Object} data Opaque data object.
@@ -4,7 +4,6 @@ goog.require('goog.asserts');
goog.require('goog.dom'); goog.require('goog.dom');
goog.require('goog.dom.TagName'); goog.require('goog.dom.TagName');
goog.require('goog.events'); goog.require('goog.events');
goog.require('goog.functions');
goog.require('ol.ViewHint'); goog.require('ol.ViewHint');
goog.require('ol.extent'); goog.require('ol.extent');
goog.require('ol.feature'); goog.require('ol.feature');
@@ -96,12 +95,10 @@ ol.renderer.canvas.VectorLayer.prototype.composeFrame =
} else { } else {
replayContext = context; replayContext = context;
} }
var renderGeometryFunction = this.getRenderGeometryFunction_();
goog.asserts.assert(goog.isFunction(renderGeometryFunction));
replayContext.globalAlpha = layerState.opacity; replayContext.globalAlpha = layerState.opacity;
replayGroup.replay( replayGroup.replay(
replayContext, frameState.extent, frameState.pixelRatio, transform, replayContext, frameState.extent, frameState.pixelRatio, transform,
frameState.view2DState.rotation, renderGeometryFunction); frameState.view2DState.rotation, frameState.skippedFeatureUids_);
if (replayContext != context) { if (replayContext != context) {
this.dispatchRenderEvent(replayContext, frameState, transform); this.dispatchRenderEvent(replayContext, frameState, transform);
@@ -126,10 +123,8 @@ ol.renderer.canvas.VectorLayer.prototype.forEachFeatureAtPixel =
var resolution = frameState.view2DState.resolution; var resolution = frameState.view2DState.resolution;
var rotation = frameState.view2DState.rotation; var rotation = frameState.view2DState.rotation;
var layer = this.getLayer(); var layer = this.getLayer();
var renderGeometryFunction = this.getRenderGeometryFunction_();
goog.asserts.assert(goog.isFunction(renderGeometryFunction));
return this.replayGroup_.forEachGeometryAtPixel(extent, resolution, return this.replayGroup_.forEachGeometryAtPixel(extent, resolution,
rotation, coordinate, renderGeometryFunction, rotation, coordinate, frameState.skippedFeatureUids_,
/** /**
* @param {ol.geom.Geometry} geometry Geometry. * @param {ol.geom.Geometry} geometry Geometry.
* @param {Object} data Data. * @param {Object} data Data.
@@ -144,43 +139,6 @@ ol.renderer.canvas.VectorLayer.prototype.forEachFeatureAtPixel =
}; };
/**
* @private
* @return {function(ol.geom.Geometry): boolean} Render geometry function.
*/
ol.renderer.canvas.VectorLayer.prototype.getRenderGeometryFunction_ =
function() {
var vectorLayer = this.getLayer();
goog.asserts.assertInstanceof(vectorLayer, ol.layer.Vector);
var renderGeometryFunctions = vectorLayer.getRenderGeometryFunctions();
if (!goog.isDef(renderGeometryFunctions)) {
return goog.functions.TRUE;
}
var renderGeometryFunctionsArray = renderGeometryFunctions.getArray();
switch (renderGeometryFunctionsArray.length) {
case 0:
return goog.functions.TRUE;
case 1:
return renderGeometryFunctionsArray[0];
default:
return (
/**
* @param {ol.geom.Geometry} geometry Geometry.
* @return {boolean} Render geometry.
*/
function(geometry) {
var i, ii;
for (i = 0, ii = renderGeometryFunctionsArray.length; i < ii; ++i) {
if (!renderGeometryFunctionsArray[i](geometry)) {
return false;
}
}
return true;
});
}
};
/** /**
* Handle changes in image style state. * Handle changes in image style state.
* @param {goog.events.Event} event Image style change event. * @param {goog.events.Event} event Image style change event.
+2 -2
View File
@@ -141,7 +141,7 @@ ol.source.ImageVector.prototype.canvasFunctionInternal_ =
var transform = this.getTransform_(ol.extent.getCenter(extent), var transform = this.getTransform_(ol.extent.getCenter(extent),
resolution, pixelRatio, size); resolution, pixelRatio, size);
replayGroup.replay(this.canvasContext_, extent, pixelRatio, transform, 0, replayGroup.replay(this.canvasContext_, extent, pixelRatio, transform, 0,
goog.functions.TRUE); {});
this.replayGroup_ = replayGroup; this.replayGroup_ = replayGroup;
@@ -158,7 +158,7 @@ ol.source.ImageVector.prototype.forEachFeatureAtPixel =
return undefined; return undefined;
} else { } else {
return this.replayGroup_.forEachGeometryAtPixel( return this.replayGroup_.forEachGeometryAtPixel(
extent, resolution, 0, coordinate, goog.functions.TRUE, extent, resolution, 0, coordinate, {},
/** /**
* @param {ol.geom.Geometry} geometry Geometry. * @param {ol.geom.Geometry} geometry Geometry.
* @param {Object} data Data. * @param {Object} data Data.