/lenasys/0.1

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/lenasys/0.1

« back to all changes in this revision

Viewing changes to trunk/svg Converter/SVG_TO_CANVAS_III.php

  • Committer: Henrik G.
  • Date: 2013-03-26 23:22:55 UTC
  • Revision ID: henrik.gustavsson@his.se-20130326232255-ik6snyatlbkf3zs1
First seed of Lenasys ... Needs to be Organized Further

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
<?php
 
2
 
 
3
// Version 3.0
 
4
//              Supports the new user interface
 
5
//              Works even without filename or with errors in file name 
 
6
//              Fixed strokes so that strokes are above fills in all cases
 
7
// Version 3.1
 
8
//              Fixed no-fill styles and colored strokes
 
9
//              Fixed drawing of polygons
 
10
//              Fixed inkscape support for styles
 
11
// Version 3.2
 
12
//              Preliminary Support for Gradients
 
13
//              Gradient support for Illustrator (svg1.1 export) and Inkscape
 
14
// Version 3.3
 
15
//              Fix for mixed gradient and non-gradient objects
 
16
//              Fix for all black objects
 
17
//              Radial Gradients added
 
18
//              Transparency added
 
19
//              Ellipse / Circle Support
 
20
//              Rectangle Fix
 
21
// Version 3.4
 
22
//              Support for Circles / Ellipses
 
23
//              Support for Groups
 
24
//    Limited Default Fill 
 
25
// Version 3.5
 
26
//    Fix for stroking of some objects
 
27
//              Stroked text and font
 
28
//    Handler for Bold Oblique Italic and Bold Italic and some other combos. Not all is covered
 
29
// Version 3.6 
 
30
//              Transparency fix for ellipse/circle
 
31
//              Group Start and Group End Handling
 
32
//              Preliminary Clipping Test
 
33
//                              Defs mode handling
 
34
//                              Clippath Translation
 
35
//                              Defs Implementation
 
36
//                                                      Polygon / Polyline etc. 
 
37
//                              Single Object Clip
 
38
//                                                      Rect
 
39
//                              Grouped Object Clip (Not Implemented)
 
40
//        Fix for "Line" Command. "Dog" from wikimedia now works
 
41
//    Fix for SVG_Award Scientific number parsing for dostr loop in polygons and lixnegroups 368.99742,-1.6192e from -1.6192e-006 now makes better string.
 
42
//    Fix for lack of SVG arc command for path - skip operation draw line instead ... Bug: SVG_Award c.fillStyle = '#ffffff'; c.lineWidth = "0.5"; c.moveTo(431.36357,334.73636); c.lineTo(A,60.482193);
 
43
//    Fix for SVG Font Styling using style="" attribute from wikipedia proporcion example file
 
44
//              Fix for SVG Style attribute errors if no ; is found i.e. attribute is last attribute of style string the code now works (untested)
 
45
//              Fix for SVG Font Size Bug - px was replaced with 0 instead of "" meaning that some times 2px would turn to 20
 
46
//              Fix: fontstyle or line style etc missing if style="" is used instead of font attributes. Error produced: fontstyle fontline fontfamily missing line 707-709 / Translate Rotate Scale missing 710-712    among others svg ARC 02  Should work now.
 
47
//              Bug: Empty text in SVG text in proporcion
 
48
//    Bug: If fill is after line, the change of fill is performed after line is drawn. (SVI_CFG from wikipedia and proporcion from wikipedia)
 
49
//              Bug: translate support for groups or individual objects such as proporcion transform="translate(642.5,-1381.291)" or transform="matrix(0.999962,-8.674822e-3,8.674822e-3,0.999962,1115.829,2072.128)" 
 
50
//  
 
51
//-------------------------------------------------------------------------- Next Version Blueprint
 
52
// Version 3.7
 
53
//    Curve Closing (html5)
 
54
//              Support for transformed gradients (??Is this in current version??)
 
55
//              Real Arc Drawing using Complex Math from values, draw arc using math in formula
 
56
 
 
57
$elementcounter=0;
 
58
$graphnodes=array();
 
59
$colorstops=array();
 
60
$clipdefs=array();
 
61
$clippaths=array();
 
62
 
 
63
$fillstyle="none";
 
64
$linestyle="none";
 
65
$opacity="1.0";
 
66
$gradientname="foo";
 
67
 
 
68
$isinkscape=false;
 
69
 
 
70
$stopcounter=0;
 
71
 
 
72
function recurseelement($element){
 
73
                global $elementcounter;
 
74
                global $graphnodes;
 
75
 
 
76
                if($element->getName()=="clipPath"){
 
77
                                        $attrs=$element->attributes();
 
78
                                        $sxe = new SimpleXMLElement("<use id='".$attrs['id']."' />");
 
79
                                        $graphnodes[$elementcounter]=$sxe;
 
80
                                        $elementcounter++;
 
81
                }
 
82
                
 
83
                foreach ($element->children() as $child) {
 
84
                                if($child->getName()=="clipPath"||$child->getName()=="defs"||$child->getName()=="g"||$child->getName()=="linearGradient"||$child->getName()=="radialGradient"){
 
85
 
 
86
                                                // Most others except for clipPath are added
 
87
                                                if($child->getName()=="defs"||$child->getName()=="g"||$child->getName()=="linearGradient"||$child->getName()=="radialGradient"){
 
88
                                                                $graphnodes[$elementcounter]=$child;
 
89
                                                                $elementcounter++;
 
90
                                                }
 
91
                                                recurseelement($child);
 
92
 
 
93
                                }else if($child->getName()=="use"||$child->getName()=="ellipse"||$child->getName()=="circle"||$child->getName()=="stop"||$child->getName()=="polygon"||$child->getName()=="line"||$child->getName()=="polyline"||$child->getName()=="path"||$child->getName()=="rect"||$child->getName()=="text"){
 
94
                                                // Add element to queue
 
95
                                                $graphnodes[$elementcounter]=$child;
 
96
                                                $elementcounter++;
 
97
                                }else{
 
98
                                                echo "//Unknown element: ".$child->getName()."<br>";
 
99
                                }
 
100
                }               
 
101
 
 
102
                if($element->getName()=="g"){
 
103
                                                                        // End of group code
 
104
                                                                        $attrs=$element->attributes();                  
 
105
                                                                        $sxe = new SimpleXMLElement("<eg id='".$attrs['id']."' />");
 
106
                                                                        $graphnodes[$elementcounter]=$sxe;
 
107
                                                                        $elementcounter++;
 
108
                                                
 
109
                }
 
110
 
 
111
                if($element->getName()=="defs"){
 
112
                                                                        $sxe = new SimpleXMLElement("<defsend/>");
 
113
                                                                        $graphnodes[$elementcounter]=$sxe;
 
114
                                                                        $elementcounter++;
 
115
                                                
 
116
                }
 
117
 
 
118
}
 
