comparison nodejs/svg.js @ 1400:18215e577fe0

clone the affine matrix ofwhen we use clone_from_subtree. This function will not copy the affine matrix at all. We need to do it manually.
author wycc
date Sun, 03 Apr 2011 18:07:47 +0800
parents 6fa4a53c3fca
children c918b79892ab
comparison
equal deleted inserted replaced
1399:9cebe429508c 1400:18215e577fe0
54 coord.center.x = 10000; 54 coord.center.x = 10000;
55 coord.center.y = 10000; 55 coord.center.y = 10000;
56 if (this.pgstack.length > 0) 56 if (this.pgstack.length > 0)
57 this.pgstack[this.pgstack.length-1].hide(); 57 this.pgstack[this.pgstack.length-1].hide();
58 this.pgstack.push(coord); 58 this.pgstack.push(coord);
59 this.mb_rt.mbnames={};
59 60
60 61
61 if(_root.attr("width")) { 62 if(_root.attr("width")) {
62 k = _root.attr("width").value(); 63 k = _root.attr("width").value();
63 this.width = parseFloat(k); 64 this.width = parseFloat(k);
812 make_mbnames(this.mb_rt, n, pcoord); 813 make_mbnames(this.mb_rt, n, pcoord);
813 }; 814 };
814 815
815 loadSVG.prototype.parseText=function(accu,coord,id, n) 816 loadSVG.prototype.parseText=function(accu,coord,id, n)
816 { 817 {
818 var nodes = n.childNodes();
819 if (nodes == "") return;
817 var x = getInteger(n,'x'); 820 var x = getInteger(n,'x');
818 var y = getInteger(n,'y'); 821 var y = getInteger(n,'y');
819 var tcoord = this.mb_rt.coord_new(coord); 822 var tcoord = this.mb_rt.coord_new(coord);
820 var style; 823 var style;
821 824
899 newm[3] = parseFloat(fields[1]); 902 newm[3] = parseFloat(fields[1]);
900 newm[4] = parseFloat(fields[3]); 903 newm[4] = parseFloat(fields[3]);
901 newm[5] = parseFloat(fields[5]); 904 newm[5] = parseFloat(fields[5]);
902 multiply(coord,newm); 905 multiply(coord,newm);
903 } 906 }
907 generateAffineParameters(coord);
908 }
909 function generateAffineParameters(coord)
910 {
904 if (coord[0]*coord[4] == coord[1]*coord[3]) { 911 if (coord[0]*coord[4] == coord[1]*coord[3]) {
905 sys.puts("Singular affine matrix\n"); 912 sys.puts("Singular affine matrix\n");
906 coord.sx = 1; 913 coord.sx = 1;
907 coord.sy = 1; 914 coord.sy = 1;
908 coord.r = 0; 915 coord.r = 0;
934 coord.sx = sx; 941 coord.sx = sx;
935 coord.sy = sy; 942 coord.sy = sy;
936 coord.r = R; 943 coord.r = R;
937 coord.tx = E; 944 coord.tx = E;
938 coord.ty = F; 945 coord.ty = F;
939 sys.puts("transform="+s);
940 sys.puts("coord[0]="+coord[0]);
941 sys.puts("coord[1]="+coord[1]);
942 sys.puts("coord[2]="+coord[2]);
943 sys.puts("coord[3]="+coord[3]);
944 sys.puts("coord[4]="+coord[4]);
945 sys.puts("coord[5]="+coord[5]);
946 sys.puts("coord.sx="+coord.sx);
947 sys.puts("coord.sy="+coord.sy);
948 sys.puts("coord.r="+coord.r);
949 sys.puts("coord.tx="+coord.tx);
950 sys.puts("coord.ty="+coord.ty);
951 } 946 }
952 947
953 loadSVG.prototype.parseRect=function(accu_matrix,coord, id, n) 948 loadSVG.prototype.parseRect=function(accu_matrix,coord, id, n)
954 { 949 {
955 var x = getInteger(n,'x'); 950 var x = getInteger(n,'x');
1041 var m = [1,0,0,1,0,0] 1036 var m = [1,0,0,1,0,0]
1042 this.parseGroup(m,root,id, n) 1037 this.parseGroup(m,root,id, n)
1043 } 1038 }
1044 1039
1045 loadSVG.prototype._check_duplicate_src=function(n,coord) { 1040 loadSVG.prototype._check_duplicate_src=function(n,coord) {
1041 var id = n.attr('id');
1042 coord.id = id;
1043 if (id) {
1044 coord.id = id.value();
1045 } else {
1046 coord.id = "NA";
1047 }
1046 if (n.name()=="use") { 1048 if (n.name()=="use") {
1047 n.coord.isuse = true 1049 n.coord.isuse = true
1048 } else { 1050 } else {
1049 n.coord.isuse = false; 1051 n.coord.isuse = false;
1050 } 1052 }
1051 var attr = n.attr('duplicate-src'); 1053 var attr = n.attr('duplicate-src');
1052 if (attr == null) return; 1054 if (attr == null) {
1055 sys.puts("no duplicated" + n);
1056 return;
1057 }
1053 var id = attr.value(); 1058 var id = attr.value();
1054 try { 1059 try {
1060 if (this.mb_rt.mbnames[id].target) {
1061 sys.puts("duplicated");
1062 }
1055 this.mb_rt.mbnames[id].target = coord; 1063 this.mb_rt.mbnames[id].target = coord;
1056 } catch(e) { 1064 } catch(e) {
1057 sys.puts("id "+id+" is not defined"); 1065 sys.puts("id "+id+" is not defined");
1058 } 1066 }
1059 } 1067 }
1140 var style; 1148 var style;
1141 var attr = n.attr('duplicate-src'); 1149 var attr = n.attr('duplicate-src');
1142 if (attr) { 1150 if (attr) {
1143 var src = this.mb_rt.mbnames[attr.value()]; 1151 var src = this.mb_rt.mbnames[attr.value()];
1144 coord = root.clone_from_subtree(src); 1152 coord = root.clone_from_subtree(src);
1153 coord[0] = src[0];
1154 coord[1] = src[1];
1155 coord[2] = src[2];
1156 coord[3] = src[3];
1157 coord[4] = src[4];
1158 coord[5] = src[5];
1145 } else { 1159 } else {
1146 coord = this.mb_rt.coord_new(root); 1160 coord = this.mb_rt.coord_new(root);
1147 } 1161 }
1148 n.coord = coord; 1162 n.coord = coord;
1149 coord.node = n; 1163 coord.node = n;
1150 this._check_duplicate_src(n,coord); 1164 this._check_duplicate_src(n,coord);
1151 1165
1152 coord.center= new Object(); 1166 coord.center= new Object();
1153 coord.center.x = 10000; 1167 coord.center.x = 10000;
1154 coord.center.y = 10000; 1168 coord.center.y = 10000;
1155 sys.puts("use id="+use_id+" "+trans);
1156 sys.puts(n);
1157 if (trans!=null) { 1169 if (trans!=null) {
1158 parseTransform(coord, trans.value()); 1170 parseTransform(coord, trans.value());
1159 } else { 1171 } else {
1160 coord.sx = 1; 1172 generateAffineParameters(coord);
1161 coord.sy = 1;
1162 coord.r = 0;
1163 coord.tx = 0;
1164 coord.ty = 0;
1165
1166 } 1173 }
1167 multiply(accu,accu_matrix); 1174 multiply(accu,accu_matrix);
1168 multiply(accu,coord); 1175 multiply(accu,coord);
1169 1176
1170 style = {}; 1177 style = {};
1178 root.center.x = coord.center.x; 1185 root.center.x = coord.center.x;
1179 if (root.center.y > coord.center.y) 1186 if (root.center.y > coord.center.y)
1180 root.center.y = coord.center.y; 1187 root.center.y = coord.center.y;
1181 this._set_bbox(n, coord); 1188 this._set_bbox(n, coord);
1182 this._groupMap[n.name()] = n; 1189 this._groupMap[n.name()] = n;
1183 1190
1184 make_mbnames(this.mb_rt, n, coord); 1191 make_mbnames(this.mb_rt, n, coord);
1185 }; 1192 };
1186 loadSVG.prototype.parseImage=function(accu,coord,id, n) 1193 loadSVG.prototype.parseImage=function(accu,coord,id, n)
1187 { 1194 {
1188 var ref = n.attr('href').value(); 1195 var ref = n.attr('href').value();