%%
%% This file is part of the ViTE project.
%%
%% This software is governed by the CeCILL-A license under French law
%% and abiding by the rules of distribution of free software. You can
%% use, modify and/or redistribute the software under the terms of the
%% CeCILL-A license as circulated by CEA, CNRS and INRIA at the following
%% URL: "http://www.cecill.info".
%% 
%% As a counterpart to the access to the source code and rights to copy,
%% modify and redistribute granted by the license, users are provided
%% only with a limited warranty and the software's author, the holder of
%% the economic rights, and the successive licensors have only limited
%% liability.
%% 
%% In this respect, the user's attention is drawn to the risks associated
%% with loading, using, modifying and/or developing or reproducing the
%% software by the user in light of its specific status of free software,
%% that may mean that it is complicated to manipulate, and that also
%% therefore means that it is reserved for developers and experienced
%% professionals having in-depth computer knowledge. Users are therefore
%% encouraged to load and test the software's suitability as regards
%% their requirements in conditions enabling the security of their
%% systems and/or data to be ensured and, more generally, to use and
%% operate it in the same conditions as regards security.
%% 
%% The fact that you are presently reading this means that you have had
%% knowledge of the CeCILL-A license and that you accept its terms.
%%
%%
%% ViTE developers are:
%%
%%        - COULOMB Kevin
%%        - FAVERGE Mathieu
%%        - JAZEIX Johnny
%%        - LAGRASSE Olivier
%%        - MARCOUEILLE Jule
%%        - NOISETTE Pascal
%%        - REDONDY Arthur
%%        - VUCHENER Clément 
%%

\subsubsection{Introduction}
As render\_opengl, render\_svg must implements the drawing functions. It consists in outputting data in a svg file.
Data to be printed in the file, are buffered in differents \verb?std::ostringstream? buffer. Main elements are stored in \verb?_buffer?, flushed regularly by print(). In a svg viewer, the last element in the file are displayed in the front : the thinnest element must be printed as latest as possible : these are stored in \verb?_thin_element_buffer?. Counter are stored in \verb?_chronogramme?, and the scale is stored in \verb?_time_scale?.

\subsubsection{Required settings}
Render in svg may produce a high weight file due to numbered elements and default scale setting may hide some relevant events. That is why render\_svg allows user to set the width, heigth and accurracy of the render. These are set by default with the following static functions ~:

\begin{itemize}
\item Svg::set\_height\_factor(double)
\item Svg::set\_wide\_factor(double)
\item Svg::set\_interval(double, double)
\item Svg::set\_accuracy(double)
\item Svg::set\_scale\_frequency(double).
\end{itemize}

\subsubsection{Initialisation}
render\_svg opens the file specified by \verb?Svg::init(const char *path)? and output the header. Css embedded stylesheet reduces style attributes in each elements.

\subsubsection{drawing}

The procedure to implement functions such as \verb?draw_arrow?, \verb?draw_container? or \verb?draw_state? is the same.

render\_svg controls that the elements to be displayed are in the appropriate range, set by \verb?Svg::set_interval(double,double)?. In this release, the render reshapes itself too tall elements, but in the next version of Vite, the reshapement can be replaced by warnings (a correct draw\_trace function doesn't need this control).

Then, render\_svg computes positions and colors according to parameters. Any elements are widen by \_wide\_factor to convert time in ms to pixel, heights are grown by \_height\_factor for the same reason. 

Positions are translated to \_container\_width\_max : the left region occuppied by containers and MARGINTOP the upper region reserved for scale. Color are converted from floats to RGB.

Whenever a time selection is set, are translated to (-) \_start\_interval\_time (in ms, ie  -\_start\_interval\_time*\_wide\_factor pixel).

The computed position allows the call to basic shape painting functions such as 
\begin{verbatim}
Svg::rectangle(const char* name, Element_pos w, Element_pos h,
               Element_pos x1, Element_pos y1, unsigned int r,
               unsigned int g, unsigned int b)
\end{verbatim}

which corresponds to write in the svg output~:
\begin{verbatim}<rect class='name' title='name' width='w' height='h'
 x='x1' y='y1' fill='rgb(r,g,b)'/>
\end{verbatim}

\subsubsection{drawing counter}
Drawing counter is an automaton. See the schema for details. Svg paths are used to display counter.

\subsubsection{drawing scale}
Each element position corresponds to a time. The latest element indicates the total time. The total time multiplies by width factor equals the total width. The scale consists in drawing a time value regulary. 


\subsubsection{ending function}
\verb?Svg::end()? flushes left buffered informations, writes the scale, the cursor and ends the svg file. 
The cursor is only available on javascript enabled svg viewers (e.g. firefox).
