World: r3wp
[SVG Renderer] SVG rendering in Draw AGG
| newer | last |
| shadwolf 23-Jun-2005 [1x5] | My actual source code that render path and <g> bloack transformation matrix |
REBOL [
Title: "SVG Demo"
Owner: "Ashley G. Trüter"
Version: 0.0.1
Date: 21-Jun-2005
Purpose: "Loads and displays a resizeable SVG file."
History: {
0.0.1 Initial release
}
Notes: {
Tested on very simple SVG icons
Only a few basic styles / attributes / commands supported
Does not handle sizes in units other than pixels (e.g. pt, in, cm,
mm, etc)
SVG path has an optional close command, "z" ... AGG shape equivalent
auto-closes
load-svg function needs to be totally refactored / optimized ...
*sample only*
}
]
; The following commands are available for path data:
;
; M = moveto
; L = lineto
; H = horizontal lineto
; V = vertical lineto
; C = curveto
; S = smooth curveto
; Q = quadratic Belzier curve
; T = smooth quadratic Belzier curveto
; A = elliptical Arc
; Z = closepath
;print: none ; comment out this line to enable debug messages
load-svg: function [svg-file [file! string!] size [pair!]] [
id defs x y to-color to-byte draw-blk append-style svg-size scale-x
scale-y
][
xml: either string? svg-file [parse-xml svg-file] [
unless %.svg = suffix? svg-file [to error! "File has an invalid suffix!"]
parse-xml read svg-file
]
unless xml/3/1/1 = "svg" [to error! "Could not find SVG header!"]
;unless find ["id" "xmlns"] xml/3/1/2/1 [to error! "Could not find
ID header!"]
;unless xml/3/1/3/1/1 = "defs" [to error! "Could not find DEFS header!"]
id: xml/3/1/2
defs: xml/3/1/3
;
; --- Parse SVG id
;
svg-size: either find ["32pt" "48pt" "72pt"] select id "width" [
switch select id "width" [
"72pt" [120x120]
"48pt" [80x80]
"32pt" [60x60]
]
][
as-pair to integer! any [select id "width" "100"] to integer! any
[select id "height" "100"]
]
x: to integer! any [select id "x" "0"]
y: to integer! any [select id "y" "0"]
scale-x: size/x / svg-size/x
scale-y: size/y / svg-size/y
;
; --- Helper functions
;
to-color: func [s [string!]] [ ; converts a string in the form "#FFFFFF"
to a 4-byte tuple
to tuple! load rejoin ["#{" next s "00}"]
]
to-byte: func [s [string!]] [ ; converts a string with a value 0-1
to an inverted byte
255 - to integer! 255 * to decimal! s
]
;
; --- Parse SVG defs
;
draw-blk: copy []
append-style: function [
command [string!] blk [block!]
][
x xy pen-color fill-color line-width mode size radius shape
closed? matrix transf-command
][
xy: 0x0
size: 0x0
line-width: 1
matrice: make block! []
radius: none
transf-command: none
foreach [attr val] blk [
switch attr [
"transform" [print "tranform have been found"
;probe val halt
val: parse val "(),"
transf-command: first val
probe transf-command
switch transf-command [
"matrix" [
foreach word val [
if not find word "matrix"
[
insert tail matrice to-decimal word
]
]
]
]
]
"style" [
foreach [attr val] parse val ":;" [
switch/default attr [
"font-size" [ ]
"stroke" [
switch/default first val [
#"#" [pen-color: to-color val]
#"n" [pen-color: none]
][
print ["Unknown stroke:" val]
]
]
"stroke-width" [line-width: to decimal! val]
"fill" [
fill-color: switch/default first val [
#"#" [to-color val]
#"n" [none]
][
print ["Unknown fill value:" val]
none
]
]
"fill-rule" [
mode: switch/default val [
"evenodd" ['even-odd]
][
print ["Unknown fill-rule value:" val]
none
]
]
"stroke-opacity" [pen-color: any [pen-color 0.0.0.0] pen-color/4:
to-byte val]
"fill-opacity" [fill-color: any [fill-color 0.0.0.0] fill-color/4:
to-byte val]
"stroke-linejoin" [
insert tail draw-blk switch/default val [
"miter" [compose [line-join miter]]
"round" [compose [line-join round]]
"bevel" [compose [line-join bevel]]
][
print ["Unknown stroke-linejoin value:" val]
none
]
]
"stroke-linecap" [
insert tail draw-blk 'line-cap
insert tail draw-blk to word! val
]
][
print ["Unknown style:" attr]
]
]
]
"x" [xy/x: scale-x * val]
"y" [xy/y: scale-y * val]
"width" [size/x: scale-x * val]
"height" [size/y: scale-y * val]
"rx" [print "rx"]
"ry" [radius: to decimal! val]
"d" [
shape: copy []
x: none
closed?: false
foreach token load val [
switch/default token [
M [insert tail shape 'move]
C [insert tail shape 'curve]
L [insert tail shape 'line]
z [closed?: true]
][
unless number? token [print ["Unknown path command:" token]]
either x [insert tail shape as-pair x scale-y * token x: none] [x:
scale-x * token]
]
]
]
]
]
insert tail draw-blk compose [
pen (pen-color)
fill-pen (fill-color)
fill-rule (mode)
line-width (line-width * min scale-x scale-y)
]
switch command [
"rect" [
insert tail draw-blk compose [box (xy) (xy + size)]
if radius [insert tail draw-blk radius]
]
"path" [
unless closed? [print "Path closed"]
either transf-command <> none [
switch transf-command [
"matrix" [insert tail draw-blk compose/only [ (to-word transf-command)
(matrice) shape (shape) reset-matrix]]
]
][
insert tail draw-blk compose/only [shape (shape)]
]
]
"g" [ print "Write here how to handle G insertion to Draw block"
insert tail draw-blk probe compose/only [reset-matrix (to-word transf-command)
(matrice)]
]
]
]
probe defs
foreach blk defs [
switch first blk [
"rect" [append-style first blk second blk]
"path" [append-style first blk second blk]
"g" [
print "key word" probe first blk
print "matrix and style in G" probe second blk
append-style first blk second blk
;print "what to draw in G" probe third blk
foreach blk2 third blk [
probe blk2
switch first blk2[
"path" [append-style first blk2 second blk2]
]
]
]
]
]
probe draw-blk
draw-blk
]
view make face [
offset: 100x100
size: 200x200
action: request-file/filter/only "*.svg"
text: rejoin ["SVG Demo [" last split-path action "]"]
data: read action
color: white
effect: compose/only [draw (load-svg data size)]
edge: font: para: none
feel: make feel [
detect: func [face event] [
if event/type = 'resize [
insert clear face/effect/draw load-svg face/data face/size
show face
]
if event/type = 'close [quit]
]
]
options: [resize]
]
| |
AS reference take the file blender.svg from svg-demo.zip package maide by ashley | |
Vincent add some path rendering commands S Q T H A V | |
REBOL [
Title: "SVG Demo"
Owner: "Ashley G. Trüter"
Version: 0.0.1
Date: 21-Jun-2005
Purpose: "Loads and displays a resizeable SVG file."
History: {
0.0.1 Initial release
}
Notes: {
Tested on very simple SVG icons
Only a few basic styles / attributes / commands supported
Does not handle sizes in units other than pixels (e.g. pt, in, cm,
mm, etc)
SVG path has an optional close command, "z" ... AGG shape equivalent
auto-closes
load-svg function needs to be totally refactored / optimized ...
*sample only*
}
]
; The following commands are available for path data:
;
; M = moveto
; L = lineto
; H = horizontal lineto
; V = vertical lineto
; C = curveto
; S = smooth curveto
; Q = quadratic Belzier curve
; T = smooth quadratic Belzier curveto
; A = elliptical Arc
; Z = closepath
;print: none ; comment out this line to enable debug messages
load-svg: function [svg-file [file! string!] size [pair!]] [
id defs x y to-color to-byte draw-blk append-style svg-size scale-x
scale-y
][
xml: either string? svg-file [parse-xml svg-file] [
unless %.svg = suffix? svg-file [to error! "File has an invalid suffix!"]
parse-xml read svg-file
]
unless xml/3/1/1 = "svg" [to error! "Could not find SVG header!"]
;unless find ["id" "xmlns"] xml/3/1/2/1 [to error! "Could not find
ID header!"]
;unless xml/3/1/3/1/1 = "defs" [to error! "Could not find DEFS header!"]
id: xml/3/1/2
defs: xml/3/1/3
;
; --- Parse SVG id
;
svg-size: either find ["32pt" "48pt" "72pt"] select id "width" [
switch select id "width" [
"72pt" [120x120]
"48pt" [80x80]
"32pt" [60x60]
]
][
as-pair to integer! any [select id "width" "100"] to integer! any
[select id "height" "100"]
]
x: to integer! any [select id "x" "0"]
y: to integer! any [select id "y" "0"]
scale-x: size/x / svg-size/x
scale-y: size/y / svg-size/y
;
; --- Helper functions
;
to-color: func [s [string!]] [ ; converts a string in the form "#FFFFFF"
to a 4-byte tuple
to tuple! load rejoin ["#{" next s "00}"]
]
to-byte: func [s [string!]] [ ; converts a string with a value 0-1
to an inverted byte
255 - to integer! 255 * to decimal! s
]
;
; --- Parse SVG defs
;
draw-blk: copy []
append-style: function [
command [string!] blk [block!]
][
x xy pen-color fill-color line-width mode size radius shape
closed? matrix transf-command
][
xy: 0x0
size: 0x0
line-width: 1
matrice: make block! []
radius: none
transf-command: none
foreach [attr val] blk [
switch attr [
"transform" [print "tranform have been found"
;probe val halt
val: parse val "(),"
transf-command: first val
probe transf-command
switch transf-command [
"matrix" [
foreach word val [
if not find word "matrix"
[
insert tail matrice to-decimal word
]
]
]
]
]
"style" [
foreach [attr val] parse val ":;" [
switch/default attr [
"font-size" [ ]
"stroke" [
switch/default first val [
#"#" [pen-color: to-color val]
#"n" [pen-color: none]
][
print ["Unknown stroke:" val]
]
]
"stroke-width" [line-width: to decimal! val]
"fill" [
fill-color: switch/default first val [
#"#" [to-color val]
#"n" [none]
][
print ["Unknown fill value:" val]
none
]
]
"fill-rule" [
mode: switch/default val [
"evenodd" ['even-odd]
][
print ["Unknown fill-rule value:" val]
none
]
]
"stroke-opacity" [pen-color: any [pen-color 0.0.0.0] pen-color/4:
to-byte val]
"fill-opacity" [fill-color: any [fill-color 0.0.0.0] fill-color/4:
to-byte val]
"stroke-linejoin" [
insert tail draw-blk switch/default val [
"miter" [compose [line-join miter]]
"round" [compose [line-join round]]
"bevel" [compose [line-join bevel]]
][
print ["Unknown stroke-linejoin value:" val]
none
]
]
"stroke-linecap" [
insert tail draw-blk 'line-cap
insert tail draw-blk to word! val
]
][
print ["Unknown style:" attr]
]
]
]
"x" [xy/x: scale-x * val]
"y" [xy/y: scale-y * val]
"width" [size/x: scale-x * val]
"height" [size/y: scale-y * val]
"rx" [print "rx"]
"ry" [radius: to decimal! val]
"d" [
shape: copy []
x: none
closed?: false
foreach token load val [
switch/default token [
M [insert tail shape 'move]
C [insert tail shape 'curve]
S [insert tail shape 'curv]
L [insert tail shape 'line]
Q [insert tail shape 'qcurve]
T [insert tail shape 'qcurv]
z [closed?: true]
H [insert tail shape 'hline]
V [insert tail shape 'vline]
A [insert tail shape 'arc]
][
unless number? token [print ["Unknown path command:" token]]
either x [insert tail shape as-pair x scale-y * token x: none] [x:
scale-x * token]
]
]
]
]
]
insert tail draw-blk compose [
pen (pen-color)
fill-pen (fill-color)
fill-rule (mode)
line-width (line-width * min scale-x scale-y)
]
switch command [
"rect" [
insert tail draw-blk compose [box (xy) (xy + size)]
if radius [insert tail draw-blk radius]
]
"path" [
unless closed? [print "Path closed"]
either transf-command <> none [
switch transf-command [
"matrix" [insert tail draw-blk compose/only [ (to-word transf-command)
(matrice) shape (shape) reset-matrix]]
]
][
insert tail draw-blk compose/only [shape (shape)]
]
]
"g" [ print "Write here how to handle G insertion to Draw block"
insert tail draw-blk probe compose/only [reset-matrix (to-word transf-command)
(matrice)]
]
]
]
probe defs
foreach blk defs [
switch first blk [
"rect" [append-style first blk second blk]
"path" [append-style first blk second blk]
"g" [
print "key word" probe first blk
print "matrix and style in G" probe second blk
append-style first blk second blk
;print "what to draw in G" probe third blk
foreach blk2 third blk [
probe blk2
switch first blk2[
"path" [append-style first blk2 second blk2]
]
]
]
]
]
probe draw-blk
draw-blk
]
view make face [
offset: 100x100
size: 200x200
action: request-file/filter/only "*.svg"
text: rejoin ["SVG Demo [" last split-path action "]"]
data: read action
color: white
effect: compose/only [draw (load-svg data size)]
edge: font: para: none
feel: make feel [
detect: func [face event] [
if event/type = 'resize [
insert clear face/effect/draw load-svg face/data face/size
show face
]
if event/type = 'close [quit]
]
]
options: [resize]
]
| |
| Vincent 23-Jun-2005 [6] | Oops too fast:
commands Q S T -> OK
commands H &t V -> need to add (just before "foreach token load val
[") :
if all [x not number? token] [
insert tail shape x * either token = 'V [scale-y][scale-x]
x: none
]
command A -> not yet solved sign issues
|
| shadwolf 23-Jun-2005 [7x8] | REBOL [
Title: "SVG Demo"
Owner: "Ashley G. Trüter"
Version: 0.0.1
Date: 21-Jun-2005
Purpose: "Loads and displays a resizeable SVG file."
History: {
0.0.1 Initial release
}
Notes: {
Tested on very simple SVG icons
Only a few basic styles / attributes / commands supported
Does not handle sizes in units other than pixels (e.g. pt, in, cm,
mm, etc)
SVG path has an optional close command, "z" ... AGG shape equivalent
auto-closes
load-svg function needs to be totally refactored / optimized ...
*sample only*
}
]
; The following commands are available for path data:
;
; M = moveto
; L = lineto
; H = horizontal lineto
; V = vertical lineto
; C = curveto
; S = smooth curveto
; Q = quadratic Belzier curve
; T = smooth quadratic Belzier curveto
; A = elliptical Arc
; Z = closepath
;print: none ; comment out this line to enable debug messages
load-svg: function [svg-file [file! string!] size [pair!]] [
id defs x y to-color to-byte draw-blk append-style svg-size scale-x
scale-y
][
xml: either string? svg-file [parse-xml svg-file] [
unless %.svg = suffix? svg-file [to error! "File has an invalid suffix!"]
parse-xml read svg-file
]
unless xml/3/1/1 = "svg" [to error! "Could not find SVG header!"]
;unless find ["id" "xmlns"] xml/3/1/2/1 [to error! "Could not find
ID header!"]
;unless xml/3/1/3/1/1 = "defs" [to error! "Could not find DEFS header!"]
id: xml/3/1/2
defs: xml/3/1/3
;
; --- Parse SVG id
;
svg-size: either find ["32pt" "48pt" "72pt"] select id "width" [
switch select id "width" [
"72pt" [120x120]
"48pt" [80x80]
"32pt" [60x60]
]
][
as-pair to integer! any [select id "width" "100"] to integer! any
[select id "height" "100"]
]
x: to integer! any [select id "x" "0"]
y: to integer! any [select id "y" "0"]
scale-x: size/x / svg-size/x
scale-y: size/y / svg-size/y
;
; --- Helper functions
;
to-color: func [s [string!]] [ ; converts a string in the form "#FFFFFF"
to a 4-byte tuple
to tuple! load rejoin ["#{" next s "00}"]
]
to-byte: func [s [string!]] [ ; converts a string with a value 0-1
to an inverted byte
255 - to integer! 255 * to decimal! s
]
;
; --- Parse SVG defs
;
draw-blk: copy []
append-style: function [
command [string!] blk [block!]
][
x xy pen-color fill-color line-width mode size radius shape
closed? matrix transf-command
][
xy: 0x0
size: 0x0
line-width: 1
matrice: make block! []
radius: none
transf-command: none
foreach [attr val] blk [
switch attr [
"transform" [print "tranform have been found"
;probe val halt
val: parse val "(),"
transf-command: first val
probe transf-command
switch transf-command [
"matrix" [
foreach word val [
if not find word "matrix"
[
insert tail matrice to-decimal word
]
]
]
]
]
"style" [
foreach [attr val] parse val ":;" [
switch/default attr [
"font-size" [ ]
"stroke" [
switch/default first val [
#"#" [pen-color: to-color val]
#"n" [pen-color: none]
][
print ["Unknown stroke:" val]
]
]
"stroke-width" [line-width: to decimal! val]
"fill" [
fill-color: switch/default first val [
#"#" [to-color val]
#"n" [none]
][
print ["Unknown fill value:" val]
none
]
]
"fill-rule" [
mode: switch/default val [
"evenodd" ['even-odd]
][
print ["Unknown fill-rule value:" val]
none
]
]
"stroke-opacity" [pen-color: any [pen-color 0.0.0.0] pen-color/4:
to-byte val]
"fill-opacity" [fill-color: any [fill-color 0.0.0.0] fill-color/4:
to-byte val]
"stroke-linejoin" [
insert tail draw-blk switch/default val [
"miter" [compose [line-join miter]]
"round" [compose [line-join round]]
"bevel" [compose [line-join bevel]]
][
print ["Unknown stroke-linejoin value:" val]
none
]
]
"stroke-linecap" [
insert tail draw-blk 'line-cap
insert tail draw-blk to word! val
]
][
print ["Unknown style:" attr]
]
]
]
"x" [xy/x: scale-x * val]
"y" [xy/y: scale-y * val]
"width" [size/x: scale-x * val]
"height" [size/y: scale-y * val]
"rx" [print "rx"]
"ry" [radius: to decimal! val]
"d" [
shape: copy []
x: none
closed?: false
if all [x not number? token] [
insert tail shape x * either token = 'V [scale-y][scale-x]
x: none
]
foreach token load val [
switch/default token [
M [insert tail shape 'move]
C [insert tail shape 'curve]
S [insert tail shape 'curv]
L [insert tail shape 'line]
Q [insert tail shape 'qcurve]
T [insert tail shape 'qcurv]
z [closed?: true]
H [insert tail shape 'hline]
V [insert tail shape 'vline]
A [insert tail shape 'arc]
][
unless number? token [print ["Unknown path command:" token]]
either x [insert tail shape as-pair x scale-y * token x: none] [x:
scale-x * token]
]
]
]
]
]
insert tail draw-blk compose [
pen (pen-color)
fill-pen (fill-color)
fill-rule (mode)
line-width (line-width * min scale-x scale-y)
]
switch command [
"rect" [
insert tail draw-blk compose [box (xy) (xy + size)]
if radius [insert tail draw-blk radius]
]
"path" [
unless closed? [print "Path closed"]
either transf-command <> none [
switch transf-command [
"matrix" [insert tail draw-blk compose/only [ (to-word transf-command)
(matrice) shape (shape) reset-matrix]]
]
][
insert tail draw-blk compose/only [shape (shape)]
]
]
"g" [ print "Write here how to handle G insertion to Draw block"
insert tail draw-blk probe compose/only [reset-matrix (to-word transf-command)
(matrice)]
]
]
]
probe defs
foreach blk defs [
switch first blk [
"rect" [append-style first blk second blk]
"path" [append-style first blk second blk]
"g" [
print "key word" probe first blk
print "matrix and style in G" probe second blk
append-style first blk second blk
;print "what to draw in G" probe third blk
foreach blk2 third blk [
probe blk2
switch first blk2[
"path" [append-style first blk2 second blk2]
]
]
]
]
]
probe draw-blk
draw-blk
]
view make face [
offset: 100x100
size: 200x200
action: request-file/filter/only "*.svg"
text: rejoin ["SVG Demo [" last split-path action "]"]
data: read action
color: white
effect: compose/only [draw (load-svg data size)]
edge: font: para: none
feel: make feel [
detect: func [face event] [
if event/type = 'resize [
insert clear face/effect/draw load-svg face/data face/size
show face
]
if event/type = 'close [quit]
]
]
options: [resize]
]
|
corrected thank you vincent ;) | |
my FTP tis back from death so here is my last script http://shadwolf.free.fr/svg-demo-shadwolf.r | |
I allways use as reference script for my work the blender.svg file provided in ashley's archive svg-demo.zip | |
so my version of the script supports in the SVG <g> block with in this block header transform matrix and in block <G> path with or without in it tranform matrix. I have a little problem with this point. Then I add the support for path d field coded in the format of INKSCAPE SVG PLAIN TEXT (the SVG light weight version available under inkscape ) | |
New D field for "path" flag processing and translation made by Vincent | |
support MLHVCSQT commands | |
can be found on http://shadwolf.free.fr/svg-demo-shadwolf.r | |
| Ashley 23-Jun-2005 [15] | Thanks for taking this up and running with it guys, you're making great progress (far better than I could have). Feel free to take ownership of the code and refactor it as needed. Two minor improvements are: unless closed? [insert tail shape reduce ['move 0x0]] which is Gabriele's fix to the shape close problem, and: feel: make feel [ redraw: func [face act pos] [ if act = 'draw [insert clear face/effect/draw load-svg face/data face/size] ] ] which cleans the sample feel code up a bit. I'd also remove "VID" from the title of this group as DRAW AGG is tied to View. ;) |
| shadwolf 23-Jun-2005 [16x3] | okay I have imporved matrix support it seems to be good for scale-x: 1 scale-y: 1 if cyphre can see the code of the matrix gestion and makes some fix optimisation it could allow us to advance more with the rest of the SVG word format |
groupe title rename done | |
matrix intervention of cyphre could be very educationnal and help me a lot to see what I'm messing in my code | |
| Vincent 23-Jun-2005 [19] | Thanks Ashley: there's still a lot of work to do - as SVG is quite flexible |
| shadwolf 23-Jun-2005 [20x2] | yes it' quite a nightmare for a AGG newbie as I'm ... |
for example the implementation of the LIneargradient I dont have any idea about how to translate it to AGG | |
| DideC 24-Jun-2005 [22] | I suppose 'fill-pen is what you need. Can render gradient in many way. |
| shadwolf 24-Jun-2005 [23x8] | yes DideC you are right the most problem will be to create tht tree structure to store all the LinearGradient définition and there childs then retrieve the approprieted informations |
drawing primitives have a xlink:href field that point to the appropiate main lineargradient (countainer) | |
I'm working hard on the translation of the linearGradient informations from SVG files to AGG | |
and I have some asks | |
how to apply a matrix tranformation only over a grendient definition ? | |
I think I handle web the creation of the rebol list of linear gradient | |
if you wants to write the "in" AGG/draw code that is based on my rebol linear gradient list there is the code and a sample file from InkScape | |
http://shadwolf.free.fr/svg-demo02.zip | |
| Ashley 25-Jun-2005 [31] | Noticed you found some conversion numbers (where from?? ;) ), so here's a simple func to make use of them: to-unit: func [s [string!]] [ switch/default skip tail s -2 [ "pt" [1.25 * to decimal! copy/part s -2 + length? s] "pc" [15 * to decimal! copy/part s -2 + length? s] "mm" [3.543307 * to decimal! copy/part s -2 + length? s] "cm" [35.43307 * to decimal! copy/part s -2 + length? s] "in" [90 * to decimal! copy/part s -2 + length? s] "px" [to decimal! copy/part s -2 + length? s] ][ to decimal! s ] ] |
| shadwolf 26-Jun-2005 [32x11] | Ashley yes !!! You noticed right I found them deep hided in the SVG format documentation on W3C dedicated pages to SVG format .... |
I copy past the conversion units into the script becaus I know that could be usefull but AS I was working on lineargradient and as it's a complicated part of the format SVG I had no time to make a conversion algorithm I glad to see that you make it :) | |
the page where I found the conversion rules | |
http://www.w3.org/TR/SVG/coords.html | |
see chapter 7.10 | |
I read most of the documentation but then make the link to AGG data structure is rather difficult | |
linearGradient for example are splitted the first one contain the coordonates systeme and tranfromation informations the second one countains the colors involved and their order in the gradient | |
so you avac primitive(fill:url) ->LinearGRadient (coords) -> LinearGradient (colors order) | |
where do I plug the to-unit function ? | |
in svg-size | |
?? | |
| Ashley 26-Jun-2005 [43] | Yes, to-unit is called from svg-size; and also from "path d", stroke-width, fill-width, etc ... probably anywhere in SVG where we "expect" an integer or decimal! ;) |
| shadwolf 29-Jun-2005 [44] | okay good stuf in it Vincent and I are planning to use the xml-to-object.r script from Brian Wisti to enbetter and make a more sophisticate support for our actual work upon SVG parsing translation and rendering into a VID window |
| BrianW 29-Jun-2005 [45] | shadwolf, I'm not the author - just a guy who made it available in the Rebol library :-) |
| shadwolf 29-Jun-2005 [46x3] | it says author hahah ;) |
opkay so we are planning on the opportinity to use a REBOL tree object! structure to represente SVG datas :) | |
this in the goal to improve drastically the performance and be more performant on some key issues like recursivity etc... | |
| shadwolf 30-Jun-2005 [49x2] | I make a base code but now I have to find a good code to exploit the relevent datas from the object tree |
this means to interogate the content of the objet a gived level | |
| newer | last |







