Re: Interpréteur SVG dynamique (?)

Page principale

Répondre à ce message
Auteur: Florent Monnier
Date:  
À: guilde
Sujet: Re: Interpréteur SVG dynamique (?)
> Bonjour à tous,
>
> J'ai une petite question au sujet de SVG, ECMA, XML et compagnie...
>
> J'ai besoin de projeter du contenu graphique et "dynamique" sur grand
> écran... (Dynamique entre guillement puisqu'il s'agit plus d'un
> rafraichissement (1 à 5 secondes) : Positionnement, Graphiques etc... mais
> avec pas mal d'éléments...)
>
> J'ai donc pensé à SVG mais il me manque un interpreteur qui soit
> indépendant de la surface d'affichage et du système de fenêtrage.... Je ne
> sais pas non plus si l'interprétation sera suffisamment rapide...
>
> L'idée de manipuler la structure du fichier SVG (par libxml, libsvg,
> librsvg) me semble super pratique mais il existe peu être des
> implementations pour faire ça tout en mémoire qui seraient plus rapide ou
> plus appropriées au rendu sur écran ??
>
> (J'avais aussi pensé à X11 mais XML me semble tellement pratique...)
>
> Connaissez-vous des interpréteurs ou librairies de ce genre ??
>
> Toutes idées sous tous systèmes est la bienvenue :)


Peut-être pourrais-tu t'en sortir assez facilement de façon élégante et
évolutive par la suite en utilisant le widget SVG de GTK, GTK pouvant être
utilisé à partir du langage de script haut niveau de ton choix.

L'avantage d'une telle solution c'est que c'est pratiquement tout en un :
la rasterisation du SVG, son affichage graphique, possibilité d'interaction
avec l'utilisateur (appuyer sur la barre d'espace pour aller à la frame
suivante, ou bien utiliser le timer pour régler le temps d'affichage de
chaque frame, appuyer sur + ou - pour accélérer ou ralentir la cadence...)
et je crois que le widget fournit la possibilité de lire soit du SVG à partir
d'un fichier, soit contenu dans une variable (donc tout en mémoire)...

Dans les fichiers d'exemples du wraper GTK d'un langage de script j'ai trouvé
çà :
(je ne donne pas cet exemple pour l'utiliser absoluement, c'est juste pour
donner une idée, un aperçu de ce type de solution)


let zoom = ref None
let dpi = ref None
let fname = ref ""

let _ = 
  let cli_args = [
    ("-zoom", Arg.Float (fun v -> zoom := Some v), "zoom factor");
    ("-dpi" , Arg.Float (fun v -> dpi := Some v),  "") ]
  and usg_msg = 
    Printf.sprintf "usage: %s [options] <file>\n"
        (Filename.basename Sys.executable_name) in
  Arg.parse cli_args ((:=) fname) usg_msg;
  if not (Sys.file_exists !fname)
  then begin
    Arg.usage cli_args usg_msg;
    exit 2 
  end



let pb =
  let gz =
    Filename.check_suffix !fname ".svgz" ||
    Filename.check_suffix !fname ".svg.gz" in
  let size_cb = match !zoom with

| None -> None
| Some z -> Some (Rsvg.at_zoom z z) in

Rsvg.render_from_file ~gz ?dpi:!dpi ?size_cb !fname


let w = GWindow.window ~allow_grow:false ~title:!fname ()
let i = GMisc.image ~packing:w#add ()

let () =
i#set_pixbuf pb;
w#connect#destroy GMain.quit;
w#show();
GMain.main()

_____