119
 
 
120
if(isset($_POST['svgname'])){
 
121
 
 
122
                        $svg = simplexml_load_file($_POST['svgname']);
 
123
                        
 
124
                        // Recurse into elements and add to element stack
 
125
                        // its important that we only process hierarchies of g elements and layers
 
126
                        foreach ($svg as $element) {
 
127
                                        if($element->getName()=="clipPath"||$element->getName()=="defs"||$element->getName()=="g"||$element->getName()=="linearGradient"||$element->getName()=="defs"||$element->getName()=="radialGradient"){
 
128
                                                        if($element->getName()=="clipPath"||$element->getName()=="defs"||$element->getName()=="g"||$element->getName()=="linearGradient"||$element->getName()=="radialGradient"){
 
129
                                                                        $graphnodes[$elementcounter]=$element;
 
130
                                                                        $elementcounter++;
 
131
                                                        }
 
132
                                                        recurseelement($element);
 
133
                                        }else if($element->getName()=="use"||$element->getName()=="radialGradient"||$element->getName()=="linearGradient"||$element->getName()=="polygon"||$element->getName()=="line"||$element->getName()=="polyline"||$element->getName()=="path"||$element->getName()=="rect"||$element->getName()=="ellipse"||$element->getName()=="circle"||$element->getName()=="text"){
 
134
                                                        // Add element to queue
 
135
                                                        $graphnodes[$elementcounter]=$element;
 
136
                                                        $elementcounter++;
 
137
                                        }else{
 
138
                                                        echo "//Unknown element: ".$element->getName()."\n";
 
139
                                        }
 
140
                        }
 
141
 
 
142
                        $defsmode=0;
 
143
                        $defsstring="";
 
144
                        $defsid="";
 
145
                        $clipid="";
 
146
                        
 
147
                        // Process elements
 
148
                        foreach ($graphnodes as $graphelement) {
 
149
 
 
150
                                // Clear Line Style and Fill Styles
 
151
                                $fillstyle="none";
 
152
                                $linestyle="none";      
 
153
                                $opacity="1.0";
 
154
                                                        
 
155
                                // For text element get 
 
156
                                if($graphelement->getName()=="text"){
 
157
                                                if(isset($graphelement[0])){
 
158
                                                                $textline=$graphelement[0];
 
159
                                                }
 
160
                                }
 
161
 
 
162
                                // To get ID comment/code
 
163
                                $attrs=$graphelement->attributes();
 
164
                                $xlinkattrs=$graphelement->attributes('http://www.w3.org/1999/xlink');
 
165
 
 
166
                                // For use element get 
 
167
                                if($graphelement->getName()=="use"){
 
168
                                                if(isset($attrs['id'])){
 
169
                                                                // We are in an id use statement
 
170
                                                                $clipid=strval($attrs['id']);
 
171
                                                }else{
 
172
                                                                // We are in the reference use statement
 
173
                                                                $clippaths[$clipid]=substr(strval($xlinkattrs['href']),1);
 
174
                                                }
 
175
                                }
 
176
 
 
177
                                if($graphelement->getName()=="linearGradient"){
 
178
                                                
 
179
                                                if(isset($attrs['id'])){
 
180
                                                                $gradientname=$attrs['id'];
 
181
                                                }
 
182
                                                if(!isset($attrs['x1'])){
 
183
                                                                // Linear Gradient is not complete, this means that it is an inkscape element!
 
184
                                                                $isinkscape=true;
 
185
                                                }else if(isset($xlinkattrs['href'])){
 
186
 
 
187
                                                                echo "var ".$gradientname."=c.createLinearGradient(".$attrs['x1'].",".$attrs['y1'].",".$attrs['x2'].",".$attrs['y2'].");\n";
 
188
 
 
189
                                                                // Now we create a new gradient with the following properties
 
190
                                                                $gradientref=$xlinkattrs['href'];
 
191
                                                                $gradientref=substr($gradientref,1,strlen($gradientref)-1);
 
192
                                                                
 
193
                                                                if(isset($colorstops["$gradientref"])){
 
194
                                                                                foreach($colorstops["$gradientref"] as $key => $value){
 
195
                                                                                                echo $gradientname.".addColorStop(".$value.");\n";
 
196
                                                                                }
 
197
                                                                }
 
198
                                                                                                                                
 
199
                                                }else{
 
200
                                                                echo "var ".$gradientname."=c.createLinearGradient(".$attrs['x1'].",".$attrs['y1'].",".$attrs['x2'].",".$attrs['y2'].");\n";
 
201
                                                }
 
202
                                }else if($graphelement->getName()=="radialGradient"){
 
203
                                                if(isset($attrs['id'])){
 
204
                                                                $gradientname=$attrs['id'];
 
205
                                                }
 
206
                                                if(!isset($attrs['cx'])){
 
207
                                                                // Radial Gradient is not complete, this means that it is an inkscape element!
 
208
                                                                $isinkscape=true;
 
209
                                                }else if(isset($xlinkattrs['href'])){
 
210
                                                                echo "var ".$gradientname."=c.createRadialGradient(".$attrs['cx'].",".$attrs['cy'].",0,".$attrs['cx'].",".$attrs['cy'].",".$attrs['r'].");\n";
 
211
 
 
212
                                                                // Now we create a new gradient with the following properties
 
213
                                                                $gradientref=$xlinkattrs['href'];
 
214
                                                                $gradientref=substr($gradientref,1,strlen($gradientref)-1);
 
215
                                                                
 
216
                                                                if(isset($colorstops["$gradientref"])){
 
217
                                                                                foreach($colorstops["$gradientref"] as $key => $value){
 
218
                                                                                                echo $gradientname.".addColorStop(".$value.");\n";
 
219
                                                                                }
 
220
                                                                }
 
221
                                                                                                                                
 
222
                                                }else{
 
223
                                                                echo "var ".$gradientname."=c.createRadialGradient(".$attrs['cx'].",".$attrs['cy'].",0,".$attrs['cx'].",".$attrs['cy'].",".$attrs['r'].");\n";
 
224
                                                }
 
225
                                }else if($graphelement->getName()=="stop"){
 
226
                                                $stopcolor=$attrs['style'];
 
227
                                                if(strpos($stopcolor,";",11)!==false){
 
228
                                                                $stopcolorend=strpos($stopcolor,";",11);
 
229
                                                }else{
 
230
                                                                $stopcolorend=strlen($stopcolor);
 
231
                                                }
 
232
                                                $stopcolor=substr($stopcolor,11,$stopcolorend-11);
 
233
                                                
 
234
                                                if($isinkscape){
 
235
                                                                        if(isset($colorstops["$gradientname"])){
 
236
                                                                                        array_push($colorstops["$gradientname"],$attrs['offset'].",'".$stopcolor."'");
 
237
                                                                        }else{
 
238
                                                                                        $poo=array();
 
239
                                                                                        array_push($poo,$attrs['offset'].",'".$stopcolor."'");
 
240
                                                                                        $colorstops["$gradientname"]=$poo;
 
241
                                                                        }
 
242
                                                }else{
 
243
                                                                        echo $gradientname.".addColorStop(".$attrs['offset'].",'".$stopcolor."');\n";
 
244
                                                }
 
245
                                                
 
246
                                }else{
 
247
                                                                // We assume that defsid is the only use of ID
 
248
                                                                if(isset($attrs['id'])) $defsid=$attrs['id'];
 
249
                                }
 
250
 
 
251
                                // For each attribute of svg                                                            
 
252
 
 
253
                                // We process attributes after gradients but before the drawing elements.
 
254
 
 
255
                          foreach ($graphelement->attributes() as $key => $val) {
 
256
 
 
257
                                        // Get font parameters!
 
258
                            if ($key == "if"&&$graphelement->getName()=="text"){
 
259
                                                        $fontline=$val;
 
260
                            }           
 
261
                                
 
262
                                        // Get font parameters!
 
263
                            if ($key == "font-size"&&$graphelement->getName()=="text"){
 
264
                                                        $fontline=$val;
 
265
                            }           
 
266
                                    
 
267
                            if ($key == "font-family"&&$graphelement->getName()=="text"){
 
268
                                                        $fontfamily=$val;
 
269
                                        $fontfamily=str_replace("'","",$fontfamily);
 
270
                                        $fontstyle="";
 
271
                                        if(!(strpos($fontfamily,"-Oblique")===FALSE)){
 
272
                                                        $fontfamily=str_replace("-Oblique","",$fontfamily);
 
273
                                                        $fontstyle="Bold";                                                      
 
274
                                        }
 
275
                                        if(!(strpos($fontfamily,"-Bold")===FALSE)){
 
276
                                                        $fontfamily=str_replace("-Bold","",$fontfamily);
 
277
                                                        $fontstyle="Bold";                                                      
 
278
                                        }
 
279
                                        if(!(strpos($fontfamily,"-Italic")===FALSE)){
 
280
                                                        $fontfamily=str_replace("-Italic","",$fontfamily);
 
281
                                                        $fontstyle="Italic";                                                    
 
282
                                        }                                       
 
283
                                        if(!(strpos($fontfamily,"Bold")===FALSE)){
 
284
                                                        $fontfamily=str_replace("Bold","",$fontfamily);
 
285
                                                        $fontstyle=$fontstyle." Bold";                                                  
 
286
                                        }
 
287
                                        if(!(strpos($fontfamily,"Italic")===FALSE)){
 
288
                                                        $fontfamily=str_replace("Italic","",$fontfamily);
 
289
                                                        $fontstyle=$fontstyle." Italic";                                                        
 
290
                                        }
 
291
 
 
292
                            }
 
293
 
 
294
                            if ($graphelement->getName()=="text"){
 
295
                                                        if($key=="x") $textx=$val;
 
296
                                                        if($key=="y") $texty=$val;
 
297
                            }
 
298
 
 
299
                            if ($graphelement->getName()=="rect"){
 
300
                                                        if($key=="x") $linex1=$val;
 
301
                                                        if($key=="y") $liney1=$val;
 
302
                                                        if($key=="width") $linex2=$val;
 
303
                                                        if($key=="height") $liney2=$val;
 
304
                            }
 
305
 
 
306
                            if ($graphelement->getName()=="ellipse"||$graphelement->getName()=="circle"){
 
307
                                                        // Element is either a circle or an ellipse
 
308
                                                        if($key=="cx") $cx=$val;
 
309
                                                        if($key=="cy") $cy=$val;
 
310
                                                        if($key=="r"){
 
311
                                                                        $rx=$val;
 
312
                                                                        $ry=$val;
 
313
                                                        } 
 
314
                                                        if($key=="rx") $rx=$val;
 
315
                                                        if($key=="ry") $ry=$val;
 
316
                            }
 
317
                            
 
318
                            if (($key == "x1"||$key == "y1"||$key == "x2"||$key == "y2")&&$graphelement->getName()=="line"){
 
319
                                                        // Element is a line element with 4 coordinate parameters
 
320
                                                        if($key=="x1") $linex1=$val;
 
321
                                                        if($key=="x2") $linex2=$val;
 
322
                                                        if($key=="y1") $liney1=$val;
 
323
                                                        if($key=="y2") $liney2=$val;
 
324
                            }else if ($key == "transform"&&$graphelement->getName()=="text"){
 
325
                                
 
326
                                                        $j=0;
 
327
                                                        $dostr="";
 
328
                                                        $params=array();
 
329
                                                        $noparams=0;
 
330
                                                        $workstr=$val;
 
331
                        
 
332
                                                        do{
 
333
                                                                        $dochr=substr($workstr,$j,1);
 
334
                                                                        if($dochr==" "||$dochr=="("||$dochr==")"){
 
335
                                                                                if(trim($dostr)!=""&&$dostr!="matrix"){
 
336
                                                                                                $params[$noparams++]=$dostr;
 
337
                                                                                }
 
338
                                                                                        if($dochr=="-"){
 
339
                                                                                                        $dostr=$dochr;                                                                                          
 
340
                                                                                        }else{
 
341
                                                                                                        $dostr="";
 
342
                                                                                        }
 
343
                                                                        }else{
 
344
                                                                                        $dostr.=$dochr;
 
345
                                                                        }
 
346
                                                                        $j++;
 
347
                                                        }while($j<=strlen($workstr));                                                                           
 
348
                                                if(trim($dostr)!=""){
 
349
                                                                        $params[$noparams++]=$dostr;
 
350
                                                        }
 
351
                                                                                        
 
352
                                                        $translate="c.translate(".$params[4].",".$params[5].");\n";
 
353
                                                        $rotate="c.rotate(".$params[1].",".$params[2].");\n";
 
354
                                                        $scale="c.scale(".$params[0].",".$params[3].");\n";
 
355
                                                                                                                        
 
356
                            }elseif ($key == "stroke"){
 
357
                                                        echo "" .'c.strokeStyle = "' . $val . '";' . "\n";
 
358
                                                        $linestyle=$val;
 
359
                            }elseif ($key == "opacity"){
 
360
                                        $opacity=$val;
 
361
                            }elseif ($key == "fill"){
 
362
                                      if($val!="none"){
 
363
                                                                        if(strpos($val,"url(")===false){
 
364
                                                                                        echo "" .'c.fillStyle = "' . $val. '";' . "\n";
 
365
                                                                        }else{
 
366
                                                                                        echo "c.fillStyle=".substr($val,5,strlen($val)-6).";\n";
 
367
                                                                        }
 
368
                                                        }
 
369
                                                        $fillstyle=$val;
 
370
                            }elseif ($key == "style"){
 
371
                                        $fillpos=strpos($val,"fill:");
 
372
                                        if($fillpos!==false){
 
373
                                                        $fillposend=strpos($val,";",$fillpos);
 
374
                                                if($fillposend===false) $fillposend=strlen($val);                               
 
375
                                                        $fillstyle=substr($val,$fillpos+5,$fillposend-$fillpos-5);
 
376
                                                            if($fillstyle!="none"){
 
377
                                                                                        if(strpos($fillstyle,"url(")===false){
 
378
                                                                                                        echo "c.fillStyle = '".$fillstyle ."';\n";
 
379
                                                                                        }else{
 
380
                                                                                                        echo "c.fillStyle=".substr($fillstyle,5,strlen($fillstyle)-6).";\n";
 
381
                                                                                        }
 
382
                                                                        }       
 
383
                                        }
 
384
 
 
385
                                        $strokepos=strpos($val,"stroke:");
 
386
                                        if($strokepos!==false){
 
387
                                                        $strokeposend=strpos($val,";",$strokepos);
 
388
                                                        if($strokeposend===false) $strokeposend=strlen($val);
 
389
                                                                        $linestyle=substr($val,$strokepos+7,$strokeposend-$strokepos-7);
 
390
                                                              if($linestyle!="none"){
 
391
                                                                                                echo "" .'c.strokeStyle = "' . $linestyle . '";' . "\n";
 
392
                                                                                }
 
393
                                        }
 
394
 
 
395
                                        $strokepos=strpos($val,"stroke-width:");
 
396
                                        if($strokepos!==false){
 
397
                                                        $strokeposend=strpos($val,";",$strokepos);
 
398
                                                        if($strokeposend===false) $strokeposend=strlen($val);
 
399
                                                                        $strokewidth=substr($val,$strokepos+13,$strokeposend-$strokepos-13);
 
400
                                                                                $strokewidth=str_replace("px","",$strokewidth);
 
401
                                                                                echo "\n" . 'c.lineWidth = "' . $strokewidth . '";' . "\n";
 
402
                                        }       
 
403
 
 
404
                                        $fontsizepos=strpos($val,"font-size:");
 
405
                                        if($fontsizepos!==false){
 
406
                                                        $fontsizeend=strpos($val,";",$fontsizepos);
 
407
                                                        if($fontsizeend===false) $fontsizeend=strlen($val);
 
408
                                                                        $fontline=substr($val,$fontsizepos+10,$fontsizeend-$fontsizepos-10);
 
409
                                                                                $fontline=str_replace("px","",$fontline);
 
410
                                        }       
 
411
 
 
412
                                        $fontfamilypos=strpos($val,"font-family:");
 
413
                                        if($fontfamilypos!==false){
 
414
                                                        $fontfamilyend=strpos($val,";",$fontfamilypos);
 
415
                                                        if($fontfamilyend===false) $fontfamilyend=strlen($val);
 
416
                                                                        $fontfamily=substr($val,$fontfamilypos+12,$fontfamilyend-$fontfamilypos-12);
 
417
                                        }       
 
418
 
 
419
                                        $fontstylepos=strpos($val,"font-style:");
 
420
                                        if($fontstylepos!==false){
 
421
                                                        $fontstyleend=strpos($val,";",$fontstylepos);
 
422
                                                        if($fontstyleend===false) $fontstyleend=strlen($val);
 
423
                                                                        $fontstyle=substr($val,$fontstylepos+11,$fontstyleend-$fontstylepos-11);
 
424
                                        }       
 
425
                                                                                                                
 
426
                            }elseif ($key == "stroke-width"){
 
427
                                                        echo "\n" . 'c.lineWidth = "' . $val . '";' . "\n";
 
428
                            }elseif ($key == "points"&&($graphelement->getName()=="polygon"||$graphelement->getName()=="polyline"||$graphelement->getName()=="line")) {
 
429
                                if($defsmode){
 
430
                                                $defsstring.="c.beginPath();\n";                                                                                                
 
431
                                }else{
 
432
                                                echo "c.beginPath();\n";                                
 
433
                                }
 
434
 
 
435
                                                        // dostr loop for polygons. Bugfix: if old char is e, then we do not break string at -                                                  
 
436
                                                        $j=0;
 
437
                                                        $dostr="";
 
438
                                                        $dochr="";
 
439
                                                        $params=array();
 
440
                                                        $noparams=0;
 
441
                                                        $workstr=$val;
 
442
                                                        $oldchr="";
 
443
                                                        do{
 
444
                                                                        $oldchr=$dostr;
 
445
                                                                        $dochr=substr($workstr,$j,1);
 
446
                                                                        if(($dochr=="-" && $oldchr!="e" && $oldchr!="E")||$dochr==","||$dochr==" "){
 
447
                                                                                if(trim($dostr)!=""){
 
448
                                                                                                $params[$noparams++]=$dostr;
 
449
                                                                                }
 
450
                                                                                        if($dochr=="-"){
 
451
                                                                                                        $dostr=$dochr;                                                                                          
 
452
                                                                                        }else{
 
453
                                                                                                        $dostr="";
 
454
                                                                                        }
 
455
                                                                        }else{
 
456
                                                                                        $dostr.=$dochr;
 
457
                                                                        }
 
458
                                                                        $j++;
 
459
                                                        }while($j<=strlen($workstr));                                                                           
 
460
                                                if(trim($dostr)!=""){
 
461
                                                                        $params[$noparams++]=$dostr;
 
462
                                                        }
 
463
                                                        
 
464
                                                        for($j=0;$j<$noparams;$j+=2){
 
465
                                                                                if($j==0){
 
466
                                                                if($defsmode){
 
467
                                                                                                        $defsstring.="c.moveTo(".$params[$j].",".$params[$j+1].");\n";                                                  
 
468
                                                                }else{
 
469
                                                                                                        echo "c.moveTo(".$params[$j].",".$params[$j+1].");\n";                                                  
 
470
                                                                }
 
471
                                                                                }else{
 
472
                                                                if($defsmode){
 
473
                                                                                                        $defsstring.="c.lineTo(".$params[$j].",".$params[$j+1].");\n";                                                                                                          
 
474
                                                                }else{
 
475
                                                                                                        echo "c.lineTo(".$params[$j].",".$params[$j+1].");\n";                                                                                                          
 
476
                                                                }
 
477
                                                                                }
 
478
                                                        }
 
479
                        
 
480
                                                        // If a polygon close path if not i.e. polyline keep it open
 
481
                                                        if($noparams>=2&&$graphelement->getName()=="polygon"){
 
482
                                                if($defsmode){
 
483
                                                                                        $defsstring.="c.lineTo(".$params[0].",".$params[1].");\n";                                                                                                              
 
484
                                                }else{
 
485
                                                                                        echo "c.lineTo(".$params[0].",".$params[1].");\n";                                                                                                              
 
486
                                                }
 
487
                                                        }
 
488
                                                
 
489
                                if(!$defsmode){
 
490
                                                                        echo "c.globalAlpha = $opacity;\n";
 
491
                                }
 
492
 
 
493
                                                        if($fillstyle=="none"&&$linestyle=="none"){
 
494
                                                if(!$defsmode){
 
495
                                                                                        echo 'c.fillStyle = "#000";';
 
496
                                                                                        echo "\n";
 
497
                                                                echo "c.fill();\n\n";
 
498
                                                }
 
499
                                                        }
 
500
                                                        if($fillstyle!="none"){
 
501
                                                if(!$defsmode){
 
502
                                                                echo "c.fill();\n";
 
503
                                                                        if($linestyle=="none") echo "\n";
 
504
                                                }
 
505
                                            }
 
506
                                            if($linestyle!="none"){
 
507
                                                if(!$defsmode){
 
508
                                                                echo "c.stroke();\n\n";
 
509
                                                }
 
510
                                            }
 
511
                                            
 
512
                                            if($defsmode){
 
513
                                                        $defsstring.="c.clip();\n\n";           
 
514
                                            }
 
515
                                                                                                
 
516
                            }elseif ($key == "d") {
 
517
                                
 
518
                                $dval=$val;
 
519
                                
 
520
                            }
 
521
                          }
 
522
 
 
523
                                // Draw d line commands. This is a fix for the bug that requires the line settings to be assigned before the line commands
 
524
                                
 
525
                                if(isset($dval)){
 
526
                                
 
527
                              echo "c.beginPath();\n";
 
528
                              
 
529
                              $i=0;
 
530
                              $str=$dval;
 
531
                              $workstr="";
 
532
                              $command="";
 
533
                              $cx=0;
 
534
                              $cy=0;
 
535
                              $firstpoint=0;
 
536
                              $firstpointx=0;
 
537
                              $firstpointy=0;
 
538
                              $lastpointx=0;
 
539
                              $lastpointy=0;
 
540
                              do{
 
541
                                                $chr=substr($str,$i,1);
 
542
                                                if($chr=="H"||$chr=="h"||$chr=="V"||$chr=="v"||$chr=="M"||$chr=="m"||$chr=="C"||$chr=="c"||$chr=="L"||$chr=="A"||$chr=="a"||$chr=="l"||$chr=="z"||$chr=="Z"||$chr=="s"||$chr=="S"||$i==strlen($str)){
 
543
                                                                        // Process Parameters for any parameter command
 
544
                                                                        if($command=="M"||$command=="m"||$command=="c"||$command=="C"||$command=="v"||$command=="V"||$command=="h"||$command=="H"||$command=="s"||$command=="S"||$command=="l"||$command=="L"||$command=="a"||$command=="A"){
 
545
                                                                        $j=0;
 
546
                                                                                $dostr="";
 
547
                                                                                        $dochr="";
 
548
                                                                                $oldchr="";
 
549
                                                                                $params=array();
 
550
                                                                                $noparams=0;
 
551
                                                                                
 
552
                                                                                // dochr loop for other drawing commands. Bug fix: If we encounter - and before it is an e we do nothing, otherwise proceed as normal
 
553
                                                                                
 
554
                                                                                do{
 
555
                                                                                                        $oldchr=$dochr;
 
556
                                                                                                        $dochr=substr($workstr,$j,1);
 
557
                                                                                                        if(($dochr=="-" && $oldchr!="e" && $oldchr!="E")||$dochr==","||$dochr==" "){
 
558
                                                                                                        if(trim($dostr)!=""){
 
559
                                                                                                                        $params[$noparams++]=$dostr;
 
560
                                                                                                        }
 
561
                                                                                                                        if($dochr=="-"){
 
562
                                                                                                                                        $dostr=$dochr;                                                                                          
 
563
                                                                                                                        }else{
 
564
                                                                                                                                        $dostr="";
 
565
                                                                                                                        }
 
566
                                                                                                        }else{
 
567
                                                                                                                        $dostr.=$dochr;
 
568
                                                                                                        }
 
569
                                                                                                        $j++;
 
570
                                                                                }while($j<=strlen($workstr));                                                                           
 
571
                                                                        if(trim($dostr)!=""){
 
572
                                                                                                        $params[$noparams++]=$dostr;
 
573
                                                                                        }
 
574
                                                                        }
 
575
                        
 
576
                                                        if($command=="M" || $command=="m"){
 
577
                                                                                        for($j=0;$j<$noparams;$j+=2){
 
578
                                                                                                        if($j==0){
 
579
                                                                                                                                // Normal moveto set cx,cy
 
580
                                                                                                                                if($command=="M"){
 
581
                                                                                                                                                                $cx=$params[$j];
 
582
                                                                                                                                                                $cy=$params[$j+1];
 
583
                                                                                                                                                                echo "c.moveTo(".$cx.",".$cy.");\n";
 
584
                                                                                                                                                                $firstpoint=1;
 
585
                                                                                                                                              $firstpointx=$cx;
 
586
                                                                                                                                        $firstpointy=$cy;
 
587
                                                                                                                                }else if($command=="m"){
 
588
                                                                                                                                                if(!$firstpoint){
 
589
                                                                                                                                                                $cx=$params[$j];
 
590
                                                                                                                                                                $cy=$params[$j+1];
 
591
                                                                                                                                                                echo "c.moveTo(".$cx.",".$cy.");\n";
 
592
                                                                                                                                                                $firstpoint=1;
 
593
                                                                                                                                              $firstpointx=$cx;
 
594
                                                                                                                                        $firstpointy=$cy;
 
595
                                                                                                                                                }else{
 
596
                                                                                                                                                                $cx+=$params[$j];
 
597
                                                                                                                                                                $cy+=$params[$j+1];                                                                                                                     
 
598
                                                                                                                                                                echo "c.moveTo(".$cx.",".$cy.");\n";
 
599
                                                                                                                                                }                                                                                                       
 
600
                                                                                                                                }
 
601
                                                                                                        }else{
 
602
                                                                                                                                // Implicit lineto
 
603
                                                                                                                                if($command=="M"){
 
604
                                                                                                                                                $cx=$params[$j];
 
605
                                                                                                                                                $cy=$params[$j+1];
 
606
                                                                                                                                                echo "c.lineTo(".$cx.",".$cy.");\n";
 
607
                                                                                                                                }else if($command=="m"){
 
608
                                                                                                                                                $cx+=$params[$j];
 
609
                                                                                                                                                $cy+=$params[$j+1];                                                                                                                     
 
610
                                                                                                                                                echo "c.lineTo(".$cx.",".$cy.");\n";
 
611
                                                                                                                                }
 
612
                                                                                                        }
 
613
                                                                                        }
 
614
                                                        }else if ($command=="C"||$command=="c"){
 
615
                                                                        // Bezier Curveto
 
616
                                                                                        for($j=0;$j<$noparams;$j+=6){
 
617
                                                                                                        if($command=="C"){
 
618
                                                                                                                        $p1x=$params[$j];
 
619
                                                                                                                        $p1y=$params[$j+1];
 
620
                                                                                                                        $p2x=$params[$j+2];
 
621
                                                                                                                        $p2y=$params[$j+3];
 
622
                                                                                                                        $cx=$params[$j+4];
 
623
                                                                                                                        $cy=$params[$j+5];
 
624
                                                                                                                        $lastpointx=$p2x;
 
625
                                                                                                                        $lastpointy=$p2y;
 
626
                                                                                                                        echo "c.bezierCurveTo(".$p1x.",".$p1y.",".$p2x.",".$p2y.",".$cx.",".$cy.");\n";
 
627
                                                                                                                        // Curveto absolute set cx to final point, other coordinates are control points
 
628
                                                                                                        }else if($command=="c"){
 
629
                                                                                                                        // Curveto relative set cx to final point, other coordinates are relative control points
 
630
                                                                                                                        $p1x=$cx+$params[$j];
 
631
                                                                                                                        $p1y=$cy+$params[$j+1];
 
632
                                                                                                                        $p2x=$cx+$params[$j+2];
 
633
                                                                                                                        $p2y=$cy+$params[$j+3];
 
634
                                                                                                                        $lastpointx=$p2x;
 
635
                                                                                                                        $lastpointy=$p2y;
 
636
                                                                                                                        $cx+=$params[$j+4];
 
637
                                                                                                                        $cy+=$params[$j+5];
 
638
                                                                                                                        echo "c.bezierCurveTo(".$p1x.",".$p1y.",".$p2x.",".$p2y.",".$cx.",".$cy.");\n";
 
639
                                                                                                        }
 
640
                                                                                        }
 
641
                                                        }else if ($command=="S"||$command=="s"){
 
642
                                                                                                                        //context . quadraticCurveTo(cpx, cpy, x, y)
 
643
                                                                        // Quadratic Curveto
 
644
                                                                                        for($j=0;$j<$noparams;$j+=4){
 
645
                                                                                                        if($command=="S"){
 
646
                                                                                                                        $p1x=$params[$j];
 
647
                                                                                                                        $p1y=$params[$j+1];
 
648
                                                                                                                        $cx=$params[$j+2];
 
649
                                                                                                                        $cy=$params[$j+3];
 
650
                                                                                                                        $lastpointx=$p1x;
 
651
                                                                                                                        $lastpointy=$p1y;
 
652
                                                                                                                  echo "c.bezierCurveTo(".$lastpointx.",".$lastpointy.",".$p1x.",".$p1y.",".$cx.",".$cy.");\n";
 
653
                                                                                                                  // Curveto absolute set cx to final point, other coordinates are control points
 
654
                                                                                                        }else if($command=="s"){
 
655
                                                                                                                        // Curveto relative set cx to final point, other coordinates are relative control points
 
656
                                                                                                                        $p1x=$cx+$params[$j];
 
657
                                                                                                                        $p1y=$cy+$params[$j+1];
 
658
                                                                                                                        $cx+=$params[$j+2];
 
659
                                                                                                                        $cy+=$params[$j+3];
 
660
                                                                                                                        $lastpointx=$p1x;
 
661
                                                                                                                        $lastpointy=$p1y;
 
662
                                                                                                                        echo "c.bezierCurveTo(".$lastpointx.",".$lastpointy.",".$p1x.",".$p1y.",".$cx.",".$cy.");\n";
 
663
                                                                                                        }
 
664
                                                                                        }
 
665
                                                        }else if ($command=="V"||$command=="v"){
 
666
                                                                        // Vertical Lineto
 
667
                                                                                        for($j=0;$j<$noparams;$j++){
 
668
                                                                                                        if($command=="V"){
 
669
                                                                                                                        $cy=$params[$j];
 
670
                                                                                                                        echo "c.lineTo(".$cx.",".$cy.");\n";                            
 
671
                                                                                                        }else if($command=="v"){
 
672
                                                                                                                        // Curveto relative set cx to final point, other coordinates are relative control points
 
673
                                                                                                                        $cy+=$params[$j];
 
674
                                                                                                                echo "c.lineTo(".$cx.",".$cy.");\n";                            
 
675
                                                                                                        }
 
676
                                                                                        }
 
677
                                                        }else if ($command=="H"||$command=="h"){
 
678
                                                                        // horizontal Lineto
 
679
                                                                                        for($j=0;$j<$noparams;$j++){
 
680
                                                                                                        if($command=="H"){
 
681
                                                                                                                        $cx=$params[$j];
 
682
                                                                                                                        echo "c.lineTo(".$cx.",".$cy.");\n";                            
 
683
                                                                                                        }else if($command=="h"){
 
684
                                                                                                                        // Curveto relative set cx to final point, other coordinates are relative control points
 
685
                                                                                                                        $cx+=$params[$j];
 
686
                                                                                                                        echo "c.lineTo(".$cx.",".$cy.");\n";                            
 
687
                                                                                                        }
 
688
                                                                                        }
 
689
                                                        }else if ($command=="L"||$command=="l"){
 
690
                                                                        // Lineto
 
691
                                                                                        for($j=0;$j<$noparams;$j+=2){
 
692
                                                                                                        if($command=="L"){
 
693
                                                                                                                        $cx=$params[$j];
 
694
                                                                                                                        $cy=$params[$j+1];
 
695
                                                                                                                        echo "c.lineTo(".$cx.",".$cy.");\n";                            
 
696
                                                                                                        }else if($command=="l"){
 
697
                                                                                                                        // Curveto relative set cx to final point, other coordinates are relative control points
 
698
                                                                                                                        $cx+=$params[$j];
 
699
                                                                                                                        $cy+=$params[$j+1];
 
700
                                                                                                                        echo "c.lineTo(".$cx.",".$cy.");\n";                            
 
701
                                                                                                        }
 
702
                                                                                        }
 
703
                                                        }else if ($command=="Z"||$command=="z"){
 
704
                                                                                        echo "c.lineTo(".$firstpointx.",".$firstpointy.");\n";                                  
 
705
                                                                        }else if ($command=="A"||$command=="a"){
 
706
                                                                                        // To avoid hard math - draw arc as a line
 
707
                                                                                        for($j=0;$j<$noparams;$j+=7){
 
708
                                                                                                        $rx=$params[0];
 
709
                                                                                                        $ry=$params[1];
 
710
                                                                                                        $ang=$params[2];
 
711
                                                                                                        $largeflag=$params[3];
 
712
                                                                                                        $sweepflag=$params[4];
 
713
                                                                                                        $cx=$params[$j];
 
714
                                                                                                        $cy=$params[$j+1];
 
715
                                                                                                        echo "c.lineTo(".$cx.",".$cy.");\n";                            
 
716
                                                                        }
 
717
                                                        }
 
718
                                                        
 
719
                                                        // Init new command!
 
720
                                                        $command=$chr;
 
721
                                                        $workstr="";
 
722
                                                }else{
 
723
                                                        $workstr.=$chr;
 
724
                                                }
 
725
                                        $i++;
 
726
                              }while($i<=strlen($str));
 
727
                                                
 
728
                                                echo "c.globalAlpha = $opacity;\n";
 
729
 
 
730
                                                if($fillstyle=="none"&&$linestyle=="none"){
 
731
                                                                echo 'c.fillStyle = "#000";';
 
732
                                        echo "\n";
 
733
                                        echo "c.fill();\n\n";
 
734
                                                }
 
735
                                                if($fillstyle!="none"){
 
736
//                                                              echo "c.save();\n\n";
 
737
//                                                              echo "c.scale(2.5,2.5);\n";                                                             
 
738
                                        echo "c.fill();\n";
 
739
//                                                              echo "c.restore();\n\n";
 
740
                                                if($linestyle=="none") echo "\n";
 
741
                                }
 
742
                                if($linestyle!="none"){
 
743
                                        echo "c.stroke();\n";
 
744
                                        echo "\n";
 
745
                              }
 
746
                              
 
747
                              unset($dval);
 
748
                                
 
749
                                }
 
750
                        
 
751
                          if($graphelement->getName()=="text"){
 
752
                        
 
753
                                                echo "c.globalAlpha = $opacity;\n";
 
754
 
 
755
                                                echo "c.beginPath();\n";
 
756
                                                echo "c.save();\n";
 
757
                                                echo "c.font = '".$fontstyle." ".$fontline."px ".$fontfamily."';\n";
 
758
 
 
759
                                                if(isset($translate)&&isset($rotate)&&isset($scale)){
 
760
                                                                echo $translate;
 
761
                                                                echo $rotate;
 
762
                                                                echo $scale;
 
763
                                                }
 
764
                                                
 
765
                                                if(isset($textx)&&isset($texty)){
 
766
                                                                echo "c.fillText('".$textline."',".$textx.",".$texty.");\n";                                            
 
767
                                                }else{
 
768
                                                                echo "c.fillText('".$textline."',0,0);\n";                                                                                              
 
769
                                                }
 
770
                                                
 
771
 
 
772
                                if($linestyle!="none"){
 
773
                                                                if(isset($textx)&&isset($texty)){
 
774
                                                        echo "c.strokeText('".$textline."',".$textx.",".$texty.");\n";
 
775
                                                        }else{
 
776
                                                        echo "c.strokeText('".$textline."',0,0);\n";                                                    
 
777
                                                        }
 
778
                                          }                                 
 
779
 
 
780
                                                echo "c.restore();\n\n";
 
781
 
 
782
                          }elseif($graphelement->getName()=="rect"){
 
783
                                                
 
784
                                                // This rectangle must be clipped!
 
785
                                                if(isset($attrs['clip-path'])){
 
786
                                                                        $clipid=substr($attrs['clip-path'],5);
 
787
                                                                        $clipid=substr($clipid,0,strlen($clipid)-1);
 
788
                                                                        $clipid=$clippaths[$clipid];
 
789
                                                                        
 
790
                                                                        echo "c.save();\n";
 
791
                                                                        
 
792
                                                                        echo $clipdefs[strval($clipid)];
 
793
                                                }
 
794
                                                
 
795
                                                echo "c.globalAlpha = $opacity;\n";
 
796
 
 
797
                                                echo "c.beginPath();\n";
 
798
                                                echo "c.moveTo(".$linex1.",".$liney1.");\n";
 
799
                                                echo "c.lineTo(".($linex1+$linex2).",".($liney1).");\n";
 
800
                                                echo "c.lineTo(".($linex1+$linex2).",".($liney1+$liney2).");\n";
 
801
                                                echo "c.lineTo(".($linex1).",".($liney1+$liney2).");\n";                        
 
802
                                                echo "c.lineTo(".($linex1).",".($liney1).");\n";                        
 
803
                                    if($fillstyle!="none"){
 
804
//                                                              echo "c.save();\n\n";
 
805
//                                                              echo "c.scale(1,1);\n";                                                         
 
806
                                        echo "c.fill();\n";
 
807
//                                                              echo "c.restore();\n\n";
 
808
 
 
809
                                                if($linestyle=="none") echo "\n";
 
810
                                }
 
811
                                    if($linestyle!="none"){
 
812
                                        echo "c.stroke();\n";
 
813
                             }
 
814
                                                // This rectangle must be clipped!
 
815
                                                if(isset($attrs['clip-path'])){
 
816
                                                                        echo "c.restore();\n";
 
817
                                                }
 
818
                                                
 
819
                                                echo "\n";
 
820
 
 
821
                          }elseif($graphelement->getName()=="circle"||$graphelement->getName()=="ellipse"){
 
822
                                                echo "c.globalAlpha = $opacity;\n";                             
 
823
                                
 
824
                                                echo "c.beginPath();\n";
 
825
                                                
 
826
                                                $xs=$cx-$rx;
 
827
                                                $xe=$cx+$rx;
 
828
                                                $ys=$cy-$ry;
 
829
                                                $ye=$cy+$ry;
 
830
 
 
831
                                                $xsp=$cx-($rx*0.552);
 
832
                                                $xep=$cx+($rx*0.552);
 
833
                                                $ysp=$cy-($ry*0.552);
 
834
                                                $yep=$cy+($ry*0.552);
 
835
                                                
 
836
                                                echo "c.moveTo(".$cx.",".$ys.");\n";                                            
 
837
                                        echo "c.bezierCurveTo(".$xsp.",".$ys.",".$xs.",".$ysp.",".$xs.",".$cy.");\n";
 
838
                                        echo "c.bezierCurveTo(".$xs.",".$yep.",".$xsp.",".$ye.",".$cx.",".$ye.");\n";
 
839
                                        echo "c.bezierCurveTo(".$xep.",".$ye.",".$xe.",".$yep.",".$xe.",".$cy.");\n";
 
840
                                        echo "c.bezierCurveTo(".$xe.",".$ysp.",".$xep.",".$ys.",".$cx.",".$ys.");\n";
 
841
 
 
842
                                    if($fillstyle!="none"){
 
843
                                        echo "c.fill();\n";
 
844
                                                if($linestyle=="none") echo "\n";
 
845
                                }
 
846
                                    if($linestyle!="none"){
 
847
                                        echo "c.stroke();\n";
 
848
                                        echo "\n";
 
849
                             }
 
850
                                }elseif($graphelement->getName()=="line"){
 
851
                                                echo "context.beginPath();\n";
 
852
                                                echo "context.moveTo(".$linex1.",".$liney1.");\n";
 
853
                                                echo "context.lineTo(".$linex1.",".$liney1.");\n";
 
854
                                                echo "context.stroke();\n";
 
855
 
 
856
                                }elseif($graphelement->getName()=="g"){
 
857
                                                        // We only print groups that have an ID
 
858
//                                                      if(isset($attrs['id'])){
 
859
                                                                        echo "//-------------------------------\n";
 
860
                                                                        echo "// Group: ".$attrs['id']."\n";
 
861
                                                                        echo "//-------------------------------\n";
 
862
//                                                      }                                                       
 
863
                                }elseif($graphelement->getName()=="eg"){
 
864
                                                        // We only print groups that have an ID
 
865
                                                        if(isset($attrs['id'])){
 
866
                                                                        echo "//-------------------------------\n";
 
867
                                                                        echo "// GroupEnd: ".$attrs['id']."\n";
 
868
                                                                        echo "//-------------------------------\n";
 
869
                                                                        echo "\n\n\n";
 
870
                                                        }                                                       
 
871
                                }elseif($graphelement->getName()=="defs"){
 
872
                                                                        $defsmode=1;
 
873
                                                                        $defsstring="";
 
874
                                }elseif($graphelement->getName()=="defsend"){
 
875
                                                                        if($defsid!=""){
 
876
                                                                                        $clipdefs[strval($defsid)]=$defsstring;
 
877
                                                                        }
 
878
                                                                        $defsmode=0;
 
879
                        }
 
880
 
 
881
                }
 
882
}
 
883
 
 
884
 
 
885
?>