Mercurial > MadButterfly
diff nodejs/svg.js @ 624:d45c928f6523
Add SVG parser sample code.
author | wycc |
---|---|
date | Thu, 15 Jul 2010 22:34:04 +0800 |
parents | |
children | 9f2080b68f8e |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/nodejs/svg.js Thu Jul 15 22:34:04 2010 +0800 @@ -0,0 +1,157 @@ +var libxml = require('libxmljs'); +var sys=require('sys'); +var mbfly = require("mbfly"); +var mb_rt = new mbfly.mb_rt(":0.0", 720,480); + +function MB_loadSVG(mb_rt,root,filename) { + var doc = libxml.parseXmlFile(filename); + var nodes = doc.root().childNodes(); + var coord = mb_rt.coord_new(root); + var k; + + for(k in nodes) { + var n = nodes[k].name(); + if (n == "defs") { + _MB_parseDefs(root,nodes[k]); + } else if (n == "g") { + _MB_parseGroup(root,'root_coord',nodes[k]); + } + } +} + +function getInteger(n,name) +{ + if (n == null) return 0; + var a = n.attr(name); + if (a==null) return 0; + return parseInt(a.value()); +} + +function parseStyle(n) +{ +} + +function _MB_parseTSpan(coord, n) +{ + var x = getInteger(n,'x'); + var y = getInteger(n,'y'); + var tcoord = mb_rt.coord_new(coord); + var paint = parseStyle(n); + var nodes = n.childNodes(); + var k; + + sys.puts(n.text()); + var obj = mb_rt.stext_new(n.text(),x,y); + var paint = mb_rt.paint_color_new(1,1,1,1); + var face=mb_rt.font_face_query("courier", 2, 100); + obj.set_style([[5,face,20]]); + paint.fill(obj); + tcoord.add_shape(obj); + for(k in nodes) { + var name = nodes[k].name(); + if (name == "tspan") { + _MB_parseTSpan(tcoord,nodes[k]); + } else { + } + } +} + +function _MB_parseText(coord,id, n) +{ + var x = getInteger(n,'x'); + var y = getInteger(n,'y'); + var tcoord = mb_rt.coord_new(coord); + var paint = parseStyle(n); + var nodes = n.childNodes(); + var k; + for(k in nodes) { + var n = nodes[k].name(); + if (n == "tspan") { + _MB_parseTSpan(tcoord,nodes[k]); + } else { + } + } + + +} + + +function parseTransform(coord, s) +{ + var off = s.indexOf('translate'); + if (off != -1) { + var ss = s.substring(off+9); + for(i=0;i<ss.length;i++) { + if (ss[i] == '(') break; + } + ss = ss.substring(i+1); + for(i=0;i<ss.length;i++) { + if (ss[i] == ')') { + ss = ss.substring(0,i); + break; + } + } + var f = ss.split(','); + var x,y; + x = parseInt(f[0]); + y = parseInt(f[1]); + coord[2] = x; + coord[5] = y; + } + off = s.indexOf('matrix'); + if (off != -1) { + sys.puts("matrix"); + } +} + +function _MB_parseRect(coord, id, n) +{ + +} + +function _MB_parseGroup(root, group_id, n) +{ + var k; + var nodes = n.childNodes(); + var coord = mb_rt.coord_new(root); + // Parse the transform and style here + var trans = n.attr('transform'); + if (trans!=null) { + parseTransform(coord, trans.value()); + } + + for(k in nodes) { + var n = nodes[k].name(); + var attr = nodes[k].attr('id'); + var id; + if (attr) { + id = attr.value(); + } + if (n == "g") { + _MB_parseGroup(coord, id, nodes[k]); + } else if (n == "text") { + _MB_parseText(coord, id, nodes[k]); + } else if (n == "rect") { + _MB_parseRect(coord, id, nodes[k]); + } + } + +} + + +function _MB_parseDefs(root,n) +{ + var k; + var nodes = n.childNodes(); + + for(k in nodes) { + var name = nodes[k].name(); + if (name == "linearGradient") { + //_MB_parseLinearGradient(root,nodes[k]); + } + } +} + + +MB_loadSVG(mb_rt,mb_rt.root,"test.svg"); +mb_rt.redraw_all();