New vector rendering for better performance and less renderer specific limitations. r=elemoine (closes #1675, closes #1656, closes #1631, closes #1431, closes #1709)
git-svn-id: http://svn.openlayers.org/trunk/openlayers@7930 dc9f47b5-9b13-0410-9fdd-eb0c1a62fdaf
This commit is contained in:
@@ -450,26 +450,36 @@ OpenLayers.Renderer.Elements = OpenLayers.Class(OpenLayers.Renderer, {
|
||||
* geometry - {<OpenLayers.Geometry>}
|
||||
* style - {Object}
|
||||
* featureId - {String}
|
||||
*
|
||||
* Returns:
|
||||
* {Boolean} true if the geometry has been drawn completely; null if
|
||||
* incomplete; false otherwise
|
||||
*/
|
||||
drawGeometry: function(geometry, style, featureId) {
|
||||
var className = geometry.CLASS_NAME;
|
||||
var rendered = true;
|
||||
if ((className == "OpenLayers.Geometry.Collection") ||
|
||||
(className == "OpenLayers.Geometry.MultiPoint") ||
|
||||
(className == "OpenLayers.Geometry.MultiLineString") ||
|
||||
(className == "OpenLayers.Geometry.MultiPolygon")) {
|
||||
for (var i = 0, len=geometry.components.length; i<len; i++) {
|
||||
this.drawGeometry(geometry.components[i], style, featureId);
|
||||
rendered = rendered && this.drawGeometry(
|
||||
geometry.components[i], style, featureId);
|
||||
}
|
||||
return;
|
||||
return rendered;
|
||||
};
|
||||
|
||||
rendered = false;
|
||||
if (style.display != "none") {
|
||||
if (style.backgroundGraphic) {
|
||||
this.redrawBackgroundNode(geometry.id, geometry, style, featureId);
|
||||
this.redrawBackgroundNode(geometry.id, geometry, style,
|
||||
featureId);
|
||||
}
|
||||
this.redrawNode(geometry.id, geometry, style, featureId);
|
||||
} else {
|
||||
var node = OpenLayers.Util.getElement(geometry.id);
|
||||
rendered = this.redrawNode(geometry.id, geometry, style,
|
||||
featureId);
|
||||
}
|
||||
if (rendered == false) {
|
||||
var node = document.getElementById(geometry.id);
|
||||
if (node) {
|
||||
if (node._style.backgroundGraphic) {
|
||||
node.parentNode.removeChild(document.getElementById(
|
||||
@@ -478,6 +488,7 @@ OpenLayers.Renderer.Elements = OpenLayers.Class(OpenLayers.Renderer, {
|
||||
node.parentNode.removeChild(node);
|
||||
}
|
||||
}
|
||||
return rendered;
|
||||
},
|
||||
|
||||
/**
|
||||
@@ -488,6 +499,10 @@ OpenLayers.Renderer.Elements = OpenLayers.Class(OpenLayers.Renderer, {
|
||||
* geometry - {<OpenLayers.Geometry>}
|
||||
* style - {Object}
|
||||
* featureId - {String}
|
||||
*
|
||||
* Returns:
|
||||
* {Boolean} true if the complete geometry could be drawn, null if parts of
|
||||
* the geometry could not be drawn, false otherwise
|
||||
*/
|
||||
redrawNode: function(id, geometry, style, featureId) {
|
||||
// Get the node if it's already on the map.
|
||||
@@ -508,7 +523,13 @@ OpenLayers.Renderer.Elements = OpenLayers.Class(OpenLayers.Renderer, {
|
||||
newNode._geometry = geometry;
|
||||
newNode._geometryClass = geometry.CLASS_NAME;
|
||||
newNode._style = style;
|
||||
newNode = this.drawGeometryNode(newNode, geometry, style);
|
||||
|
||||
var drawResult = this.drawGeometryNode(newNode, geometry, style);
|
||||
if(drawResult === false) {
|
||||
return false;
|
||||
}
|
||||
|
||||
newNode = drawResult.node;
|
||||
|
||||
// Insert the node into the indexer so it can show us where to
|
||||
// place it. Note that this operation is O(log(n)). If there's a
|
||||
@@ -522,7 +543,9 @@ OpenLayers.Renderer.Elements = OpenLayers.Class(OpenLayers.Renderer, {
|
||||
this.root.appendChild(newNode);
|
||||
}
|
||||
|
||||
this.postDraw(newNode);
|
||||
this.postDraw(newNode);
|
||||
|
||||
return drawResult.complete;
|
||||
},
|
||||
|
||||
/**
|
||||
@@ -540,6 +563,10 @@ OpenLayers.Renderer.Elements = OpenLayers.Class(OpenLayers.Renderer, {
|
||||
* geometry - {<OpenLayers.Geometry>}
|
||||
* style - {Object}
|
||||
* featureId - {String}
|
||||
*
|
||||
* Returns:
|
||||
* {Boolean} true if the complete geometry could be drawn, null if parts of
|
||||
* the geometry could not be drawn, false otherwise
|
||||
*/
|
||||
redrawBackgroundNode: function(id, geometry, style, featureId) {
|
||||
var backgroundStyle = OpenLayers.Util.extend({}, style);
|
||||
@@ -556,7 +583,7 @@ OpenLayers.Renderer.Elements = OpenLayers.Class(OpenLayers.Renderer, {
|
||||
backgroundStyle.backgroundYOffset = null;
|
||||
backgroundStyle.backgroundGraphicZIndex = null;
|
||||
|
||||
this.redrawNode(
|
||||
return this.redrawNode(
|
||||
id + this.BACKGROUND_ID_SUFFIX,
|
||||
geometry,
|
||||
backgroundStyle,
|
||||
@@ -574,6 +601,11 @@ OpenLayers.Renderer.Elements = OpenLayers.Class(OpenLayers.Renderer, {
|
||||
* node - {DOMElement}
|
||||
* geometry - {<OpenLayers.Geometry>}
|
||||
* style - {Object}
|
||||
*
|
||||
* Returns:
|
||||
* {Object} a hash with properties "node" (the drawn node) and "complete"
|
||||
* (null if parts of the geometry could not be drawn, false if nothing
|
||||
* could be drawn)
|
||||
*/
|
||||
drawGeometryNode: function(node, geometry, style) {
|
||||
style = style || node._style;
|
||||
@@ -583,25 +615,26 @@ OpenLayers.Renderer.Elements = OpenLayers.Class(OpenLayers.Renderer, {
|
||||
'isFilled': true,
|
||||
'isStroked': !!style.strokeWidth
|
||||
};
|
||||
var drawn;
|
||||
switch (geometry.CLASS_NAME) {
|
||||
case "OpenLayers.Geometry.Point":
|
||||
this.drawPoint(node, geometry);
|
||||
drawn = this.drawPoint(node, geometry);
|
||||
break;
|
||||
case "OpenLayers.Geometry.LineString":
|
||||
options.isFilled = false;
|
||||
this.drawLineString(node, geometry);
|
||||
drawn = this.drawLineString(node, geometry);
|
||||
break;
|
||||
case "OpenLayers.Geometry.LinearRing":
|
||||
this.drawLinearRing(node, geometry);
|
||||
drawn = this.drawLinearRing(node, geometry);
|
||||
break;
|
||||
case "OpenLayers.Geometry.Polygon":
|
||||
this.drawPolygon(node, geometry);
|
||||
drawn = this.drawPolygon(node, geometry);
|
||||
break;
|
||||
case "OpenLayers.Geometry.Surface":
|
||||
this.drawSurface(node, geometry);
|
||||
drawn = this.drawSurface(node, geometry);
|
||||
break;
|
||||
case "OpenLayers.Geometry.Rectangle":
|
||||
this.drawRectangle(node, geometry);
|
||||
drawn = this.drawRectangle(node, geometry);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
@@ -612,7 +645,14 @@ OpenLayers.Renderer.Elements = OpenLayers.Class(OpenLayers.Renderer, {
|
||||
|
||||
//set style
|
||||
//TBD simplify this
|
||||
return this.setStyle(node, style, options, geometry);
|
||||
if (drawn != false) {
|
||||
return {
|
||||
node: this.setStyle(node, style, options, geometry),
|
||||
complete: drawn
|
||||
};
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
@@ -634,6 +674,9 @@ OpenLayers.Renderer.Elements = OpenLayers.Class(OpenLayers.Renderer, {
|
||||
* Parameters:
|
||||
* node - {DOMElement}
|
||||
* geometry - {<OpenLayers.Geometry>}
|
||||
*
|
||||
* Returns:
|
||||
* {DOMElement} or false if the renderer could not draw the point
|
||||
*/
|
||||
drawPoint: function(node, geometry) {},
|
||||
|
||||
@@ -646,6 +689,10 @@ OpenLayers.Renderer.Elements = OpenLayers.Class(OpenLayers.Renderer, {
|
||||
* Parameters:
|
||||
* node - {DOMElement}
|
||||
* geometry - {<OpenLayers.Geometry>}
|
||||
*
|
||||
* Returns:
|
||||
* {DOMElement} or null if the renderer could not draw all components of
|
||||
* the linestring, or false if nothing could be drawn
|
||||
*/
|
||||
drawLineString: function(node, geometry) {},
|
||||
|
||||
@@ -658,6 +705,10 @@ OpenLayers.Renderer.Elements = OpenLayers.Class(OpenLayers.Renderer, {
|
||||
* Parameters:
|
||||
* node - {DOMElement}
|
||||
* geometry - {<OpenLayers.Geometry>}
|
||||
*
|
||||
* Returns:
|
||||
* {DOMElement} or null if the renderer could not draw all components
|
||||
* of the linear ring, or false if nothing could be drawn
|
||||
*/
|
||||
drawLinearRing: function(node, geometry) {},
|
||||
|
||||
@@ -670,6 +721,10 @@ OpenLayers.Renderer.Elements = OpenLayers.Class(OpenLayers.Renderer, {
|
||||
* Parameters:
|
||||
* node - {DOMElement}
|
||||
* geometry - {<OpenLayers.Geometry>}
|
||||
*
|
||||
* Returns:
|
||||
* {DOMElement} or null if the renderer could not draw all components
|
||||
* of the polygon, or false if nothing could be drawn
|
||||
*/
|
||||
drawPolygon: function(node, geometry) {},
|
||||
|
||||
@@ -682,6 +737,9 @@ OpenLayers.Renderer.Elements = OpenLayers.Class(OpenLayers.Renderer, {
|
||||
* Parameters:
|
||||
* node - {DOMElement}
|
||||
* geometry - {<OpenLayers.Geometry>}
|
||||
*
|
||||
* Returns:
|
||||
* {DOMElement} or false if the renderer could not draw the rectangle
|
||||
*/
|
||||
drawRectangle: function(node, geometry) {},
|
||||
|
||||
@@ -694,6 +752,9 @@ OpenLayers.Renderer.Elements = OpenLayers.Class(OpenLayers.Renderer, {
|
||||
* Parameters:
|
||||
* node - {DOMElement}
|
||||
* geometry - {<OpenLayers.Geometry>}
|
||||
*
|
||||
* Returns:
|
||||
* {DOMElement} or false if the renderer could not draw the circle
|
||||
*/
|
||||
drawCircle: function(node, geometry) {},
|
||||
|
||||
@@ -706,6 +767,9 @@ OpenLayers.Renderer.Elements = OpenLayers.Class(OpenLayers.Renderer, {
|
||||
* Parameters:
|
||||
* node - {DOMElement}
|
||||
* geometry - {<OpenLayers.Geometry>}
|
||||
*
|
||||
* Returns:
|
||||
* {DOMElement} or false if the renderer could not draw the surface
|
||||
*/
|
||||
drawSurface: function(node, geometry) {},
|
||||
|
||||
|
||||
Reference in New Issue
Block a user