ai miei genitori, ai miei nonni e ad Andy K.

Transcript

ai miei genitori, ai miei nonni e ad Andy K.
ai miei genitori, ai miei nonni e ad Andy K.
ii
Indice
1 Introduzione
1
2 Contesto: what the world needs now...
11
2.1
Le immagini nel Web . . . . . . . . . . . . . . . . . . . . . . . . . .
11
2.2
I linguaggi coinvolti . . . . . . . . . . . . . . . . . . . . . . . . . . .
13
2.2.1
SVG: breve descrizione strutturale . . . . . . . . . . . . . . .
13
2.2.2
VML: breve descrizione strutturale . . . . . . . . . . . . . .
16
2.2.3
Confronto tra SVG e VML . . . . . . . . . . . . . . . . . . .
19
2.2.4
GIF . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
22
Applicativi esistenti . . . . . . . . . . . . . . . . . . . . . . . . . . .
22
2.3.1
Viewer . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
23
2.3.2
Editor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
25
2.3.3
Convertitori . . . . . . . . . . . . . . . . . . . . . . . . . . .
29
SVGmaker e VMLmaker . . . . . . . . . . . . . . . . . . . .
29
CR2V . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
30
KVEC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
31
CSIRO SVG Toolkit . . . . . . . . . . . . . . . . . . . . . .
31
Batik SVG toolkit . . . . . . . . . . . . . . . . . . . . . . .
32
2.4
Applicazioni di un formato grafico vettoriale . . . . . . . . . . . . . .
34
2.5
Perché realizzare un nuovo convertitore . . . . . . . . . . . . . . . .
36
2.5.1
Conversione VML – SVG . . . . . . . . . . . . . . . . . . .
36
2.5.2
Conversione in GIF . . . . . . . . . . . . . . . . . . . . . . .
38
Conclusioni . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
39
2.3
2.3.4
2.6
iii
iv
3 Descrizione ad alto livello: analyze this
3.1
Conversione tra SVG e VML . . . . . . . . . . . . . . . . . . . . . .
41
3.1.1
Metodo di traduzione: utilizzo di XSLT . . . . . . . . . . . .
42
3.1.2
Come funziona in pratica . . . . . . . . . . . . . . . . . . . .
43
3.1.3
Metodologia delle conversioni . . . . . . . . . . . . . . . . .
44
3.1.4
Da SVG a VML . . . . . . . . . . . . . . . . . . . . . . . .
46
Conversione di base . . . . . . . . . . . . . . . . . . . . . .
46
Punti “sottili” . . . . . . . . . . . . . . . . . . . . . . . . . .
46
Esempi . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
53
Problemi e limiti . . . . . . . . . . . . . . . . . . . . . . . .
56
Da VML a SVG . . . . . . . . . . . . . . . . . . . . . . . .
59
Conversione di base . . . . . . . . . . . . . . . . . . . . . .
59
Punti “sottili” . . . . . . . . . . . . . . . . . . . . . . . . . .
59
Esempi . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
63
Problemi e limiti . . . . . . . . . . . . . . . . . . . . . . . .
66
Conversione da SVG e VML a GIF . . . . . . . . . . . . . . . . . . .
68
3.2.1
Realizzazione . . . . . . . . . . . . . . . . . . . . . . . . . .
68
3.2.2
Metodo di gestione dei documenti . . . . . . . . . . . . . . .
68
3.2.3
Punti “sottili” . . . . . . . . . . . . . . . . . . . . . . . . . .
69
3.2.4
Esempi . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
72
3.2.5
Risultati e problemi . . . . . . . . . . . . . . . . . . . . . . .
75
Conversione da GIF a SVG e VML . . . . . . . . . . . . . . . . . . .
76
3.1.5
3.2
3.3
4 Descrizione a basso livello: into the code
4.1
41
77
Da SVG a VML . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
77
4.1.1
Elementi . . . . . . . . . . . . . . . . . . . . . . . . . . . .
78
4.1.2
Testi (elementi text, tspan, tref e textpath) . . . . .
85
4.1.3
Trasformazioni (attributo transform) . . . . . . . . . . . . . .
86
4.1.4
Altri attributi . . . . . . . . . . . . . . . . . . . . . . . . . .
88
4.1.5
Caratteristiche non traducibili . . . . . . . . . . . . . . . . .
90
4.1.6
Caratteristiche non tradotte . . . . . . . . . . . . . . . . . . .
91
INDICE
4.2
4.3
4.4
v
Da VML a SVG . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
93
4.2.1
Elementi . . . . . . . . . . . . . . . . . . . . . . . . . . . .
94
4.2.2
shape – shapetype . . . . . . . . . . . . . . . . . . . . .
99
4.2.3
Gestione defs . . . . . . . . . . . . . . . . . . . . . . . . . 100
4.2.4
Trasformazioni . . . . . . . . . . . . . . . . . . . . . . . . . 102
4.2.5
Altri attributi . . . . . . . . . . . . . . . . . . . . . . . . . . 102
4.2.6
Caratteristiche non traducibili . . . . . . . . . . . . . . . . . 104
4.2.7
Caratteristiche non tradotte . . . . . . . . . . . . . . . . . . . 104
Da SVG e VML a GIF . . . . . . . . . . . . . . . . . . . . . . . . . 105
4.3.1
Funzioni per le immagini di PHP
. . . . . . . . . . . . . . . 105
4.3.2
Metodo di traduzione . . . . . . . . . . . . . . . . . . . . . . 106
4.3.3
Traduzione da SVG a GIF . . . . . . . . . . . . . . . . . . . 107
4.3.4
Traduzione da VML a GIF . . . . . . . . . . . . . . . . . . . 112
4.3.5
Caratteristiche non traducibili . . . . . . . . . . . . . . . . . 116
4.3.6
Caratteristiche non tradotte . . . . . . . . . . . . . . . . . . . 117
Da GIF a SVG e VML . . . . . . . . . . . . . . . . . . . . . . . . . 117
5 Conclusioni
119
Bibliografia
123
vi
Capitolo 1
Introduzione
Con questa tesi si è voluto realizzare un convertitore che permetta di tradurre documenti SVG in documenti VML e viceversa; inoltre questi documenti possono venire
tradotti in un formato di immagini bitmap, quale GIF.
La figura seguente mostra uno schema delle conversioni che sono state realizzate,
specificandone gli strumenti utilizzati.
Figura 1.1: Schema della conversione
1
2
SVG, Scalable Vector Graphics [FerJunJac03], è un linguaggio standard del W3C
basato su XML [BPSMY04], per rappresentare figure bidimensionali in grafica vettoriale.
VML, Vector Markup Language [MatLeeDis98], è anch’esso un linguaggio, proposto al W3C, per rappresentare figure bidimensionali in grafica vettoriale, basato su
XML.
GIF, Graphic Interchange Format, è un formato raster, cioè rappresenta un’immagine tramite una matrice che associa punti (pixel) e colori.
Analizziamo brevemente le caratteristiche dei diversi linguaggi, procedendo poi ad
una loro comparazione.
Il linguaggio SVG è nato dall’esigenza di creare uno standard comune per la rappresentazione di immagini in grafica vettoriale per il web. È stato sviluppato dal W3C,
World Wide Web Consortium, a partire dal 2001 e la versione 1.1, quella presa in considerazione per la traduzione, è diventata una Recommendation il 14 Gennaio 2003.
In seguito sono stati sviluppati dei profili per la rappresentazione di immagini su dispositivi mobili, SVG Mobile Profile [Cap03], e per l’ottimizzazione della stampa di
immagini, SVG Print [Dan03], che esulano da questa dissertazione. Attualmente si sta
lavorando alla versione 1.2, Working Draft dal 18 Marzo 2004 [Jac04].
SVG permette di gestire tre tipi di oggetti grafici:
• figure in grafica vettoriale (linee congiunte tramite rette o curve);
• immagini;
• testi.
È in sintassi XML, quindi leggibile e gestibile tramite un semplice editor di testo,
è un formato aperto, non proprietario, e si integra con gli altri standard del W3C, quali
per esempio XSLT (eXtensible Stylesheet Language Transformations) e CSS (Cascading Style Sheet). Permette di realizzare figure interattive (per cui vengono compiute
determinate azioni in base a determinati eventi, come per esempio un link ipertestuale
Capitolo 1. Introduzione
3
associato ad una figura) e dinamiche (si possono gestire delle animazioni, tramite opportuni elementi o con degli script). A quest’ultimo proposito bisogna sottolineare
che tramite il DOM, Document Object Model, è possibile interagire con linguaggi di
scripting, come JavaScript.
Come suggerisce il nome, SVG è un formato scalabile, in un duplice senso. Essendo vettoriale (ogni oggetto grafico e rappresentato da una funzione matematica e
non da una griglia di pixel) è possibile scalare e zoomare tutto o una parte del documento senza perdita di qualità. Inoltre è scalabile poiché è possibile gestirlo con una
grande varietà di applicazioni, il cui numero è in continua espansione.
Un ulteriore aspetto di rilevante importanza, riguarda l’accessibilità di questo formato. Mediante particolari elementi è possibile esprimere una descrizione di ogni parte
del documento rendendolo leggibile anche ad utenti disabili. Inoltre è possibile fare
selezioni e ricerca, nonché indicizzazioni dei testi presenti nei documenti SVG.
Per rappresentare degli oggetti SVG, ci sono vari modi. Si può creare un documento SVG stand-alone che verrà visualizzato da un browser. In alternativa si può inserire
una porzione di SVG in un documento HTML, tramite vari elementi, quali image o object, oppure tramite applet. Tramite HTML ci si può inoltre riferire ad un documento
SVG mediante l’elemento a usato per creare un link ipertestuale.
Come accennato in precedenza, essendo SVG un formato testuale è possibile scrivere documenti tramite un semplice editor. Ovviamente non è spesso conveniente,
specie per disegni complessi. Sono disponibili numerosi applicativi per ottenere ottime immagini SVG, in una maniera semplice e potente, tramite interfacce WYSIWYG. Per quanto riguarda la visualizzazione, attualmente si trovano pochi browser
nativi, un esempio è Amaya, il web browser del W3C. La maggior parte degli altri
richiede l’aggiunta di un opportuno plug-in.
SVG, come gli altri linguaggi XML per esprimere oggetti grafici, si contrappone
ai formati raster, ampiamente utilizzati per rappresentare le immagini nel web. Questi
ultimi utilizzano una corrispondenza pixel–colori per rappresentare tutti i punti dell’immagine ed essendo formati non leggibili sono risultati dei corpi estranei all’interno
4
del mondo human readable del web, in cui ogni documento è leggibile e facilmente
interpretabile. Inoltre i nuovi formati grafici XML hanno portato ulteriori benefici
che vanno dalla dimensione ridotta dei file, facilitando il download, alla possibilità di
scalare l’immagine senza perdita di qualità ed infine si integrano con altri standard:
è possibile quindi modificare, trasformare, generare oggetti grafici mediante semplici
applicazioni.
VML è stato il formato vettoriale, basato su XML, proposto da Microsoft e Macromedia al W3C, nel 1998. È usato per includere immagini all’interno di documenti HTML, specificando un opportuno namespace, attraverso il quale l’applicazione
visualizzatrice (il browser) è in grado di generare la figura.
Con questo linguaggio è possibile definire: oggetti in grafica vettoriale (figure definite mediante la congiunzione di linee, rette o curve), inclusione di immagini raster,
testi in sintassi HTML.
Essendo un’applicazione di XML, questo formato presenta molti vantaggi:
• è completamente leggibile ed editabile, anche mediante un semplice text-editor;
• si integra con HTML;
• è compatibile con numerosi standard, quali DOM e CSS. A questo proposito, va
sottolineato che utilizza il modello di posizionamento di CSS2.
VML non è mai diventato uno standard del W3C, è rimasto una Submission; per
questo non esistono molte applicazioni in grado di supportarlo. Essendo stato proposto principalmente da Microsoft è utilizzabile in molti suoi prodotti. Attualmente, e
probabilmente sarà cosı̀ per sempre, solamente Internet Explorer (dalla versione 5.0)
è in grado di visualizzare immagini VML, disponendo di un programma per il render.
Oltre a questo è possibile ottenere VML a partire da documenti definiti mediante le
applicazioni di Office 2000, come per esempio Power Point.
SVG è nato basandosi sugli altri formati vettoriali proposti al W3C, come VML
e PGML (Precision Graphics Markup Language), un formato proposto tra gli altri da
Capitolo 1. Introduzione
5
Adobe e ormai abbandonato. Ha estratto il meglio da ognuno di essi. Quindi, non deve
sembrare strano se SVG è un formato più completo.
SVG ammette un maggior numero di caratteristiche ed effetti, come le animazioni
o particolari filtri grafici. Consente una trattazione approfondita dei testi, permettendo la definizione della formattazione e del layout di specifiche porzioni. Inoltre è
supportato da un numero maggiore di sistemi e di applicazioni.
Va segnalato che in alcuni ambiti (sistemi Windows e applicazioni Microsoft) VML
gode ancora di alcuni vantaggi. Ha un supporto diretto nel web browser, senza la necessità di plug-in, e mediante Office è possibile salvare i grafici direttamente in formato
VML. Un ulteriore beneficio riguarda la gestione dei testi espressi in sintassi HTML:
è possibile effettuare degli “a capo” in maniera automatica; mentre in SVG devono
essere effettuati tramite opportuni posizionamenti.
GIF, è un formato per rappresentare immagini tramite bitmap. Questo significa
che le immagini sono rappresentate mediante una corrispondenza tra colori e pixel.
Formati di questo tipo, detti raster, offrono alcuni vantaggi nella rappresentazione
delle figure:
• offrono una buona resa dell’immagine, quando è rappresentata nelle sue dimensioni effettive;
• sono sostanzialmente indipendenti dal sistema, possono essere quindi visualizzato da ogni tipo di browser;
• utilizzano algoritmi di compressione per ridurre la loro dimensione;
• offrono un’ottima rappresentazione per immagini complesse, come ad esempio
le foto digitali.
Tuttavia se viene modificata la risoluzione dell’immagine, per esempio ingrandendola, la qualità appare proporzionalmente deteriorata.
Contrapposto a questo tipo di formato ci sono le immagini in grafica vettoriale; ad
esempio lo sono i formati SVG e VML, visti in precedenza. La differenza riguarda il
6
modo in cui vengono memorizzate le informazioni: associazione pixel–colori da una
parte, rappresentazione mediante funzioni matematiche dall’altra.
Utilizzare una rappresentazione in grafica vettoriale mediante linguaggi in sintassi
XML comporta notevoli vantaggi:
• scalabilità: si può ingrandire o rimpicciolire l’immagine, adattarla quindi alle
esigenze dell’utente senza perdita di qualità;
• dimensione ridotta: essendo rappresentata mediante testo, la dimensione dell’immagine risulta molto ridotta, il che comporta un risparmio di bandwidth,
quindi un aumento di velocità per effettuarne il caricamento;
• interoperabilità: essendo linguaggi in sintassi XML, quindi open standard,
possono interagire con gli altri formati standard. Questo tra l’altro comporta:
– utilizzo di CSS: si può specificare lo stile per la rappresentazione di gruppi di oggetti grafici, permettendone la variazione in un modo semplice,
cambiando le caratteristiche del CSS;
– utilizzo del DOM: tramite il Document Object Model, è possibile ottenere un comportamento dinamico ed interattivo, mediante l’utilizzo di
un linguaggio di scripting, quale JavaScript;
• generazione on-the-fly:
– è possibile ottenere immagini in sintassi SVG (o VML) a partire da altri
dati, come documenti XML o dati di un database, mediante l’adozione di
semplici fogli di stile XSLT, il che permette di generare le immagini solo
su richiesta ed in base alle proprie esigenze. Per esempio da uno stesso
documento XML si può ottenere un grafico a torta oppure un istogramma.
– è molto più semplice generare immagini rispetto ai formati raster; inoltre una volta generate, queste si adattano alle varie esigenze (risoluzione,
ecc.), mentre le figure bitmap devono essere rigenerate per ogni esigenza
dimensionale.
Capitolo 1. Introduzione
7
• editabilità semplificata: è possibile modificare l’immagine mediante un semplice text editor e senza particolari conoscenze; le modifiche sono inoltre molto
più semplici da effettuare: ad esempio per cambiare la dimensione di un quadrato basta modificare due numeri, mentre con i formati raster bisogna rigenerare
completamente l’immagine;
• gestione indipendente del testo: con i formati vettoriali, il testo è effettivamente testo, è editabile e ricercabile all’interno del codice, ed è effettivamente
selezionabile anche nell’immagine visualizzata;
• accessibilità: mediante l’utilizzo di opportuni elementi è possibile ottenere rappresentazioni alternative delle immagine, consentendone la fruizione anche ad
utenti con particolari deficit sensoriali;
• compatibilità con immagini raster: come ultimo aspetto, bisogna segnalare la
possibilità di includere immagini raster all’interno di questi formati, mentre il
contrario non è possibile.
Di contro si segnalano alcuni problemi derivati dall’uso di immagini vettoriali:
• la grafica vettoriale richiede un’elaborazione prima di poter essere visualizzata;
d’altra parte vista la dimensione ridotta è possibile che termini prima il processo
di elaborazione rispetto al caricamento (download) dell’immagine raster;
• immagini complesse, quali foto digitali, richiedono una rappresentazione molto
complessa utilizzando i vettori, e di norma questa rappresentazione occuperà
più spazio rispetto alla corrispondente immagine raster; tuttavia in questi casi
la scelta più conveniente è quella di includere la figura bitmap all’interno del
documento SVG (o VML);
• allo stato dell’arte SVG non ha un supporto completo da parte dei web browser
(ancor meno VML); la maggior parte di essi richiede l’aggiunta di un opportuno
plug-in.
Esistono vari applicativi (visualizzatori, editor, convertitori) per utilizzare SVG e
VML, nel capitolo 2 (in particolare nella sezione 2.3), queste soluzioni sono discusse
8
in dettaglio.
Oltre al semplice utilizzo per rappresentare immagini, SVG e VML si prestano ad
altre funzioni. Sono state sviluppare molte applicazioni che sfruttano questi formati,
ad esempio:
• generazione dinamica di immagini, come la rappresentazione di grafici a partire
da base di dati;
• rappresentazione di mappe, permettendo di effettuare zoom e collegamenti ipertestuali in una maniera semplice ed efficace;
• gestione di animazioni, in cui si contrasta lo strapotere del formato Flash, tramite
un linguaggio standard e leggibile (SVG).
In questo contesto si inserisce il nuovo progetto, un convertitore tra i formati
vettoriali SVG e VML e da questi nel formato raster GIF.
Le motivazioni che ne hanno spinto alla realizzazione sono molteplici e diverse per
ogni verso della conversione.
Per quanto riguarda VML, il fattore fondamentale è la sua non standardizzazione,
la quale implica il suo supporto esclusivo tramite sistemi Microsoft. In particolar modo
è il formato in cui vengono memorizzate le immagini nelle presentazioni di Power
Point. Da qui l’esigenza di poter ottenere disegni utilizzabili su più piattaforme, sia in
formato vettoriali (SVG) che in formato bitmap (GIF).
La conversione di SVG, d’altro canto, ha delle motivazioni più sottili, bisogna
sottolineare che pur essendo un formato standard, allo stato dell’arte non ha un pieno
supporto; basti ricordare l’esiguo numero di browser nativi. GIF, come molti altri
formati raster, ha ormai raggiunto una diffusione pressoché totale, consentendone un
suo utilizzo su ogni sistema. Convertitori tra questi formati ne esistono, e con risultati
molto buoni, tuttavia il nuovo convertitore, scritto mediante script PHP, permette un
efficiente integrazione in applicazioni web server side, richiedendo limitate risorse
da parte dell’utente ed inoltre, tramite meccanismi di caching, viene velocizzanto il
riutilizzo di immagini già convertite.
Capitolo 1. Introduzione
9
La conversione da SVG a VML, è stata realizzata perché, anche se VML è un
formato ormai obsoleto, sui sistemi Microsoft gode ancora di una gestione migliore; è
presente un visualizzatore integrato nel browser Internet Explorer. D’altro canto, SVG
richiede un opportuno plug-in, che allo stato attuale mostra ancora delle limitazioni.
Per completezza è stato realizzata anche un’applicazione per passare da GIF a SVG
e VML. In questo caso però si tratta di una semplice inclusione.
Nel capitolo 3, viene mostrata una descrizione ad alto livello dei convertitori realizzati. Per ognuno di essi viene specificata la tecnologia adottata, soffermandosi sul suo
utilizzo pratico, passando poi alla descrizione della metodologia che sta alla base delle
traduzioni. Inoltre, per ogni singola conversione è stato analizzato più nel dettaglio il
funzionamento, soffermandosi sui principali aspetti delicati, mostrando infine alcuni
esempi ed un elenco di problemi.
Per realizzare la conversione tra SVG e VML sono stati utilizzati due fogli di stile
XSLT, questa è sembrata la scelta migliore visto la natura dei formati, entrambi in
sintassi XML. Questi due linguaggi per rappresentare molti oggetti grafici utilizzano
elementi simili; per altri presentano una struttura totalmente diversa. Per effuttuare
una buona conversione, nel senso della rappresentazione visiva dell’immagine, spesso
questa struttura è stata sensibilmente modificata. Tuttavia si è cercato di rispettare il
più possibile l’organizzazione strutturale dei documenti.
La prima conversione realizzata è stata quella da SVG a VML. Questa traduzione
si è rivelata molto dispendiosa, dovuta al vasto dominio di SVG. È stato quindi deciso
di non tradurlo completamente. Visto che quella realizzata dovrebbe rappresentare
una prima versione del convertitore ci si è soffermati sugli aspetti principali dei due
linguaggi. Bisogna tuttavia segnalare che alcune caratteristiche non sono state tradotte
in quanto non supportate dall’altro formato (vedi sezione 3.1.4).
La seconda conversione, da VML a SVG, si è rivelata più semplice, in quanto le
caratteristiche supportate solo dal primo formato sono in numero molto più esiguo.
10
Anche in questo caso però alcuni aspetti non sono stati considerati, per scelta o per
mancanza di una corrispondenza in SVG e altri aspetti sono risultati approssimati,
sostanzialmente per una diversa gestione dei due linguaggi.
Le conversioni da SVG e VML a GIF sono state realizzate mediante due script
PHP, sfruttando un’opportuna libreria grafica che permette di creare un file in grafica
raster, e di inserirci vari elementi grafici, come ad esempio rettangoli, ellissi, path e
testi.
La metodologia alla base della traduzione è la stessa, per questo è stata descritta in
un’unica sezione (vedi 3.2) per entrambe le direzioni: è stato implementato un parser
che riconosce e gestisce opportunamente ogni elemento ed attributo incontrato.
Nella realizzazione di queste conversioni non sono stati tradotti tutte le caratteristiche dei due formati: alcune per mancanza di mezzi implementativi, cioè di parametri
nelle funzioni di PHP, altre per scelta. Quest’ultimo caso riguarda le opzioni non
tradotte nei convertitori tra SVG e VML. È sembrato opportuno avere una certa coerenza supportando le stesse caratteristiche in ogni convertitore.
Come accennato in precedenza è stata realizzata un’ultima applicazione per passare da GIF a SVG e VML. In questo caso si tratta di una semplice inclusione di
un’immagine esterna, realizzata mediante due script PHP, che creano un opportuno
documento con il riferimento (l’url) all’immagine da inserire.
Nel capitolo 4 sono state descritte più nel dettaglio le conversioni realizzate.
In conclusione con questa tesi si illustra il ruolo di rilievo della grafica vettoriale
rispetto a quella scalare, in particolar modo del formato SVG, standard del W3C che
si appresta ad avere un supporto globale. Viene motivata l’esigenza di un nuovo convertitore tra questi tipi di formati, la cui implementazione è ampiamente descritta,
spiegandone ideologie, pregi e difetti. Infine bisogna ricordare che quella realizzata è
la prima versione del convertitore, la quale non considera i due formati vettoriali nella
loro totalità, per questo si auspica una realizzazione futura di altre implementazioni
Capitolo 1. Introduzione
che ne migliorino le prestazioni.
11
12
Capitolo 2
Contesto: what the world needs now...
In questo capitolo verrà fatta una panoramica sull’uso delle immagini nel Web e sulla nascita di nuovi formati grafici. Successivamente verrano, in breve, descritti i tre
formati considerati per la conversione.
Verrà descritto un insieme di strumenti disponibili per gestire e operare con questi
formati e si elencheranno alcuni tipi di applicazioni inerenti.
Infine si passerà ad analizzare i motivi che hanno spinto alla realizzazione di questi
convertitori, esprimendo poi alcune considerazioni.
2.1 Le immagini nel Web
Inizialmente per presentare informazioni sul Web, visualizzate tramite browser, venivano combinati linguaggi di markup testuali (HTML prima, XML poi), con immagini
raster, cioè immagini rappresentate mediante una matrice che associa i colori ai rispettivi pixel. Questo approccio ha sempre mostrato evidenti limitazioni e incongruenze.
Innanzi tutto questo tipo di immagini sono pensate e create per essere rappresentate
ad una data dimensione (se vengono scalata si perde di qualità), quindi inserite in
un documento testuale ne forzano la rappresentazione del layout, non permettendo di
adattarsi in base alla dimensione e risoluzione dello schermo.
Oltre a questo, va ricordato l’alto consumo di bandwidth necessario per “caricare”
questi formati.
13
14
Infine, forse come motivo principale, queste immagini rappresentano degli oggetti
non leggibili, su cui non si ha alcun controllo, mentre la parte testuale può essere
visualizzata, editata, ed adattata alle proprie esigenze.
Da qui è nata l’esigenza di rappresentare le immagini in un altro modo, tramite
grafica vettoriale.
Inizialmente, nel 1998, sono stati proposti al W3C1 due linguaggi: VML (Vector
Markup Language), proposta tra gli altri da Microsoft e Macromedia [MatLeeDis98],
e PGML (Precision Graphics Markup Language), proposto da Adobe, Sun e Netscape
[AAC98].
Questi due linguaggi sono basati su XML [BPSMY04] e permettono di realizzare
immagini in grafica vettoriale bidimensionali. Sono compatibili con i principali standard quali CSS (Cascading Style Sheet) level 1 e 2 [BosWiu99] [BWLJ98] e DOM
(Document Object Model) level 1 [Woo98]. È possibile quindi inserire questo tipo di
immagini in documenti HTML o XML, che verranno gestite dalla parte client, adattandosi alle esigenze dell’utente e consentendo un effettivo risparmio di bandwidth.
Essendo in formato XML, tutto il disegno è rappresentato in maniera testuale, quindi facilmente indicizzabile, eventualmente anche da motori di ricerca. Inoltre va sottolineato che il testo è effettivamente testo e quindi è possibile effettuare ricerche e
selezioni. Un altro aspetto sull’importanza di questi formati è la possibilità di creare
immagini in maniera dinamica a partire da documenti XML, vedi [McKGri00].
A quel punto il W3C si è trovato ad un bivio, riguardo a quale linguaggio scegliere.
La soluzione adottata è stata quella di prendere il meglio da ogni formato e creare uno
standard nuovo. Da qui è nato SVG.
SVG (Scalable Vector Graphics) è il formato standard del W3C per rappresentare
immagini in grafica vettoriale in XML. Nell’Ottobre del 1998 viene creato un working
group per la creazione di questo linguaggio, che sfocia nella Recommendation della
versione 1.0, il 4 Settembre 2001 [Fer01].
1 W3C:
World Wide Web Consortium, il consorzio fondato da Tim Berners-Lee al fine di “sviluppare
protocolli comuni per migliorare l’interoperabilità e guidare l’evoluzione del World Wide Web”.
Capitolo 2. Contesto: what the world needs now...
15
Rispetto agli altri formati, presenta molte caratteristiche aggiuntive (specifica di
animazioni, gestione elaborata dei testi, ecc.). Uno dei punti chiave nella creazione di
questo linguaggio è stata l’accessibilità, cioè è stato pensato per poter essere usufruito
dal maggior numero possibile di utenti, permettendo, per esempio, di inserire nel
codice informazioni aggiuntive (metadati), per descrivere il contenuto dell’immagine.
In seguito è stata sviluppata la versione 1.1, Recommendation del 14 Gennaio 2003
[FerJunJac03], che fornisce una modularizzazione della versione precedente; questi
moduli possono essere combinati tra loro o con moduli di altre specifiche, per ottenere
sottoinsiemi od estensioni di SVG.
Da questo nascono due ulteriori specifiche, Mobile SVG Profiles [Cap03], pensate per l’applicazione di SVG a dispositivi con risorse limitate. I due profili sono i
seguenti:
• SVG Tiny: progettato per telefoni cellulari, quindi dispositivi con molte restrizioni;
• SVG Basic: realizzato per palmari (PDA).
Ogni profilo contiene una serie di moduli, e per ognuno specifica il grado di completezza (full, basic, tiny).
Un’altra specifica è rappresentata da SVG Print [Dan03], una versione di SVG
pensata per produrre documenti XML disponibili per essere stampati.
Attualmente si sta lavorando alla versione 1.2 di SVG, Working Draft del 27 Ottobre 2004 [Jac04].
2.2 I linguaggi coinvolti
2.2.1 SVG: breve descrizione strutturale
SVG (Scalable Vector Graphics) è un linguaggio per descrivere figure bidimensionali
e applicazioni grafiche in XML. Permette di realizzare immagini in grafica vettoria-
16
le scalabili, statiche o dinamiche. È una raccomandazione del W3C, e la versione
considerata per la conversione, 1.1, è datata 15 gennaio 2003.
Questo linguaggio viene usato per trattare tre tipi di elementi grafici:
• figure in grafica vettoriale (combinazioni di linee e curve);
• testo;
• immagini raster.
Le figure e i testi possono essere colorati, sia l’interno sia i bordi; i riempimenti
possono essere effettuati con colori semplici, con gradienti o con pattern. È possibile
effettuare vari tipi di trasformazioni sugli oggetti grafici, quali rotazioni o ingrandimenti.
Il contenuto di SVG può essere incluso in un documento SVG a se stante oppure
può essere incluso in un documento HTML, tramite varie opzioni (elemento object,
link con elemento a, elemento img). Inoltre SVG è compatibile con gli altri standard
del W3C, quali per esempio CSS, DOM e XSLT.
Una parte di un documento SVG consiste in un insieme di elementi contenuti in
uno o più elementi ‘svg’. L’elemento svg rappresenta un contenitore, il quale definisce
un nuovo sistema di coordinate (chiamato user space) che influenzerà tutti gli elementi
contenuti al suo interno. Contiene degli attributi per specificare la dimensione del
“contenitore” e il numero di coordinate per le ascisse e per le ordinate, in modo che
gli oggetti contenuti possano essere opportunamente posizionati mediante gli attributi
x ed y.
Per esempio se viene definito il contenitore di 10cm × 10cm e le coordinate sono
1000 × 1000, se si definisce un rettangolo di 100 × 100 questo sarà di dimensioni
effettive pari a 1cm × 1cm.
Un primo esempio di documente SVG è il seguente, la cui resa grafica è rappresentata
dalla figura 2.1:
<?xml version="1.0" standalone="no"?>
<svg width="15cm" height="10cm" viewBox="0 0 1500 1000"
Capitolo 2. Contesto: what the world needs now...
17
Figura 2.1: Esempio SVG
xmlns="http://www.w3.org/2000/svg" version="1.1"
preserveAspectRatio="none">
<rect x="10" y="10" width="1480" height="980"
fill="none" stroke="blue" stroke-width="5" />
<rect x="200" y="100" width="1100" height="700"
fill="yellow" stroke="green" stroke-width="15" />
<ellipse cx="750" cy="400" rx="450" ry="200"
fill="white" stroke="blue" stroke-width="10" />
<!-- triangolo -->
<path d="M 600 300 l 300 0 l -150
200
z"
fill="red" stroke="black" stroke-width="10" />
<text x="500" y="700" font-family="Arial"
font-size="70">Esempio SVG</text>
</svg>
18
SVG fornisce dei costrutti (elementi) per definire alcune figure di base (rettangoli, ellissi, ecc.) il cui utilizzo è molto semplice, come si evince dall’esempio: basta definire gli attributi per il posizionamento e il dimensionamento nonchè il tipo di
colorazione.
Un altro elemento di rilevante importanza è path, il quale permette di disegnare una
generica figura, specificandone i punti e i tipi di linee (con una sintassi ben precisa, ad
esempio m effettua uno spostamento, l disegna una linea).
L’elemento text, visto nell’esempio, serve per inserire un testo, specificandone la
posizione. Sono possibili gestioni complesse dei testi, gestendone in maniera diversa
varie porzioni.
Sono presenti numerosi altri aspetti di SVG, quali colorazioni (fill, stroke, opacità
e gradienti), trasformazioni (rotazioni, gestione di scale, ecc.), raggruppamenti (elemento g), animazioni e interattività ed inserimento di immagini esterne (raster). Per
maggiori dettagli si rimanda a [FerJunJac03].
2.2.2 VML: breve descrizione strutturale
VML (Vector Markup Language) è un’applicazione XML per rappresentare immagini
in grafica vettoriale. È stato proposto dalla Microsoft al W3C, nel Maggio del 1998, ed
è tuttora una submission. È compatibile con CSS1 e CSS2, anzi, si basa su CSS2 per
determinare il layout degli elementi grafici ed è supportato da Internet Explorer (dalla
versione 5.0) e da vari componenti di Office 2000 (Excel, PowerPoint, Word).
Questo linguaggio si può paragonare all’HTML: “VML supporta il markup per informazioni di grafica vettoriale nello stesso modo con cui HTML supporta il markup
per informazioni testuali” [MatLeeDis98]. VML è scritto in sintassi XML, come
HTML è stato scritto usando la sintassi di SGML.
Da notare che documenti VML veri e propri (stand-alone) non esistono, gli oggetti
grafici di VML sono inclusi all’interno di documenti HTML, utilizzando un opportuno
namespace, il quale fa in modo che il browser (IE), possa chiamare un programma per
visualizzare la parte VML (in IE5 è installato il programma VMLRender).
Per scrivere (o meglio disegnare) oggetti grafici in VML, oltre alla scrittura ma-
Capitolo 2. Contesto: what the world needs now...
19
Figura 2.2: Esempio VML
nuale tramite editor testuale, si può utilizzare Office 2000, il quale permette di salvare
i documenti in formato HTML, nei quali, le immagini saranno rappresentate in sintassi
VML, vedi [Har04].
VML permette di definire un certo numero di elementi, non necessariamente inclusi in un contenitore, per rappresentare le varie figure. Sono tuttavia presenti alcuni elementi contenitori (shape e group) che permettono di raggruppare varie figure
definendo un nuovo sistema di coordinate, specificandone dimensioni (tramite le proprietà width ed height dell’attributo style) e numero di coordinate (tramite l’attributo
coordsize).
Vediamo ora un esempio di immagine in formato VML, la cui resa grafica è mostrata dalla figura 2.2:
<?xml version="1.0"?>
<HTML xmlns:v="urn:schemas-microsoft-com:vml"
xmlns="http://www.w3.org/1999/xhtml">
20
<HEAD>
<OBJECT id="VMLRender" classid="CLSID:..."></OBJECT>
<STYLE>v\:* {BEHAVIOR: url(#VMLRender)}</STYLE>
</HEAD>
<BODY>
<v:rect style="position: absolute; left: 10; top: 10;
width: 10cm; height: 10cm;" strokecolor="green"
fillcolor="green" strokeweight="10"
>
<v:fill on="false" />
</v:rect>
<v:shapetype id="t1" strokecolor="red"
fillcolor="yellow" strokeweight="5"
path="M 200,500 L 600,500 e" >
<v:textpath style="font-family: Arial;
font-size: 30;" on="true"
string="Esempio VML"
/>
</v:shapetype>
<!-- visualizzazione del triangolo -->
<v:shape type="#t1" style="position: absolute;
width: 500; height: 500;" coordsize="1500 1500">
<v:path textpathok="false"
v="m 450,250 L 700,250 L 575,500 x e"
/>
</v:shape>
<!-- visualizzazione del testo definito in t1 -->
<v:shape type="#t1" style="position: absolute;
width: 500; height: 600;"
fillcolor="green" coordsize="1000 1000">
<v:stroke on="false" />
<v:path textpathok="true" />
</v:shape>
<v:group style="position: absolute; width: 15cm;
height: 10cm" coordsize="1500 1000">
Capitolo 2. Contesto: what the world needs now...
21
<v:oval style="position: absolute; left: 150;
top: 150; width: 700; height: 400;">
<v:fill on="true" color="red" opacity="0.2" />
<v:stroke on="true" color="black" weight="2.5" />
</v:oval>
<v:rect style="position: absolute; left: 100;
top: 100; width: 800; height: 500;"
strokecolor="blue" strokeweight="5">
<v:fill on="false" />
</v:rect>
</v:group>
</BODY>
</HTML>
VML dispone di vari elementi per definire alcune figure di base (rettangoli, ellissi,
ecc.), le quali tramite l’attributo style, vengono posizionate e dimensionate. Queste figure, come ogni altro elemento, possono essere raggruppate tramite l’elemento group.
Quest’elemento mediante width e height e l’attributo coordsize, definisce una regione
in cui rappresentare gli oggetti contenuti ed un sistema di coordinate che influenza tutti
i valori degli elementi.
Un altro elemento di notevole importanza è shape usato per creare un figura generica. Presenta una serie di attributi per specificare il posizionamento e il dimensionamento, tra i quali coordsize, che definisce un nuovo sistema di coordinate. Al suo interno
può contenere dei path, dei testi (o semplici in sintassi HTML, o testi inseriti in path),
oppure riferimenti ad immagini raster esterne. Un elemento analogo è shapetype, che
svolge la medesima funzione, solo che non visualizza il contenuto, può essere solo
richiamato da un’altro elemento shape (il quale erediterà le proprietà, sovrascrivendo
eventuali valori).
Per avere informazioni sulle restanti proprietà (fill, stroke, ecc.) o per ulteriori
dettagli si rimanda a [MatLeeDis98] oppure a [Mic98a].
22
2.2.3 Confronto tra SVG e VML
Dopo l’analisi dei due linguaggi, si può passare ad effettuarne un confronto, in relazione ai tool che li supportano, alla struttura dei documenti e al tipo di figure realizzabili.
Innanzi tutto va rilevato che SVG è stato sviluppato dopo che VML è stato proposto
al W3C come standard per rappresentare disegni in grafica vettoriale; quindi ha potuto
beneficiare dell’altro linguaggio. Tuttavia la strutturazione dei documenti è simile solo
in parte.
Si può affermare che SVG è più rigido nella sua struttura, mentre VML è più
flessibile, si possono paragonare ad XML e ad HTML, in cui il primo dev’essere ben
formato, mentre il secondo viene comunque visualizzato dai browser. Va ricordato che
il codice VML è incluso in un documento HTML, e che la sua integrazione è strutturalmente evidente, in quanto entrambi si basano su CSS per esprimere le proprietà
dei vari elementi.
In SVG tutto il contenuto è racchiuso in un elemento svg che funge da contenitore
e dimensiona la figura e tutti i successivi oggetti grafici definiti. Ogni oggetto grafico
dispone di uno specifico elemento per rappresentarlo, tutte le proprietà sono specificate tramite attributi ed è supportata un’ereditarietà completa sugli attributi mancanti.
Gli elementi possono essere raggruppati in modo da applicare gli stessi effetti ad un
certo numero di oggetti. Sono disponibili molti tipi di effetti quali trasformazioni,
implementate con un opportuno attributo od effetti particolari, quali per esempio gradienti o filtri, definibili separatamente e richiamati tramite riferimento. Anche i testi
sono definiti tramite un semplice elemento che ne specifica le caratteristiche ed il contenuto. Infine tutti gli elementi possono essere definiti in un opportuno contenitore ed
essere richiamati più volte nel documento.
D’altro canto VML è molto più verboso ed ha una struttura meno coerente. Non
necessita di un elemento contenitore come radice, tuttavia può essere realizzato tramite
raggruppamento, permettendo di specificare un parziale dimensionamento e posiziona-
Capitolo 2. Contesto: what the world needs now...
23
mento; parziale in quanto le figure occuperanno sempre tutto lo spazio a disposizione
(tutta la finestra del browser) e non è possibile fare clipping (cioè impedire la visualizzazione all’esterno di un determinato perimetro) degli oggetti grafici. Molte delle
figure esprimibili, hanno uno specifico elemento per crearle, tranne alcune che devono
essere inserite e gestite in modo opportuno, con l’elemento shape. Quest’elemento specifica una figura, utilizzando path, testi o immagini esterne; la scelta su quale
oggetto rappresentare si basa su attributi presenti negli elementi figli. È presente un
elemento, shapetype, che permette di definire delle figure da richiamare più volte nel
documento, ma queste figure sono solo di tipo shape, non permettendo di definirne altre quali rettangoli o ellissi. Per quanto riguarda l’ereditarietà: vengono ereditati solo
i valori di dimensionamento, mentre le proprietà grafiche, quali fill e stroke, no.
Come ultimo aspetto passiamo agli effetti grafici e alle trasformazioni. Non esistono attributi specifici per realizzare trasformazioni, si realizzano o tramite proprietà
CSS (rotation) o dimensionando opportunamente gli altri attributi. Inoltre sono presenti un limitato insieme di attributi, non utilizzabile da tutti gli elementi per specificare
effetti grafici. Infine è molto più verboso, per rappresentare le stesse caratteristiche di
SVG richiede un maggior numero di elementi ed attributi.
Per quanto riguarda gli applicativi che supportano i due formati, bisogna notare la
maggiore influenza di SVG. VML è sopportato principalmente dai prodotti Microsoft,
IE ed Office 2000, che permettono di visualizzarlo ed editarlo. SVG non è supportato
direttamente dai browser, richiede l’aggiunto di opportuni plug-in, come l’Adobe SVG
Viewer; tuttora è completamente supportato solo da IE, ma molti altri prodotti si stanno predisponendo al suo utilizzo, come per esempio una versione di Mozilla, Croczilla
[Moz05], che ne supporta una parte. Sono inoltre presenti numerosi tool per editare
o convertire immagini in formato SVG, mentre VML sembra non essere considerato
dalle case produttrici di software, visto che non è uno standard e non sembra che lo
diverrà mai. Per maggiori dettagli su vari tool specifici si rimanda a 2.3.
Veniamo ora ai tipi di figure ed effetti supportati dai due linguaggi. VML presenta un esiguo numero di caratteristiche non supportate dall’altro linguaggio, quali la
24
possibilità di definire l’ordine di annidamento delle figure, l’utilizzo di funzioni matematiche per calcolare determinati valori, alcune caratteristiche dei path e la definizione
semplificata di archi e curve. Le caratteristiche esclusive di SVG, d’altro canto sono
in numero maggiore. Abbiamo una lunga lista di effetti grafici (filtri, clipping, ecc.),
la possibilità di definire animazioni, ed alcuni tipi di trasformazioni. Una nota a parte
merita la rappresentazione dei testi, in cui VML mostra maggiormente i suoi limiti,
permettendo una semplice definizione in stile HTML o la rappresentazione su path.
Con SVG è possibile inserire i testi in qualsiasi posizione, gestire sottotesti, od addirittura ogni singolo carattere, in modo indipendente.
Anche a livello accademico si nota il supporto maggiore di SVG, in quanto è
l’unico linguaggio vettoriale ampiamente descritto, analizzato ed implementato. Al
proposito basta pensare alla conferenza annuale su SVG, SVG Open [SVKHKP05], e
agli svariati siti Internet specifici, tra i quali si segnalano: svg-cafe [Php02], svg.org
[Gus05] e svg-wiki [Svg05].
In conclusione si può affermare che SVG è più chiaro e più completo. È più facile
da imparare ed è maggiormente considerato e implementato.
2.2.4 GIF
Lo standard GIF (Graphic Interchange Format), è un formato grafiche che rappresenta le immagini tramite bitmap, cioè tramite una matrice che associa ad ogni pixel i
rispettivi colori. È stato sviluppato, alla fine degli anni 80 da CompuServe, con l’intenzione di definire un protocollo per la trasmissione on-line (platform-independent)
e lo scambio di immagini raster. È ottimizzato per rappresentare le immagini ad una
data dimensione, scalandole si perde di qualità. Questo formato inoltre è ampiamente
usato per rappresentare disegni animati.
Data la diffusione e la conoscenza di GIF, si è preferito non soffermarsi troppo
sulla sua descrizione e sugli strumenti di gestione disponibili.
Capitolo 2. Contesto: what the world needs now...
25
2.3 Applicativi esistenti
In questa sezione vengono elencati i principali programmi di gestione di SVG e VML,
suddivisi in categorie. Batik, visto il ruolo importante che svolge, in quanto sembra
essere lo strumento più usato e più completo per la gestione di SVG, viene descritto
separatamente.
2.3.1 Viewer
VML
Essendo VML solo una Submission del W3C, quindi non uno standard, i prodotti che
lo supportano sono pochi. Dal momento che è un linguaggio proposto dalla Microsoft,
è supportato dai prodotti Microsoft. L’unico visualizzatore attualmente presente, e
probabilmente resterà unico, è Internet Explorer, dalla versione 5. In questo browser
è installato un programma, VMLRender, che permette di visualizzare immagini in
formato VML.
Per poter usare VML si deve inserire il codice in un documento HTML, specificando nell’intestazione il namespace
xmlns:v = "urn:schemas-microsoft-com:vml"
e le seguenti informazioni:
<HEAD>
<OBJECT id="VMLRender"
classid="CLSID:10...">
</OBJECT>
<STYLE>
v\:* {BEHAVIOR: url(#VMLRender) }
</STYLE>
</HEAD>
In questo modo viene segnalato al browser di “passare” tutti gli oggetti con namespace v, al VMLRender che provvederà alla loro effettiva visulizzazione. Per maggiori
dettagli si rimanda a [Mic98a].
26
SVG
Per visualizzare un documento SVG, oltre all’utilizzo di appositi applicativi, che permettono di effettuare operazioni più complesse, come editing e conversioni, per i quali
si rimanda alle sezioni successive, la soluzione più semplice ed intuitiva è l’utilizzo di
un web browser. SVG è nato con lo scopo di rappresentare le immagini in un formato
coerente con XML, per utilizzarle in applicazioni web, quindi è auspicabile che queste
applicazioni web, di norma i browser, possano rappresentare la grafica di SVG.
Sfortunatamente di browser che supportano nativamente SVG ce ne sono pochi, il
più importate è Amaya (vedi sezione 2.3.2), gli altri di norma richiedono l’aggiunta di
opportuni plug-in.
I principali plug-in disponibili sul mercato sono i seguenti:
Adobe SVG Viewer: questo plug-in, attualmente alla versione 3.0, è disponibile per
sistemi Windows (da 95) e Macintosh (dalla versione 8.6), per i browser Internet
Explorer (dalla versione 5) e Netscape Navigator o Communicator (dalla versione 4.5 alla 4.78, la versione 6 non è supportata). Sono supportate la maggior
parte delle caratteristiche di SVG con prestazioni molto buone, tuttavia presenta una fondamentale limitazione, riguardo alla mancanza dell’attivazione della
barra di scorrimento, nel caso in cui l’immagine “esca” dai bordi dello schermo.
Per maggiori informazioni si rimanada a [Ado05].
Corel SVG Viewer: oltre a servire per la visualizzazione di immagini SVG nei browser, è una delle componenti chiave del Corel Smart Graphics Studio (ambiente
di sviluppo per creare grafici in SVG da documenti XML). È stato sviluppato
per sistemi Windows (da NT) e si applica ad Internet Explorer (dalla versione
5.5) e a Netscape Navigator o Communicator (nelle versioni 4.79 o 7.02). Per
maggiori informazioni vedi [Cor03].
Per quanto riguarda l’ambiente Linux/Unix, c’è da segnalare il progetto KSVG,
integrato nell’ambiente KDE, dalla versione 3.2, il quale permette la visualizzazione
di immagini in formato SVG, tramite il web browser Konqueror. La versione attuale di
questo plug-in non è da considerarsi completa, molti aspetti del linguaggio sono ancora esclusi, specialmente l’integrazione con altre tecnologie; per ulteriori informazioni
Capitolo 2. Contesto: what the world needs now...
27
si rimanda a [BuiZim04].
Anche Mozilla presenta un’implementazione di SVG. A differenza dell’utilizzo di
plug-in, quella proposita è un’implementazione nativa. Non è integrata nella release
ufficiale di Mozilla, ma è disponibile nel Mozilla CVS repository.
Allo stato dell’arte non sono molte le caratteristiche supportate, manca completamente la gestione delle animazioni e degli effetti grafici, ed è presente una gestione semplificata dei testi; gli elementi basilari tuttavia sono gestiti. Informazioni
supplementari possono essere trovate in [Moz05].
2.3.2 Editor
Per quanto riguarda gli applicati per editare documenti SVG o VML, si deve ricordare
che essendo formati XML, sono leggibili e quindi per poter essere creati si può usare
un semplice text editor. Questa soluzione è accettabile per la creazione di immagini
semplici, in cui sono presenti pochi oggetti od elementi basilari.
La realizzazione di disegni più complessi, per esempio con curve di Bézier, consistenti di particolari effetti grafici (ombreggiature, ecc.) presenta la necessità di uno
strumento WYSIWYG, che permetta di disegnare in maniera semplice le figure (senza
specificare il markup) e ottenere da esse il corrispondente codice.
Di seguito sono presentati alcuni tra i più significativi editor presenti sul mercato.
VML
Per la gestione di VML, come affermato in precedenza, sono presenti un numero esiguo di applicativi, la maggior parte dei quali di proprietà di Microsoft. Di seguito sono
presentati i due strumenti maggiormente utilizzati:
Microsoft Office 2000: gli applicativi Word, Excel e PowerPoint supportano VML. È
possibile convertire le immagini create con questi programmi in formato VML
(inserito in un documento HTML).
Per fare questo bisogna specificare nelle impostazioni che si desidera utilizzare
28
VML come formato per rappresentare le immagini nei browser. Salvando poi il
documento in formato Web si otterrà il documento VML (vedi [Har04]).
Va ricordato che vengono convertite solo le immagine generate tramite gli appositi strumenti di disegno di questi programmi; quindi Office non rappresenta un convertitore, ma un semplice editor che tuttavia una volta generato il
documento VML, dà la possibilità di modificarlo esclusivamente a livello di
codice.
Microsoft VML Generator: questo prodotto è quanto di meglio sia presente sul mercato per realizzare da zero documenti VML [Mic98b].
Figura 2.3: VML Generator
Presenta una semplice interfaccia grafica suddivisa in quattro sezioni: la barra
di comandi, un pannello di opzioni (che permette di inserire elementi ed attributi, anche se in minima parte), una schermata in cui appare il codice (editabile)
dell’immagine ed una porzione che mostra un’anteprima dell’immagine.
Non è un grande prodotto, in quanto molti elementi non sono supportati (sono
da inserire manualmente), tuttavia è uno dei pochi disponibili ed è freeware.
Capitolo 2. Contesto: what the world needs now...
29
SVG
“Gli editor sono un mattone per il successo di SVG” [HauWen04].
Sono presenti numerosissimi editor per SVG, tra i quali bisogna distinguere tra
quelli nativi, cioè quelli che hanno come scopo principale produrre immagini SVG e
gli altri, che hanno aggiunto SVG alla lista dei formati supportati. Questi ultimi “non
supportano il contenuto SVG ad un livello che chiunque sia coinvolto in uno sviluppo
a livello di codice possa trovare accettabile” [Edw02].
A seguire saranno presentati alcuni tra i più importanti editor nativi e verrà presentata una breve descrizione di Adobe Illustrator, un applicativo in grado di gestire
oggetti SVG.
Amaya: è il web browser ed editor del W3C [Vat04], [Vat05]. Serve sia per visualizzare pagine web sia per crearle. Inizialmente supportava HTML e CSS, in seguito è stato esteso per supportare XML e le sue applicazioni com MathML e SVG.
Supporta alcuni tipi di animazioni e alcune figure vettoriali di base. Tuttavia non
è molto usabile, ma è open source.
Jasc WebDraw: è stato uno dei primi editor nativi di SVG [Edw02]. Supporta tutte le
caratteristiche di SVG tramite un’interfaccia semplice ed efficace. È un prodotto
commerciale ed è disponibile solo per sistemi Windows.
Figura 2.4: WebDraw
30
Sono presenti tre ambienti di sviluppo: il primo presenta una finestra WYSIWYG, in cui è possibile inserire le varie figure mediante opportune palette,
specificando eventualmente animazioni e complessi effetti grafici in una maniera
molto semplice ed intuitiva.
Il secondo ambiente è rappresentato dal codice sorgente dell’immagine creata,
editabile e con un correttore automatico in grado di rilevare eventuali errori.
Infine è disponibile una preview per visualizzare l’immagine comprensiva delle
animazioni.
Quindi un buon prodotto, semplice da usare e molto potente.
Sodipodi: è un editor open source nativo per SVG basato su GTK, il toolKit di GIMP
[Kap03].
Figura 2.5: Sodipodi
Presenta un interfaccia simile a quella di molti programmi grafici di Linux, con
varie palette e finestre di dialogo ed una finestra di editing in cui poter disegnare.
Inoltre è possibile accedere e modificare il codice SVG.
Offre grandi prestazioni per la realizzazione di path, in special modo nella gestione delle curve di Bézier. D’altra parte la versione attuale presenta delle limi-
Capitolo 2. Contesto: what the world needs now...
31
tazioni in quanto non sono supportate molte delle caratteristiche fondamentali di
SVG, quali ad esempio le animazioni.
Adobe Illustrator: questo programma permette di creare immagini ed esportarle in
formato SVG, specificando varie opzioni, come l’utilizzo di fogli di stile, o il
livello (inteso come ordine di visualizzazione) degli elementi; supporta un gran
numero di caratteristiche, tra le quali l’interattività, ed è abbastanza agevole da
utilizzare.
Come ricordato in precedenza, non è un editor nativo, e questo si vede. Innanzi
tutto, tutti gli oggetti vettoriali vengono convertiti in path, quindi si perde la
definizione di elementi quali rettangoli od ellissi. Molte caratteristiche, come
ombreggiature e gradienti, non sono direttamente supportate ma vengono trattare
come oggetti raster inseriti nel file SVG.
Per maggiori dettagli si rimanda a [Ado01].
2.3.3 Convertitori
Attualmente è disponibile una lunga serie di applicativi per gestire conversioni di formati, riguardanti SVG, per VML il numero è molto più esiguo. Queste applicazioni
permettono per esempio di trasformare documenti PDF o SWF in formato SVG. Tuttavia si è preferito privilegiare la descrizione di programmi che traducono formati
grafici.
In questa sezione saranno presentati alcuni tra i principali convertitori per convertire immagini raster in grafica vettoriale e viceversa; la maggior parte si riferisce esclusivamente al formato SVG. Oltre a questi sono presentati due applicativi per ottenere
documenti SVG o VML da qualsiasi input.
SVG MAKER e VML MAKER
Questi due programmi [Sof04] [Sof02], realizzati da Software Mechanics, rappresentano delle stampanti virtuali.
32
Sono realizzati esclusivamente per sistemi Windows (dal 95) e consento di convertire in SVG o VML qualsiasi documento stampabile.
L’idea di base è la seguente: se dal documento sorgente si riescono ad estrarre
delle informazioni (sul testo o sulle figure) queste sarranno rappresentate tramite gli
opportuni elementi, tutto il resto viene convertito in un’immagine raster da includere
nel documento VML o SVG. Quindi i file ottenuti possono contenere path (nel caso di
VML solo linee), testi o immagini raster.
Questi due programmi sono compatibili con molte applicazioni esistenti, cioè sono
ottimizzati per interpretare le informazioni contenute in queste applicazioni. Per esempio alcuni tra i formati supportati sono: PDF, CAD e i documenti prodotti da
Office.
Nel dettaglio:
• la versione attuale di VMLmaker è del Giugno 2002, non è molto funzionale,
sopporta limitatamente la gestione dei testi (realizzati tramite applicazioni di
Office), mentre tutto il resto è convertito in bitmap;
• SVGmaker, attualmente alla versione 2.0, datata Novembre 2004, è dotato di
una potenza maggiore, supporta in larga misura Acrobat, CAD e Office, cioè è
in grado di riconoscerne i testi e rappresentarli ottimamente, e riconosce molti
elementi grafici, rappresentati tramite path.
Nel complesso VMLmaker non sembra dare risultati accettabili, mentre SVGmaker appare un valido prodotto. Il documento creato è abbastanza limitato, in sostanza
tutto è rappresentato tramite path, ma la gestione dei testi è veramente buona.
CR2V
CR2V, Celinea Raster to Vector converter, è un progetto, sviluppato in C++, nato per
“convertire fotografie e disegni in una formato vettoriale puro e leggero” [Sia03a].
Consente di convertire immagini in formato BMP, TIFF, PNG, JPEG e GIF in
SVG. Presenta una buona gestione dell’immagine di partenza, rappresentandola completamente tramite path, i quali sono molto precisi, e “a differenza di altri program-
Capitolo 2. Contesto: what the world needs now...
33
mi di tracing, semplifica l’immagine generata rimuovendo dettagli insignificanti ed
estraendo l’essenza dell’immagine”.
Va sottolineato che l’immagine di partenza viene gestita completamente tramite
path, quindi eventuali testi verranno anch’essi trattati come path; anche se la resa
grafica è ottimale: si perde il testo, inteso come leggibilità e ricerca all’interno del
documento. Permette di specificare il livello di dettaglio con cui rappresentare l’immagine di partenza, portando quindi ad un incremento della qualità del disegno e
coseguentemente all’aumento della dimensione del file.
Attualmente CR2V è disponibile come funzione chiave di Vector Eye, un programma per convertire immagini raster in formato vettoriale, dotato di un’interfaccia grafica
semplice da usare [Sia03b].
Questo programma è disponibile solo per sistemi Windows.
KVEC
Questo prodotto, della ditta tedesca KK-Software [KKS04], permette di convertire
immagini raster in grafica vettoriale e per alcuni formati, come SWF (il formato di
Macromedia Flash), supporta anche la conversione inversa.
Non è molto buono per quanto riguarda l’usabilità, in quanto viene eseguito esclusivamente mediante linee di comandi, non presentando un interfaccia grafica. Per
quanto riguarda le conversioni verso il formato SVG, non mostra buoni risultati. La
traduzione non è molto buona e precisa e la dimensione del file risulta eccessivamente
grande. Il file SVG creato è composto da path formati esclusivamente da linee rette.
A suo favore va ricordato che funziona praticamente su tutti i sistemi.
CSIRO SVG TOOLKIT
CSIRO SVG Toolkit [Csi02] rappresenta una collezione di utility per effettuare varie
operazioni con i documenti SVG. Contiene un viewer, un’implementazione del DOM
di SVG ed è in grado di convertire immagini SVG in vari formati raster.
34
È un applicazione open source basata su tecnologia Java. L’ultima versione (12
Marzo 2002) supporta le principali caratteristiche di SVG, ad esclusione degli effetti
grafici (filtri) e presenta una gestione limitata dei testi.
Attualmente è da considerarsi un prodotto obsoleto, soppiantato dal toolkit di Batik
vedi 2.3.4.
2.3.4 Batik SVG toolkit
Batik è uno strumento basato su tecnologia Java per applicazioni o applet che vogliono
usare immagini in formato SVG per vari scopi, come visualizzazione, generazione e
manipolazione.
Lo scopo di questo strumento è quello di dare agli sviluppatori un insieme di moduli da poter usare (o meglio integrare) nelle loro applicazioni per supportare e gestire
immagini in formato SVG.
È stato sviluppato a partire dall’estate 2000 dalla Sun Microsystems e da altre
organizzazioni; l’attuale versione 1.5.1 è dell’estate 2003. È un prodotto open source
ed è possibile ottenere i file sorgenti dal sito di Apache (http://xml.apache.org/batik).
A RCHITETTURA
Batik si struttura in tre moduli:
• Applications: illustra le funzionalità che Batik offre;
• Core: contiene i moduli per manipolare, generare, creare, convertire e visualizzare contenuti SVG;
• Low Level: contiene moduli usati internamente dal modulo Core; non sono
direttamente usati dagli sviluppatori.
TOOL
E APPLICAZIONI
Di seguito vengono elencate alcune applicazioni, disponibili con la distribuzione di
Batik:
Capitolo 2. Contesto: what the world needs now...
35
Figura 2.6: Utilizzo di Batik
• Squiggle SVG Browser: browser che permette di visualizzare documenti SVG.
Consente di visualizzare il codice sorgente, l’albero del documento, consente di
effettuare rotazioni dell’immagine, ingrandimenti e restrizioni;
• SVG Rasterizer: è un utility che consente di convertire documenti SVG in un
formato raster (JPEG, PNG, o TIFF);
• SVG Font Converter: permette di convertire font True Type in font SVG, in
modo da rendere l’immagine SVG indipendente dai font supportati dai vari
sistemi.
E SEMPI
DI PROGETTI E PRODOTTI CHE LO UTILIZZANO
Sono presenti tantissimi progetti e prodotti che utilizzano Batik, di seguito ne vengono
elencati alcuni:
• Progetto Apache FOP: usa Batik per trattare immagini SVG. Permette di convertire file SVG in PDF;
36
• Progetto Apache Cocoon: usa Batik per rasterizzare immagini SVG;
• XWeb: usato per creare siti Web in maniera automatica da documenti XML, usa
Batik per convertire SVG in immagini raster;
• XML svg2image: classe PHP che traduce documenti SVG in JPEG o PNG.
In conclusione questo toolkit rappresenta un ottimo prodotto, attualmente il migliore,
per chi intende sviluppare applicazioni utilizzando SVG. Dispone di un convertitore
che permette di ottenere immagini pressoché perfette.
Per maggiori riferimenti sull’utilizzo o su come sviluppare applicazioni con Batik
si rimanda rispettivamente a [DewHar02] e [Kor02].
2.4 Applicazioni di un formato grafico vettoriale
Oltre al semplice utilizzo per rappresentare immagini nel web, i formati vettoriali
XML, si prestano ad una molteplicità di altri usi. Di seguito vengono elencate applicazioni per cui SVG (ed eventualmente anche VML) si dimostrano dei punti di
forza:
• Generazione dinamica di immagini: in molti casi può nascere la necessità di
utilizzare delle immagini, o meglio dei grafici, per meglio rappresentare dei valori numerici. Per esempio, in [Asm03], viene mostrata la necessità di una banca
di rappresentare dei grafici (a torta) per mostrare vari tipi di dati memorizzati in
documenti XML. Utilizzando un foglio di stile XSLT è possibile ottenere grafici
in SVG in una maniera molto semplice.
Un altro esempio è rappresentato da [BGLS03], in cui vengono mostrate applicazioni in ambito scientifico di SVG. Tramite alcuni dispositivi vengono recuperate informazioni, in tempo reale (per esempio riguardo alla meteorologia) e viene mostrato come generare on-the-fly grafici e immagini in SVG, in
quanto “i dati numerici possono essere compresi più facilmente se rappresentati
graficamente in un opportuno contesto”.
Altri esempi sono dati da [GebGal00], [FroHar02] e [Mor04].
Capitolo 2. Contesto: what the world needs now...
37
• Rappresentazione di Mappe: molto diffusa e importante è la rappresentazione
delle cartine geografiche in rete. Con il tradizionale approccio, tramite immagini
raster, si presentavano numerosi problemi:
– l’immagine era pressoché statica, non permettendo interazioni;
– la scalabilità era concessa ma degradando la qualità; servivano lunghi tempi di attesa per generare le mappe dal server;
– ogni mappa veniva generata in base alle esigenze degli utenti, non permettendo una scalabilità, nel senso di utenti che utilizzano simultaneamente la
stessa cartine.
Tramite l’utilizzo di SVG (ed in parte con VML) questi problemi vengono risolti.
Le informazioni vengono memorizzate in un database e si creano le cartine onthe-fly, permettendone l’utilizzo simultaneo. Inoltre, con SVG, è possibile effettuare ingrandimenti e riduzioni senza perdita di qualità. È anche possibile
associare degli eventi alle immagini, in modo da riuscire per esempio, cliccando
sul nome di una città, a far comparire una schermata con delle statistiche.
Inoltre, tramite l’utilizzo di elementi quali defs e use, che permettono di definire
una figura una volta sola e di richiamarla più volte nel documento, è possibile
ottimizzare la rappresentazione delle mappe, definendo i simboli separatamente
e richiamandoli nei punti opportuni.
Per maggiori dettagli sulla rappresentazione delle mappe si rimanda ai lavori di
[NeuWin01] e [Zas00].
• Trasformazioni inter–media: SVG può essere usato per rappresentare graficamente informazioni testuali. Ad esempio in [JBMOW03] viene mostrato come
convertire i seguenti formati:
– MusicXML: formato XML per rappresentare musica (definizione di spartiti);
– BioML: descrive informazioni biomolecolari (rappresentazioni del dna);
38
– CALCS: formato per memorizzare informazioni su acquisti, da cui si possono creare grafici di vario tipo.
• Animazioni: tramite SVG si possono realizzare complesse animazioni grafiche,
sullo stile di Macromedia Flash. Quest’ultimo formato, per quanto diffuso, ha
dalla sua alcuni svantaggi:
– è un formato proprietario;
– è binario, non si può leggere il codice;
– non si integra con gli altri standard.
D’altra parte, la programmazione in Flash è in uno stato più evoluto e dispone
di molti più strumenti che ne facilitano la gestione. Tuttavia, SVG è ancora
relativamente giovane ed è auspicabile che possa diventare la tecnologia per animazioni del futuro. In quest’ambito va segnalato lo sviluppo di animazioni per
applicazioni mobili [And04].
Per maggiori dettagli su un confronto tra Flash e SVG si rimanda a [HUNW04].
2.5 Perché realizzare un nuovo convertitore
2.5.1 Conversione VML – SVG
A questo punto della dissertazione dovrebbe sembrare ovvio il motivo per cui convertire immagini VML in SVG, il dubbio dovrebbe venire per la conversione inversa!
Prima di analizzare quest’ultimo aspetto, vengono riportate le motivazioni che
spingono al passaggio da VML a SVG:
• innanzi tutto non esiste in commercio un tale convertitore, e i convertitori, per
quanto poco possano servire, sono sempre strumenti necessari, da usare all’evenienza;
• SVG è un formato standard, l’attuale versione è una Recommendation del
W3C, mentre VML è rimasto una proposta. Questo vuol dire che le aziende spe-
Capitolo 2. Contesto: what the world needs now...
39
cializzate si sono dedicate al supporto di SVG, non sprecando tempo e risorse
per un formato che non offre garanzie;
• per il motivo precedente, si può affermare che SVG è supportato da molte più
applicazioni e da molti più ambienti, mentre VML è utilizzabile esclusivamente
con sistemi Microsoft;
• la sintassi di SVG è molto più semplice ed intuitiva, permette un editing manuale più agevole;
• alcuni applicativi di Office 2000 (Word, Excel, PowerPoint), permettono di “salvare” le immagini in formato VML. Con il convertitore si possono tradurre
quindi documenti di Office in un formato standard.
Passiamo ora ad analizzare gli aspetti per cui realizzare il convertitore da SVG a
VML:
• anche in questo caso convertitori non ne esistono, quindi può risultare utile;
• i plug-in esistenti mostrano delle limitazioni, per esempio, tramite l’Adobe SVG
Viewer, visualizzando un’immagine SVG su un browser, l’eventuale area che
“esce” dallo schermo non viene visualizzata, o meglio, non viene inserita una
barra di scorrimento per permetterne una visione completa;
• possono esserci applicazioni che utilizzano esclusivamente VML come formato
grafico vettoriale;
• VML permette una gestione di testi in sintassi HTML, quindi, permette di definire
paragrafi e altri costrutti più complessi, come le tabelle. SVG non ha una gestione di questo tipo; la limitazione più forte riguarda la mancanza di un comando per definire l’“a capo”, realizzabile esclusivamente mediante un opportuno
posizionamento.
40
2.5.2 Conversione in GIF
Il formato GIF, come d’altronde molti altri formati raster, è allo stato dell’arte universalmente accettato, sia dalle applicazioni grafiche sia dai web browser. Come è stato
specificato in precedenza ha dalla sua molti svantaggi (non scalabile, dimensione consistente, ecc.) tuttavia gode di un enorme diffusione.
Di seguito sono riportate alcune motivazioni che hanno spinto alla realizzazione
dei convertitori da SVG a GIF e da VML a GIF.
Per quanto riguarda la prima conversione (da SVG a GIF), bisogna notare che SVG
è uno standard aperto e probabilmente passerà ancora molto tempo prima di un suo
supporto globale; per il momento però funziona solo su alcuni sistemi e con particolari
strumenti (vedi plug-in di Adobe), quindi può rendersi necessaria una sua conversione
per poter visualizzare l’immagine in ogni ambiente.
Convertitori di questo formato ne esistono, alcuni anche ottimali, come Batik, che
traduce perfettamente l’immagine da SVG in un formato raster (supporta PNG, JPEG
e TIFF); attualmente non supporta GIF, ma è prevista una sua futura integrazione.
Il nuovo convertitore non ha una rappresentazione ottimale, tuttavia è ad un livello
più che buono ed è stato realizzato per ragioni di completezza, per permettere cioè di
poter passare da uno qualsiasi dei tre formati ad un altro. Inoltre, essendo realizzato
con uno script PHP, è possibile integrarlo in applicazioni web server side, in modo da
limitare le risorse richieste dall’utente, fornendo la possibilità di ottimizzare le conversioni utilizzando meccanismi di caching.
Per la conversione da VML a GIF, si segnala che convertitori di questo tipo (da
VML a immagini bitmap) non sembrano esistere. Questo appare abbastanza normale
vista la non standardizzazione e il disuso del formato. In ogni caso è un formato valido
e in certi ambiti è ancora utilizzato, in particolar modo nei sistemi Windows. Da questo
appare ancora più evidente rispetto all’altro formato la necessità di una traduzione in
formato raster.
Capitolo 2. Contesto: what the world needs now...
41
In conclusione si può affermare che una conversione dal formato VML è necessaria in quanto questo linguaggio è ormai obsoleto e supportato da un numero esiguo
di applicazioni. D’altro canto SVG è nel pieno del suo sviluppo, ma non ha ancora
raggiunto un supporto completo. La conversione in GIF permette di ottenere quindi,
un’immagine che sarà sicuramente accettata da ogni sistema.
2.6 Conclusioni
In questo capitolo sono stati introdotti e descritti i formati grafici vettoriali, mettendone
in evidenza i pregi rispetto ai tradizionali formati bitmap. Sono stati descritti i formati
più “popolari” SVG e VML, ed è stato mostrato come il primo abbia ormai superato
per diffusione e uso il secondo.
Sono stati visti alcuni applicativi per gestire questi linguaggi ed alcune possibili
applicazioni. Infine è stata motivata la realizzazione del nuovo convertitore.
Infine si segnala che quella realizzata è una prima versione dei traduttori, in cui si
considerano solo le caratteristiche principali dei vari linguaggi, escludendone completamente altre, ottenibili in future versioni. Nel capitolo successivo verranno descritte
più nel dettaglio le conversioni realizzate.
42
Capitolo 3
Descrizione ad alto livello: analyze this
In questo capitolo vengono descritti i traduttori realizzati. Due di essi permettono di
trasformare un documento scritto in sintassi SVG in uno scritto in sintassi VML e
viceversa. Sono stati realizzati mediante l’utilizzo di fogli di stile XSLT. Altri due
convertitori permettono di tradurre un documento SVG in un’immagine GIF e un
documento VML anch’esso in un immagine GIF, realizzati mediante script PHP.
Inoltre è stata creata un’applicazione per otterere file SVG e VML da GIF, realizzata in PHP tramite una semplice inclusione di immagini.
In questo capitolo verranno descritte le traduzioni realizzate specificando gli strumenti utilizzati, le ideologie alla base di ognuna di esse, i pregi e i difetti. Infine
verranno mostrate alcuni esempi di conversione.
3.1 Conversione tra SVG e VML
In questa sezione si illustrerà lo strumento di conversione utilizzato, XSLT, con le
motivazioni che hanno spinto al suo utilizzo. Verranno descritti poi i principi seguiti,
passando poi alla descrizione vera e propria delle conversioni, analizzandone gli aspetti
fondamentali, mostrando numerosi esempi e descrivendo alcune caratteristiche escluse
dalle trasformazioni.
43
44
3.1.1 Metodo di traduzione: utilizzo di XSLT
Per effettuare queste conversioni si sarebbero potuti usare molti metodi, come script
PERL, script PHP, od applicazioni Java, come espresso in [Jol03] e in [PMEB01]. Tuttavia, vista la natura dei documenti di partenza (linguaggi basati su XML), la soluzione
migliore è parsa quella di utilizzare un foglio di stile XSLT.
In [Man02] viene analizzato un metodo per convertire vari formati grafici in SVG.
L’idea base è la seguente: ogni applicazione ha una propria semantica per rappresentare le immagini, che differisce da quella di SVG. Quindi si suddividono i formati
grafici in domini applicativi (presentazioni, modellazione 3D, ecc.) e si analizzano le
caratteristiche di ciascun dominio. Si passa poi a tradurre ogni dominio in una struttura comune (un formato XML intermedio), da questa si passerà poi alla conversione
in SVG tramite XSLT.
Questo metodo appare valido per la conversione di molteplici formati in SVG. Tuttavia nello specifico (come il convertitore realizzato) appare migliore e più semplice
una trattazione ad hoc, gestita mediante una conversione diretta. Questo è dovuto al
fatto che utilizzando una metodologia generale non ci si può soffermare sulle particolarità di un dato linguaggio e quindi si perdono molte possibili ottimizzazioni. Per
esempio SVG e VML hanno varie caratteristiche rappresentate mediante la stessa sintassi, il che comporta una conversione diretta. Oltre a questo appare del tutto inutile
passare ad un formato intermedio quando si può andare direttamente al formato finale,
senza perdere alcun beneficio.
XSLT (eXtensible Stylesheet Language Transformations) è un linguaggio per trasformare documenti XML in altri documenti XML, la versione 1.0 è una Recommendation del W3C, datata 16 Novembre 1999 [Cla99].
Sostanzialmente le trasformazioni sono definite mediante regole o template che
indicano quale oggetto del documento sorgente dev’essere processato per produrre il
documento di output.
Questo linguaggio è apparso un ottimo strumento da utilizzare per le conversioni,
in quanto:
Capitolo 3. Descrizione ad alto livello: analyze this
45
• è dichiarativo ed è scritto anch’esso in sintassi XML;
• è un formata standard, gestibile da ogni sistema che supporta XML;
• è completamente compatibile con i formati XML, quindi SVG e VML;
• è compatibile con molti altri standard del W3C, come XPath, il quale permette
di effettuere complesse selezioni all’interno della struttura dei documenti;
• è relativamente semplice.
Tuttavia presenta alcune limitazioni che rendono più complesso il suo utilizzo:
• non permette di aggiornare le variabili e l’iterazione, quindi richiede la ricorsione, il che implica un incremento nella complessità;
• è difficile estrarre e gestire valori espressi in stringhe di testo.
Comunque, basandosi sui lavori di [FroHar02], [Asm03], [BGLS03] e [ManFul01],
che mostrano degli esempi concreti di utilizzo di questo linguaggio, e sulla propria
esperienza personale è stato deciso di utilizzare questo strumento di conversione.
3.1.2 Come funziona in pratica
Sono stati realizzati due fogli di stile, svg2vml.xsl e vml2svg.xsl, mediante i quali
vengono realizzate le conversioni.
Per poterli utilizzare devono essere inclusi nei documenti sorgente, mediante un’opportuna processing-instruction:
<?xml-stylesheet type="text/xsl" href="vml2svg.xsl"?>
Successivamente, mediante un’opportuna applicazione, quale xsltproc, si forza
l’applicazione del foglio di stile.
A livello di interfaccia grafica, per permettere un utilizzo pratico, nonché semplificato, dei convertitori, sono state create alcune pagine HTML. Attraverso questi
documenti, che sfruttano degli script PHP, si può inserire l’url di un’immagine SVG
(o VML) ed ottenere nella stessa schermata sia l’immagine di partenza, sia quella
convertita.
46
3.1.3 Metodologia delle conversioni
I due linguaggi (SVG e VML) hanno una struttura molto simile, cioè entrambi offrono,
per esempio, la possibilità di utilizzare elementi “contenitori” per dimensionare e posizionare vari oggetti grafici; oppure hanno attributi simili per esprimere i colori delle
figure. Tuttavia per alcuni aspetti, come si vedrà meglio in seguito, presentano una
struttura molto diversa.
Per convertire una componente grafica da un formato all’altro si è cercato innanzi
tutto di mantenere inalterata la struttura del primo documento, trasferendola nel secondo; se, per esempio, nel documento sorgente si ha un gruppo con all’interno due
elementi di figure, si cercherà di ottenere nell’altro documento un gruppo con due
elementi di figure. Tuttavia, non sempre è possibile realizzare una corrispondenza
cosı̀ netta: per ottenere la stessa figura, a livello di rendering, in molti casi bisogna
cambiare sostanzialmente o lievemente la struttura del documento. Quindi, si è dovuto
scegliere se mantenere una coerenza strutturale tra i due file o una coerenza visuale, e
naturalmente è stata scelta questa seconda opzione.
Un caso evidente di modifica della struttura del documento è rappresentato dalla
gestione dei testi. In SVG è possibile definire un elemento per rappresentare un testo,
al cui interno sono presenti altri elementi per posizionare in maniera diversa porzioni di
testo. VML non permette questa gestione dei testi, quindi, ogni singolo pezzo di testo
è stato inserito in un opportuno elemento textpath, perdendo la struttura e la linearità
del testo.
Un altro esempio è rappresentato dalle corrispondenze use–defs e shape–shapetype,
rispettivamente di SVG e VML, le quali non è stato possibile mantenere nei documenti
generati, come ampiamente descritto nelle successive sezioni.
Inoltre, i file convertiti sono stati ottimizzati per eventuali conversioni inverse. Per
esempio sono state tradotte e opportunamente inserite negli elementi le proprietà di
styling.
In pratica, per realizzare le traduzioni, si è cercato di ottenere una figura il più
possibile simile a quella di partenza, cercando di mantenere inalterata la struttura del
documento e si è cercato di ottimizzare i documenti per semplificare eventuali conver-
Capitolo 3. Descrizione ad alto livello: analyze this
sioni inverse.
Riassumendo, quindi, la priorità delle proprietà delle conversioni è la seguente:
1. coerenza visuale;
2. coerenza strutturale;
3. ottimizzazione per conversioni inverse.
47
48
3.1.4 Da SVG a VML
In questa sezione verrà presentata la prima conversione, spiegandone brevemente il
funzionamento, mostrando alcuni esempi che rappresentano gli aspetti più “problematici” ed elencando le principali limitazioni di questo traduttore. Ricordiamo che questa
conversione è stata realizzata mediante un foglio di stile XSLT (svg2vml.xsl).
C ONVERSIONE
DI BASE
Un documento SVG è rappresentato nella seguente forma: c’è un elemento svg che
racchiude tutti gli oggetti grafici e che imposta le dimensioni dell’immagine ed un sistema di coordinate usato per posizionare le figure. Da questo viene creato un documento HTML, al cui interno sono presenti gli elementi di VML, racchiusi in un elemento
group che funge da contenitore e che imposta le dimensioni e le coordinate.
Nella traduzione si scorre tutto l’albero del documento sorgente e per ogni elemento si procede ad un’opportuna traduzione. SVG e VML hanno molti attributi che
rappresentano le stesse caratteristiche (gestione di colori, dimensione di font, ecc.)
che tuttavia hanno un diverso valore di default; quindi per ogni elemento di SVG, se
presenta queste proprietà, si procede alla conversione (cioè al cambiamento di nome
dell’attributo), altrimenti si inseriscono ugualmente nell’elemento VML, ma con il
valore di default usato da SVG; il documento risultante presenterà quindi molti più
attributi di quello di partenza, dovuti al fatto del diverso uso dei valori di default.
Un altro aspetto riguarda gli elementi di SVG che non richiedono determinate proprietà, in quanto le ereditano, mentre in VML bisogna impostarle (è il caso per esempio dei gruppi). Per gestire queste situazioni, bisogna scorrere l’albero del documento
dall’elemento corrente, all’indietro, cercando le opportune proprietà negli elementi
precedenti.
P UNTI “ SOTTILI ”
La maggior parte degli elementi e degli attributi di SVG presentano una corrispondenza
abbastanza lineare con elementi di VML; in questi casi la conversione si è basata su
Capitolo 3. Descrizione ad alto livello: analyze this
49
una semplice traduzione di nomi più opportuni aggiustamenti. Altri aspetti, riportati
di seguito, hanno richiesto una gestione più complessa:
dimensioni: SVG e VML trattano i valori delle dimensioni in modo diverso. Tutti i
valori possono essere espressi con unità di misura oppure senza, in quest’ultimo
vengono considerati in pixel. In SVG, tranne i valori del primo elemento svg,
che servono per dimensionare la figura e specificare il sistema di coordinate (con
l’attributo viewBox), tutti i valori vengono processati nel seguente modo:
1. vengono convertiti dal valore con unità di misura al valore senza. Ad
esempio: 10cm viene convertito in 354 (che rappresenta il valore in pixel).
2. il valore ottenuto viene rappresentato in proporzione al sistema di coordinate utilizzato.
3. se all’interno di un elemento contenitore che definisce un sistema di coordinate, è presente un altro elemento con tali caratteristiche, gli elementi
successivi saranno influenzati da entrambi gli elementi.
VML differisce da SVG per due questioni:
1. i valori espressi con l’unità di misura, vengono convertiti con un’altra
proporzione.
2. alcuni attributi (stroke-width, font-size) non vengono influenzati dal sistema di coordinate.
Per queste ragioni, durante la traduzione bisogna forzare una conversione dei
valori e per alcuni attributi bisogna calcolare il valore scalato in base ai vari
sistemi di coordinate definiti.
gestione style: in SVG molte proprietà possono essere definite tramite l’attributo o
l’elemento style, con opportuni selettori (vedi [BWLJ98]). Anche VML ammette la gestione di style, tuttavia i nomi delle proprietà differiscono tra i due
linguaggi. Le proprietà definibili in style, sono principalmente quelle riguardanti
50
i testi (font-size, ecc.) e riguardanti i colori (fill, stroke, ecc.). Queste caratteristiche vengono gestite ad hoc in quanto VML non ammette ereditarietà: per ogni
elemento vengono cercate le varie proprietà nel seguente ordine:
1. viene cercato il corrispondente attributo all’interno dell’elemento stesso;
2. si controlla il contenuto di un eventuale attributo style;
3. in base ai valori degli attributi id e class, oppure basandosi sul nome dell’elemento, si cercano le proprietà all’interno di elementi style, controllandone i selettori;
4. per le proprietà mancanti si ripetono i primi tre passi per gli elementi ancestor, finché non si trovano tutte le caratteristiche o non si giunga alla radice
del documento. In quest’ultimo caso le proprietà si impostano con i valori
di default.
Di seguito viene mostrato un esempio, semplificato, su come vengono gestite le
varie proprietà:
SVG:
<style type="text/css">
<![CDATA[
rect {stroke: blue; stroke-width: 3;}
.classe {fill:red; fill-opacity: 1;}
]]>
</style>
<g fill-opacity="0.5" stroke-opacity="0.3"
stroke-width="5" fill="blue">
<rect class="classe"
x="300" y="100" width="400" height="200"
style="fill-opacity: 0.7;"
stroke="black" />
</g>
Capitolo 3. Descrizione ad alto livello: analyze this
51
VML:
<v:group ...>
<v:rect style="left:300; top:100;
width:400; height:200;"
class="classe">
<v:stroke color="black" opacity="0.3" width="3" />
<v:fill color="red" opacity="0.7" />
</v:rect>
</v:group>
path: entrambi i linguaggi hanno un elemento per definire i path. Questi sono espressi
nella forma:
comando valori
in cui comando rappresenta il tipo di percorso (linea retta, curva, arco, ecc.) e
valori rappresentano i punti o i parametri per disegnare la linea. Sfortunatamente
i due formati utilizzano una sintassi diversa (diverso nome del comando o diversa
gestione dei valori) e dal momento che sono memorizzati in un attributo, cioè in
una stringa di testo, la loro estrazione e traduzione risulta piuttosto difficile e non
sempre realizzabile. Comunque sono stati tradotti il maggior numero possibile
di path, mentre i restanti sono stati approssimati. Ad esempio, il seguente path:
M 0,0 L 100,200 C 100,100 250,100 250,200
S 400,300 400,200
tramite M viene effettuato uno spostamento al punto (0,0), con L viene tracciata
una linea, con C, una curva di Bézier, con S, viene tracciata una seconda curva
basandosi sui valori della prima curva. I primi tre comandi hanno una corrispondenza in VML, S no. Per tradurre quest’ultimo comando si dovrebbero prendere
il terzultimo e quartultimo valore della curva precedente (se è presente una curva precedente); vista la complessità di queste estrazioni, oltre al fatto che non si
può sapere a priori se il comando S segue il comando C, la gestione viene approssimata, prendendo gli ultimi due valori del comando precedente. Il risultato
della traduzione è il seguente:
52
m 100 200 C 100,100 250,100 250,200
C 250 200 400,300 400,200 e
Graficamente il risultato è il seguente (figura 3.1):
Figura 3.1: path
testi: in SVG è presente un elemento (text) per definire i testi, al suo interno può
contentere altri elementi (tspan, tref, textPath) per rappresentare e posizionare in
modo diverso porzioni di testo. Ad esempio:
<text x="200" y="150" fill="blue" >
You are
<tspan dy="-20" fill="red">not</tspan>
a banana.
</text>
il risultato è espresso dalla figura 3.2.
Figura 3.2: text con tspan
Capitolo 3. Descrizione ad alto livello: analyze this
53
In VML i testi si possono esprimere in due modi: o lungo un path, oppure testi
semplici in sintassi HTML. Quindi per effettuare una traduzione corretta, la
soluzione adottata prevede di suddividere il testo in tante parti (ogni porzione
di text prima e dopo un elemento ed il testo degli altri elementi) e creare un
path per rappresentare ognuna di esse. Per tradurre l’esempio precedente, l’applicazione crea tre path, due per rappresentare il testo prima e dopo l’elemento
tspan e un altro per rappresentare il testo di tspan.
trasformazioni: in SVG è presente un attributo che permette di effettuare trasformazioni quali traslazioni, rotazioni o cambiamenti di scala. In VML non è presente una tale caratteristica. Per realizzare la conversione, in presenza di ogni
attributo di trasformazione, viene creato un elemento contenitore (un gruppo)
per impostare la trasformazione.
Ad esempio, per scalare (dimezzare) un rettangolo, si crea un gruppo, impostando le coordinate col doppio di quelle definite, in modo che la figura inserita
all’interno risulti dimezzata, pur esprimendo le stesse dimensioni. Di seguito
riportiamo un frammento SVG e la corrispondente traduzione VML.
SVG:
<svg width="14cm" height="14cm" viewBox="0 0 2400 2400">
<rect transform="scale(0.5)"
x="300" y="100" width="400" height="200"
stroke="black" fill="green" />
</svg>
VML:
<v:group style="left:0; top:0; width:14cm; height:14cm;"
coordorigin="0 0" coordsize="2400 2400">
<v:group style="left:0; top:0; width:2400; height:400"
coordorigin="0 0" coordsize="4800 4800">
<v:rect style="left:300; top:100;
width:400; height:200;">
54
<v:stroke on="true" color="black" />
<v:fill on="true" color="black"/>
</v:rect>
</v:group>
</v:group>
use – defs: SVG presenta un elemento contenitore (defs) per definire elementi da richiamare in seguito nel documento, richiamati tramite l’elemento use. Il codice
seguente mostra come possano essere usati questi due elementi per definire, ad
esempio, due rettangoli con dimensioni uguali ma colori diversi:
<defs>
<rect id="MyRect" width="100" height="50" />
</defs>
...
<use x="20" y="10"
xlink:href="#MyRect"
fill="green" />
<use x="20" y="100"
xlink:href="#MyRect"
fill="red" />
In VML è presente un elemento analogo (shapetype), richiamato dall’elemento
shape, tuttavia non supporta tutti gli elementi. Per esempio in shapetype non
si può definire un rettangolo, o qualsiasi altra figura predefinita. Quindi, per la
gestione, si ignorano gli elementi defs e, ad ogni use, si va a prelevare l’elemento riferito. Questo comporta una ridondanza di codice, ma pare essere l’unica
soluzione possibile.
Per una maggiore descrizione su questa traduzione si rimanda alla sezione 4.1.
Capitolo 3. Descrizione ad alto livello: analyze this
55
E SEMPI
Sono presentati due esempi che mostrano sia le potenzialità, sia alcuni limiti del convertitore.
Il primo esempio (figura 3.3 e conversione in figura 3.4) mostra trasformazioni
(rotazione dei rettangoli e ridimensionamento delle stelle), gestione dei gradienti, sfumature (gestite tramite opacità), testi inseriti in path e testi con spostamenti.
Nel secondo esempio (figura 3.5 e conversione in figura 3.6) sono mostrate alcune
figura di base (nella griglia), dei testi con rotazioni, inseriti in path e testi con una
diversa gestione di colori e dimensioni (utilizzando tspan). Inoltre sono mostrati numerosi path, in cui si possono vedere alcune differenze di rappresentazione, dovute ad
approssimazioni.
56
Figura 3.3: Esempio SVG 1
Figura 3.4: Conversione in VML della figura 3.3
Capitolo 3. Descrizione ad alto livello: analyze this
Figura 3.5: Esempio SVG 2
Figura 3.6: Conversione in VML della figura 3.5
57
58
P ROBLEMI
E LIMITI
In questa sezione sono riportati i principali problemi di questa traduzione, suddivisi in
tre categorie.
Inizilmente verranno elencate le caratteristiche tradotte mediante approssimazioni;
successivamente si descriveranno le caratteristiche non tradotte per mancanza di una
corrispondenza nell’altro linguaggio.
Infine vengono presentate le principali caratteristiche che non sono state tradotte
per scelta, indipendentemente dal fatto che fossero traducibili o meno. Per realizzare
questo primo convertitore si è dovuto limitare il campo d’azione dei linguaggi, vista la
vastissima gamma di opzioni: è stato deciso di convertire le principali caratteristiche.
Per un elenco più dettagliato si rimanda alle sezioni 4.1.5 e 4.1.6.
I due linguaggi sono molti simili riguardo alla rappresentazione di alcuni oggetti grafici; tuttavia, in alcuni casi, utilizzano una sintassi molto diversa, rendendo la
traduzione non sempre possibile. In questi casi sono state ottenute delle approssimazioni. Di seguito sono mostrati alcuni elementi tradotti parzialmente:
path: come visto in precedenza alcuni tipi di path non vengono tradotti correttamente
(per problemi di gestione della stringa in cui è contenuto il path), quindi vengono
rappresentati con un’approssimazione. Si rimanda alle figure 3.5 e 3.6 per un
esempio.
testi: nella gestione dei testi sono presenti le maggiori differenze tra i due formati,
rendendo molto complessa la traduzione; questo comporta una rappresentazione
in parte approssimata. Inoltre sono presenti in entrambi i linguaggi alcune proprietà, che pur rappresentando la stessa funzione, vengono gestite in maniera
diversa. Di seguito sono elencati i principali aspetti dei testi gestiti con approssimazioni:
• rappresentando ogni porzione di testo tramite un path si possono presentare
problemi di posizionamento. Questo è dovuto al fatto che per stabilire la
posizione di ogni testo bisogna calcolare il numero di caratteri dei testi
Capitolo 3. Descrizione ad alto livello: analyze this
59
precedenti e la dimensione del font; visto che i caratteri non occupano tutti
lo stesso spazio, risulta di conseguenza un posizionamento approssimato.
• i testi nei path in SVG vengono allineati a sinistra, mentre in VML vengono
allineati al centro del path.
• in SVG, quando si rappresenta un testo in un path, se il testo è più lungo,
viene troncato; in VML esce dal path e viene visualizzato completamente.
Come ricordato in precedenza, quella realizzata è una prima versione del convertitore, per cui non tutte le caratteristiche dei formati sono state considerate; di seguito
sono riportate le principali:
animazioni: non hanno un supporto diretto in VML, per ottenerle si deve integrare il
codice VML con un linguaggio di scripting;
testi: non sono supportate la gestione dell’orientazione del testo e i valori multipli
degli attributi x e y (che permettono di posizionare l’i-esimo carattere nella
specifica coordinata);
filtri: SVG permette una gestione molto approfondita, mentre VML ne ammette solo
un sottoinsieme.
SVG è un linguaggio più completo di VML, in quanto permette di definire varie
caratteristiche non ottenibili nell’altro formato; le principali sono le seguenti:
clipping: in SVG è possibile specificare se far vedere o meno le porzioni di immagine che “escono” dal contenitore (per default non vengono visualizzate). In
VML questa caratteristica non è supportata, in quanto le figure vengono sempre
mostrate nella loro interezza.
attributo preserveAspectRatio: tramite questo attributo è possibile far mantenere le
proporzioni alle figure indipendentemente dal sistema di coordinate definito, oppure specificare come debbano essere scalate. In VML una tale caratteristica non
è definibile.
60
trasformazioni: SVG permette di definire alcuni tipi di trasformazioni non supportate
da VML, quali matrix (specifica la matrice di trasformazione da applicare ai vari
attributi), skewX e skewY (usati per inclinare le immagini, in orizzontale o in
verticale).
Capitolo 3. Descrizione ad alto livello: analyze this
61
3.1.5 Da VML a SVG
In questa sezione verrà illustrata la conversione da VML a SVG, spiegandone brevemente il funzionamento e soffermandosi sulle diversità rispetto all’inversa. Verranno
descritti alcuni punti sottili, riguardo la traduzione di varie caratteristiche; si mostreranno un paio di esempi, per illustrare la potenzialità ed alcune limitazioni del traduttore e verranno descritte le caratteristiche non tradotte perfettamente (dal punto di vista
visivo).
C ONVERSIONE
DI BASE
In VML gli oggetti grafici rappresentati non necessitano di essere definiti all’interno
di un elemento contenitore; tuttavia, tramite l’elemento group è possibile raggruppare vari elementi, definire un opportuno dimensionamento e definire un sistema di
coordinare che influenzi tutti gli oggetti contenuti.
Il linguaggio SVG richiede un elemento contenitore principale, quindi per la traduzione si crea quest’elemento, dimensionato come lo schermo (100%) e senza sistema
di coordinate. Va ricordato che in VML non è possibile specificare la dimensione
dell’immagine, al di fuori della quale eventuali elementi non saranno rappresentati:
questa occuperà, al minimo, tutto lo schermo; eventualmente è possibile far aumentare
la dimensione, specificando oggetti di dimensione maggiore della risoluzione dello
schermo.
Un altro aspetto da considerare è l’attributo style. In VML style ha un ruolo fondamentale poiché contiene tutte le proprietà di posizionamento e dimensionamento. In
SVG le stesse proprietà sono definite tramite un opportuno attributo; quindi per realizzare la conversioni, si devono estrarre tutte le proprietà contenute in style e inserirle
nei corrispondenti attributi.
P UNTI “ SOTTILI ”
In questa sezione vengono presentate le principali caratteristiche di VML che richiedono una traduzione non immediata in SVG, cioè richiedono una gestione particolare
e a volte complessa. In particolare:
62
elementi shape e shapetype: in VML, tramite shapetype, si può definire una figura
da richiamare successivamente nel documento. Tramite shape, si può definire
una figura nuova o riferirsi ad una definita con shapetype; in quest’ultimo caso
verranno ereditati tutti i parametri non specificati.
SVG ha un comportamento opposto rispetto a VML: presenta anch’esso una
carripondenza analoga, ottenuta mediante gli elementi defs e use; in questo
caso però tutte le proprietà definite in use vengono sovrascritte dall’elemento
richiamato. Per questo motivo si gestiscono i riferimenti shape – shapetype onthe-fly: per ogni elemento shape si cercano eventuali elementi riferiti e da questi
si estraggono solo le proprietà che non sono già state definite.
Nell’esempio che segue, viene mostrato questo riferimento; in questo caso viene
creato il path con id path-shape, con riempimento verde e bordi rossi:
<v:shapetype id="s1" strokecolor="red" fillcolor="blue">
<v:path
id="path-shape"
v="m 40,40 L 40,530 530,530 x e"
/>
</v:shapetype>
<v:shape type="#s1" style="width:500; height:500;">
<v:path id="path-shape"
v="m 240,240 L 530,40 530,530 x e"
/>
<v:fill on="true" color="green" />
</v:shape>
fill e stroke: per definire le proprietà di painting VML mette a disposizione degli
attributi (fillcolor, strokecolor, ecc.) e degli elementi (fill, stroke), in cui le
proprietà definite negli elementi hanno priorità. SVG ha a disposizione solo
attributi.
Per effettuare la conversione, per ogni elemento, si cercano eventuali elementi
figli fill e stroke e si impostano le proprietà definite; successivamente si cercano
le proprietà negli attributi dell’elemento, gestendo solo quelle che non sono già
state impostate. Di seguito viene mostrato un esempio di gestione di queste
proprietà:
Capitolo 3. Descrizione ad alto livello: analyze this
63
VML:
<v:rect style="left:300; top:100;
width:400; height:200;"
fillcolor="green"
strokecolor="red"
opacity="0.3">
<v:stroke color="black" weight="10" />
<v:fill color="black" opacity="0.5" />
</v:rect>
SVG:
<rect x="300" y="100"
width="400" height="200"
stroke="black"
stroke-width="10"
stroke-opacity="0.3"
fill="black"
fill-opacity="0.5">
</rect>
Va sottolineato inoltre che in VML le proprietà di painting non vengono mai
ereditate (tranne nella gestione di shape e shapetype).
testi: i testi in VML possono esssere di due tipi: testi inseriti in un path o testi in
formato HTML (elemento textbox). Nel primo caso la traduzione non presenta problemi; nel secondo ogni tag HTML è trasformato in un elemento tspan,
mantenendo la formattazione del testo.
Di seguito viene mostrato un esempio di un testo definito tramite textbox e di
come viene convertito in SVG:
64
VML:
<v:textbox>
<div style="color:green; font-family:Times;
font-size:25;">Parole
<i>in italic</i> <b>in bold</b>
<i style="color:blue;"> ed in blu</i>
</div>
</v:textbox>
SVG:
<text>
<tspan font-size="25" font-family="Times"
fill="green">Parole
<tspan font-style="italic">in italic</tspan>
<tspan font-weight="bold">in bold</tspan>
<tspan fill="blue"
font-style="italic">ed in blu</tspan>
</tspan>
</text>
gestione “defs”: in SVG alcuni elementi (ad esempio i gradienti, oppure i path usati
per rappresentare i testi), vanno definiti all’inizio del documento, in un elemento
defs, per poi essere richiamati opportunamente. VML definisce le stesse caratteristiche direttamente nell’elemento opprotuno (tramite attributi). Per gestire
queste situazioni, la prima operazione, dopo aver creato l’elemento svg contenitore, è la ricerca di tutti i path e tutti i gradienti presenti nel documento VML;
ognuno di questi elementi è inserito in un elemento defs, in modo da consentirne
una gestione corretta.
Capitolo 3. Descrizione ad alto livello: analyze this
65
E SEMPI
A seguire vengono mostrati due esempi riguardanti la conversione, in cui si può notare
la potenza del convertitore ed alcuni limiti.
Il primo esempio (figura 3.7 e conversione in figura 3.8) mostra molti aspetti di
VML: le curve (in alto a sinistra) tradotte tramite path, gli archi (in alto a destra) anch’essi tradotti con path ed in parte approssimati. Vengono mostrate figure ruotate
(rettangoli arrotondati e path) e sfumate (mediante la definizione della proprietà di
opacità); inoltre sono presenti dei testi, sia in sintassi HTML (curve), sia inseriti in
path, in cui appare evidente una differenza da rappresentazione tra i due linguaggi:
VML inserisce il testo nel path, SVG sopra il path.
Nel secondo esempio (figura 3.9 e conversione in figura 3.10), sono state gestite
molte figure tramite l’utilizzo degli elementi shapetype (stelle e fulmini), richiamati
con shape, cambiandogli di dimensione. Sono stati utlizzati numerosi path (casa,
alieno e nuvole). Inoltre sono presenti testi nei path e testo definito tramite textbox
(help!), in cui si può notare una differenza di gestione tra i due linguaggi. Altri aspetti
mostrati sono l’utilizzo di linee tratteggiate e l’uso del gradiente (colore delle nuvole).
66
Figura 3.7: Esempio VML 1
Figura 3.8: Conversione in SVG della figura 3.7
Capitolo 3. Descrizione ad alto livello: analyze this
Figura 3.9: Esempio VML 2
Figura 3.10: Conversione in SVG della figura 3.9
67
68
P ROBLEMI
E LIMITI
La conversione tra VML e SVG non è risultata completa ed esaustiva, in quanto: alcune caratteristiche non sono state tradotte, altre non sono state tradotte correttamente
ma solo approssimate ed altre ancora appaiono intraducibili. Di seguito vengono presentati i principali aspetti che rientrano in queste categorie.
Alcune caratteristiche di VML presentano una gestione diversa rispetto alle corrispondenti caratteristiche di SVG, in questi casi è stata ottenuta una rappresentazione
approssimata:
archi: VML presenta, a differenza di SVG, un elemento specifico per rappresentare
gli archi. La traduzione viene effettuata tramite path, ma per ragioni di complessità della traduzione, gli archi vengono approssimati con quarti di ellisse, cioè
un arco che va da 10 a 140 gradi verrà rappresentato da 0 a 180 gradi;
path: come specificato nella sezione precedente (3.1.4), SVG e VML hanno un modo
diverso di rappresentare alcuni path, rendendo la traduzione molto complessa.
In questi casi si è optato per rappresentarli con approssimazioni;
dimensioni: alcune dimensioni (bordi e testi) non vengono influenzate dal sistema di
coordinate definito. In SVG, anche modificandone i valori, non si riesce a non
far modificare la loro rappresentazione: testi e bordi vengono sempre deformati
(schiacciati o allargati) in base ai valori di dimensionamento specificati.
Come specificato nella sezione precedente, non sono state tradotte tutte le caratteristiche dei due linguaggi (vista la vastità dei loro domini), tra di esse vanno ricordate
le seguenti:
shadow: usato per rappresentare ombreggiature;
testi: in textbox sono rappresentati i testi con sintassi HTML. Sono stati gestiti solo
alcuni tag (quelli principalmente inerenti alla rappresentazione dei testi).
Un esiguo numero di caratteristiche di VML non hanno una controparte nell’altro
formato, di seguito sono mostrate quelle principali:
Capitolo 3. Descrizione ad alto livello: analyze this
69
elemento formulas: usato per definire delle formule matematiche, calcolate sulla base
del valore di opportuni attributi o basandosi sul valore di altre formule;
z-index: usato per specificare l’ordine di visualizzazione delle figure.
Per maggiori dettagli si rimanda alle sezioni 4.2.6 e 4.2.7.
70
3.2 Conversione da SVG e VML a GIF
In questa sezione vengono presentate sia la conversione da SVG a GIF, sia quella
da VML a GIF, in quanto si basano sugli stessi principi. Verrà brevemente descritto il metodo mediante il quale sono state realizzate (utilizzo di funzioni grafiche in
script PHP), successivamente si passerà ad analizzare alcune caratteristiche che hanno
richiesto una trattazione non banale. Infine verranno mostrati alcuni esempi e saranno
elencati i principali problemi di questi convertitori.
3.2.1 Realizzazione
Le conversioni sono state implementate mediante l’utilizzo di due script PHP, utilizzando un’opportuna libreria grafica, contenente funzioni di gestione di immagini.
Tramite queste funzioni è possibile creare un’immagine GIF, specificandone le dimensioni, inizialmente vuota (bianca) e in seguito inserirci oggetti grafici (figure, testi
o altre immagini raster). La parte più complessa riguarda la gestione della dimensione degli oggetti, in quanto vengono influenzati da tutti gli elementi contenitori (svg,
group, ecc.) precedenti. Quindi per ogni dimensione (di una dato elemento) è stato
necessario calcolare i valori di dimensionamento di tutti gli elementi precedenti.
A differenza delle altre conversioni, in cui si riusciva, con semplicità, a gestire la
struttura (l’albero) del documento e si avevano problemi nella gestione di stringhe, in
questa si gestiscono “semplicemente” molti aspetti complessi, ma si perde la struttura
del documento. Come vedremo in dettaglio nel seguito non è banale da un elemento
riferirsi agli elementi precedenti (per gestire, ad esempio, l’ereditarietà).
Passando agli aspetti pratici, sono stati realizzati, come accennato in precedenza,
due script (svg2gif.php e vml2gif.php), ai quali viene passato come argomento l’url di
un file e restituiscono l’immagine GIF.
3.2.2 Metodo di gestione dei documenti
Per realizzare questo convertitore è stato implementato un parser, il quale scandisce
tutto il documento e riconosce ogni elemento mediante l’apertura e la chiusura di
Capitolo 3. Descrizione ad alto livello: analyze this
71
tag. Per ogni oggetto viene tenuta traccia del livello di annidamento e dei parametri
contenuti (rappresentati dai vari attributi o sottoelementi). Risulta molto importante
sapere la posizione in cui si trova un oggetto all’interno della struttura del documento
perché, in questo modo, è possibile posizionarlo correttamente basandosi sugli attributi
di dimensionamento degli elementi precedenti.
Quando si riconosce la fine di un elemento grafico (tag chiuso) si procede alla
sua inclusione nell’immagine GIF. Ogni elemento richiede tre tipi di informazioni per
poter essere rappresentato: colori (per i bordi e per il riempimento), dimensioni e
posizionamento.
Le informazioni sui colori possono essere contenute nell’elemento stesso oppure
vengono ereditate dagli elementi precedenti. Come accennato in precedenza, viene
tenuta traccia di ogni elemento e dei rispettivi attributi; in questo modo è sempre
possibile recuperare informazioni sugli elementi precedenti.
Per effettuare posizionamenti e dimensionamenti, oltre a utilizzare gli attributi dell’elemento considerato, vengono considerati gli opportuni attributi di tutti gli elementi
precedenti, in quanto ogni figura viene influenzata da ogni elemento che la contiene.
Il motivo per cui è stato deciso di utilizzare un parser per gestire i documenti (SVG
e VML) è la propria esperienza nella creazione ed implementazione di parser.
3.2.3 Punti “sottili”
In questa sezione sono elencati gli aspetti della conversione che hanno richiesto una
particolare attenzione.
attributi di painting: per quanto riguarda la gestione di questi attributi (fill, stroke,
ecc.), la conversione da SVG non presenta problemi, in quanto o sono specificati
nell’elemento che viene gestito, oppure vengono ereditati dagli elementi precedenti. VML invece permette di specificare queste proprietà sia tramite attributi,
sia tramite elementi; quindi, quando si gestisce un oggetto, prima si cercano gli
attributi, tenendone traccia, poi, continuando a scorrere il documento, si controlla l’eventuale presenza degli elementi, ed eventualmente si sovrascrivono i valori
72
precedenti. Infine, giunti alla fine dell’oggetto si procede all’effettiva inclusione
nell’immagine GIF.
bordi: nelle funzioni per la gestione delle immagini di PHP, non è possibile specificare la dimensione delle figure, quindi bisogna in qualche modo cercare di
forzarla. Per fare questo, per ogni figura (rettangolo, ellisse o altro), dopo aver
recuperato le informazioni sulla dimensione del bordo, si procede alla creazione
di tante figure sovrapposte, di dimensioni via via crescenti, in modo da simulare
la presenza dello spessore del bordo.
dimensioni: ogni elemento che rappresenta una figura avrà degli attributi per specificarne le dimensioni. Queste dimensioni per essere rappresentate nell’immagine
GIF devono essere scalate in base alle dimensioni degli elementi contenitori ed
ai sistemi di coordinate definiti. Questa conversione è realizzata tramite due pile:
una che memorizza le dimensioni e l’altra il numero di coordinate contenute in
ogni elemento.
Per ogni oggetto si scorrono le due pile, moltiplicando tra loro tutti i rapporti tra
dimensione e scala e gestendo gli opportuni livelli in cui si trovano.
gestione use–defs (SVG): in SVG tramite l’elemento defs si definiscono elementi da
richiamare successivamente. Tramite l’elemento use si richiamano tali elementi.
La gestione di questa connessione avviene nel modo seguente: ogni volta che si
incontra un elemento defs, il suo contenuto viene memorizzato in una struttura e
non viene gestito. Ogni use viene considerato come se fosse un elemento di raggruppamento, quindi si impostano i valori di dimensionamento e posizionamento e si passa a cercare l’elemento riferito all’interno della struttura che mantiene
il contenuto di defs. Quando si trova, viene gestito come se fosse contenuto nel
livello corrente, cioè come se fosse contenuto all’interno di use.
gestione shape–shapetype (VML): in VML shapetype definisce una figura da richiamare successivamente nel documento, shape la richiama ridefinendone eventualmente delle caratteristiche.
Capitolo 3. Descrizione ad alto livello: analyze this
73
La gestione è simile a quella precedente (il contenuto di shapetype viene mantenuto in una struttura e gestito ad ogni riferimento). Tuttavia shape e shapetype
possono definire gli stessi attributi e si deve dare priorità a quelli di shape. Nella
loro gestione, ad ogni shape si memorizzano tutte le caratteristiche in una struttura, specificando se si tratta di valori effettivamente definiti o valori di default.
Giunti alla fine di quest’elemento, si controlla l’eventuale elemento shapetype
riferito, sovrascrivendo quelle proprietà che erano state impostate coi valori di
default.
testi (SVG): i testi in SVG sono contenuti nell’elemento text, il quale a sua volta
può contenere elementi per definire porzioni di testo formattate e posizionate in
maniera diversa.
Per la gestione si utilizza una struttura, in cui vengono memorizzate tutte le
porzioni di testo (contenuto di text prima e dopo gli elementi interni e testo
degli altri elementi), tenendo traccia del loro posizionamento relativo e delle
informazioni sulla rappresentazione (font, colori, ecc.).
Il testo viene effettivamente inserito nell’immagine GIF quando si giunge alla fine dell’elemento text. La gestione è la seguente: ogni porzione di testo
viene posizionata basandosi sulla lunghezza dei testi precedenti (e su eventuali
posizionamenti relativi) e rappresentata mediante gli opportuni colori e font.
Alcune considerazioni aggiuntive:
• elemento tref : quest’elemento permette di richiamare dei testi definiti in
defs. Questa situazione viene trattata come nel caso della gestione di use:
si cerca il testo in defs e lo si considera inserito al posto di tref.
• elemento textPath: nella conversione in GIF non vengono inseriti i testi nei
path, in quanto la gestione sarebbe molto complessa; ci si limita a scriverli
orizzontalmente partendo dal punto iniziale del path.
testi (VML): in VML i testi sono di due tipi:
74
• testi inseriti in path: come nel caso di testi SVG, vengono visualizzati in
orizzontale a partire dal punto di inizio path.
• testi in formato HTML: gestiti come i testi di SVG. Tramite una struttura
si memorizzano le informazioni associate ad ogni porzione di testo (testi
compresi tra due tag) e in fase di visualizzazione si posizionano i testi
considerando la lunghezza dei testi già considerati.
3.2.4 Esempi
In questa sottosezione sono mostrati due esempi di conversione in GIF, che mostrano
tutti gli aspetti visti in precedenza. Il primo realizzato partendo da un file SVG, il secondo con un documento VML.
Il primo esempio (figura 3.11 e conversione in figura 3.12), mostra una conversione
da SVG a GIF. Molti elementi sono tradotti correttamente, i path, le figure predefinite
(ellissi, rettangoli), la gestione delle variazioni di scala (stelle), ottenute mediante vari
elementi use riferiti alla stessa stella, applicandogli delle trasformazioni. I testi (sia
semplici, sia complessi, cioè definiti con l’utilizzo di tspan) sono tradotti correttamente. Infine sono presenti alcune caratteristiche che non trovano una corrispondenza
come l’opacità e le rotazioni.
Il secondo esempio (figura 3.13 e conversione in figura 3.14), mostra una conversione da VML a GIF. Sono presenti numerose caratteristiche tradotte correttamente,
i vari path (gatto e nuvole), gli archi e le curve. È supportata la gestione di shape e
shapetype (è presente una definizione della stella e del fulmine, richiamata più volte).
Inoltre sono mostrate alcune caratteristiche non supportate: i gradienti (nuvole), i testi
nei path (approssimati, inserendo il testo nel punto iniziale dei path) e appare evidente
l’approssimazione dei bordi.
Capitolo 3. Descrizione ad alto livello: analyze this
Figura 3.11: Esempio SVG
Figura 3.12: Conversione in GIF della figura 3.11
75
76
Figura 3.13: Esempio VML
Figura 3.14: Conversione in GIF della figura 3.13
Capitolo 3. Descrizione ad alto livello: analyze this
77
3.2.5 Risultati e problemi
La traduzione in GIF non è da considerarsi completa; molte caratteristiche di SVG
e VML non sono state tradotte, alcune per mancanza di mezzi implementativi (cioè
mancanza di funzioni od opzioni nella libreria grafica di PHP), altre per scelta, altre
ancora sono state approssimate. Nel seguito sono esposte le principali caratteristiche
che non presentano una traduzione precisa in GIF.
Per ragioni di coerenze si è scelto di non tradurre le caratteristiche non supportate
dagli altri convertitori (tra SVG e VML).
Alcune caratteristiche sono state tradotte tramite approssimazioni; le principali
sono le seguenti:
bordi: i bordi sono approssimati mediante sovrapposizione di figure con perimento
sempre maggiore, in modo da simulare lo spessore. Non pare che questa rappresentazione differisca dall’immagine di partenza. Alcune caratteristiche dei
bordi, come l’arrotondamento e la dimensione dei punti di congiunzione non
sono supportate da PHP, quindi tutti i bordi sono rappresentati sempre in maniera
semplice (normali linee rette).
path: quasi tutti i path sono stati rappresentati correttamente, a differenza di alcuni
(archi), che richiedevano una gestione molto complessa, rappresentati mediante
linee rette.
Molte altre caratteristiche non sono state tradotte, in quanto non traducibili, o
perché mancavano le funzioni nella libreria grafica di PHP o perché troppo complesse per essere realizzate. Tra queste le opzioni maggiormente significative senza
traduzione sono le seguenti:
gradienti: non supportati da PHP, viene rappresentato un solo colore del gradiente;
opacità: non supportata da PHP, i colori con specifici attributi di opacità vengono
rappresentati con il colore naturale;
rotazioni: non supportate da PHP, gli elementi che presentano rotazioni, vengono
posizionati nella posizione specificata, senza applicare la rotazione;
78
testi inseriti nei path: la gestione sarebbe troppo complessa (calcolare la dimensione
di ogni testo, calcolare la lunghezza del path! e posizionare ogni carattere nel
testo in un punto equispaziato! del path). I testi nei path sono rappresentati in
orizzontale, posizionati nel punto iniziale del path.
Come visto finora, alcune caratteristiche non sono state tradotte per scelta, altre
per mancanza di mezzi. Comunque va ricordato che quella realizzata è una prima
versione del convertitore, per la quale sono state gestite le funzioni principali dei due
formati, lasciando aperta la strada per eventuali aggiornamenti futuri. A tal proposito
va segnalata la possibilità di estendere il convertitore permettendo la traduzione in altri
formati raster (JPEG e PNG), mediante il semplice cambiamento nomi di funzioni.
3.3 Conversione da GIF a SVG e VML
I formati grafici vettoriali permettono, come visto nell’introduzione, di includere un’immagine raster. Questa è stata la soluzione adottata per la conversione da GIF a SVG e
VML.
Si sarebbe potuto effettuare una traduzione effettiva, creando un documento (SVG
o VML) con un elemento (un rettangolo) per ogni pixel del GIF, come espresso nel
lavoro di [ByrLys04]. Questa soluzione, oltre a non essere elegante e permettere
un’“effettiva” manipolazione del disegno, non è funzionale, a detta degli stessi autori,
perché:
• il file prodotto risulta più grande di quello di partenza, di circa due volte e mezzo;
• il tempo per visualizzare il documento diventava molto elevato.
Capitolo 4
Descrizione a basso livello: into the
code
4.1 Da SVG a VML
In questa sezione vengono descritti i vari elementi e le varie caratteristiche di SVG
e il modo con cui sono state tradotte, ove possibile, in VML. Inizialmente vengono
presentati tutti gli elementi di SVG, descrivendone brevemente il significato e l’utilizzo, passando poi ad illustrare come sono stati convertiti. Successivamente vengono
descritte le altre caratteristiche basilari di SVG: la gestione dei testi, le trasformazioni
(traslazioni, rotazioni, ecc.) e gli attributi più importanti. Alla fine verranno presentate nel dettaglio tutte le caratteristiche non tradotte, suddividendole in due categorie:
quelle che non possono essere convertite in quanto non supportate dall’altro formato e
quelle non convertite per scelta.
Lo scopo di questo capitolo è quello di creare un vero e proprio manuale che permetta, leggendo la sezione di ogni elemento o di ogni proprietà, di capire come è stata
realizzata la traduzione.
79
80
4.1.1 Elementi
In questa sottosezione sono presentati tutti gli elementi di SVG, spiegando il loro
utilizzo e come è avvenuta la conversione in VML.
svg
Nei documenti SVG viene rinchiuso tutto in un elemento svg, quindi nella conversione
si vuole cercare di ottenere un elemento che contenga tutto il resto. In VML ci sono
tre elementi contenitori (group, shape e shapetype), dei quali quello più appropriato
è group; quindi tutto il contenuto del documento SVG verrà inserito (dopo opportune
conversioni) in un elemento group, il quale a sua volta è inserito in un documento
HTML, come unico tag all’interno di body.
La conversione tra i due elementi è pressoché immediata, gli attributi x, y, width
e height vengono tradotti nell’attributo style come valori di left, top, width e height.
L’attributo viewBox (contenente quattro valori) viene suddiviso negli attributi coordorigin e coordsize. Se viewBox non è presente bisogna comunque mettere gli attributi
coordorigin e coordsize, in questo caso vengono impostati coi valori di x, y, width,
height, tradotti in pixel, se non sono presenti, x e y corrispondono a 0 e width e height
a 100%.
Il problema si presenta nella traduzione dell’elemento preserveAspectRatio, che
serve per mantenere le proporzioni delle figure indipendentemente dal sistema di coordinate usato (definito tramite l’attributo viewBox). Cioè, se abbiamo, per esempio, un rettangolo di 400x400 e viewBox definisce le dimensioni con 400x200, senza
PreserveAspectRatio (o meglio, impostato a none) il rettangolo risulterà schiacciato; con PreserveAspectRatio il rettangolo risulterà un vero e proprio quadrato ma di
dimensione 200x200. VML non supporta operazioni di questo tipo.
Inoltre SVG dà la possibilità di fare clipping della figura, cioè tutto quello che
sta al di fuori della regione definita da viewBox non viene visualizzato (salvo diversa
specificazione, attributo overflow); in VML non c’è la possibilità di definire questa
opzione.
Capitolo 4. Descrizione a basso livello: into the code
81
Note: traduzione esaustiva tranne per l’attributo preserveAspectRatio (non traducibile) e la possibilità di fare clipping (anch’essa non traducibile).
g
Quest’elemento rappresenta un contenitore di figure. La traduzione in VML è abbastanza immediata: si usa l’elemento group, che svolge il medesimo ruolo, l’unica
differenza è che mentre g non ha attributi per definire dimensioni e posizioni, l’elemento group richiede (se non sono presenti non visualizza il contenuto!) attributi di
posizionamento e dimensionamento (attributo style con all’interno top, left, width e
height). Per fare questo si impostano i valori di left e top a 0, mentre width e height
si impostano con i valori di viewBox del primo (partendo dall’elemento corrente e
risalendo verso la radice) elemento ancestor che ha tale attributo.
Più complesso è il caso in cui è presente l’attributo transform (che serve per effettuare delle trasformazioni: shift, rotazioni, modifiche della scala, ecc.), tradotto
creando un gruppo per ogni operazione di trasformazione, contenente opportuni valori
di posizionamento, dimensionamento e di coordinate.
defs
Rappresenta un contenitore di elementi che non vengono direttamente visualizzati, ma
che sono richiamati in altre parti del documento (per esempio tramite l’elemento use).
La traduzione (l’unica possibile) consiste nell’ignorare del tutto questo elemento
e nel trattare il suo contenuto man mano che viene richiamato da altri elementi. Per
esempio, quando un elemento use chiama un elemento contenuto in defs, si gestisce
quest’ultimo elemento on-the-fly. Quindi se per esempio si hanno 10 elementi use
che richiamano lo stesso rettangolo, nel documento VML si avranno i 10 elementi use
ognuno dei quali conterrà un elemento rettangolo. Il problema in questa traduzione
viene dai valori ereditati. Se un elemento definito in defs non dichiara alcuni attributi,
di norma questi dovrebbero essere ereditati (dall’attributo chiamante), però usando
questa tecnica, gli elementi ancestor dell’attributo chiamato vengono considerati defs
e i suoi precedenti e non use. Sembra che non ci sia soluzione a questo problema perché
82
quando viene trovato use, si crea un elemento group con sottoelementi che definiscono
le varie proprietà (fill, stroke o altro), poi si cerca il corrispondente elemento riferito e
lo si inserisce all’interno del gruppo. Il problema viene dal fatto che quest’elemento
NON erediterà nessun attributo da group; questa è una caratteristica di VML e credo
non ci si possa fare niente.
In “teoria” un soluzione più semplice e ragionevole ci sarebbe. Si definisce il
contenuto di defs in vari elementi shapetype e quando viene trovato use si crea un
elemento shape che richiama un elemento shapetype. Il problema viene dal fatto che
in defs posso definire di tutto, per esempio un rettangolo (elemento rect), mentre in
shapetype non posso definire tutto ma solo path e testi e quindi questa traduzione non
è fattibile.
Note: non vengono ereditati gli attributi.
symbol
Più o meno svolge lo stesso ruolo di defs, la traduzione è quindi analoga.
use
Quest’elemento è usato per riferirsi ad altri elementi (definiti in defs oppure symbol,
ma potrebbe riferirsi anche a elementi svg).
La traduzione si svolge nel modo seguente (vedi defs): si crea un elemento group
con gli attributi di use (opportunamente tradotti) e si cerca in defs l’elemento con id
uguale all’attributo href. Se viene trovato si chiama il template che gestisce quell’elemento, che quindi verrà inserito all’interno di group. In questo caso non vengono
ereditati i valori da use o dagli elementi precedenti.
desc e title
Rappresentano una descrizione all’interno del documento, non vengono visualizzati,
servono solo per migliorare la leggibilità interna. Title viene tradotto nell’attributo
title. Desc viene trodotto come commento.
Capitolo 4. Descrizione a basso livello: into the code
83
image
Inserisce un’immagine esterna in un rettangolo definito dai suoi attributi. Per la traduzione si crea un elemento image con l’attributo src uguale all’attributo href. Può
contenere l’attributo transform, che viene gestito inserendo l’elemento image in tanti
gruppi quanti sono gli elementi in transform, ognuno opportunamente gestito. Problemi invece riguardano la rappresentazione dell’attributo preserveAspectRatio, che non
appare traducibile.
style (elemento e attributo)
Quest’elemento, usato per definire proprietà di stile, crea grossi problemi, in quanto
definisce le proprietà usando i nomi degli attributi di SVG; quindi, se viene tradotto
in un elemento style con contenuto uguale, gli elementi di VML erediteranno degli
attributi che non saranno utilizzabili. Soltanto una minima parte di attributi ha lo stesso
nome sia per VML che per SVG.
Inoltre alcuni attributi usati da SVG in VML vengono definiti all’interno dell’ attributo style, il che crea ulteriori problemi perché, ereditando gli attributi con style,
questi verranno trattati come attributi separati e quindi VML non sarà in grado di
gestirli.
La soluzione adottata è stata la seguente:
• Per alcune proprietà (fill, stroke, font, ecc.) si cercano i valori prima all’interno
dell’elemento; se non sono presenti si cerca in un eventuale attributo style all’interno dell’elemento. Se non è presente si cerca negli elementi style (controllando
opportunamente i selettori, in base a class, id e al nome dell’elemento) se sono
presenti queste proprietà. In caso negativo vengono cercate ricorsivamente negli
elementi ancestor e se da nessuna parte vengono trovate si impostano coi valori di default. Questa soluzione risolve anche il problema dell’attributo style di
VML, in quanto le proprietà di font vengono cercate e inserite tutte all’interno
dell’attributo style.
• Le altre proprietà per il momento non vengono gestite (non essendo di fondamentale importanza), comunque è possibile effettuare una traduzione analoga.
84
path
Questo elemento crea una figura (disegnando le linee esterne), specificando il perimetro
punto per punto. Anche VML presenta un elemento path con la medesima funzione;
tuttavia la traduzione è molto problematica perché i due elementi hanno due modi in
parte diversi per rappresentare i vari tipi di linee (linee rette, curve, archi, ecc.).
Ogni istruzione è formata da una o più lettere, che rappresentano il tipo di operazione (ad esempio: m, move; a, arc), seguita da un certo insieme di punti (o parametri).
Tutte queste istruzioni sui collegamenti fra punti sono contenute in un attributo (d per
SVG, v per VML), alcune istruzioni sono identiche fra i due linguaggi (m: move,
l: line). Altre, oltre ad avere nomi diversi, trattano gli argomenti in modo diverso,
oppure richiedono un diverso numero di valori, il che rende difficile la traduzione,
non consentendo un semplice cambio di nome per i comandi. Inoltre certe istruzioni
elaborano i valori di punti precedenti (se presenti): quindi, per la traduzione bisogna
effettuare complesse operazioni di estrazione di valori all’interno dell’unica stringa,
rappresentata dal valore dell’attributo.
Più in dettaglio: i path sono definiti in questa forma: “nome-comando insieme-divalori”, per esempio “M 10 10 L 50 10” effettua uno spostamento nel punto 10,10 e
a partire da lı̀ disegna una linea fino al punto 50,10. SVG e VML definiscono molte
istruzioni in maniera simile (stesso nome per l’istruzione o simile, stesso numero di
argomenti), però ci sono alcune istruzioni (abbreviazioni di altre istruzioni) che mette
a disposizione SVG che non hanno una corrispondenza diretta in VML.
Per esempio entrambi i linguaggi hanno il comando c (curve) che richiede sei
parametri e serve per disegnare una curva. SVG ha anche il comando s (smooth curve),
anch’esso serve per disegnare una curva , ma richiede solo quattro punti, gli altri due
vengono presi dalla riflessione degli ultimi due punti della curva precedente (se è presente). In pratica serve per disegnare una seconda curva, risparmiandosi di scrivere
due valori. Per tradurlo in VML bisogna usare il comando c, però bisogna riuscire a
recuperare i due valori mancanti. Questo non è molto semplice perché si dovrebbero
andare a vedere i valori precedenti a c (il terzo e quarto valore di sei) che potrebbero
eventualmente non essere presenti se il comando precedente non è c.
Capitolo 4. Descrizione a basso livello: into the code
85
La traduzione è stata effettuata per il maggior numero possibile di operazioni, alcune sono tradotte correttamente (effettuando vari aggiustamenti), altre invece vengono approssimate (in quanto troppo complesse per venire tradotte o non supportate).
La tabella 4.1 presenta la lista dei comandi di path di SVG e il modo in cui sono
stati tradotti in VML, specificando il nome del comando usato.
Comando
M
m
Z, z
L
l
H
h
V
v
C
c
S
s
Q
q
T
t
A
a
Descrizione
move to (assoluto)
move to (relativo)
close path
line to (assoluto)
line to (relativo)
horizontal line to (assoluto)
horizontal line to (relativo)
vertical line to (assoluto)
vertical line to (relativo)
curve to (assoluto)
curve to (relativo)
smooth curve to (assoluto)
smooth curve to (relativo)
quadratic Bézier curve to (assoluto)
quadratic Bézier curve to (relativo)
smooth quadratic Bézier curveto (assoluto)
smooth quadratic Bézier curveto (relativo)
elliptical arc (assoluto)
elliptical arc (relativo)
Traduzione
corretta (M)
corretta (t)
corretta (x)
corretta (L)
corretta (r)
corretta (L)
corretta (r)
corretta (L)
corretta (r)
corretta (C)
corretta (v)
approssimata (C)
approssimata (v)
approssimata (qb)
approssimata (r)
approssimata (L)
approssimata (r)
approssimata (L)
approssimata (r)
Tabella 4.1: Traduzione path da SVG a VML
Note: traduzione molto complessa (molte operazioni trattano gli argomenti in
maniera diversa e in un diverso numero, richiedendo complesse operazioni di estrazioni di sottostringhe.
figure predefinite: rect, circle, ellipse, line, polyline e polygon
La traduzione di queste figure è abbastanza semplice (tranne nel caso del rettangolo
con angoli arrotondati), in quanto per ogni elemento di SVG c’è un corrispondente
86
elemento di VML, tranne nel caso di polygon e circle, ma questi ultimi vengono
considerati un caso particolare di polyline e ellipse.
Un po’ diverso è il caso di rect. Ci sono due tipi di rettangoli, quello normale
(traduzione immediata) e quello con gli angoli arrotondati. Per quest’ultimo ci sarebbe
una traduzione naturale nell’elemento di VML roundrect, però questo non gestisce la
parte arrotondata nello stesso modo del rect di SVG (roundrect ha un solo attributo che
definisce la percentuale della dimensione del rettangolo da arrotondare, rect invece
definisce due raggi di ellisse per le x e per le y). Quindi per effettuare una traduzione
corretta bisogna disegnare il rettangolo tramite l’elemento path.
Note: tranne per il rettangolo con angoli arrotondati, tradotto tramite path, ogni
elementi di SVG ha un corrispondente elemento in VML.
gradient
Questo elemento serve per creare effetti di sfumature tra vari colori. SVG usa un
elemento per specificare le proprietà di gradient (inserito in defs), mentre VML utilizza alcuni attributi (nell’elemento fill). Innanzi tutto c’è da sottolineare il fatto che
in VML stroke non supporta gradient e quindi non si riesce ad effettuare una conversione. Quindi si può usare il gradiente solo per fill. Anche qui ci sono dei problemi.
I gradienti sono di due tipi: lineare e radiale. Quello lineare non presenta problemi.
Quello radiale (pur essendo supportato da entrambi i linguaggi) presenta delle differenze: SVG lo gestisce con cerchi concentrici, mentre VML con rettangoli concentrici.
Non sembra che si sia modo per avere lo stesso tipo di gradiente. Ultimo problema:
SVG permette di specificare un valore di opacità per ogni colore del gradient, VML
non lo supporta.
Note: ci sono alcune differenze tra i due linguaggi: stroke non supporta gradient
e i gradienti radiali vengono rappresentati in modi diversi.
a
Usato per creare link ipertestuali. Conversione banale, basta un cambio di nome.
Capitolo 4. Descrizione a basso livello: into the code
87
4.1.2 Testi (elementi text, tspan, tref e textpath)
Questi elementi servono per scrivere del testo con vari effetti grafici. Qui appare evidente in maniera maggiore rispetto agli altri elementi la differenza tra SVG e VML.
SVG si sbizzarrisce nel definire tanti possibili effetti per rappresentare testi, mentre
VML definisce due elementi comprensivi di poche opzioni. Quindi per effettuare
una traduzione soddisfacente (una traduzione precisa sembra irrealizzabile), bisogna
suddividere il testo in tante parti e gestirle separatamente.
Nel dettaglio: l’elemento text (senza figli) è tranquillamente traducibile mediante
l’elemento textpath di VML (inserito all’interno di shapetype, che dovrà contenere un
path per rappresentare il testo). Per fare questo bisogna calcolare la lunghezza del
testo, moltiplicare per la dimensione del font e selezionare un path (una linea retta in
questo caso) con questa lunghezza in cui inserire il testo. L’unico problema con questo
elemento viene dagli attributi x e y, che rappresentano le coordinate di posizionamento. Questi attributi possono contenere un singolo valore (semplice) o valori multipli
(ogni valore rappresenta la posizione dell’i-esimo carattere); quest’ultimo caso risulta
problematico e non è stato considerato.
Le cose si complicano se text contiene tspan o tref. Questi elementi rappresentano
dei blocchi di testo da inserire all’interno di text (un paragone si può fare con i tag b e i
di HTML). La differenza tra i due è che il primo definisce al suo interno il testo, mentre
il secondo contiene un link ad un testo definito esternamente (all’interno dell’elemento
defs). Questi elementi (come text) contengono attributi di posizionamento (x e y:
posizionamento assoluto) e attributi di offset (dx e dy: posizionamento relativo alla
posizione corrente del testo). Il problema deriva dal fatto che il testo contenuto in text
viene influenzato da questi elementi: i caratteri posizionati dopo uno di questi elementi
verranno visualizzati (logicamente) successivamente ai caratteri di tspan o tref. Quindi,
per gestire questa situazione, bisogna considerare ogni singola parte del testo, cioè,
ogni frammento di text che precede o segue tspan/tref e ogni testo di tspan e tref.
Ognuna di queste parti viene posizionata considerando la lunghezza e le coordinate
delle parti precedenti. Queste operazioni risultano molto complesse ma tuttavia sono
realizzabili, con risultati soddisfacenti.
88
L’elemento text può inoltre contenere textPath che inserisce un testo all’interno di
un path. Quest’elemento influenza in parte il testo che lo segue, comportandosi come
se ci fosse uno spostamento nel punto 0,0.
Altri problemi derivano dalla gestione degli attributi (font-size, font-family, ecc.).
Molti attributi vengono gestiti molto semplicemente effettuando una traduzione di nomi; alcuni attributi non sono proprio gestiti da VML (font-stretch), altri rivelano problemi imprevisti. Questo è il caso di font-size, apparentemente facile da tradurre, rivela
invece dei problemi (risolvibili). Per quest’attributo non basta fare una copia del valore, bisogna anche effettuare un ridimensionamento, in quanto, in VML, il valore di
quest’attributo non viene influenzato dagli attributi di dimensionamento (width, height
e coordsize).
Un ulteriore problema (forse senza soluzione) deriva dalle decorazioni (sottolineature, ecc.) che pur essendo supportate da entrambi i linguaggi vengono gestite in
maniera diversa.
Con questa gestione del testo (considerare ogni singola parte di text fra i vari
tspan, tref e textpath) la traduzione non viene perfetta ma approssimata perché, per
posizionare ogni porzione di testo, si calcola la lunghezza del testo precedente e si
moltiplica per la dimensione del font, ma a seconda delle varie font-family, la dimensione dei singoli caratteri risulta diversa: una i occupa meno spazio di una m,
quindi calcolando le lunghezze si aggiunge un valore di aggiustamento (il 10% della
stringa), in questo modo, il testo risultate potrà risultare più o meno spaziato ma le
frasi dovrebbero essere equamente spaziate e non sovrapposte.
Note: la traduzione è molto complessa, bisogna gestire ogni singolo pezzo di testo
perdendo la struttura sequenziale del testo originale. Inoltre molte caratteristiche non
sono traducibili.
4.1.3 Trasformazioni (attributo transform)
Quest’attributo serve per effettuare delle trasformazioni che possono essere di sei tipi:
translate, scale, rotate, matrix, skewX e skewY.
In VML non c’è un corrispondente attributo che svolge le medesime funzioni,
Capitolo 4. Descrizione a basso livello: into the code
89
quindi la traduzione viene effettuata creando un gruppo per ogni operazione di trasformazione, impostando opportunamente i suoi parametri e copiando all’interno della
catena di gruppi il contenuto dell’elemento che aveva l’attributo transform. Alcune
trasformazioni sono realizzabili (translate, scale, rotate), altre sembrano irrealizzabili
(matrix, skewX, skewY).
SkewX e skewY rappresentano un’inclinazione delle immagine sull’asse delle x e
delle y: in VML non sembra esserci nessun modo per far inclinare un’immagine.
Matrix specifica una matrice di trasformazione: ogni trasformazione può essere
considerata come una matrice con opportuni valori da applicare ai valori di x e y
dell’elemento da trasformare. Anche questa trasformazione non si riesce a tradurre.
Rotate sembrerebbe facilmente traducibile, in quanto VML ammette l’attributo rotation, quindi potrebbe essere una traduzione 1–1. Invece questa traduzione presenta
dei problemi perché SVG considera la rotazione a partire dall’angolo in alto a sinistra,
mentre VML a partire dal centro della figura; quindi per effettuare la traduzione si
deve prima effettuare uno spostamento, poi effettuare la rotazione. Inoltre SVG permette di specificare il punto rispetto a cui fare la rotazione, ma in questo caso non ci
sono particolari problemi perché questa trasformazione corrisponde ad effettuare: uno
spostamento (translate verso i due punti), la rotazione ed un altro spostamento (rispetto
all’inverso dei dui punti) e quindi ci si riconduce a dover tradurre due spostamenti ed
una rotazione normale.
Scale e translate sono facilmente traducibili (c’è un punto sottile da considerare:
se scale vale 0 tutte le trasformazioni non vengono considerate).
Per translate viene creato un gruppo con i valori di x e y impostati con i due valori
di translate (se non sono presenti valgono 0). Bisogna considerare che i valori vengono sempre considerati in user unit: se un valore presenta l’unità di misura, questa
dev’essere ignorata.
Per convertire scale si crea un gruppo con x e y impostati a 0 e si usano gli attributi
coordorigin (0,0) e coordsize (impostato col valore precedente diviso per il valore di
scale). In questo modo, riducendo o aumentando il numero di coordinate, gli elementi
contenuti all’interno del gruppo verranno automaticamente aumentati o diminuiti proporzionatamente. Un altro aspetto da considerare riguarda i valori di width e height
90
dei vari gruppi, che vanno impostati con i valori di coordsize dell’ultimo elemento ancestor. Quindi se è presente una trasformazione di tipo scale, i valori di width e height
dei gruppi andranno impostati con i nuovi valori di coordsize.
Note: gestite solo alcune trasformazioni (scale, translate e rotate), le altre sono
intraducibili (skewX, skewY, matrix).
4.1.4 Altri attributi
Dimensioni
Tutte le unità di misura (ad eccezione di quelle definite nell’elemento svg) vengono
tradotte, tramite un opportuno template, in user unit (che corrisponderebbero alle
dimensioni in pixel).
Lasciando il valore con la sua unità di misura la visualizzazione risulta errata.
Questo è dovuto alla presenza degli attributi coordsize che fanno in modo che le dimensioni effettive non corrispondano più alle dimensioni reali. Con una conversione
di questo tipo (esprimendo ogni valore in pixel) si risolve il problema, mantenendo le
dimensioni nella misura corretta.
Nel caso siano presenti valori percentuali si cerca il valore a cui corrispondono e
vengono opportunamente tradotti.
Attributi comuni
SVG presenta vari attributi comuni a molti elementi, suddivisi in varie classi. La loro
gestione è molto diversa: per alcuni basta una semplice traduzione di nome, per altri
sembra che una traduzione sia irrealizzabile. Non sono stati gestiti tutti, solo quelli
principali.
Attributi ereditati
Molti attributi di SVG, se non specificati, ereditano il valore dagli elementi ancestor.
Per fare in modo che anche nella traduzione in VML avvenga questo bisogna forzare la
ricerca negli attributi precedenti. Non può essere lasciata automatica (cioè senza met-
Capitolo 4. Descrizione a basso livello: into the code
91
tere l’attributo) perché molte volte gli attributi dei due linguaggi hanno nomi differenti
e perché il valore di default (nel caso che nessun ancestor abbia l’attributo) per i due
linguaggi è diverso. Ci sono attributi che presentano delle difficoltà maggiori (opacity:
il valore dell’attributo è dato dalla moltiplicazione del valore dell’elemento corrente e
tutti gli elementi precedenti), ma tutto sommato la traduzione non presenta difficoltà.
Proprità stoke e fill
Le proprietà per definire il tipo di bordo e il riempimento delle figure sono definite
da una serie di attributi (stroke, fill, stroke-width, stroke-opacity, fill-opacity, ecc.).
VML, dal canto suo, gestisce queste caratteristiche definendo due elementi: stroke e
fill, i quali possono essere utilizzati da quasi tutti gli altri elementi. La traduzione non
comporta grossi problemi, si riduce ad una conversione di nomi; tuttavia ci sono alcuni
intoppi.
Innanzi tutto ci sono caratteristiche che sono supportate solo da SVG (fill-rule: per
specificare il tipo di riempimento in figure definite tramite path). Un altro problema
riguarda le dimensioni di stroke (stroke-width): anche qui, come per le dimensioni del
testo, copiare lo stesso valore di SVG in VML comporta una modifica della dimensione del bordo, quindi bisogna effettuare dei ridimensionamenti. L’ultimo problema
riguarda i valori ereditati (sia per stroke che per fill): se l’elemento è definito all’interno di defs e non presenta proprietà di bordo/riempimento, queste potrebbero essere
definite dall’elemento che lo utilizzerà, però non si riesce a farle ereditare.
Note: traduzione non completa; inoltre non vengono ereditate le propriet à per
elementi richiamti da defs.
Attributi di opacità
Sia SVG che VML prevedono l’utilizzo di uno o più attributi per definire l’opacità
(SVG permette di definire anche se l’opacità si riferisce ai bordi o al riempimento). Per
effettuare la traduzione bisogna considerare tutti gli attributi di opacità e moltiplicarli
per gli attributi degli elementi ancestor, in quanto SVG, a differenza di VML, considera
92
il valore di opacità di ogni elemento come il prodotto delle opacità di tutti gli elementi
precedenti.
4.1.5 Caratteristiche non traducibili
In questa sezione sono presentate tutte le caratteristiche di SVG che non possono essere
tradotte in quanto non supportate da VML.
Elemento pattern
Permette di specificare degli oggetti da utilizzare come riempimento o come bordo. A
differenza di gradient, VML supporta quest’attributo (SVG lo tratta come elemento,
VML come attributo) anche per stroke. La traduzione sembrerebbe fattibile (basta
inserire l’id della figura da visualizzare), ma in realtà sembra non essere supportato, in
quanto VML ammette come pattern solo una figura esterna.
Elemento mask
Definisce una maschera per comporre oggetti col background. Non traducibile.
Filter Effects (elemento filter e elementi associati)
Serve per creare complessi effetti grafici, non supportati da VML. Di seguito viene
riportato l’elenco completo degli elementi: filter, feBlend, feColorMatrix, feComponentTransfer, feComposite, feConvolveMatrix, feDiffuseLighting, feDisplacementMap,
feDistantLight, feFlood, feFuncA, feFuncB, feFuncG, feFuncR, feGaussianBlur, feImage, feMerge, feMergeNode, feMorphology, feOffset, fePointLight, feSpecularLighting, feSpotLight, feTile, feTurbulence.
Elemento script
Non supportato.
Capitolo 4. Descrizione a basso livello: into the code
93
Animazioni (elemento animate ed elementi associati)
Non supportate. Elenco completo degli elementi: animate, animateColor, animateMotion, animateTransform, cursor, mpath, set.
Elemento clipPath
Serve per realizzare un path con cui effettuare un clipping. Non supportato.
Altre
Inoltre non è stato tradotto l’attributo preserveAspectRatio, le priorietà di clipping e le
trasformazioni di tipo matrix, skewX e skewY come descritto in precedenza.
4.1.6 Caratteristiche non tradotte
Vengono di seguito presentate varie caratteristiche di SVG, che essendo traducibili o
meno, non sono state prese in considerazione per questa prima versione del convertitore.
Elemento marker
Quest’elemento inserisce delle figure (definite tramite path) nei vertici di alcuni elementi (path, line, polyline, polygon). Queste figure possono essere inserite nel punto
iniziale, nel punto finale o in tutti i vertici intermedi.
Caratteristiche riguardanti i testi
Per quanto riguarda i testi, sono state considerate e tradotte molte caratteristiche,
tuttavia alcune sono state tralasciate, eccone un elenco:
• elementi per definire/gestire nuovi font (elementi font, glyph e altri);
• orientamento del testo, sono stati gestiti solo i testi scritti in orizzontale;
94
• gestione valori multipli di x, y (anche dx e dy): permettono di posizionare ogni
carattere in base all’i-esimo valore di x e y;
• tspan, tref complessi (con all’interno altri tspan, tref).
Per maggiori informazioni viene presentato un elenco di tutti gli elementi non tradotti:
altGlyph, altGlyphDef, altGlyphItem, definition-src, font, font-face, font-face-format,
font-face-name, font-face-src, font-face-uri, glyph, glyphRef, hkern, missing-glyph,
vkern.
Elemento color-profile
Serve per definire un nuovo profilo per rappresentare un colore.
Elemento foreignObject
Serve per includere un oggetto esterno.
Elemento metadata
Serve per includere metadati.
Elemento switch
Serve per specificare un rappresentazione alternativa a seconda della capacità di un
dato user agent.
Capitolo 4. Descrizione a basso livello: into the code
95
4.2 Da VML a SVG
In questa sezione viene descritta la struttura (e gli elementi) di VML e il modo con
cui è stata tradotta in SVG. Come per la conversione precedente, questo sottocapitolo
è stato organizzato in forma di manuale. Vengono descritto tutti gli elementi di VML,
specificando come sono stati convertiti; si passa poi a descrivere alcuni aspetti particolari (ad esempio la gestione di defs) ed i principali attributi. Infine si analizzeranno le
caratteristiche che non sono state tradotte.
Innanzi tutto va sottolineato che un documento VML vero e proprio non esiste,
il codice VML (cioè i tag) è inserito all’interno di un documento HTML, usando un
apposito namespace. SVG invece è un tipo di documento XML vero e proprio, in cui
tutto il contenuto è racchiuso in un elemento svg.
Per la conversione sono stati esclusi tutti i tag di HTML, in quanto non fanno parte
della vera e propria “grafica” del documento e per effettuare una traduzione completa si
dovrebbe (o potrebbe) creare un nuovo documento HTML, con la parte HTML identica
e sostituendo alla parte VML un tag object che include un documento SVG.
Nella conversione per prima cosa è stato creato un elemento svg (contenitore) con
dimensioni pari allo schermo (width e height impostati a 100%) che conterrà tutti gli
altri elementi grafici. Questa soluzione si è resa necessaria per due motivi:
• Il primo consiste nel fatto che SVG richiede che tutto il contenuto sia raggruppato all’interno di uno o più tag svg, mentre VML non ha un tag contenitore obbligatorio, quindi si deve forzare in qualche modo la creazione di questo elemento.
Per esempio, se il documento VML conterrà un solo elemento rect, la traduzione
“naturale” creerebbe un documento SVG con un solo elemento rect senza creare
il “contenitore” svg e quindi il rettangolo non verràebbe visualizzato).
• Il secondo motivo riguarda l’uso dell’elemento defs. Quest’elemento (di SVG)
rappresenta un contenitore che contiene tutti quegli elementi che saranno richiamati più volte nel documento (il suo contenuto non viene visualizzato direttamente, può solo essere richiamato).
Quest’elemento viene posto all’interno di questo primo tag svg, in modo che il
96
suo contenuto possa essere tranquillamente richiamato da ogni altro elemento.
Senza questa soluzione si dovrebbero creare tanti elementi defs, i quali probabilmente conterrebbero gli stessi elementi, portando ad una ripetizione, poco
elegante, del codice.
4.2.1 Elementi
In questa sezione vengono descritti tutti gli elementi di VML ed il modo in cui sono
stati convertiti in SVG.
group
Quest’elemento rappresenta un contenitore, cioè può contenere qualsiasi altro elemento. La traduzione naturale in SVG sarebbe tramite l’elemento g (anch’esso rappresenta
un gruppo), tuttavia non è possibile per alcune piccole differenze. L’elemento group
può (anzi deve) contenere degli attributi di posizionamento e dimensionamento (top,
left, width e height), se non sono presenti il contenuto non verrà visualizzato; nell’elemento g di SVG invece attributi di posizionamento/dimensionamento non sono
ammessi.
Inoltre group può contenere gli attributi coordorigin e coordsize per ridimensionare il suo contenuto. In SVG questi si traducono con l’attributo viewBox, ma anche
in questo caso l’elemento g non lo supporta. Quindi group è stato tradotto con un
elemento svg, che in linea di principio (ma anche in pratica) svolge le stesse funzioni
(cioè di contenitore).
path (elemento ed attributo)
Quest’elemento può essere presente solo in shape o shapetype e contiene un path
che può essere visualizzato direttamente o usato per rappresentare un testo. Oltre a
quest’elemento shape e shapetype possono definire l’attributo path che contiene anch’esso un path. La differenza tra l’utilizzo dei due è che l’elemento path permette di
definire più caratteristiche.
Capitolo 4. Descrizione a basso livello: into the code
97
La traduzione è abbastanza naturale: si utilizza l’elemento path di SVG che presenta le medesime caratteristiche. Un problema è dovuto al fatto che utilizzano una
diversa notazione per rappresentare i vari tipi di linee, non sempre traducibile mediante
un cambio del nome del comando.
• Sintassi dei path: i path sono espressi mediante un nome di comando seguito
da uno o più punti. Per esempio: “M 0,0” si sposta nel punto 0,0 “L 10,10”
crea una linea dal punto corrente fino al punto specificato (da 0,0 a 10,10), “L
10,10, 20,20”, crea due linee una dal punto corrente a 10,10 e una da 10,10 a
20,20. È presente un comando particolare, X, che permette di chiudere il path,
disegnando una linea dall’ultimo punto considerato fino al punto iniziale.
• Traduzione: in SVG i path sono rappresentati alla stessa maniera, molti comandi
hanno la stessa forma e lo stesso nome, altri hanno un nome diverso (per la
traduzione basta una semplice traduzione di lettere). Infine ci sono comandi
che hanno una diversa gestione, cioè utilizzano un diverso numero di punti ed
eventualmente si basano su punti precedenti, o su altre considerazioni. Per alcuni
di questi comandi si è realizzata una traduzione equivalente lavorando un po’ sui
valori del comando. Altri comandi sono stati tradotti con un’approssimazione.
Alcuni non sono traducibili, per esempio nf, ns: servono per segnalare che da
quel punto del path in avanti non bisogna effettuare il riempimento o disegnare
il bordo (non c’è un modo per fare la stessa cosa in SVG).
L’elemento path inoltre presenta vari attributi (alcuni per segnalare se visualizzare
il testo o il path, altri per impostare il rettangolo in cui inserire la textbox). Ci sono
alcuni attributi che non sono stati gestiti (per esempio l’inserimento di frecce nel path),
comunque non di fondamentale importanza.
La tabella 4.2 mostra l’elenco dei vari comandi ammessi da VML per rappresentare
dei path e la corrispondente traduzione in SVG, specificando se è stata realizzata
correttamente o approssimata e il nome del comando usato.
Note:
• alcuni path tradotti con approssimazioni, alcune caratteristiche non traducibili;
98
Comando
m
t
l
r
c
v
x
e
ae
al
at
ar
wa
wr
qx
qy
nf
ns
Descrizione
move to (assoluto)
move to (relativo)
line to (assoluto)
line to (relativo)
curve to (assoluto)
curve to (relativo)
close path
end path
angle ellipse to
angle ellipse
arc to
arc
clockwise arc to
clockwise arc
elliptical qaudrant x
elliptical qaudrant y
no fill
no stroke
Traduzione
corretta (M)
corretta (m)
corretta (L)
corretta (l)
corretta (C)
corretta (c)
corretta (Z)
corretta ( )
approssimata (L)
approssimata (M)
approssimata (l+l+l+l+l)
approssimata (m+l+l+l+l)
approssimata (l+l+l+l+l)
approssimata (m+l+l+l+l)
approssimata (Q)
approssimata (Q)
non supportata
non supportata
Tabella 4.2: Traduzione path da SVG a VML
• non tutti gli attributi tradotti/traducibili.
fill e stroke (elementi e attributi)
In VML ci sono due elementi (fill e stroke) per specificare le proprietà del riempimento
e del bordo delle figure (oltre all’utilizzo dei semplici attributi fill e stroke). In presenza
sia dell’elemento che dell’attributo corrispondente, ad esempio:
<rect fillcolor="black">
<fill color="red" />
</rect>
ha la precedenza l’elemento, che sovrascriverà le proprietà specificate in precedenza (nell’esempio il rettangolo viene riempito di rosso). In SVG ci sono solo gli attributi
fill e stroke.
Capitolo 4. Descrizione a basso livello: into the code
99
La rraduzione si svolge nel modo seguente: per ogni elemento si impostano le
proprietà di painting cercando prima gli elementi fill e stroke. Se non ci sono si cercano
gli attributi all’interno dell’elemento; se neanch’essi sono presenti si impostano le
proprietà di default.
Da notare che non si cercano queste proprietà negli elementi precedenti perché
in VML non c’è nessun modo di far ereditare questi valori (ogni elemento non può
“passare” questi valori ai figli, eccezion fatta per shapetype–shape, che prevedono una
gestione ad hoc).
Questi due elementi presentano vari attributi (per rappresentare semplici colori,
gradienti e altro) di cui è stata gestita la maggior parte, tralasciandone alcuni di dubbia
traducibilità.
Note: traduzione non completa ma abbastanza esaustiva.
textbox
Quest’elemento può essere contenuto all’interno di shape o shapetype e serve per inserire del testo. Il contenuto di questo elemento può essere testo semplice oppure
testi inserito in tag HTML. La “scatola” in cui viene rappresentato il testo è definita
dall’attributo textboxrect espresso all’interno di un elemento path (figlio di shape o
shapetype).
La traduzione di quest’elemento è semplificata, in quanto non vengono gestiti tutti
i tag HTML (per esempio possono essere definite delle tabelle, ma quest’opzione è
molto difficile da rappresentare in SVG, se non impossibile). Sono stati considerati
gli elementi in qualche modo riferiti al testo; quindi sono stati tradotti i tag b ed i
che hanno un ruolo importante per quanto riguarda il testo e l’attributo style, che anch’esso influisce la rappresentazione del testo. Oltre a questi viene gestito il tag id per
effettuare collegamenti ipertestuali.
Note: textbox richiederebbe una gestione di HTML, fatta solo in parte.
100
textpath
Quest’elemento può essere contenuto all’interno di shape o shapetype e serve per inserire un testo all’interno di un path. Per poter essere rappresentato serve all’interno
dell’elemento path (figlio di shape o shapetype) l’attributo textpathok impostato a true:
in questo modo non viene visualizzato il path e si visualizza il testo.
La traduzione viene effettuata mediante un elemento textpath (contenuto all’interno di un elemento text), quest’elemento contiene un attributo (href) per riferirsi
al path. Questo path, come specificato in precedenza, viene inserito nell’elemento
defs. Textpath presenta varie caratteristiche per la rappresentazione del testo, come
il ridimensionamento del testo per inserirlo completamente nel path (si rimpiccolisce
il testo dimensionandolo in base alla lunghezza del path): questa caratteristica non è
traducibile in SVG.
Inoltre textpath, tramite l’attributo style, permette di definire varie proprietà sul
testo: font-style, font-family, ecc. Di queste sono state considerate solo quelle fondamentali, tralasciandone alcune di minor importanza (e forse non gestibili).
Problemi con la traduzione:
• in SVG il testo viene deformato in base al valore di viewbox, in VML il testo non
viene condizionato da coordsize;
• il testo nei path, in SVG viene allineato a sinistra, in VML viene centrato nel
path;
• textpath: in VML se il testo è più lungo del path, viene visualizzato “fuori”,
mentre in SVG viene troncato;
• non tradotte tutte le proprietà (quelle fondamentali si).
imagedata e image
L’elemento imagedata serve per inserire un’immagine esterna. Può essere contenuto
solo all’interno di shape o shapetype. Si traduce con l’elemento image di SVG che
serve anch’esso per inserire immagini esterne.
Capitolo 4. Descrizione a basso livello: into the code
101
L’elemento image, svolge lo stesso ruolo, solo che viene inserito esternamente a
shape/shapetype. La traduzione si effettua anche in questo caso con l’elemento image.
Note: image e imagedata supportano molti attributi per la definizione della figura
(contrasto, luminosità, scala di grigi, ecc.) che non sono considerati nella traduzione.
Figure predefinite: rect, roundrect, line, polyline, curve, oval e arc
Questi elementi sono banalmente traducibili in corrispondenti elementi SVG, con alcune eccezioni. Per gli elementi curve e arc non ci sono corrispondenti elementi,
quindi vengono rappresentati creando un path.
Da notare che arc permette di definire l’angolo di inizio e di fine dell’arco, mentre
(per semplicità) il path creato da SVG può essere rappresentato solo mediante quarti di
arco. Per esempio: se viene definito un arco che va da 20 a 130 gradi, in SVG si otterrà
lo stesso arco (nel senso di dimensioni) ma verrà rappresentato da 0 a 180 gradi.
Note: traduzione in parte approssimata (arc).
4.2.2 shape – shapetype
L’elemento shape serve per creare delle figure, tramite: path, testi o inserimento di immagini. È l’unico elemento di VML (assieme a shapetype) che supporta i path e i testi.
Inoltre (tramite l’attributo type) si può riferire ad un altro elemento che serve per creare
figure (shapetype), ridefinendone, eventualmente, alcune proprietà e caratteristiche.
L’elemento shapetype è identico a shape tranne per il fatto che il suo contenuto non
viene visualizzato, può essere solo richiamato. Serve per definire figure che saranno
riusate più volte nel documento.
Traduzione:
• Primo approccio:
– La traduzione naturale di questi due elementi è quella di rappresentare
shapetype come un elemento svg inserito all’interno di defs (in modo che
non venga visualizzato e possa essere richiamato); mentre shape viene anch’esso rappresentato con un elemento svg: nel caso si riferisca ad uno
102
shapetype, si utilizza l’elemento use per effettuare il riferimento (use permette di richiamare un elemento definito all’interno di defs).
– Problema: quando sia shape che shapetype definiscono gli stessi elementi o attributi, VML da precedenza alle caratteristiche definite in shape.
Usando la traduzione svg + use, svg definisce le caratteristiche di shape,
use richiama shapetype sovrascrivendo le proprietà già definite, quindi
in questo modo, si da precedenza a shapetype. Quindi pur essendo una
traduzione che rispetta la struttura del documento presenta forti differenze
di rappresentazione e di conseguenza è stata scartata.
• Soluzione finale: si traduce l’elemento shape con un elemento svg, ricercando
eventualmente un elemento shapetype a cui ci si riferisce e combinando appropriatamente le caratteristiche dei due elementi. In questo modo in defs non ci
sarà più la definizione di una figura: ogni shapetype presente è come se venisse
copiato in ogni elemento che lo richiama (in pratica non viene copiato del tutto,
si tengono solo le caratteristiche non presenti nel shape chiamante).
4.2.3 Gestione defs
Come accennato precedentemente, all’interno del primo elemento svg viene creato
l’elemento defs, che conterrà tutti gli elementi richiamati all’interno del documento.
Nel dettaglio:
• Textpath:
– Descrizione: in VML l’elemento textpath (che può essere contenuto esclusivamente in shape o shapetype) rappresenta un testo scritto all’interno di
un path. Questo path verrà determinato dall’ultimo elemento (o attributo)
path contenuto nell’elemento shape (o shapetype).
In SVG, per inserire un testo in path, si utilizza l’elemento textpath (all’interno di un elemento text). Quest’elemento contiene un riferimento ad un
elemento path (che contiene, naturalmente, il path). Il path (visto che è un
Capitolo 4. Descrizione a basso livello: into the code
103
elemento che non verrà rappresentato direttamente ma a cui ci si riferisce)
verrà inserito nell’elemento defs.
– Realizzazione: per ogni elemento textpath contenuto nel documento VML
si crea un elemento path. Innanzi tutto bisogna impostare il valore di id.
Per fare in modo che sia univoco lo si eguaglia al numero di elementi che
precedono textpath, più la stringa path (ad esempio se textpath ha 5 elementi precedenti si avrà id=path5). Poi da textpath si risale al padre. Se ha
l’attributo/elemento path si utilizza questo valore; se è un elemento shape
con attributo type si cerca l’elemento shapetype a cui si riferisce e si cerca
il path in quest’elemento.
– Nota: viene creato un elemento path per ogni shape che presenta l’attributo
path. Inoltre viene creato un elemento path anche per ogni shape con type,
indipendentemente dal fatto che l’elemento shapetype riferito contenga o
meno un attributo path. Quest’ultimo caso serve per gestire i path eventualmente creati in shapetype: in questo modo, però, potrebbero essere definiti
dei path vuoti e inutilizzati, ma è un compromesso ragionevole per essere
sicuri di coprire tutti i casi possibili.
• Gradient:
– Descrizione: in VML l’elemento fill (e solo lui!) permette di definire un
gradiente (mediante l’attributo type impostato a gradient o gradientradial).
Una volta impostato type, vengono considerati altri attributi di fill che
specificano le caratteristiche del gradiente (attributi: angle, colors, color,
color2, focusposition, ecc.).
In SVG il gradiente viene definito tramite gli elementi linearGradient o
radialGradient, che sono esclusivamente definiti all’interno di defs e sono
poi richiamati tramite attributo href.
– Realizzazione: per ogni elemento fill, con attributo type impostato a gradient o gradientradial, viene creato un elemento linearGradient o radialGradient, gestendolo considerando i vari attributi dell’elemento fill. Per l’id si
104
utilizza o l’id presente in fill oppure (come nel caso textpath) si utilizza un
valore univoco dato dal numero di elementi precedenti.
• Pattern: come per gradient, viene creato un elemento pattern per ogni fill che
contengono l’attributo type uguale a frame (caso type = pattern)
• Shapetype: non considerato. Vedi elemento shape.
4.2.4 Trasformazioni
A differenza di SVG, che presenta un attributo per definire le varie trasformazioni,
VML non presenta un tale attributo. Tuttavia anche in VML è possibile effettuare le
principali trasformazioni (rotate, scale e translate).
Per effettuare la rotazione si utilizza la proprietà rotation all’interno di style (che
effettua una rotazione rispetto al centro della figura). La traduzione in questo caso è
realizzabile molto semplicemente: viene creato un gruppo con transform che include
la proprietà rotate. Rotate di SVG ruota la figura rispetto all’angolo in alto a sinistra della figura, quindi si comporta diversamente rispetto a VML, tuttavia supporta
due parametri che indicano il punto rispetto al quale effettuare la rotazione, rendendo
ottenibile una trasformazione equivalente.
Per effettuare operazioni di scale non è presente nessun attributo specifico in VML:
si eseguono semplicemente utilizzando i valori di coordsize per rimpicciolire o ingrandire le figure (equivalenti a viewBox di SVG). Anche per le traslazioni non ci
sono attributi specifici: per effettuarle si crea un gruppo impostando opportunamente i
valori di top e left.
4.2.5 Altri attributi
Dimensioni
Tutte le dimensioni di VML sono gestite in modo appropriato traducendole, senza
unità di misura (e senza percentuali), nei corrispondenti valori.
Capitolo 4. Descrizione a basso livello: into the code
105
Ci sono alcune considerazioni da fare riguardo alla dimensione dei font e dei bordi.
Per quanto riguarda i testi: qualunque sia la dimensione delle figure e i ridimensionamenti effettuati da coordsize, il valore di font-size non ne viene influenzato, è un valore
“assoluto”. Per ottenere una traduzione in SVG, in cui il testo è influenzato dai dimensionamenti, bisogna effettuare varie traduzioni in base alle dimensioni degli elementi
che contengono il testo (considerando gli attributi coordsize, width e height).
Per i bordi il discorso è analogo, quindi avranno la stessa dimensione sia per la
larghezza sia per l’altezza, non facendosi influenzare da coordsize. In SVG, invece,
i bordi possono avere una diversa rappresentazione per l’altezza e per la larghezza in
base ai valori di viewBox: cioè un rettangolo può avere i bordi più larghi ai lati verticali
rispetto a quelli orizzontali. Questa differenza non può venire gestita nella traduzione.
Attributi comuni
Quasi tutti gli elementi di VML presentano una serie di attributi comuni che si dividono
in due categorie: core e shape.
Gli attributi core forniscono informazioni strutturali della figura (dimensionamenti,
scale, ecc.), oltre ad avere attributi quali id, class, href. Questi attributi sono più o meno
traducibili con una nota a parte per style, descritto nel dettaglio in seguito.
Gli attributi shape invece forniscono informazioni sulla resa grafica della figura
(colori interni ed esterni, opacità, ecc.): anche questi sono facilmente traducibili.
Note: questi attributi comuni sono stati tradotti quasi tutti, escludendo alcuni non
di fondamentale importanza.
Attributo style
Molte proprietà in VML sono inserite nell’attributo style (left, top, width, height,
ecc.): per effettuare una corretta traduzione devono essere estratti e convertiti in appropriati attributi. Quest’operazione non presenta grosse difficoltà, tuttavia non tutte
le caratteristiche di style sono state tradotte.
Ci sono alcune proprietà che non sono traducibili (z-index: indica l’ordine delle
106
figure, nel senso di quale visualizzare a livello più alto, quale mettere sotto, ecc.), altre
invece non sono state tradotte in quanto di minore importanza.
Note: non tutte le proprietà tradotte/traducibili.
4.2.6 Caratteristiche non traducibili
VML presenta alcune caratteristiche che non trovano una corrispondeza in SVG, le
quali sono mostrate nel seguito con una breve descrizione.
Elemento fourmulas (e f): non gestibile. Serve per definire delle formule matematiche il cui valore verrà calcolato in base al valore dell’attributo adj. Il problema
non è tanto calcolare le formule, ma riuscire a riferirsi alle formule già definite,
in quanto ogni formula ogni formula può riferirsi a valori di formule precedenti.
Elemento handles (e h): non è da tradurre. Serve per effettuare modifiche dell’immagine all’interno di Office.
Proprietà z-index: serve per definire l’ordine di visualizzazione (sovrapposizione)
degli elementi.
4.2.7 Caratteristiche non tradotte
Di seguito sono elencati gli elementi e gli attributi che non sono stati gestiti (i quali
potrebbero essere traducibili o meno) nella realizzazione del convertitore.
Elemento background: serve per specificare il background dell’immagine.
Elemento shadow: serve per definire degli effetti di ombreggiatura.
Attributi comuni: adj, visibility, z-index, flip, position, chromakey, wrapcoords.
Attributi di path: limo, shadowok, arrowok.
Attributi di stroke: startarrow, startarrowwidth, startarrowlength, endarrow, endarrowwidth, endarrowlength.
Attributi di imagedata e image: gain, blacklevel, gamma, grayscale, bilevel.
Capitolo 4. Descrizione a basso livello: into the code
107
4.3 Da SVG e VML a GIF
Le conversioni da SVG e VML a GIF sono state realizzate mediante l’utilizzo di due
script PHP, sfruttano la libreria grafica di questo linguaggio che mette a disposizione
diverse funzioni per creare e gestire delle immagini raster.
Per ottenere un utilizzo effettivo di questi script (con un pieno supporto di tutti gli
elementi grafici) è necessario installare PHP dalla versione 4.1.0. Inoltre è necessario
installare la libreria GD, nella versione inferiore alla 1.6 (con un supporto esclusivo del
formato GIF), oppure, per supportare anche gli altri formati raster, serve una versione
superiore alla 2.0.28.
Tutto il codice è stato scritto e testato utilizzando la versione 4.3.8 di PHP, con la
libreria GD nella versione 2.0.
4.3.1 Funzioni per le immagini di PHP
In questa sezione verranno descritte brevemente le funzioni di PHP (PHP Hypertext
Preprocessor) utilizzate per la creazione dell’immagine GIF; per maggiori riferimenti
si rimanda a [Bak05].
Per creare una nuova immagine si utilizza la funzione imagecrate, la quale permette
di allocare l’immagine, specificandone le dimensioni e restituisce un identificatore che
verrà utilizzato nelle successive funzioni per inserire le varie figure o caratteristiche
nell’immagine. Per visualizzarla verrà utilizzata la funzione imagegif che visualizza
l’immagine creata (eventualmente la può memorizzare in un file).
All’inizio della gestione della figura viene utilizzata la funzione imagecolorallocate che permette di allocare i colori che saranno utilizzati dalle altre funzioni,
restituendo un identificatore per ogni colore. Questi identificatori verranno usati come
parametri nelle varie funzioni per specificare i colori di riempimento o del bordo delle
figure. Solo i colori allocati possono essere utilizzati.
Per creare le varie figure si utilizzano una serie di funzioni che permettono di
creare rettangoli, disegnandone i bordi (imagerectangle) oppure colorandone la superficie (imagefilledrectangle). Si possono creare ellissi (imageellipse, imagefilledellipse), linee (imageline), archi (imagearc, imagefilledarc) e poligoni (imagepolygon,
108
imagefilledpolygon). A queste funzioni vengono passati come parametri, oltre all’identificatore dell’immagine, i punti in cui disegnare la figura, le dimensioni e i colori
(allocati in precedenza).
Per rappresentare i testi viene utilizzata la funzione imagettftext, che prende in
input le coordinate di posizionamento, il font (passato come url), la dimensione e i
colori.
Infine, le ultime funzioni utilizzate sono quelle per l’inserimento di un’immagine
esterna. Si utilizza la funzione imagecreatefromjpeg (o imagecreatefromgif oppure
imagecreatefrompng) per includere l’immagine, ottenendo un identificatore. Successivamente, tramite imagecopyresized, si inserisce la nuova immagine all’interno di
quella che si sta creando, dimensionandola opportunamente.
4.3.2 Metodo di traduzione
La traduzione si svolge in tre fasi: una prima fase in cui viene modificato il file originario, adattandolo alle proprie esigenze (per esempio si tolgono le parti inutili e si
cambiano i namespace); successivamente si analizza tutto il documento impostando la
figura finale. Infine si procede alla visualizzazione dell’immagine GIF.
La fase fondamentale è la seconda, nella quale viene scandito tutto il file. Per prima
cosa viene cercato il primo elemento, il quale fornirà le informazioni sulla dimensione
dell’immagine. Quindi l’applicazione crea un file GIF vuoto con le dimensioni specificate. Successivamente si effettua il vero e proprio parser del documento: per ogni
elemento incontrato (ad eccezione dei contenitori) viene creato un’opportuna figura
(dimensionata e colorata in base agli specifici attributi) da inserire nel GIF.
La struttura dei documenti viene analizzata gestendo i vari livelli di annidamento
degli elementi (tramite una variabile globale). Ad ogni tag aperto si incrementa il
livello e ad ogni tag chiuso si decrementa. Per ogni livello si mantengono determinate
informazioni (dimensionamenti, colori, font e altro) che potranno essere ereditate dai
livelli successivi.
Per mantenere informazioni sui vari attributi e sul livello in cui sono presenti questi
Capitolo 4. Descrizione a basso livello: into the code
109
attributi si utilizzano una serie di pile, in modo che, in ogni livello di annidamento in
cui ci si trova, si possa sempre recuperare le informazioni sugli elementi ancestor. Le
pile sono della forma: [valore, livello]. Per ogni tag chiuso (</nome> o <nome/>)
oltre a diminuire il livello corrente, vengono svuotati dale pile tutti i valori riferiti a
quel livello.
Un punto sottile della traduzione è rappresentato dalla gestione dei bordi. SVG
e VML permettono di definire lo spessore dei bordi delle figure, mentre con le funzioni di PHP non è possibile farlo: quindi si è utilizzato una specie di trucchetto. Per
rappresentare un bordo di una data dimensione, si disegnano tante figure sovrapposte
di perimetro sempre maggiore (con incrementi di piccole dimensioni) creando cosı̀
l’illusione di un unico perimetro con un bordo di una specifica dimensione.
4.3.3 Traduzione da SVG a GIF
Questa traduzione è stata realizzata mediante l’utilizzo di uno script php (svg2gif.php)
a cui viene passato l’url del file da tradurre e visualizza il GIF creato. In questa sezione
verrà illustrato il funzionamento del programma principale dello script e verranno
descritte le funzioni utilizzate.
MAIN PROGRAM
Viene aperto il file e copiato in un file temporaneo, il quale verrà letto più volte (si
scorre dall’inizio alla fine) effettuando delle modifiche.
prima scansione: vengono gestiti i seguenti aspetti:
• vengono memorizzati eventuali riferimenti a CSS esterni;
• si modifica il file in modo da avere un solo tag per ogni riga;
• si eliminano tutti i tag superflui (dichiarazioni iniziali e commenti su una
riga);
• si elimina l’eventuale namespace di SVG da ogni tag.
110
seconda scansione: vengono gestite le entità (ogni entità viene sostituita con il rispettivo valore).
terza scansione: gestione di eventuali CSS esterni (inseriti nel file).
quarta scansione: si gestisce style. Vengono inserite in ogni elemento con id e class
le proprietà di style opportune (definite nell’elemento style). Vengono gestite
inoltre le proprietà di style che si riferiscono ai nomi degli elementi.
quinta scansione: viene estratto il contenuto dell’attributo style di ogni elemento e
vengono gestiti i colori (si considerano tutti i colori che verranno utilizzati in
modo da poterli allocare).
In seguito viene gestito il file creato. Per prima cosa si impostano (si azzerano)
le variabili globali (le pile): sostanzialmente si inseriscono i valori di default (livello
impostato a –1 e valore uguale al valore di default).
Successivamente si scorrono tutte le righe del file:
• si ci si trova all’interno di un commento, non si considera il contenuto;
• se ci si trova dentro defs, si inserisce il contenuto nella struttura gestione defs;
• in presenza del primo tag svg, si imposta la dimensione dell’immagine GIF, si
allocano tutti i colori (ricavati in precedenza) e si crea l’immagine;
• per ogni riga si invoca la funzione gestione file.
Alla fine del file si visualizza l’immagine creata.
FUNZIONI
Per effettuare la gestione del documento SVG è stata utilizzata una specifica funzione
(gestione file), la quale analizza ogni riga del file ed in base agli elementi ed attributi
incontrati crea i vari oggetti grafici nell’immagine finale.
gestione file: funzione principale, gestisce ogni riga del file. Di seguito vengono
descritti i vari aspetti considerati.
Capitolo 4. Descrizione a basso livello: into the code
111
1. Gestione livello: per ogni tag aperto <nome> si incrementa il livello. Per
ogni tag chiuso </nome> si decrementa. Con tag del tipo <nome /> si incrementa il livello, si gestisce il contenuto e si decrementa. Ogni volta che
si decrementa un livello vengono controllate tutte le pile ed eventualmente
si tolgono dei valori.
2. Variabili perc x, perc y: in base ai precedenti valori di width, height e
viewBox si impostano due variabili che rappresentano i valori a cui eventuali valori espressi in percentuale si riferiscono.
3. Gestione testo: quando si entra in una regione di testo (<text> ...) si
imposta la variabile in text a 1, in modo che non vengano gestite altre
caratteristiche, concentrandosi solo sul testo, cioè non modificando le varie
pile.
• Ogni parte di testo, text semplice: un solo testo. text con tspan e tref:
viene diviso il testo in tante porzioni. Ad esempio:
<text>
parte 1
<tspan> parte 2 </tspan>
parte 3
</text>
In questo caso si avranno tre porzioni di testo. Queste parti non vengono visualizzate al momento, ma alla fine della gestione di text. Vengono gestite singolarmente e memorizzate in un array multidimensionale (che contiene informazioni sul posizionamento, font, colori,
ecc.).
• Quando si giunge alla fine del testo (</text>) si visualizzano tutte le
parti di testo considerate. Ogni parte viene posizionata considerando
la posizione raggiunta dalle parti di testo precedenti. Ad esempio:
<text>
ciao
<tspan> fine </tspan>
</text>
112
viene scritto ciao. Per scrivere fine, ci si sposta dalla posizione di
inizio testo di quattro volte la lunghezza del font di ciao (più eventuali
aggiustamenti, dovuti al fatto che i caratteri sono più o meno spessi,
una i occupa meno spazio di una m).
• Nota: sono gestiti solo tre tipi di font (times, verdana, arial), ognuno
ha un diverso tipo di aggiustamento.
• textpath: si deve cercare il path all’interno di defs (gestione defs: è
presente un array, contenuto defs, che contiene tutte le righe presenti
in defs). Da notare che il path potrebbe non essere contenuto in defs:
in questo caso non viene gestito.
• tref: come per textpath si deve cercare il testo in defs.
4. Gestione viewBox: in presenza di quest’attributo, si aggiornano le variabili (array) per la conversione. Ha quattro valori: i primi due vengono
considerati come se fossero due traslazioni.
5. Gestione transform: si estrae il contenuto e si aggiunge alle variabili di
conversione (translate e scale). Alcune trasformazioni non sono gestibili
(rotate, skewX, skewY e matrix).
6. Valori di font family, font size e text-anchor: vengono mantenute delle pile
anche per questi valori (array multidimensionali, con valore e livello) in
modo da poterli usare come valori “di default” nel caso text non contenga
questi attributi.
7. Fill e stroke: anche per fill e stroke è presente una pila.
8. Figure predefinite: si chiama la funzione predef.
9. x, y, width e height: x e y vengono aggiunte alle traslazioni. Width e height
vengono inserite in una pila (servono per la gestione di viewbox).
10. image: si estrae l’url dell’immagine e in base all’estensione si crea un’immagine opportunamente dimensionata (formati supportati: JPEG, PNG,
GIF) e la si inserisce nel GIF.
11. Gestione use: l’elemento use si riferisce (o almeno cosı̀ dovrebbe) ad un
Capitolo 4. Descrizione a basso livello: into the code
113
elemento contenuto in defs. Per la traduzione si cerca l’elemento in defs
(array contenuto defs). Una volta trovato si gestisce il contenuto di defs
(fino alla fine dell’elemento) come se fosse inserito al posto di use. Per
fare questo si richiama la funzione gestione file per ogni riga di defs.
12. Gestione path: vengono estratti tutti i comandi e i rispettivi valori dall’attributo d di path e si inseriscono in un array multidimensionale, chiamando
poi la funzione visualizza path.
La funzione principale necessità di alcune funzioni di libreria per gestire nello specifico vari aspetti della traduzione. Di seguito sono riportate tutte le funzioni
utilizzate:
carica colori: alloca tutti i colori presenti, nella forma #rrggbb o rgb(rr,gg,bb), e
alloca i principali colori con nome (black, white, ecc.)
converti: converte il valore in base all’unità di misura, restituisce un numero.
conversione: imposta gli attributi di conversione (translate x e y, scale x e y, viewBox
x e y) da applicare in un determinato livello.
Sono presenti tre pile, implementare mediante una serie di array (viewbox x,
viewbox y, n viewbox, viewbox livello, ecc.) che contengono tutti i viewbox,
translate e scale incontrati, più il livello in cui sono state incontrate (inteso come
livello di annidamento dei tag).
Viene invocata in un certo livello e calcola tutte le “trasformazioni” dei livelli
precedenti, cioè quelle da applicare.
gestione angoli: calcola i valori di seno e coseno in base ai valori dei “lati” per rappresentare delle line. Serve per fare in modo che le linee oblique abbiamo uno
spessore equivalente a quelle orizzontali e verticali.
calcola inverso: usata nell’ambito della gestione degli angoli.
bezier3 – cubicbezier: servono per calcolare i punti delle curve di bezier.
114
gestione attributi testo: cerca e imposta gli attributi del testo (font family, font size,
x, y, dx, dy, ecc.)
predef: gestisce le figure predefinite (rect, ellipse, circle, polygon e polyline), considerando i valori di posizionamento (x, y, width, height, ecc.), le conversioni e
i colori (fill e stroke).
gestione roundrect: roundrect viene gestito come un path: si impostano i vari parametri del path e si chiama la funzione per visualizzare il path.
visualizza path: gli viene passato un path (un array multidimensionale con tutti i
comandi del path e i rispettivi valori).
• ogni comando viene tradotto in una serie di punti che poi verranno visualizzati come linee congiunte. Quando nel path si incontra un comando di
inizio nuovo path (M) o si arriva alla fine del path si chiama una funzione
che visualizza il segmento di path fin qui considerato.
• alcuni path vengono approssimati (solo quelli relativi ad arc).
• per le curve si calcolano i punti con le funzioni di bezier.
visualizza segmento path: gli viene passato un path, inteso come semplice array di
punti, e viene visualizzato (in base ai parametri di stroke e fill). Anche qui è
presente la gestione degli angoli.
4.3.4 Traduzione da VML a GIF
Anche questa traduzione è stata realizzata mediante l’utilizzo di uno script PHP a cui
viene passato l’url del file VML e visualizza il GIF creato (vml2gif.php). Di seguito
viene specificato il funzionamento del programma principale e delle varie funzioni
utilizzate.
MAIN PROGRAM
Viene copiato il file passato in input in un file temporaneo (in modo da poterlo modificare) e si scorre interamente più volte.
Capitolo 4. Descrizione a basso livello: into the code
115
prima scansione: si modifica il file in modo da ottenere un tag per ogni riga, questo
per semplificare la gestione successiva. Si tolgono i tag inutili (dichiarazioni
iniziali e commenti su una riga). Viene impostato il namespace dei tag VML (v)
e si inserisce un namespace (x) a tutti gli altri tag (elementi HTML).
seconda scansione: vengono gestiti i colori: si cercano tutti i colori che saranno
utilizzati nel documento in modo da poterli allocare.
Una volta impostato il nuovo file, si inizializzano alcune variabili globali (con i
valori di default) ed eventuali pile.
Successivamente viene eseguito un ciclo per scorrere tutto il file:
• se viene trovato un commento si tralascia;
• se viene trovato un elemento shapetype lo si inserisce (ogni riga) nell’array
contenuto shapetype;
• quando viene incontrato il primo elemento di VML, si cercano gli attributi di
dimensionamento e si crea l’immagine GIF;
• per ogni riga del file viene invocata la funzione gestione file.
Arrivati alla fine del file si visualizza l’immagine GIF creata.
FUNZIONI
In questa sezione vengono descritte tutte le funzioni utilizzate per la creazione dell’immagine GIF. Tramite la funzione gestione file si gestisce tutta la struttura del
documento VML, utilizzando alcune funzioni di libreria descritte successivamente.
gestione file: vengono gestiti gli aspetti di seguito riportati.
1. Livelli: vengono gestiti i livelli, incrementando la variabile livello per ogni tag aperto e decrementandola ad ogni tag chiuso ed eventualmente si
svuotano delle pile.
116
2. Variabili perc x, perc y: queste variabili contengono il valore a cui eventuali valori espressi in percentuale si riferiscono.
3. Elemento group: si gestisce quest’elemento, cercando i valori top e left
all’interno dell’attributo style e l’attributo coordorigin per impostare le
traslazioni. Si cercano poi i valori di width e height e coordsize per impostare le pile per il dimensionamento.
4. Figure predefinite: per ogni figura si chiama la funzione predef che imposta i vari parametri della figura. Quando si trova il tag di fine elemento si
procede alla visualizzazione. Questa procedura è necessaria in quanto gli
elementi delle figure possono contenere gli elementi fill e stroke che reimpostano i colori, eventualmente definiti tramite attributi; quindi solo alla
fine dell’elemento si possono sapere i colori da utilizzare.
Nota: roundrect e curve vengono gestiti come se fossero dei path, chiamando l’opportuna funzione.
5. gestione elementi stroke e fill: per questi elementi vengono gestiti gli opportuni attributi. Si controlla se questi elementi sono contenuti all’interno di una figura predefinita o all’interno di shape, impostando (o meglio
sovrascrivendo) le varie proprietà di painting, visto che i valori degli elementi fill e stroke hanno priorità rispetto ai rispettivi attributi (contenuti
negli elementi ancestor).
6. Gestione elemento shape: vengono impostati i valori di default (in un array
multidimensionale), poi si chiama la funzione per la gestione degli attributi
(shape), e si imposta una variabile contenente l’eventuale attributo type.
Una volta giunti alla fine dell’elemento shape, si gestisce l’eventuale riferimento a shapetype. Poi, in base ai vari attributi ed elementi incontrati
(inseriti nell’array), si procede alla visualizzazione di immagini esterne,
path e testi (definiti sia tramite path, sia tramite textbox).
7. Gestione elemento path: per quest’elemento, si controlla se è contenuto all’interno di shape (può essere solo in shape o shapetype). Si chiama la funzione per la sua gestione (path) che inserisce il path nell’ar-
Capitolo 4. Descrizione a basso livello: into the code
117
ray che mantiene le informazioni su shape, gestendo poi gli altri attributi
(impostazione textboxrect, ecc.).
8. Gestione elemento textpath: anche per quest’elemento si controlla se è
contenuto in shape. Si procede poi alla ricerca e all’impostazione dei valori
riguardanti informazioni sul testo (valore della stringa, font-family, fontsize, ecc.).
9. Gestione elemento textbox: quest’elemento è più complesso da gestire,
in quando può contenere tag HTML. Si suddivide il testo in tante parti
(ogni porzione del testo prima e dopo un tag); per ognuna si impostano i
valori del font e dei colori. Tutte queste informazioni vengono memorizzati
nell’array per la gestione di shape.
10. Gestione elemento imagedata: si ricerca l’url e si memorizza nell’array
shape. L’immagine verrà inserita nella fase di visualizzazione si shape.
11. Gestione elemento image: si preleva l’url e si cerca di creare l’immagine
riferita inserendola nel GIF, opportunamente dimensionata.
Di seguito sono riportate le funzioni di libreria utilizzate dalla funzione principale.
Alcune, essendo identiche nel convertitore da SVG a GIF, sono state semplicemente
elencate.
Funzioni identiche a quelle definite in SVG: carica colori,calcola inverso, converti,
conversione, gestione angoli, bezier3 e cubicbezier.
predef: gestisce le figure predefinite (rect, roundrect, oval, line, polyline, arc, curve
e image). Calcola i valori di dimensionamento (width, height, eventuali punti,
ecc.) e i colori ed imposta i valori nell’array multidimensionale predef.
Nb: non visualizza le figure (a differenza della rispettiva funzione in svg2gif),
imposta solo i parametri.
shape: gestisce l’elemento shape. Anche in questo caso non visualizza la figura
ma imposta i valori dell’array shape. Cerca informazioni di dimensionamento e posizionamento (left, top, width, height, coordorigin e coordsize), gestisce
118
l’eventuale attributo path (chiamando la funzione path) e gestisce i colori (fill e
stroke).
shapetype: svolge un ruolo simile a shape. Questa funzione verrà richiamata tante
volte quanti sono gli elementi shape che si riferiscono a shapetype. Imposta i
valori solo se non sono già stati impostati dal shape che lo ha invocato. Tutto il
contenuto di shapetype dall’inizio dell’elemento alla fine è contenuto in un array (contenuto shapetype), il quale viene considerato completamente. In questa
funzione si impostano esclusivamente i valori della figura che non sono già stati
impostati; eventualmente, se anche in questo elemento non si trovano gli opportuni attributi, si lasciano i valori di default. Ci sono opportuni campi dell’array
shape che segnalano se l’attributo è da aggiornare oppure no (se è affermativo
significa che contiene i valori di default).
path: riceve in input un path (una stringa con nomi di istruzioni e valori) e li suddivide in un array multidimensionale (implementato tramite l’utilizzo di una parte
dell’array shape, in quanto solo shape può contenere dei path).
visualizza path: gestisce il path, traducendo ogni istruzione in un insieme di punti
che verranno utilizzati per rappresentare il path, mediante linee congiunte. Per
ogni comando di inizio path (m o t), fine path (e) o comandi di gestione colore (nf, ns: da questo punto in poi non colorare più l’interno/i bordi del path)
viene visualizzata la porzione di path fin qui considerata, tramite la funzione
visualizza segmento path. I path che rappresentano curve vengono approssimati
tramite le funzioni di bezier. I path vengono tutti rappresentati correttamente
tranne quelli relativi ad archi che vengono approssimati con delle linee.
4.3.5 Caratteristiche non traducibili
Molte caratteristiche di SVG e VML non sono state tradotte per la mancanza di funzioni (o opzioni) nella libreria grafica di PHP. Di seguito viene presentata la lista, tutte
le opzioni si riferiscono sia a SVG che a VML:
• collegamenti ipertestuali;
Capitolo 4. Descrizione a basso livello: into the code
119
• gradienti;
• opacità;
• rotazioni;
• pattern;
• proprietà di stroke: miterlimit, joinstyle, endcap, dashstyle;
• proprietà dei font: font-weight, font-style, text-decoration.
Inoltre non sono state tradotti le seguenti caratteristiche dovute ad un eccessiva
complessità:
• testi inseriti nei path;
• gestione degli archi nei path: approssimati (tuttavia anche nelle trasformazioni
tra SVG e VML vengono rappresentati in maniera approssimata).
4.3.6 Caratteristiche non tradotte
Nelle trasformazioni in GIF non sono state tradotte varie caratteristiche dei linguaggi
VML e SVG, specificatamente tutte quelle escluse dalle traduzioni da SVG a VML e
da VML e SVG, indipendentemente dal fatto che fossero realizzabili o meno.
Per maggiori dettagli sugli elementi ed attributi non tradotti si rimanda alle sezioni
4.1.5 e 4.2.6 (caratteristiche non traducibili) e alle sezioni 4.1.6 e 4.2.7 (caratteristiche
non tradotte).
4.4 Da GIF a SVG e VML
Come specificato in precedenza, vedi 3.3, questa trasformazione non rappresenta una
traduzione vera e propria, ma un’inclusione. Infatti, per realizzare le conversioni da
GIF a SVG e da GIF a VML sono stati realizzati due semplici script PHP (gif2svg.php
120
e gif2vml.php) che creano un nuovo documento (SVG o GIF) che include l’immagine esterna passata in input. Quindi più che di traduzione in questo caso si parla di
inclusione.
Capitolo 5
Conclusioni
Lo scopo di questa tesi è quello di realizzare un convertitore tra formati grafici, nello
specifico tra SVG, VML e GIF.
GIF rappresenta un formato grafico di tipo bitmap, in cui l’immagine è rappresentata mediante correlazione tra colori e pixel. Rappresentazioni di questo tipo presentano alcuni svantaggi, in quanto: si perde di qualità con gli ingrandimenti; non sono
leggibili ed editabili e infine hanno delle dimensioni consistenti che ne rallentano il
caricamento.
I formati vettoriali, tra cui SVG (Scalable Vector Graphics) e VML (Vector Markup
Language), risolvono ampiamente questi problemi. Inoltre, data la loro natura di documenti XML, offrono ulteriori benefici, quali l’integrazione con gli altri standard web
(HTML, CSS, ecc.). Possono essere creati dinamicamente senza troppo carico per i
server, eventualmente mediante generazione da documenti XML o prelevando informazioni da un database. Un altro aspetto molto importante riguarda il testo, il quale
rappresenta effettivamente testo: questo permette di effettuarene selezioni e ricerche.
In quest’ambito si inserisce il convertitore realizzato, motivato dal fatto che VML
non è un formato standard (è rimasto una Submission del W3C), quindi è supportato
solo da pochi sistemi e prodotti (Windows con Internet Explorer). Per questo una
conversione in un formato vettoriale standard, quale SVG, o in un formato raster di
121
122
ampia diffusione, come GIF, risulta utile, per permettere l’utilizzo di figure VML in
molteplici piattaforme.
D’altro canto SVG è un formato abbastanza recente (la versione 1.0 è diventata
Recommendation nel Settembre 2001) e non ha ancora avuto un supporto completo:
ci sono solo pochi browser nativi. Altri richiedono opportuni plug-in, i quali non hanno
ancora una versione ottimale. Quindi risulta utile una sua conversione in GIF.
Gli altri convertitori sono stati realizzati principalmente per ragioni di completezza.
Nei capitoli 3 e 4 sono stati descritti i convertitori realizzati, elencandone le caratteristiche tecniche, la loro filosofia, i pregi e i difetti.
Nella traduzione tra SVG e VML (realizzata mediante due fogli di stile XSLT)
si è cercato di mantenere il più possibile la struttura logica del documento sorgente.
Questo non è stato sempre possibile perché i due formati, per rappresentare vari oggetti
grafici, usano una sintassi molto diversa.
Per molti aspetti, la traduzione è stata realizzata mediante un semplice cambio di
nome (di elementi e attributi). Per altri si sono presentate maggiori difficoltà, dovute
per esempio all’ereditarietà dei valori, o ai dati inseriti in stringhe di testo, per cui il
documento creato risulta in parte approssimato. Bisogna inoltre ricordare che non tutte
le caratteristiche dei due formati sono state prese in considerazione, o per scelta, vista
la vastità dei domini, o per la loro presunta intraducibilità.
I convertitori da SVG e VML a GIF sono stati realizzati con script PHP, sfruttando
un’opportuna libreria grafica, e implementano due parser che, per ogni elemento di
SVG (o VML), creano un elemento grafico nell’immagine GIF.
L’utilizzo di PHP porta alcuni benefici alla gestione dei documenti, come l’estrazione di sottostringhe, ma d’altro canto presenta alcune limitazioni, come la mancate
definizione dell’opacità (trasparenza) e della dimensione dei bordi. Per questo e per altri motivi (l’elevante complessità), alcune caratteristiche sono risultate approssimate,
mentre altre non sono state convertite. Inoltre, è stato deciso di non considerare le
caratteristiche non tradotte nel convertitore tra SVG e VML.
Capitolo 5. Conclusioni
123
Infine l’ultima conversione, da GIF a SVG e VML, è stata realizzata per completezza mediante una semplice inclusione di immagini.
Quella realizzata rappresenta una prima versione del convertitore, nel quale molti
aspetti dei due linguaggi non sono stati considerati.
Eventuali sviluppi di questi convertitori potrebbero seguire una duplice direzione.
Innanzi tutto si potrebbe migliorare la gestione, attualmente approssimata, di alcuni elementi. Esempi di questi elementi sono dati dai path, dei quali è gestita correttamente
la maggior parte dei comandi, mentre altri (in special modo gli archi) sono rappresentati medianti semplici linee rette. Un altro esempio è dato dai testi, i quali, dato l’alto
numero di opzioni disponibili, sono stati gestiti in maniera limitata e semplificata.
Inoltre si potrebbe iniziare a convertire le caratteristiche non tradotte. Tra queste
quelle di maggior rilievo sono i filtri (particolari effetti grafici, che comprendono le
ombreggiature) e le animazioni, le quali richiedono integrazione di VML con linguaggi
di scripting.
Un ulteriore sviluppo può essere la conversione in altri formati raster, quali JPEG
e PNG.
124
Bibliografia
[AAC98] Nabeel Al-Shamma, Robert Ayers, Richard Cohn, et. al., Precision Graphics Markup Language (PGML), Submission to the W3C, 10 Aprile 1998,
http://www.w3.org/TR/1998/NOTE-PGML-19980410.
[Ado01] Adobe Systems Incorporated, Using SVG with Adobe Illustrator, 2001,
http://www.adobe.com/svg/indepth/pdfs/illusag.pdf, ultimo accesso: 30 Gennaio
2005.
[Ado05] Adobe Systems Incorporated, Adobe SVG Zone, 2005,
http://www.adobe.com/svg/, ultimo accesso: 31 Gennaio 2005.
[And04] Ola Andersson, SVGT Animation Authoring, in: SVG Open 2004 Conference and Exhibition, 3rd Annual Conference on Scalable Vector Graphics,
Tokyo, Giappone, 7–10 Settembre 2004.
[Asm03] Paul Asman, Creating SVG Pie Charts through XSLT via a Web Service: An
Experience Report, in: SVG Open 2003 Conference and Exhibition, 2nd Annual Conference on Scalable Vector Graphics, Vancouver, Canada, 13–18 Luglio,
2003.
[Bak05] Stig Sæther Bakken, et al., PHP manual: capitolo 6, sezione 46: Image Funct
ions, http://www.php.net/manual/en/ref.image.php, ultimo accesso: 13 Gennaio
2005.
[BGLS03] Andres Baravalle, Marco Gribaudo, Vitaveska Lanfranchi, Tiziana Sandri, Using SVG and XSLT for graphic representation, in: SVG Open 2003 Con125
126
ference and Exhibition, 2nd Annual Conference on Scalable Vector Graphics,
Vancouver, Canada, 13–18 Luglio, 2003.
[BosWiu99] Bert Bos, Håkon Wium Lie, Cascading Style Sheets, level 1, W3C
Recommendation, 11 Gennaio 1999, http://www.w3.org/TR/REC-CSS1.
[BPSMY04] Tim Bray, Jean Paoli, C. M. Sperberg-McQueen, Eve Maler, François
Yergeau, Extensible Markup Language (XML) 1.0 (Third Edition), W3C
Recommendation, 4 Febraio 2004, http://www.w3.org/TR/REC-xml.
[BuiZim04] Rob Buis, Nikolas Zimmermann, et. al., KSVG: freedom for veKtors,
2004, http://svg.kde.org/, ultimo accesso: 28 Gennaio 2005.
[BWLJ98] Bert Bos, Håkon Wium Lie, Chris Lilley, Ian Jacobs, Cascading Style Sheets, level 2, W3C Recommendation, 12 Maggio 1998,
http://www.w3.org/TR/REC-CSS2.
[ByrLys04] Antoniou Byron, Tsoulos Lysandros, Converting raster images to XML
and SVG , in: SVG Open 2004 Conference and Exhibition, 3rd Annual
Conference on Scalable Vector Graphics, Tokyo, Giappone, 7–10 Settembre
2004.
[Cap03] Tolga Capin (editor), Mobile SVG Profiles: SVG Tiny and SVG Basic , W3C
Recommendation, 14 Gennaio 2003, http://www.w3.org/TR/SVGMobile/.
[Cla99] James Clark (editor), XSL Transformations (XSLT) Version 1.0, W3C
Recommendation, 16 Novembre 1999, http://www.w3.org/TR/xslt.
[Cor03] Corel Corporation, Corel SVG Viewer, 2003,
http://www.smartgraphics.com/Viewer prod info.shtml, ultimo accesso:
28
Gennaio 2005.
[Csi02] Csiro, Csiro SVG Toolkit, 12 Marzo 2002, http://sis.cmis.csiro.au/svg/, ultimo
accesso: 31 Gennaio 2005.
BIBLIOGRAFIA
127
[Dan03] Alex Danilo (editor), SVG Print, W3C Working Draft, 15 Luglio 2003,
http://www.w3.org/TR/SVGPrint/.
[DewHar02] Thomas Deweese, Vincent Hardy, Introduction to the Batik project, in:
SVG Open 2002 Developers Conference, 1st Annual Conference on Scalable
Vector Graphics, Zurigo, Svizzera, 15–17 Luglio 2002.
[Edw02] ElShaddai Edwards, Introduction to Jasc WebDraw, in: SVG Open 2002
Developers Conference, 1st Annual Conference on Scalable Vector Graphics,
Zurigo, Svizzera, 15–17 Luglio 2002.
[Fer01] Jon Ferraiolo (editor), Scalable Vector Graphics (SVG) 1.0 Specification,
W3C Recommendation, 4 Settembre 2001, http://www.w3.org/TR/2001/RECSVG-20010904/.
[FerJunJac03] Jon Ferraiolo, Fujisawa Jun, Dean Jackson (editors), Scalable Vector
Graphics (SVG) 1.1 Specification, W3C Recommendation, 14 Gennaio 2003,
http://www.w3.org/Graphics/SVG.
[FroHar02] Max Froumentin, Vincent Hardy, Using XSLT and SVG together: a survey of case studies, in: SVG Open 2002 Developers Conference, 1st Annual
Conference on Scalable Vector Graphics, Zurigo, Svizzera, 15–17 Luglio 2002.
[GebGal00] John C. Gebhardt, Greg Gallant, Strategies for effective use of intelligent
graphics in Web applications, XML Europe 2000, Parigi, Giugno 2000.
[Gus05] Niklas Gustavsson, et. al., SVG.org, http://svg.org/, ultimo accesso: 10
Febbraio 2005.
[Har04] Elliotte Rusty Harold, The Vector Markup Language, in: XML Bible, Foster
City, CA, IDG Books Worldwide Inc., 1999, pgg 805–831.
[HauWen04] Tobias Hauser, Christian Wenz, SVG Editors: A Survey about the Market
of native SVG Editors, in: SVG Open 2004 Conference and Exhibition, 3rd Annual Conference on Scalable Vector Graphics, Tokyo, Giappone, 7–10 Settembre
2004.
128
[HUNW04] Georg Held, Torsten Ullrich, Andreas Neumann, André M. Winter, Comparing .SWF (ShockWave Flash) and .SVG (Scalable Vector
Graphics) file format specifications , Cartographic Perspectives, 29 Marzo
2004, http://www.carto.net/papers/svg/comparison flash svg/, ultimo accesso: 2
Febbraio 2005.
[Jac04] Dean Jackson (editor), Scalable Vector Graphics (SVG) 1.2, W3C Working
Draft, 27 Ottobre 2004, http://www.w3.org/TR/SVG12/.
[JBMOW03] Benjamin Jung, Jamie Brohan, Richard Maher, Laura O’Shea, Vincent
Wade, Stirring XML: Visualisations in SVG, in: SVG Open 2003 Conference
and Exhibition, 2nd Annual Conference on Scalable Vector Graphics, Vancouver,
Canada, 13–18 Luglio, 2003.
[Jol03] Christophe Jolif, Comparison between XML to SVG Transformation Mechanisms - The GraphML use case, in: SVG Open 2003 Conference and Exhibition,
2nd Annual Conference on Scalable Vector Graphics, Vancouver, Canada, 13–18
Luglio, 2003.
[Kap03] Lauris Kaplinski, Sodipodi - open source native SVG editor for Linux
and Windows , in: SVG Open 2003 Conference and Exhibition, 2nd Annual
Conference on Scalable Vector Graphics, Vancouver, Canada, 13–18 Luglio,
2003.
[KKS04] KK-Software, KVEC - raster to vector, versione 3.20, 9 Gennaio 2005,
http://www.kvec.de/, ultimo accesso: 31 Gennaio 2005.
[Kor02] Thierry Kormann, Developing SVG Applications with Batik, in: SVG
Open 2002 Developers Conference, 1st Annual Conference on Scalable Vector
Graphics, Zurigo, Svizzera, 15–17 Luglio 2002.
[Man02] Philip A. Mansfield, Common graphical object models and how to translate them to SVG, in: SVG Open 2002 Developers Conference, 1st Annual
Conference on Scalable Vector Graphics, Zurigo, Svizzera, 15–17 Luglio 2002.
BIBLIOGRAFIA
129
[ManFul01] Philip A. Mansfield, Darryl W. Fuller, Graphical Stylesheets - Using
XSLT to generate SVG, in: XML Conference and Exposition 2001, 9–14
Dicembre 2001, Walt Disney World Dolphin Hotel, Orlando, Florida, USA.
[MatLeeDis98] Brian Mathews,
Daniel Lee,
Brian Dister,
et al.,
Vector
Markup Language (VML), Submission to the W3C, 13 Maggio 1998,
http://www.w3.org/TR/1998/NOTE-VML-19980513.
[McKGri00] John McKeown, Jane Grimson, SVG: putting XML in the picture, XML
Europe 2000, Parigi, Giugno 2000.
[Mic98a] Microsoft Corporation, Introduction to Vector Markup Language (VML),
16 Novembre 1998,
http://msdn.microsoft.com/library/default.asp?url=/workshop/author/vml/default.asp,
ultimo accesso: 26 Gennaio 2005.
[Mic98b] Microsoft Corporation, Microsoft VML Generator Version 1.0, 1998,
http://msdn.microsoft.com/downloads/samples/internet/vml/vmlgenerator/default.asp,
ultimo accesso: 29 Gennaio 2005.
[Mor04] Brendan J. Morley, A Public Transport Mapping Example Using perl and
mySQL, in: SVG Open 2004 Conference and Exhibition, 3rd Annual Conference
on Scalable Vector Graphics, Tokyo, Giappone, 7–10 Settembre 2004.
[Moz05] The
Mozilla
Organization,
Mozilla
SVG
Project,
2005,
http://www.mozilla.org/projects/svg/, ultimo accesso: 29 Gennaio 2005.
[NeuWin01] Andreas Neumann, Andréas M. Winter, Time for SVG - Towards
high quality interactive Web-Maps, in: Proceedings of the 20th Internationals
Cartographic Congress, Beijing, 2001.
[Php02] phpBB Group, 2001, 2002, SVG Cafe - The Scalable Vector Graphics
Community, http://www.svg-cafe.com/, ultimo accesso: 10 Febbraio 2005.
130
[PMEB01] Steve Probets, Julius Mong, David Evans, David Brailsford, Vector
Graphics: From PostScriptand Flash to SVG, DocEnd, 9-10 Novembre 2001,
Atlanta, Georgia, USA.
[Sia03a] Siame Editions, CR2V - Celinea Raster to Vector converter, 12 Marzo 2003,
http://www.celinea.com/, ultimo accesso: 31 Gennaio 2005.
[Sia03b] Siame Editions, Vector Eye 2.0, Dicembre 2003, http://www.siame.com/,
ultimo accesso: 31 Gennaio 2005.
[Sof02] Software Mechanics , VMLmaker, versione 1.10, 17 Giugno 2002,
http://www.vmlmaker.com/, ultimo accesso: 30 Gennaio 2005.
[Sof04] Software Mechanics, SVGmaker - The SVG Printer Driver, versione 2.01, 18
Novembre 2004, http://www.svgmaker.com/, ultimo accesso: 30 Gennaio 2005.
[Svg05] SVG Open 2005 Conference and Exhibition, http://wiki.svg.org/, ultimo
accesso: 10 Febbraio 2005.
[SVKHKP05] R.G. Steltenpool, S.J. van Tongeren, B.J. Köbben, D.K.J. Heylen, J.W.
Koolwaaij, R. Poortinga, organizzatori, SVG Open 2005 Conference and Exhibition, 4th Annual Conference on Scalable Vector Graphics, Enschede, Paesi Bassi,
15–19 Agosto 2005, http://www.svgopen.org/2005/, ultimo accesso: 2 Febbraio
2005.
[Vat04] Irène Vatton, et. al., Amaya User Manual, Ottobre 2004,
http://www.w3.org/Amaya/User/Manual.html, ultimo accesso: 30 Gennaio 2005.
[Vat05] Irène Vatton, Amaya Overview, 2005,
http://www.w3.org/Amaya/Amaya.html, ultimo accesso: 30 Gennaio 2005.
[Woo98] Lauren Wood (WG Chair), Document Object Model (DOM) Level 1, W3C
Recommendation, 1 Ottobre 1998, http://www.w3.org/TR/REC-DOM-Level-1.
[Zas00] Ilya Zaslavsky, A New Technology for Interactive Online Mapping with Vector
Markup and XML, Cartographic Perspectives, # 37 (Fall 2000), pp. 65–77.