Mercurial > MadButterfly
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(); |