use a local coordinate system starting at (0,0) instead of coordinates just derived from the geometries, resetting it every time the resolution changes. r=tschaub (Pullup #1732)
git-svn-id: http://svn.openlayers.org/trunk/openlayers@8004 dc9f47b5-9b13-0410-9fdd-eb0c1a62fdaf
This commit is contained in:
@@ -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<ilen; i++) {
|
||||
comp = linearRing.components[i];
|
||||
x = comp.x / resolution;
|
||||
y = comp.y / resolution;
|
||||
x = comp.x / resolution - this.offset.x;
|
||||
y = comp.y / resolution - this.offset.y;
|
||||
path.push(" " + x.toFixed() + "," + y.toFixed());
|
||||
if (i==0) {
|
||||
path.push(" l");
|
||||
@@ -741,8 +759,8 @@ OpenLayers.Renderer.VML = OpenLayers.Class(OpenLayers.Renderer.Elements, {
|
||||
drawRectangle: function(node, geometry) {
|
||||
var resolution = this.getResolution();
|
||||
|
||||
node.style.left = geometry.x/resolution + "px";
|
||||
node.style.top = geometry.y/resolution + "px";
|
||||
node.style.left = (geometry.x/resolution - this.offset.x) + "px";
|
||||
node.style.top = (geometry.y/resolution - this.offset.y) + "px";
|
||||
node.style.width = geometry.width/resolution + "px";
|
||||
node.style.height = geometry.height/resolution + "px";
|
||||
|
||||
@@ -769,8 +787,8 @@ OpenLayers.Renderer.VML = OpenLayers.Class(OpenLayers.Renderer.Elements, {
|
||||
var comp, x, y;
|
||||
for (var i=0, len=geometry.components.length; i<len; 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;
|
||||
if ((i%3)==0 && (i/3)==0) {
|
||||
path.push("m");
|
||||
} else if ((i%3)==1) {
|
||||
|
||||
Reference in New Issue
Block a user