Merge pull request #1473 from elemoine/vector-api-zindex

[vector-api] Make canvas immediate API support zIndex
This commit is contained in:
Éric Lemoine
2014-01-06 12:17:33 -08:00
8 changed files with 83 additions and 9 deletions

View File

@@ -4,7 +4,9 @@
goog.provide('ol.render.canvas.Immediate');
goog.require('goog.array');
goog.require('goog.asserts');
goog.require('goog.object');
goog.require('goog.vec.Mat4');
goog.require('ol.color');
goog.require('ol.extent');
@@ -26,6 +28,13 @@ goog.require('ol.vec.Mat4');
*/
ol.render.canvas.Immediate = function(context, pixelRatio, extent, transform) {
/**
* @private
* @type {Object.<string,
* Array.<function(ol.render.canvas.Immediate)>>}
*/
this.callbacksByZIndex_ = {};
/**
* @private
* @type {CanvasRenderingContext2D}
@@ -240,6 +249,20 @@ ol.render.canvas.Immediate.prototype.drawRings_ =
};
/**
* @inheritDoc
*/
ol.render.canvas.Immediate.prototype.drawAsync = function(zIndex, callback) {
var zIndexKey = zIndex.toString();
var callbacks = this.callbacksByZIndex_[zIndexKey];
if (goog.isDef(callbacks)) {
callbacks.push(callback);
} else {
this.callbacksByZIndex_[zIndexKey] = [callback];
}
};
/**
* @inheritDoc
*/
@@ -249,12 +272,18 @@ ol.render.canvas.Immediate.prototype.drawFeature = function(feature, style) {
!ol.extent.intersects(this.extent_, geometry.getExtent())) {
return;
}
this.setFillStrokeStyle(style.getFill(), style.getStroke());
this.setImageStyle(style.getImage());
var renderGeometry =
ol.render.canvas.Immediate.GEOMETRY_RENDERES_[geometry.getType()];
goog.asserts.assert(goog.isDef(renderGeometry));
renderGeometry.call(this, geometry, null);
var zIndex = style.getZIndex();
if (!goog.isDef(zIndex)) {
zIndex = 0;
}
this.drawAsync(zIndex, function(render) {
render.setFillStrokeStyle(style.getFill(), style.getStroke());
render.setImageStyle(style.getImage());
var renderGeometry =
ol.render.canvas.Immediate.GEOMETRY_RENDERES_[geometry.getType()];
goog.asserts.assert(goog.isDef(renderGeometry));
renderGeometry.call(render, geometry, null);
});
};
@@ -402,6 +431,23 @@ ol.render.canvas.Immediate.prototype.drawMultiPolygonGeometry =
};
/**
* FIXME: empty description for jsdoc
*/
ol.render.canvas.Immediate.prototype.flush = function() {
/** @type {Array.<number>} */
var zs = goog.array.map(goog.object.getKeys(this.callbacksByZIndex_), Number);
goog.array.sort(zs);
var i, ii, callbacks, j, jj;
for (i = 0, ii = zs.length; i < ii; ++i) {
callbacks = this.callbacksByZIndex_[zs[i].toString()];
for (j = 0, jj = callbacks.length; j < jj; ++j) {
callbacks[j](this);
}
}
};
/**
* @inheritDoc
*/