Mercurial > MadButterfly
annotate nodejs/svg.js @ 776:77b561bb7929
Implement new algorithm to calculate the origin of the SVG elemnts so that we can implement object resize without changing the position of the object.
However, the image does not work here since it does not use the transformation of the group.
author | wycc |
---|---|
date | Mon, 30 Aug 2010 08:56:44 +0800 |
parents | ae1ae29348d1 |
children | a47431293043 |
rev | line source |
---|---|
776
77b561bb7929
Implement new algorithm to calculate the origin of the SVG elemnts so that we can implement object resize without changing the position of the object.
wycc
parents:
759
diff
changeset
|
1 // vim: ts=4 |
624 | 2 var libxml = require('libxmljs'); |
3 var sys=require('sys'); | |
4 var mbfly = require("mbfly"); | |
646 | 5 var ldr = mbfly.img_ldr_new("."); |
714 | 6 |
624 | 7 |
713 | 8 var _std_colors = { |
9 "white": [1, 1, 1], | |
10 "black": [0, 0, 0], | |
11 "red": [1, 0, 0] | |
12 }; | |
13 | |
714 | 14 exports.loadSVG=function(mb_rt,root,filename) { |
718
0cd59ce76e67
Refactor loadSVG as a class
Thinker K.F. Li <thinker@branda.to>
parents:
717
diff
changeset
|
15 return new loadSVG(mb_rt, root, filename); |
0cd59ce76e67
Refactor loadSVG as a class
Thinker K.F. Li <thinker@branda.to>
parents:
717
diff
changeset
|
16 }; |
0cd59ce76e67
Refactor loadSVG as a class
Thinker K.F. Li <thinker@branda.to>
parents:
717
diff
changeset
|
17 |
0cd59ce76e67
Refactor loadSVG as a class
Thinker K.F. Li <thinker@branda.to>
parents:
717
diff
changeset
|
18 function loadSVG(mb_rt, root, filename) { |
624 | 19 var doc = libxml.parseXmlFile(filename); |
20 var nodes = doc.root().childNodes(); | |
21 var coord = mb_rt.coord_new(root); | |
22 var k; | |
759 | 23 var accu=[1,0,0,0,1,0]; |
714 | 24 this.mb_rt = mb_rt; |
750 | 25 this.stop_ref={}; |
26 this.gradients={}; | |
776
77b561bb7929
Implement new algorithm to calculate the origin of the SVG elemnts so that we can implement object resize without changing the position of the object.
wycc
parents:
759
diff
changeset
|
27 root.center=new Object(); |
77b561bb7929
Implement new algorithm to calculate the origin of the SVG elemnts so that we can implement object resize without changing the position of the object.
wycc
parents:
759
diff
changeset
|
28 root.center.x = 10000; |
77b561bb7929
Implement new algorithm to calculate the origin of the SVG elemnts so that we can implement object resize without changing the position of the object.
wycc
parents:
759
diff
changeset
|
29 root.center.y = 10000; |
624 | 30 |
31 for(k in nodes) { | |
32 var n = nodes[k].name(); | |
33 if (n == "defs") { | |
714 | 34 this.parseDefs(root,nodes[k]); |
624 | 35 } else if (n == "g") { |
759 | 36 this.parseGroup(accu,root,'root_coord',nodes[k]); |
624 | 37 } |
38 } | |
39 } | |
40 | |
719
1b6856fda760
Collect mbnames and mapping to object through mb_rt.mbnames
Thinker K.F. Li <thinker@branda.to>
parents:
718
diff
changeset
|
41 function make_mbnames(mb_rt, n, obj) { |
1b6856fda760
Collect mbnames and mapping to object through mb_rt.mbnames
Thinker K.F. Li <thinker@branda.to>
parents:
718
diff
changeset
|
42 var mbname; |
1b6856fda760
Collect mbnames and mapping to object through mb_rt.mbnames
Thinker K.F. Li <thinker@branda.to>
parents:
718
diff
changeset
|
43 var name; |
1b6856fda760
Collect mbnames and mapping to object through mb_rt.mbnames
Thinker K.F. Li <thinker@branda.to>
parents:
718
diff
changeset
|
44 |
1b6856fda760
Collect mbnames and mapping to object through mb_rt.mbnames
Thinker K.F. Li <thinker@branda.to>
parents:
718
diff
changeset
|
45 if(!mb_rt.mbnames) |
1b6856fda760
Collect mbnames and mapping to object through mb_rt.mbnames
Thinker K.F. Li <thinker@branda.to>
parents:
718
diff
changeset
|
46 mb_rt.mbnames = {}; |
1b6856fda760
Collect mbnames and mapping to object through mb_rt.mbnames
Thinker K.F. Li <thinker@branda.to>
parents:
718
diff
changeset
|
47 |
1b6856fda760
Collect mbnames and mapping to object through mb_rt.mbnames
Thinker K.F. Li <thinker@branda.to>
parents:
718
diff
changeset
|
48 mbname = n.attr("mbname"); |
1b6856fda760
Collect mbnames and mapping to object through mb_rt.mbnames
Thinker K.F. Li <thinker@branda.to>
parents:
718
diff
changeset
|
49 if(mbname) { |
1b6856fda760
Collect mbnames and mapping to object through mb_rt.mbnames
Thinker K.F. Li <thinker@branda.to>
parents:
718
diff
changeset
|
50 name = mbname.value(); |
1b6856fda760
Collect mbnames and mapping to object through mb_rt.mbnames
Thinker K.F. Li <thinker@branda.to>
parents:
718
diff
changeset
|
51 mb_rt.mbnames[name] = obj; |
1b6856fda760
Collect mbnames and mapping to object through mb_rt.mbnames
Thinker K.F. Li <thinker@branda.to>
parents:
718
diff
changeset
|
52 } |
1b6856fda760
Collect mbnames and mapping to object through mb_rt.mbnames
Thinker K.F. Li <thinker@branda.to>
parents:
718
diff
changeset
|
53 } |
1b6856fda760
Collect mbnames and mapping to object through mb_rt.mbnames
Thinker K.F. Li <thinker@branda.to>
parents:
718
diff
changeset
|
54 |
624 | 55 function getInteger(n,name) |
56 { | |
57 if (n == null) return 0; | |
58 var a = n.attr(name); | |
59 if (a==null) return 0; | |
60 return parseInt(a.value()); | |
61 } | |
719
1b6856fda760
Collect mbnames and mapping to object through mb_rt.mbnames
Thinker K.F. Li <thinker@branda.to>
parents:
718
diff
changeset
|
62 |
631 | 63 function parsePointSize(s) |
64 { | |
65 var fs=0; | |
66 var i; | |
624 | 67 |
631 | 68 for(i=0;i<s.length;i++) { |
69 if (s[i]<'0' || s[i] > '9') break; | |
70 fs = fs*10 + (s[i]-'0'); | |
71 } | |
72 return fs; | |
73 | |
74 } | |
75 | |
76 function parseColor(c) | |
77 { | |
78 if (c[0] == '#') { | |
79 return parseInt(c.substring(1,3),16)<<16 | parseInt(c.substring(3,5),16)<<8 | parseInt(c.substring(5,7),16); | |
80 } | |
81 } | |
719
1b6856fda760
Collect mbnames and mapping to object through mb_rt.mbnames
Thinker K.F. Li <thinker@branda.to>
parents:
718
diff
changeset
|
82 |
631 | 83 function parseTextStyle(style,n) |
624 | 84 { |
625
9f2080b68f8e
Add the text style parser. This can not handle the recursive tspan yet.
wycc
parents:
624
diff
changeset
|
85 var attr; |
9f2080b68f8e
Add the text style parser. This can not handle the recursive tspan yet.
wycc
parents:
624
diff
changeset
|
86 if (n) { |
9f2080b68f8e
Add the text style parser. This can not handle the recursive tspan yet.
wycc
parents:
624
diff
changeset
|
87 attr = n.attr('style'); |
9f2080b68f8e
Add the text style parser. This can not handle the recursive tspan yet.
wycc
parents:
624
diff
changeset
|
88 } else { |
9f2080b68f8e
Add the text style parser. This can not handle the recursive tspan yet.
wycc
parents:
624
diff
changeset
|
89 attr = null; |
9f2080b68f8e
Add the text style parser. This can not handle the recursive tspan yet.
wycc
parents:
624
diff
changeset
|
90 } |
9f2080b68f8e
Add the text style parser. This can not handle the recursive tspan yet.
wycc
parents:
624
diff
changeset
|
91 if (attr == null) { |
631 | 92 return; |
625
9f2080b68f8e
Add the text style parser. This can not handle the recursive tspan yet.
wycc
parents:
624
diff
changeset
|
93 } |
9f2080b68f8e
Add the text style parser. This can not handle the recursive tspan yet.
wycc
parents:
624
diff
changeset
|
94 var f = attr.value().split(';'); |
9f2080b68f8e
Add the text style parser. This can not handle the recursive tspan yet.
wycc
parents:
624
diff
changeset
|
95 |
9f2080b68f8e
Add the text style parser. This can not handle the recursive tspan yet.
wycc
parents:
624
diff
changeset
|
96 for(i in f) { |
9f2080b68f8e
Add the text style parser. This can not handle the recursive tspan yet.
wycc
parents:
624
diff
changeset
|
97 var kv = f[i].split(':'); |
9f2080b68f8e
Add the text style parser. This can not handle the recursive tspan yet.
wycc
parents:
624
diff
changeset
|
98 if (kv[0] == 'font-size') { |
631 | 99 style.fs = parsePointSize(kv[1]); |
625
9f2080b68f8e
Add the text style parser. This can not handle the recursive tspan yet.
wycc
parents:
624
diff
changeset
|
100 } else if (kv[0] == "font-style") { |
9f2080b68f8e
Add the text style parser. This can not handle the recursive tspan yet.
wycc
parents:
624
diff
changeset
|
101 } else if (kv[0] == "font-weight") { |
9f2080b68f8e
Add the text style parser. This can not handle the recursive tspan yet.
wycc
parents:
624
diff
changeset
|
102 } else if (kv[0] == "fill") { |
631 | 103 style.color = parseColor(kv[1]); |
625
9f2080b68f8e
Add the text style parser. This can not handle the recursive tspan yet.
wycc
parents:
624
diff
changeset
|
104 } else if (kv[0] == "fill-opacity") { |
703
3457519e3b9c
Add rect and matrix support. The test.svg can be rendered almost correctly now.
wycc
parents:
647
diff
changeset
|
105 } else if (kv[0] == "stroke-opacity") { |
625
9f2080b68f8e
Add the text style parser. This can not handle the recursive tspan yet.
wycc
parents:
624
diff
changeset
|
106 } else if (kv[0] == "stroke") { |
9f2080b68f8e
Add the text style parser. This can not handle the recursive tspan yet.
wycc
parents:
624
diff
changeset
|
107 } else if (kv[0] == "stroke-width") { |
9f2080b68f8e
Add the text style parser. This can not handle the recursive tspan yet.
wycc
parents:
624
diff
changeset
|
108 } else if (kv[0] == "stroke-linecap") { |
9f2080b68f8e
Add the text style parser. This can not handle the recursive tspan yet.
wycc
parents:
624
diff
changeset
|
109 } else if (kv[0] == "stroke-linejoin") { |
9f2080b68f8e
Add the text style parser. This can not handle the recursive tspan yet.
wycc
parents:
624
diff
changeset
|
110 } else if (kv[0] == "stroke-lineopacity") { |
9f2080b68f8e
Add the text style parser. This can not handle the recursive tspan yet.
wycc
parents:
624
diff
changeset
|
111 } else if (kv[0] == "font-family") { |
631 | 112 style.family = kv[1]; |
625
9f2080b68f8e
Add the text style parser. This can not handle the recursive tspan yet.
wycc
parents:
624
diff
changeset
|
113 } else if (kv[0] == "font-stretch") { |
9f2080b68f8e
Add the text style parser. This can not handle the recursive tspan yet.
wycc
parents:
624
diff
changeset
|
114 } else if (kv[0] == "font-variant") { |
9f2080b68f8e
Add the text style parser. This can not handle the recursive tspan yet.
wycc
parents:
624
diff
changeset
|
115 } else if (kv[0] == "text-anchor") { |
9f2080b68f8e
Add the text style parser. This can not handle the recursive tspan yet.
wycc
parents:
624
diff
changeset
|
116 } else if (kv[0] == "text-align") { |
9f2080b68f8e
Add the text style parser. This can not handle the recursive tspan yet.
wycc
parents:
624
diff
changeset
|
117 } else if (kv[0] == "writing-mode") { |
9f2080b68f8e
Add the text style parser. This can not handle the recursive tspan yet.
wycc
parents:
624
diff
changeset
|
118 } else if (kv[0] == "line-height") { |
632 | 119 } else { |
625
9f2080b68f8e
Add the text style parser. This can not handle the recursive tspan yet.
wycc
parents:
624
diff
changeset
|
120 sys.puts("Unknown style: "+kv[0]); |
9f2080b68f8e
Add the text style parser. This can not handle the recursive tspan yet.
wycc
parents:
624
diff
changeset
|
121 } |
9f2080b68f8e
Add the text style parser. This can not handle the recursive tspan yet.
wycc
parents:
624
diff
changeset
|
122 } |
624 | 123 } |
732
6879aa403306
Add set_text to the coordinate of the coord_t of the text.
wycc
parents:
720
diff
changeset
|
124 function tspan_set_text(text) |
6879aa403306
Add set_text to the coordinate of the coord_t of the text.
wycc
parents:
720
diff
changeset
|
125 { |
6879aa403306
Add set_text to the coordinate of the coord_t of the text.
wycc
parents:
720
diff
changeset
|
126 this.text.set_text(text); |
6879aa403306
Add set_text to the coordinate of the coord_t of the text.
wycc
parents:
720
diff
changeset
|
127 } |
624 | 128 |
718
0cd59ce76e67
Refactor loadSVG as a class
Thinker K.F. Li <thinker@branda.to>
parents:
717
diff
changeset
|
129 loadSVG.prototype.parseTSpan=function(coord, n,style) |
624 | 130 { |
131 var x = getInteger(n,'x'); | |
132 var y = getInteger(n,'y'); | |
714 | 133 var tcoord = this.mb_rt.coord_new(coord); |
624 | 134 var nodes = n.childNodes(); |
135 var k; | |
136 | |
714 | 137 var obj = this.mb_rt.stext_new(n.text(),x,y); |
631 | 138 parseTextStyle(style,n); |
714 | 139 style.paint = this.mb_rt.paint_color_new(1,1,1,1); |
140 style.face=this.mb_rt.font_face_query(style.family, 2, 100); | |
631 | 141 obj.set_style([[20,style.face,style.fs]]); |
142 style.paint.fill(obj); | |
624 | 143 tcoord.add_shape(obj); |
144 for(k in nodes) { | |
145 var name = nodes[k].name(); | |
146 if (name == "tspan") { | |
714 | 147 this.parseTSpan(tcoord,nodes[k]); |
624 | 148 } else { |
149 } | |
150 } | |
732
6879aa403306
Add set_text to the coordinate of the coord_t of the text.
wycc
parents:
720
diff
changeset
|
151 tcoord.set_text=tspan_set_text; |
6879aa403306
Add set_text to the coordinate of the coord_t of the text.
wycc
parents:
720
diff
changeset
|
152 tcoord.text = obj; |
719
1b6856fda760
Collect mbnames and mapping to object through mb_rt.mbnames
Thinker K.F. Li <thinker@branda.to>
parents:
718
diff
changeset
|
153 make_mbnames(this.mb_rt, n, tcoord); |
624 | 154 } |
155 | |
718
0cd59ce76e67
Refactor loadSVG as a class
Thinker K.F. Li <thinker@branda.to>
parents:
717
diff
changeset
|
156 loadSVG.prototype._prepare_paint_color=function(color, alpha) { |
706 | 157 var paint; |
713 | 158 var c; |
706 | 159 |
160 if (color[0]=='#') { | |
161 var r,g,b; | |
717
b822b1912d67
Paint with black for unspecified, not "none", fill and stroke.
Thinker K.F. Li <thinker@branda.to>
parents:
714
diff
changeset
|
162 r = parseInt(color.substring(1,3),16)/255; |
b822b1912d67
Paint with black for unspecified, not "none", fill and stroke.
Thinker K.F. Li <thinker@branda.to>
parents:
714
diff
changeset
|
163 g = parseInt(color.substring(3,5),16)/255; |
b822b1912d67
Paint with black for unspecified, not "none", fill and stroke.
Thinker K.F. Li <thinker@branda.to>
parents:
714
diff
changeset
|
164 b = parseInt(color.substring(5,7),16)/255; |
714 | 165 paint = this.mb_rt.paint_color_new(r, g, b, alpha); |
713 | 166 } else if(_std_colors[color]) { |
167 c = _std_colors[color]; | |
714 | 168 paint = this.mb_rt.paint_color_new(c[0], c[1], c[2], alpha); |
706 | 169 } else { |
714 | 170 paint = this.mb_rt.paint_color_new(0,0,0,1); |
706 | 171 } |
172 return paint; | |
173 } | |
174 | |
759 | 175 function guessPathBoundingBox(coord,d) |
176 { | |
776
77b561bb7929
Implement new algorithm to calculate the origin of the SVG elemnts so that we can implement object resize without changing the position of the object.
wycc
parents:
759
diff
changeset
|
177 return; |
759 | 178 var items = d.split(' '); |
179 var len = items.length; | |
180 var pair; | |
181 var i; | |
182 var minx,miny; | |
183 | |
184 minx = 10000; | |
185 miny = 10000; | |
186 | |
187 for(i=0;i<len;i++) { | |
188 var type = items[i].toLowerCase(); | |
189 x = minx;y = miny; | |
190 switch(type) { | |
191 case 'm': | |
192 case 'l': | |
193 case 'a': | |
194 case 'x': | |
195 pair = items[i+1].split(','); | |
196 if (pair.length==2) { | |
197 x = parseFloat(pair[0]); | |
198 y = parseFloat(pair[1]); | |
199 i++; | |
200 } else { | |
201 x = parseFloat(items[i+1]); | |
202 y = parseFloat(items[i+2]); | |
203 i+=2; | |
204 } | |
205 break; | |
206 case 'q': | |
207 // Implement this latter | |
208 break; | |
209 case 'c': | |
210 // Implement this latter | |
211 break; | |
212 case 's': | |
213 // Implement this latter | |
214 break; | |
215 case 'h': | |
216 x = parseFloat(items[i+1]); | |
217 break; | |
218 case 'v': | |
219 y = parseFloat(items[i+1]); | |
220 break; | |
776
77b561bb7929
Implement new algorithm to calculate the origin of the SVG elemnts so that we can implement object resize without changing the position of the object.
wycc
parents:
759
diff
changeset
|
221 default: |
77b561bb7929
Implement new algorithm to calculate the origin of the SVG elemnts so that we can implement object resize without changing the position of the object.
wycc
parents:
759
diff
changeset
|
222 continue; |
759 | 223 } |
224 if (x < minx) minx = x; | |
225 if (y < miny) miny = y; | |
226 } | |
227 if (coord.center.x > minx) | |
228 coord.center.x = minx; | |
229 if (coord.center.y > miny) | |
230 coord.center.y = miny; | |
231 } | |
232 | |
233 | |
718
0cd59ce76e67
Refactor loadSVG as a class
Thinker K.F. Li <thinker@branda.to>
parents:
717
diff
changeset
|
234 loadSVG.prototype.parsePath=function(coord,id, n) |
706 | 235 { |
236 var d = n.attr('d').value(); | |
237 var style = n.attr('style'); | |
714 | 238 var path = this.mb_rt.path_new(d); |
706 | 239 var paint; |
717
b822b1912d67
Paint with black for unspecified, not "none", fill and stroke.
Thinker K.F. Li <thinker@branda.to>
parents:
714
diff
changeset
|
240 var fill_alpha = 1; |
b822b1912d67
Paint with black for unspecified, not "none", fill and stroke.
Thinker K.F. Li <thinker@branda.to>
parents:
714
diff
changeset
|
241 var stroke_alpha = 1; |
b822b1912d67
Paint with black for unspecified, not "none", fill and stroke.
Thinker K.F. Li <thinker@branda.to>
parents:
714
diff
changeset
|
242 var fill_color; |
b822b1912d67
Paint with black for unspecified, not "none", fill and stroke.
Thinker K.F. Li <thinker@branda.to>
parents:
714
diff
changeset
|
243 var stroke_color; |
b822b1912d67
Paint with black for unspecified, not "none", fill and stroke.
Thinker K.F. Li <thinker@branda.to>
parents:
714
diff
changeset
|
244 var black_paint; |
706 | 245 |
759 | 246 guessPathBoundingBox(coord,d); |
717
b822b1912d67
Paint with black for unspecified, not "none", fill and stroke.
Thinker K.F. Li <thinker@branda.to>
parents:
714
diff
changeset
|
247 if(style != null) { |
706 | 248 var items = style.value().split(';'); |
249 var alpha; | |
250 | |
251 for(i in items) { | |
252 var f = items[i].split(':'); | |
253 if (f[0] == 'opacity') { | |
254 alpha = f[1]; | |
255 } else if (f[0] == 'fill') { | |
717
b822b1912d67
Paint with black for unspecified, not "none", fill and stroke.
Thinker K.F. Li <thinker@branda.to>
parents:
714
diff
changeset
|
256 fill_color = f[1]; |
706 | 257 } else if (f[0] == 'fill-opacity') { |
258 fill_alpha = parseFloat(f[1]); | |
259 } else if (f[0] == 'stroke') { | |
717
b822b1912d67
Paint with black for unspecified, not "none", fill and stroke.
Thinker K.F. Li <thinker@branda.to>
parents:
714
diff
changeset
|
260 stroke_color = f[1]; |
706 | 261 } else if (f[0] == 'stroke-width') { |
262 path.stroke_width = parseFloat(f[1]); | |
263 } else if (f[0] == 'stroke-opacity') { | |
264 stroke_alpha = parseFloat(f[1]); | |
265 } | |
266 } | |
267 | |
717
b822b1912d67
Paint with black for unspecified, not "none", fill and stroke.
Thinker K.F. Li <thinker@branda.to>
parents:
714
diff
changeset
|
268 } |
b822b1912d67
Paint with black for unspecified, not "none", fill and stroke.
Thinker K.F. Li <thinker@branda.to>
parents:
714
diff
changeset
|
269 |
b822b1912d67
Paint with black for unspecified, not "none", fill and stroke.
Thinker K.F. Li <thinker@branda.to>
parents:
714
diff
changeset
|
270 if(!fill_color || !stroke_color) |
b822b1912d67
Paint with black for unspecified, not "none", fill and stroke.
Thinker K.F. Li <thinker@branda.to>
parents:
714
diff
changeset
|
271 black_paint = this.mb_rt.paint_color_new(0, 0, 0, 1); |
b822b1912d67
Paint with black for unspecified, not "none", fill and stroke.
Thinker K.F. Li <thinker@branda.to>
parents:
714
diff
changeset
|
272 |
b822b1912d67
Paint with black for unspecified, not "none", fill and stroke.
Thinker K.F. Li <thinker@branda.to>
parents:
714
diff
changeset
|
273 if(fill_color) { |
b822b1912d67
Paint with black for unspecified, not "none", fill and stroke.
Thinker K.F. Li <thinker@branda.to>
parents:
714
diff
changeset
|
274 if(fill_color != "none") { |
714 | 275 paint = this._prepare_paint_color(fill_color, fill_alpha); |
706 | 276 paint.fill(path); |
277 } | |
717
b822b1912d67
Paint with black for unspecified, not "none", fill and stroke.
Thinker K.F. Li <thinker@branda.to>
parents:
714
diff
changeset
|
278 } else { |
b822b1912d67
Paint with black for unspecified, not "none", fill and stroke.
Thinker K.F. Li <thinker@branda.to>
parents:
714
diff
changeset
|
279 black_paint.fill(path); |
b822b1912d67
Paint with black for unspecified, not "none", fill and stroke.
Thinker K.F. Li <thinker@branda.to>
parents:
714
diff
changeset
|
280 } |
b822b1912d67
Paint with black for unspecified, not "none", fill and stroke.
Thinker K.F. Li <thinker@branda.to>
parents:
714
diff
changeset
|
281 if(stroke_color) { |
b822b1912d67
Paint with black for unspecified, not "none", fill and stroke.
Thinker K.F. Li <thinker@branda.to>
parents:
714
diff
changeset
|
282 if(stroke_color != "none") { |
714 | 283 paint = this._prepare_paint_color(stroke_color, stroke_alpha); |
706 | 284 paint.stroke(path); |
285 } | |
717
b822b1912d67
Paint with black for unspecified, not "none", fill and stroke.
Thinker K.F. Li <thinker@branda.to>
parents:
714
diff
changeset
|
286 } else { |
b822b1912d67
Paint with black for unspecified, not "none", fill and stroke.
Thinker K.F. Li <thinker@branda.to>
parents:
714
diff
changeset
|
287 black_paint.stroke(path); |
706 | 288 } |
289 coord.add_shape(path); | |
719
1b6856fda760
Collect mbnames and mapping to object through mb_rt.mbnames
Thinker K.F. Li <thinker@branda.to>
parents:
718
diff
changeset
|
290 |
1b6856fda760
Collect mbnames and mapping to object through mb_rt.mbnames
Thinker K.F. Li <thinker@branda.to>
parents:
718
diff
changeset
|
291 make_mbnames(this.mb_rt, n, path); |
706 | 292 } |
293 | |
776
77b561bb7929
Implement new algorithm to calculate the origin of the SVG elemnts so that we can implement object resize without changing the position of the object.
wycc
parents:
759
diff
changeset
|
294 loadSVG.prototype.parseText=function(accu,coord,id, n) |
624 | 295 { |
296 var x = getInteger(n,'x'); | |
297 var y = getInteger(n,'y'); | |
714 | 298 var tcoord = this.mb_rt.coord_new(coord); |
631 | 299 var style = new Object(); |
759 | 300 |
776
77b561bb7929
Implement new algorithm to calculate the origin of the SVG elemnts so that we can implement object resize without changing the position of the object.
wycc
parents:
759
diff
changeset
|
301 if (n.attr('x')) { |
77b561bb7929
Implement new algorithm to calculate the origin of the SVG elemnts so that we can implement object resize without changing the position of the object.
wycc
parents:
759
diff
changeset
|
302 var nx = coord[0]*x+coord[1]*y+coord[2]; |
77b561bb7929
Implement new algorithm to calculate the origin of the SVG elemnts so that we can implement object resize without changing the position of the object.
wycc
parents:
759
diff
changeset
|
303 if (coord.center.x > nx) |
77b561bb7929
Implement new algorithm to calculate the origin of the SVG elemnts so that we can implement object resize without changing the position of the object.
wycc
parents:
759
diff
changeset
|
304 coord.center.x = nx; |
77b561bb7929
Implement new algorithm to calculate the origin of the SVG elemnts so that we can implement object resize without changing the position of the object.
wycc
parents:
759
diff
changeset
|
305 } |
77b561bb7929
Implement new algorithm to calculate the origin of the SVG elemnts so that we can implement object resize without changing the position of the object.
wycc
parents:
759
diff
changeset
|
306 if (n.attr('y')) { |
77b561bb7929
Implement new algorithm to calculate the origin of the SVG elemnts so that we can implement object resize without changing the position of the object.
wycc
parents:
759
diff
changeset
|
307 var ny = coord[3]*x+coord[4]*y+coord[5]; |
77b561bb7929
Implement new algorithm to calculate the origin of the SVG elemnts so that we can implement object resize without changing the position of the object.
wycc
parents:
759
diff
changeset
|
308 if (coord.center.y > ny) |
77b561bb7929
Implement new algorithm to calculate the origin of the SVG elemnts so that we can implement object resize without changing the position of the object.
wycc
parents:
759
diff
changeset
|
309 coord.center.y = ny; |
77b561bb7929
Implement new algorithm to calculate the origin of the SVG elemnts so that we can implement object resize without changing the position of the object.
wycc
parents:
759
diff
changeset
|
310 } |
631 | 311 style.fs = 20; |
312 style.family = 'courier'; | |
313 parseTextStyle(style,n); | |
624 | 314 var nodes = n.childNodes(); |
315 var k; | |
316 for(k in nodes) { | |
720
9c5abb4e114b
Fix issue of redefine a variable with the same name of a argument
Thinker K.F. Li <thinker@branda.to>
parents:
719
diff
changeset
|
317 var c= nodes[k].name(); |
9c5abb4e114b
Fix issue of redefine a variable with the same name of a argument
Thinker K.F. Li <thinker@branda.to>
parents:
719
diff
changeset
|
318 if (c == "tspan") { |
714 | 319 this.parseTSpan(tcoord,nodes[k],style); |
624 | 320 } else { |
321 } | |
322 } | |
323 | |
719
1b6856fda760
Collect mbnames and mapping to object through mb_rt.mbnames
Thinker K.F. Li <thinker@branda.to>
parents:
718
diff
changeset
|
324 make_mbnames(this.mb_rt, n, tcoord); |
624 | 325 } |
326 | |
759 | 327 |
328 function multiply(s,d) { | |
329 var m=[]; | |
330 m[0] = s[0]*d[0]+s[1]*d[3]; | |
331 m[1] = s[0]*d[1]+s[1]*d[4]; | |
332 m[2] = s[0]*d[2]+s[1]*d[5]+s[2]; | |
333 m[3] = s[3]*d[0]+s[4]*d[3]; | |
334 m[4] = s[3]*d[1]+s[4]*d[4]; | |
335 m[5] = s[3]*d[2]+s[4]*d[5]+s[5]; | |
336 s[0] = m[0]; | |
337 s[1] = m[1]; | |
338 s[2] = m[2]; | |
339 s[3] = m[3]; | |
340 s[4] = m[4]; | |
341 s[5] = m[5]; | |
342 } | |
343 | |
624 | 344 function parseTransform(coord, s) |
345 { | |
346 var off = s.indexOf('translate'); | |
347 if (off != -1) { | |
348 var ss = s.substring(off+9); | |
349 for(i=0;i<ss.length;i++) { | |
350 if (ss[i] == '(') break; | |
351 } | |
352 ss = ss.substring(i+1); | |
353 for(i=0;i<ss.length;i++) { | |
354 if (ss[i] == ')') { | |
355 ss = ss.substring(0,i); | |
356 break; | |
357 } | |
358 } | |
359 var f = ss.split(','); | |
360 var x,y; | |
706 | 361 x = parseFloat(f[0]); |
362 y = parseFloat(f[1]); | |
759 | 363 coord[2] += x; |
364 coord[5] += y; | |
624 | 365 } |
366 off = s.indexOf('matrix'); | |
367 if (off != -1) { | |
703
3457519e3b9c
Add rect and matrix support. The test.svg can be rendered almost correctly now.
wycc
parents:
647
diff
changeset
|
368 var end = s.indexOf(')'); |
3457519e3b9c
Add rect and matrix support. The test.svg can be rendered almost correctly now.
wycc
parents:
647
diff
changeset
|
369 var m = s.substring(7,end); |
3457519e3b9c
Add rect and matrix support. The test.svg can be rendered almost correctly now.
wycc
parents:
647
diff
changeset
|
370 var fields = m.split(','); |
759 | 371 var newm=[]; |
372 newm[0] = parseFloat(fields[0]); | |
373 newm[1] = parseFloat(fields[2]); | |
374 newm[2] = parseFloat(fields[4]); | |
375 newm[3] = parseFloat(fields[1]); | |
376 newm[4] = parseFloat(fields[3]); | |
377 newm[5] = parseFloat(fields[5]); | |
378 multiply(coord,newm); | |
624 | 379 } |
380 } | |
381 | |
759 | 382 loadSVG.prototype.parseRect=function(accu_matrix,coord, id, n) |
624 | 383 { |
703
3457519e3b9c
Add rect and matrix support. The test.svg can be rendered almost correctly now.
wycc
parents:
647
diff
changeset
|
384 var x = getInteger(n,'x'); |
3457519e3b9c
Add rect and matrix support. The test.svg can be rendered almost correctly now.
wycc
parents:
647
diff
changeset
|
385 var y = getInteger(n,'y'); |
759 | 386 var rx,ry; |
703
3457519e3b9c
Add rect and matrix support. The test.svg can be rendered almost correctly now.
wycc
parents:
647
diff
changeset
|
387 var w = getInteger(n,'width'); |
3457519e3b9c
Add rect and matrix support. The test.svg can be rendered almost correctly now.
wycc
parents:
647
diff
changeset
|
388 var h = getInteger(n,'height'); |
759 | 389 var trans = n.attr('transform'); |
703
3457519e3b9c
Add rect and matrix support. The test.svg can be rendered almost correctly now.
wycc
parents:
647
diff
changeset
|
390 var paint; |
776
77b561bb7929
Implement new algorithm to calculate the origin of the SVG elemnts so that we can implement object resize without changing the position of the object.
wycc
parents:
759
diff
changeset
|
391 var tcoord = this.mb_rt.coord_new(coord); |
703
3457519e3b9c
Add rect and matrix support. The test.svg can be rendered almost correctly now.
wycc
parents:
647
diff
changeset
|
392 |
3457519e3b9c
Add rect and matrix support. The test.svg can be rendered almost correctly now.
wycc
parents:
647
diff
changeset
|
393 var style = n.attr('style'); |
3457519e3b9c
Add rect and matrix support. The test.svg can be rendered almost correctly now.
wycc
parents:
647
diff
changeset
|
394 |
759 | 395 if (trans) { |
776
77b561bb7929
Implement new algorithm to calculate the origin of the SVG elemnts so that we can implement object resize without changing the position of the object.
wycc
parents:
759
diff
changeset
|
396 parseTransform(tcoord,trans.value()); |
77b561bb7929
Implement new algorithm to calculate the origin of the SVG elemnts so that we can implement object resize without changing the position of the object.
wycc
parents:
759
diff
changeset
|
397 //var m = [1,0,0,0,1,0]; |
77b561bb7929
Implement new algorithm to calculate the origin of the SVG elemnts so that we can implement object resize without changing the position of the object.
wycc
parents:
759
diff
changeset
|
398 //multiply(m,tcoord); |
77b561bb7929
Implement new algorithm to calculate the origin of the SVG elemnts so that we can implement object resize without changing the position of the object.
wycc
parents:
759
diff
changeset
|
399 rx = tcoord[0]*x+tcoord[1]*y+tcoord[2]; |
77b561bb7929
Implement new algorithm to calculate the origin of the SVG elemnts so that we can implement object resize without changing the position of the object.
wycc
parents:
759
diff
changeset
|
400 ry = tcoord[3]*x+tcoord[4]*y+tcoord[5]; |
759 | 401 } |
402 | |
403 if (coord.center.x > rx) | |
404 coord.center.x = rx; | |
405 if (coord.center.y > ry) | |
406 coord.center.y = ry; | |
407 | |
703
3457519e3b9c
Add rect and matrix support. The test.svg can be rendered almost correctly now.
wycc
parents:
647
diff
changeset
|
408 if (style==null) { |
714 | 409 paint = this.mb_rt.paint_color_new(0,0,0,0.1); |
703
3457519e3b9c
Add rect and matrix support. The test.svg can be rendered almost correctly now.
wycc
parents:
647
diff
changeset
|
410 } else { |
3457519e3b9c
Add rect and matrix support. The test.svg can be rendered almost correctly now.
wycc
parents:
647
diff
changeset
|
411 var items = style.value().split(';'); |
3457519e3b9c
Add rect and matrix support. The test.svg can be rendered almost correctly now.
wycc
parents:
647
diff
changeset
|
412 var fill = ''; |
708
ac9c20db953e
Default alpha of a tag is '1'
Thinker K.F. Li <thinker@branda.to>
parents:
706
diff
changeset
|
413 var alpha = 1; |
776
77b561bb7929
Implement new algorithm to calculate the origin of the SVG elemnts so that we can implement object resize without changing the position of the object.
wycc
parents:
759
diff
changeset
|
414 display = 'on'; |
703
3457519e3b9c
Add rect and matrix support. The test.svg can be rendered almost correctly now.
wycc
parents:
647
diff
changeset
|
415 for(i in items) { |
3457519e3b9c
Add rect and matrix support. The test.svg can be rendered almost correctly now.
wycc
parents:
647
diff
changeset
|
416 var f = items[i].split(':'); |
3457519e3b9c
Add rect and matrix support. The test.svg can be rendered almost correctly now.
wycc
parents:
647
diff
changeset
|
417 if (f[0] == 'opacity') { |
3457519e3b9c
Add rect and matrix support. The test.svg can be rendered almost correctly now.
wycc
parents:
647
diff
changeset
|
418 alpha = f[1]; |
3457519e3b9c
Add rect and matrix support. The test.svg can be rendered almost correctly now.
wycc
parents:
647
diff
changeset
|
419 } else if (f[0] == 'fill') { |
3457519e3b9c
Add rect and matrix support. The test.svg can be rendered almost correctly now.
wycc
parents:
647
diff
changeset
|
420 fill = f[1]; |
3457519e3b9c
Add rect and matrix support. The test.svg can be rendered almost correctly now.
wycc
parents:
647
diff
changeset
|
421 } else if (f[0] == 'fill-opacity') { |
3457519e3b9c
Add rect and matrix support. The test.svg can be rendered almost correctly now.
wycc
parents:
647
diff
changeset
|
422 } else if (f[0] == 'stroke') { |
3457519e3b9c
Add rect and matrix support. The test.svg can be rendered almost correctly now.
wycc
parents:
647
diff
changeset
|
423 } else if (f[0] == 'stroken-width') { |
3457519e3b9c
Add rect and matrix support. The test.svg can be rendered almost correctly now.
wycc
parents:
647
diff
changeset
|
424 } else if (f[0] == 'stroke-opacity') { |
776
77b561bb7929
Implement new algorithm to calculate the origin of the SVG elemnts so that we can implement object resize without changing the position of the object.
wycc
parents:
759
diff
changeset
|
425 } else if (f[0] == 'display') { |
77b561bb7929
Implement new algorithm to calculate the origin of the SVG elemnts so that we can implement object resize without changing the position of the object.
wycc
parents:
759
diff
changeset
|
426 display = f[1]; |
703
3457519e3b9c
Add rect and matrix support. The test.svg can be rendered almost correctly now.
wycc
parents:
647
diff
changeset
|
427 } |
3457519e3b9c
Add rect and matrix support. The test.svg can be rendered almost correctly now.
wycc
parents:
647
diff
changeset
|
428 } |
776
77b561bb7929
Implement new algorithm to calculate the origin of the SVG elemnts so that we can implement object resize without changing the position of the object.
wycc
parents:
759
diff
changeset
|
429 if (display == 'none') { |
77b561bb7929
Implement new algorithm to calculate the origin of the SVG elemnts so that we can implement object resize without changing the position of the object.
wycc
parents:
759
diff
changeset
|
430 return; |
77b561bb7929
Implement new algorithm to calculate the origin of the SVG elemnts so that we can implement object resize without changing the position of the object.
wycc
parents:
759
diff
changeset
|
431 } |
703
3457519e3b9c
Add rect and matrix support. The test.svg can be rendered almost correctly now.
wycc
parents:
647
diff
changeset
|
432 if (fill[0]=='#') { |
3457519e3b9c
Add rect and matrix support. The test.svg can be rendered almost correctly now.
wycc
parents:
647
diff
changeset
|
433 var r,g,b; |
3457519e3b9c
Add rect and matrix support. The test.svg can be rendered almost correctly now.
wycc
parents:
647
diff
changeset
|
434 r = parseInt(fill.substring(1,3),16)/256; |
3457519e3b9c
Add rect and matrix support. The test.svg can be rendered almost correctly now.
wycc
parents:
647
diff
changeset
|
435 g = parseInt(fill.substring(3,5),16)/256; |
3457519e3b9c
Add rect and matrix support. The test.svg can be rendered almost correctly now.
wycc
parents:
647
diff
changeset
|
436 b = parseInt(fill.substring(5,7),16)/256; |
3457519e3b9c
Add rect and matrix support. The test.svg can be rendered almost correctly now.
wycc
parents:
647
diff
changeset
|
437 |
714 | 438 paint = this.mb_rt.paint_color_new(r,g,b,parseFloat(alpha)); |
750 | 439 } else if (fill.substring(0,3) == 'url') { |
440 var id = fill.substring(5,fill.length-1); | |
441 var gr = this.gradients[id]; | |
442 paint = this.mb_rt.paint_linear_new(gr[0],gr[1],gr[2],gr[3]); | |
443 paint.set_stops(this.stop_ref[id]); | |
703
3457519e3b9c
Add rect and matrix support. The test.svg can be rendered almost correctly now.
wycc
parents:
647
diff
changeset
|
444 } else { |
714 | 445 paint = this.mb_rt.paint_color_new(0,0,0,1); |
703
3457519e3b9c
Add rect and matrix support. The test.svg can be rendered almost correctly now.
wycc
parents:
647
diff
changeset
|
446 } |
3457519e3b9c
Add rect and matrix support. The test.svg can be rendered almost correctly now.
wycc
parents:
647
diff
changeset
|
447 } |
714 | 448 var rect = this.mb_rt.rect_new(x,y,w,h,10, 10); |
703
3457519e3b9c
Add rect and matrix support. The test.svg can be rendered almost correctly now.
wycc
parents:
647
diff
changeset
|
449 paint.fill(rect); |
776
77b561bb7929
Implement new algorithm to calculate the origin of the SVG elemnts so that we can implement object resize without changing the position of the object.
wycc
parents:
759
diff
changeset
|
450 tcoord.add_shape(rect); |
624 | 451 } |
776
77b561bb7929
Implement new algorithm to calculate the origin of the SVG elemnts so that we can implement object resize without changing the position of the object.
wycc
parents:
759
diff
changeset
|
452 // When we parse a group, we need to calculate the origin of the group so that we can resize the group without changing its origin point. |
77b561bb7929
Implement new algorithm to calculate the origin of the SVG elemnts so that we can implement object resize without changing the position of the object.
wycc
parents:
759
diff
changeset
|
453 // This must be done recursively. For text/rect/image, we can get its origin point directly by using the (x,y) and apply their transformation |
77b561bb7929
Implement new algorithm to calculate the origin of the SVG elemnts so that we can implement object resize without changing the position of the object.
wycc
parents:
759
diff
changeset
|
454 // matrix. For group, we need to send the acculumated matrix so that each group can get their origin correctly. |
77b561bb7929
Implement new algorithm to calculate the origin of the SVG elemnts so that we can implement object resize without changing the position of the object.
wycc
parents:
759
diff
changeset
|
455 // |
77b561bb7929
Implement new algorithm to calculate the origin of the SVG elemnts so that we can implement object resize without changing the position of the object.
wycc
parents:
759
diff
changeset
|
456 // Each element must be responsible to calculate its absolute origin point and update the origin of its parent. |
759 | 457 loadSVG.prototype.parseGroup=function(accu_matrix,root, group_id, n) |
624 | 458 { |
459 var k; | |
460 var nodes = n.childNodes(); | |
714 | 461 var coord = this.mb_rt.coord_new(root); |
624 | 462 // Parse the transform and style here |
463 var trans = n.attr('transform'); | |
759 | 464 var accu=[1,0,0,0,1,0]; |
465 coord.center= new Object(); | |
466 coord.center.x = 10000; | |
467 coord.center.y = 10000; | |
624 | 468 if (trans!=null) { |
469 parseTransform(coord, trans.value()); | |
759 | 470 } |
776
77b561bb7929
Implement new algorithm to calculate the origin of the SVG elemnts so that we can implement object resize without changing the position of the object.
wycc
parents:
759
diff
changeset
|
471 multiply(accu,accu_matrix); |
77b561bb7929
Implement new algorithm to calculate the origin of the SVG elemnts so that we can implement object resize without changing the position of the object.
wycc
parents:
759
diff
changeset
|
472 multiply(accu,coord); |
624 | 473 |
474 for(k in nodes) { | |
719
1b6856fda760
Collect mbnames and mapping to object through mb_rt.mbnames
Thinker K.F. Li <thinker@branda.to>
parents:
718
diff
changeset
|
475 var c = nodes[k].name(); |
624 | 476 var attr = nodes[k].attr('id'); |
477 var id; | |
478 if (attr) { | |
479 id = attr.value(); | |
480 } | |
719
1b6856fda760
Collect mbnames and mapping to object through mb_rt.mbnames
Thinker K.F. Li <thinker@branda.to>
parents:
718
diff
changeset
|
481 if (c == "g") { |
759 | 482 this.parseGroup(accu,coord, id, nodes[k]); |
719
1b6856fda760
Collect mbnames and mapping to object through mb_rt.mbnames
Thinker K.F. Li <thinker@branda.to>
parents:
718
diff
changeset
|
483 } else if (c == "path") { |
776
77b561bb7929
Implement new algorithm to calculate the origin of the SVG elemnts so that we can implement object resize without changing the position of the object.
wycc
parents:
759
diff
changeset
|
484 this.parsePath(accu,coord, id, nodes[k]); |
719
1b6856fda760
Collect mbnames and mapping to object through mb_rt.mbnames
Thinker K.F. Li <thinker@branda.to>
parents:
718
diff
changeset
|
485 } else if (c == "text") { |
776
77b561bb7929
Implement new algorithm to calculate the origin of the SVG elemnts so that we can implement object resize without changing the position of the object.
wycc
parents:
759
diff
changeset
|
486 this.parseText(accu,coord, id, nodes[k]); |
719
1b6856fda760
Collect mbnames and mapping to object through mb_rt.mbnames
Thinker K.F. Li <thinker@branda.to>
parents:
718
diff
changeset
|
487 } else if (c == "rect") { |
759 | 488 this.parseRect(accu_matrix,coord, id, nodes[k]); |
719
1b6856fda760
Collect mbnames and mapping to object through mb_rt.mbnames
Thinker K.F. Li <thinker@branda.to>
parents:
718
diff
changeset
|
489 } else if (c == "image") { |
776
77b561bb7929
Implement new algorithm to calculate the origin of the SVG elemnts so that we can implement object resize without changing the position of the object.
wycc
parents:
759
diff
changeset
|
490 this.parseImage(accu_matrix,coord, id, nodes[k]); |
624 | 491 } |
492 } | |
776
77b561bb7929
Implement new algorithm to calculate the origin of the SVG elemnts so that we can implement object resize without changing the position of the object.
wycc
parents:
759
diff
changeset
|
493 if (root.center.x > coord.center.x) |
77b561bb7929
Implement new algorithm to calculate the origin of the SVG elemnts so that we can implement object resize without changing the position of the object.
wycc
parents:
759
diff
changeset
|
494 root.center.x = coord.center.x; |
77b561bb7929
Implement new algorithm to calculate the origin of the SVG elemnts so that we can implement object resize without changing the position of the object.
wycc
parents:
759
diff
changeset
|
495 if (root.center.y > coord.center.y) |
77b561bb7929
Implement new algorithm to calculate the origin of the SVG elemnts so that we can implement object resize without changing the position of the object.
wycc
parents:
759
diff
changeset
|
496 root.center.y = coord.center.y; |
719
1b6856fda760
Collect mbnames and mapping to object through mb_rt.mbnames
Thinker K.F. Li <thinker@branda.to>
parents:
718
diff
changeset
|
497 make_mbnames(this.mb_rt, n, coord); |
624 | 498 } |
499 | |
776
77b561bb7929
Implement new algorithm to calculate the origin of the SVG elemnts so that we can implement object resize without changing the position of the object.
wycc
parents:
759
diff
changeset
|
500 loadSVG.prototype.parseImage=function(accu,coord,id, n) |
646 | 501 { |
502 var ref = n.attr('href').value(); | |
776
77b561bb7929
Implement new algorithm to calculate the origin of the SVG elemnts so that we can implement object resize without changing the position of the object.
wycc
parents:
759
diff
changeset
|
503 var tcoord = this.mb_rt.coord_new(coord); |
77b561bb7929
Implement new algorithm to calculate the origin of the SVG elemnts so that we can implement object resize without changing the position of the object.
wycc
parents:
759
diff
changeset
|
504 var trans = n.attr('transform'); |
646 | 505 |
506 if (ref == null) return; | |
647 | 507 if (ref.substr(0,7) == "file://") { |
508 ref = ref.substring(7); | |
509 } else if (ref.substr(0,5)=="file:") { | |
510 ref = ref.substring(5); | |
511 } else { | |
646 | 512 return; |
513 } | |
514 var w; | |
515 var h; | |
776
77b561bb7929
Implement new algorithm to calculate the origin of the SVG elemnts so that we can implement object resize without changing the position of the object.
wycc
parents:
759
diff
changeset
|
516 var x,y,nx,ny; |
77b561bb7929
Implement new algorithm to calculate the origin of the SVG elemnts so that we can implement object resize without changing the position of the object.
wycc
parents:
759
diff
changeset
|
517 coord.center= new Object(); |
77b561bb7929
Implement new algorithm to calculate the origin of the SVG elemnts so that we can implement object resize without changing the position of the object.
wycc
parents:
759
diff
changeset
|
518 coord.center.x = 10000; |
77b561bb7929
Implement new algorithm to calculate the origin of the SVG elemnts so that we can implement object resize without changing the position of the object.
wycc
parents:
759
diff
changeset
|
519 coord.center.y = 10000; |
77b561bb7929
Implement new algorithm to calculate the origin of the SVG elemnts so that we can implement object resize without changing the position of the object.
wycc
parents:
759
diff
changeset
|
520 if (trans!=null) { |
77b561bb7929
Implement new algorithm to calculate the origin of the SVG elemnts so that we can implement object resize without changing the position of the object.
wycc
parents:
759
diff
changeset
|
521 parseTransform(coord, trans.value()); |
77b561bb7929
Implement new algorithm to calculate the origin of the SVG elemnts so that we can implement object resize without changing the position of the object.
wycc
parents:
759
diff
changeset
|
522 } |
646 | 523 |
524 w = n.attr("width"); | |
525 if (w == null) return; | |
759 | 526 w = parseFloat(w.value()); |
646 | 527 h = n.attr("height"); |
528 if (h == null) return; | |
759 | 529 h = parseFloat(h.value()); |
646 | 530 x = n.attr("x"); |
531 if (x == null) return; | |
759 | 532 x = parseFloat(x.value()); |
646 | 533 y = n.attr("y"); |
534 if (y == null) return; | |
759 | 535 y = parseFloat(y.value()); |
776
77b561bb7929
Implement new algorithm to calculate the origin of the SVG elemnts so that we can implement object resize without changing the position of the object.
wycc
parents:
759
diff
changeset
|
536 nx = tcoord[0]*x+tcoord[1]*y+tcoord[2]; |
77b561bb7929
Implement new algorithm to calculate the origin of the SVG elemnts so that we can implement object resize without changing the position of the object.
wycc
parents:
759
diff
changeset
|
537 ny = tcoord[3]*x+tcoord[4]*y+tcoord[5]; |
77b561bb7929
Implement new algorithm to calculate the origin of the SVG elemnts so that we can implement object resize without changing the position of the object.
wycc
parents:
759
diff
changeset
|
538 if (coord.center.x > nx) |
77b561bb7929
Implement new algorithm to calculate the origin of the SVG elemnts so that we can implement object resize without changing the position of the object.
wycc
parents:
759
diff
changeset
|
539 coord.center.x = nx; |
77b561bb7929
Implement new algorithm to calculate the origin of the SVG elemnts so that we can implement object resize without changing the position of the object.
wycc
parents:
759
diff
changeset
|
540 if (coord.center.y > ny) |
77b561bb7929
Implement new algorithm to calculate the origin of the SVG elemnts so that we can implement object resize without changing the position of the object.
wycc
parents:
759
diff
changeset
|
541 coord.center.y = ny; |
714 | 542 var img = this.mb_rt.image_new(x,y,w,h); |
646 | 543 var img_data = ldr.load(ref); |
714 | 544 var paint = this.mb_rt.paint_image_new(img_data); |
646 | 545 paint.fill(img); |
776
77b561bb7929
Implement new algorithm to calculate the origin of the SVG elemnts so that we can implement object resize without changing the position of the object.
wycc
parents:
759
diff
changeset
|
546 tcoord.add_shape(img); |
719
1b6856fda760
Collect mbnames and mapping to object through mb_rt.mbnames
Thinker K.F. Li <thinker@branda.to>
parents:
718
diff
changeset
|
547 make_mbnames(this.mb_rt, n, img); |
646 | 548 } |
624 | 549 |
750 | 550 loadSVG.prototype._MB_parseLinearGradient=function(root,n) |
551 { | |
552 var id = n.attr('id'); | |
553 var k; | |
554 var nodes = n.childNodes(); | |
555 | |
556 if (id == null) return; | |
557 var x1 = n.attr("x1"); | |
558 var y1 = n.attr("y1"); | |
559 var x2 = n.attr("x2"); | |
560 var y2 = n.attr("y2"); | |
561 var gr; | |
562 var color, opacity; | |
563 var stops; | |
564 var r,g,b; | |
565 stops=[]; | |
566 for(k in nodes) { | |
567 var ss = nodes[k]; | |
568 if (ss.name()=="stop") { | |
569 var style = ss.attr("style").value(); | |
570 var items = style.split(';'); | |
571 var off = parseInt(ss.attr('offset').value()); | |
572 color = 'black'; | |
573 opacity = 1; | |
574 for (i in items) { | |
575 it = items[i]; | |
576 var f = it.split(':'); | |
577 k = f[0]; | |
578 v = f[1]; | |
579 if (k == 'stop-color') { | |
580 color = v.substring(1); | |
581 if (v == 'white') { | |
582 r = 1; | |
583 g = 1; | |
584 b = 1; | |
585 } else if (v == 'black') { | |
586 r = 0; | |
587 g = 0; | |
588 b = 0; | |
589 } else { | |
590 r = parseInt(color.substring(0,2),16)/255.0; | |
591 g = parseInt(color.substring(2,4),16)/255.0; | |
592 b = parseInt(color.substring(4,6),16)/255.0; | |
593 } | |
594 } else if (k=='stop-opacity') { | |
595 opacity = parseFloat(v); | |
596 } | |
597 } | |
598 stops.push([off, r,g,b,opacity]); | |
599 } | |
600 } | |
601 var href = n.attr('href'); | |
602 if (href != null) { | |
603 href = href.value(); | |
604 pstops = this.stop_ref[href.substring(1)]; | |
605 stops = pstops.concat(stops); | |
606 } | |
607 id = id.value(); | |
608 this.stop_ref[id] = stops; | |
609 if (x1) | |
610 x1 = parseFloat(x1.value()); | |
611 if (x2) | |
612 x2 = parseFloat(x2.value()); | |
613 if (y1) | |
614 y1 = parseFloat(y1.value()); | |
615 if (y2) | |
616 y2 = parseFloat(y2.value()); | |
617 this.gradients[id] = [x1,y1,x2,y2]; | |
618 } | |
619 | |
718
0cd59ce76e67
Refactor loadSVG as a class
Thinker K.F. Li <thinker@branda.to>
parents:
717
diff
changeset
|
620 loadSVG.prototype.parseDefs=function(root,n) |
624 | 621 { |
622 var k; | |
623 var nodes = n.childNodes(); | |
624 | |
625 for(k in nodes) { | |
626 var name = nodes[k].name(); | |
627 if (name == "linearGradient") { | |
750 | 628 this._MB_parseLinearGradient(root,nodes[k]); |
624 | 629 } |
630 } | |
631 } | |
632 | |
633 |