changeset 842:76fe4afce640

The inkscape:bbox is defined as the global coordinate system. However, the center.x and center.y must be the coordiante system of the parent group of the SVG entity. Therefore, we need to do coordinate transformation from the global coordination system to the local coordination system.
author wycc
date Sat, 18 Sep 2010 21:23:51 +0800
parents ce6cd06adccf
children 2bcacd29d95f
files nodejs/svg.js
diffstat 1 files changed, 32 insertions(+), 18 deletions(-) [+]
line wrap: on
line diff
--- a/nodejs/svg.js	Fri Sep 17 16:26:14 2010 +0800
+++ b/nodejs/svg.js	Sat Sep 18 21:23:51 2010 +0800
@@ -254,7 +254,7 @@
     
     a = node.attr("bbox-x");
     if(!a)
-	return;
+	return 0;
     
     tgt.bbox = bbox = new Object();
     vstr = a.value();
@@ -275,17 +275,20 @@
 
     tgt.center = center = new Object();
     
-    center.x = bbox.width / 2 + bbox.x;
-    center.y = bbox.height / 2 + bbox.y;
+    //center.x = bbox.width / 2 + bbox.x;
+    //center.y = bbox.height / 2 + bbox.y;
+    center.x = bbox.x;
+    center.y = bbox.y;
     a = node.attr("transform-center-x");
     if(!a)
-	return;
+	return 1;
     
     vstr = a.value();
     center.x += parseFloat(vstr);
     a = node.attr("transform-center-y");
     vstr = a.value();
     center.y -= parseFloat(vstr);
+    return 1;
 }
 
 loadSVG.prototype._set_paint = function(node, tgt) {
@@ -460,22 +463,26 @@
 	
     var style = n.attr('style');
 
-    if (trans) {
+    if (trans)
         parseTransform(tcoord,trans.value());
-        //var m = [1,0,0,0,1,0];
-        //multiply(m,tcoord);
-        rx = tcoord[0]*x+tcoord[1]*y+tcoord[2];
-        ry = tcoord[3]*x+tcoord[4]*y+tcoord[5];
-    }
-
-    if (coord.center.x > rx)
-        coord.center.x = rx;
-    if (coord.center.y > ry)
-        coord.center.y = ry;
 
     var rect = this.mb_rt.rect_new(x,y,w,h,10, 10);
     this._set_paint(n, rect);
-    this._set_bbox(n, tcoord);
+    if (this._set_bbox(n, tcoord)) {
+        rx = accu_matrix[0]*tcoord.center.x+accu_matrix[1]*tcoord.center.y+accu_matrix[2];
+        ry = accu_matrix[3]*tcoord.center.x+accu_matrix[4]*tcoord.center.y+accu_matrix[5];
+	tcoord.center.x -= accu_matrix[2]+tcoord[2];
+	tcoord.center.y -= accu_matrix[2]+tcoord[2];
+    } else {
+        if (trans) {
+            rx = tcoord[0]*x+tcoord[1]*y+tcoord[2];
+            ry = tcoord[3]*x+tcoord[4]*y+tcoord[5];
+            if (tcoord.center.x > rx)
+                tcoord.center.x = rx;
+            if (tcoord.center.y > ry)
+                tcoord.center.y = ry;
+	}
+    }
     tcoord.add_shape(rect);
 
     make_mbnames(this.mb_rt, n, tcoord);
@@ -563,7 +570,11 @@
     if (root.center.y > coord.center.y)
 	root.center.y = coord.center.y;
 
-    this._set_bbox(n, coord);
+    if (this._set_bbox(n, coord)) {
+        coord.center.x -= accu[2];
+        coord.center.y -= accu[5];
+    }
+    sys.puts("coord.center.x="+coord.center.x+",coord.center.y="+coord.center.y);
     
     make_mbnames(this.mb_rt, n, coord);
 };
@@ -615,7 +626,10 @@
     paint.fill(img);
     tcoord.add_shape(img);
     
-    this._set_bbox(n, img);
+    if (this._set_bbox(n, img)) {
+        img.center.x -= accu[2]+coord[2];
+        img.center.y -= accu[5]+coord[5];
+    }
 
     make_mbnames(this.mb_rt, n, img);
 };