diff --git a/lib/OpenLayers/Renderer/VML.js b/lib/OpenLayers/Renderer/VML.js index 76333dd971..33d773322c 100644 --- a/lib/OpenLayers/Renderer/VML.js +++ b/lib/OpenLayers/Renderer/VML.js @@ -33,6 +33,12 @@ OpenLayers.Renderer.VML = OpenLayers.Class(OpenLayers.Renderer.Elements, { */ symbolCache: {}, + /** + * Property: offset + * {Object} Hash with "x" and "y" properties + */ + offset: null, + /** * Constructor: OpenLayers.Renderer.VML * Create a new VML renderer. @@ -50,8 +56,10 @@ OpenLayers.Renderer.VML = OpenLayers.Class(OpenLayers.Renderer.Elements, { style.addRule('olv\\:*', "behavior: url(#default#VML); " + "position: absolute; display: inline-block;"); } + OpenLayers.Renderer.Elements.prototype.initialize.apply(this, arguments); + this.offset = {x: 0, y: 0}; }, /** @@ -90,8 +98,18 @@ OpenLayers.Renderer.VML = OpenLayers.Class(OpenLayers.Renderer.Elements, { arguments); var resolution = this.getResolution(); - var org = extent.left/resolution + " " + - (extent.top/resolution - this.size.h); + var left = extent.left/resolution; + var top = extent.top/resolution - this.size.h; + if (resolutionChanged) { + this.offset = {x: left, y: top}; + left = 0; + top = 0; + } else { + left = left - this.offset.x; + top = top - this.offset.y; + } + + var org = left + " " + top; this.root.setAttribute("coordorigin", org); var size = this.size.w + " " + this.size.h; @@ -191,8 +209,8 @@ OpenLayers.Renderer.VML = OpenLayers.Class(OpenLayers.Renderer.Elements, { var yOffset = (style.graphicYOffset != undefined) ? style.graphicYOffset : -(0.5 * height); - node.style.left = ((geometry.x/resolution)+xOffset).toFixed(); - node.style.top = ((geometry.y/resolution)-(yOffset+height)).toFixed(); + node.style.left = ((geometry.x/resolution - this.offset.x)+xOffset).toFixed(); + node.style.top = ((geometry.y/resolution - this.offset.y)-(yOffset+height)).toFixed(); node.style.width = width + "px"; node.style.height = height + "px"; node.style.flip = "y"; @@ -448,10 +466,10 @@ OpenLayers.Renderer.VML = OpenLayers.Class(OpenLayers.Renderer.Elements, { var resolution = this.getResolution(); var scaledBox = - new OpenLayers.Bounds((bbox.left/resolution).toFixed(), - (bbox.bottom/resolution).toFixed(), - (bbox.right/resolution).toFixed(), - (bbox.top/resolution).toFixed()); + new OpenLayers.Bounds((bbox.left/resolution - this.offset.x).toFixed(), + (bbox.bottom/resolution - this.offset.y).toFixed(), + (bbox.right/resolution - this.offset.x).toFixed(), + (bbox.top/resolution - this.offset.y).toFixed()); // Set the internal coordinate system to draw the path node.style.left = scaledBox.left + "px"; @@ -613,9 +631,9 @@ OpenLayers.Renderer.VML = OpenLayers.Class(OpenLayers.Renderer.Elements, { drawCircle: function(node, geometry, radius) { if(!isNaN(geometry.x)&& !isNaN(geometry.y)) { var resolution = this.getResolution(); - - node.style.left = ((geometry.x /resolution).toFixed() - radius) + "px"; - node.style.top = ((geometry.y /resolution).toFixed() - radius) + "px"; + + node.style.left = ((geometry.x /resolution - this.offset.x).toFixed() - radius) + "px"; + node.style.top = ((geometry.y /resolution - this.offset.y).toFixed() - radius) + "px"; var diameter = radius * 2; @@ -680,8 +698,8 @@ OpenLayers.Renderer.VML = OpenLayers.Class(OpenLayers.Renderer.Elements, { var comp, x, y; for (var i = 0; i < numComponents; i++) { comp = geometry.components[i]; - x = (comp.x/resolution); - y = (comp.y/resolution); + x = (comp.x/resolution - this.offset.x); + y = (comp.y/resolution - this.offset.y); parts[i] = " " + x.toFixed() + "," + y.toFixed() + " l "; } var end = (closeLine) ? " x e" : " e"; @@ -713,8 +731,8 @@ OpenLayers.Renderer.VML = OpenLayers.Class(OpenLayers.Renderer.Elements, { path.push("m"); for (i=0, ilen=linearRing.components.length; i