54
54
// Support for transformed gradients (??Is this in current version??)
55
55
// Real Arc Drawing using Complex Math from values, draw arc using math in formula
72
function recurseelement($element){
73
global $elementcounter;
76
if($element->getName()=="clipPath"){
77
$attrs=$element->attributes();
78
$sxe = new SimpleXMLElement("<use id='".$attrs['id']."' />");
79
$graphnodes[$elementcounter]=$sxe;
58
$graphnodes = array();
59
$colorstops = array();
65
$gradientname = "foo";
69
function recurseelement( $element ) {
70
global $elementcounter;
72
if( $element -> getName() == "clipPath" ) {
73
$attrs = $element -> attributes();
74
$sxe = new SimpleXMLElement( "<use id='".$attrs['id']."' />" );
75
$graphnodes [$elementcounter] = $sxe;
83
foreach ($element->children() as $child) {
84
if($child->getName()=="clipPath"||$child->getName()=="defs"||$child->getName()=="g"||$child->getName()=="linearGradient"||$child->getName()=="radialGradient"){
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;
91
recurseelement($child);
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;
98
echo "//Unknown element: ".$child->getName()."<br>";
78
foreach( $element -> children() as $child ) {
79
if( $child -> getName() == "clipPath" || $child -> getName() == "defs" || $child -> getName() == "g" || $child -> getName() == "linearGradient" || $child -> getName() == "radialGradient" ) {
80
// Most others except for clipPath are added
81
if( $child -> getName() == "defs" || $child -> getName() == "g" || $child -> getName() == "linearGradient" || $child -> getName() == "radialGradient" ) {
82
$graphnodes [$elementcounter] = $child;
85
recurseelement( $child );
86
} 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" ) {
87
// Add element to queue
88
$graphnodes [$elementcounter] = $child;
91
echo "//Unknown element: ".$child -> getName()."<br>";
102
if($element->getName()=="g"){
104
$attrs=$element->attributes();
105
$sxe = new SimpleXMLElement("<eg id='".$attrs['id']."' />");
106
$graphnodes[$elementcounter]=$sxe;
111
if($element->getName()=="defs"){
112
$sxe = new SimpleXMLElement("<defsend/>");
113
$graphnodes[$elementcounter]=$sxe;
94
if( $element -> getName() == "g" ) {
96
$attrs = $element -> attributes();
97
$sxe = new SimpleXMLElement( "<eg id='".$attrs['id']."' />" );
98
$graphnodes [$elementcounter] = $sxe;
101
if( $element -> getName() == "defs" ) {
102
$sxe = new SimpleXMLElement( "<defsend/>" );
103
$graphnodes [$elementcounter] = $sxe;
120
if(isset($_POST['svgname'])){
122
$svg = simplexml_load_file($_POST['svgname']);
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;
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;
138
echo "//Unknown element: ".$element->getName()."\n";
148
foreach ($graphnodes as $graphelement) {
150
// Clear Line Style and Fill Styles
155
// For text element get
156
if($graphelement->getName()=="text"){
157
if(isset($graphelement[0])){
158
$textline=$graphelement[0];
162
// To get ID comment/code
163
$attrs=$graphelement->attributes();
164
$xlinkattrs=$graphelement->attributes('http://www.w3.org/1999/xlink');
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']);
172
// We are in the reference use statement
173
$clippaths[$clipid]=substr(strval($xlinkattrs['href']),1);
177
if($graphelement->getName()=="linearGradient"){
179
if(isset($attrs['id'])){
180
$gradientname=$attrs['id'];
182
if(!isset($attrs['x1'])){
183
// Linear Gradient is not complete, this means that it is an inkscape element!
185
}else if(isset($xlinkattrs['href'])){
187
echo "var ".$gradientname."=c.createLinearGradient(".$attrs['x1'].",".$attrs['y1'].",".$attrs['x2'].",".$attrs['y2'].");\n";
189
// Now we create a new gradient with the following properties
190
$gradientref=$xlinkattrs['href'];
191
$gradientref=substr($gradientref,1,strlen($gradientref)-1);
193
if(isset($colorstops["$gradientref"])){
194
foreach($colorstops["$gradientref"] as $key => $value){
195
echo $gradientname.".addColorStop(".$value.");\n";
200
echo "var ".$gradientname."=c.createLinearGradient(".$attrs['x1'].",".$attrs['y1'].",".$attrs['x2'].",".$attrs['y2'].");\n";
202
}else if($graphelement->getName()=="radialGradient"){
203
if(isset($attrs['id'])){
204
$gradientname=$attrs['id'];
206
if(!isset($attrs['cx'])){
207
// Radial Gradient is not complete, this means that it is an inkscape element!
209
}else if(isset($xlinkattrs['href'])){
210
echo "var ".$gradientname."=c.createRadialGradient(".$attrs['cx'].",".$attrs['cy'].",0,".$attrs['cx'].",".$attrs['cy'].",".$attrs['r'].");\n";
212
// Now we create a new gradient with the following properties
213
$gradientref=$xlinkattrs['href'];
214
$gradientref=substr($gradientref,1,strlen($gradientref)-1);
216
if(isset($colorstops["$gradientref"])){
217
foreach($colorstops["$gradientref"] as $key => $value){
218
echo $gradientname.".addColorStop(".$value.");\n";
223
echo "var ".$gradientname."=c.createRadialGradient(".$attrs['cx'].",".$attrs['cy'].",0,".$attrs['cx'].",".$attrs['cy'].",".$attrs['r'].");\n";
225
}else if($graphelement->getName()=="stop"){
226
$stopcolor=$attrs['style'];
227
if(strpos($stopcolor,";",11)!==false){
228
$stopcolorend=strpos($stopcolor,";",11);
230
$stopcolorend=strlen($stopcolor);
232
$stopcolor=substr($stopcolor,11,$stopcolorend-11);
235
if(isset($colorstops["$gradientname"])){
236
array_push($colorstops["$gradientname"],$attrs['offset'].",'".$stopcolor."'");
239
array_push($poo,$attrs['offset'].",'".$stopcolor."'");
240
$colorstops["$gradientname"]=$poo;
243
echo $gradientname.".addColorStop(".$attrs['offset'].",'".$stopcolor."');\n";
247
// We assume that defsid is the only use of ID
248
if(isset($attrs['id'])) $defsid=$attrs['id'];
251
// For each attribute of svg
253
// We process attributes after gradients but before the drawing elements.
255
foreach ($graphelement->attributes() as $key => $val) {
257
// Get font parameters!
258
if ($key == "if"&&$graphelement->getName()=="text"){
262
// Get font parameters!
263
if ($key == "font-size"&&$graphelement->getName()=="text"){
267
if ($key == "font-family"&&$graphelement->getName()=="text"){
269
$fontfamily=str_replace("'","",$fontfamily);
271
if(!(strpos($fontfamily,"-Oblique")===FALSE)){
272
$fontfamily=str_replace("-Oblique","",$fontfamily);
275
if(!(strpos($fontfamily,"-Bold")===FALSE)){
276
$fontfamily=str_replace("-Bold","",$fontfamily);
279
if(!(strpos($fontfamily,"-Italic")===FALSE)){
280
$fontfamily=str_replace("-Italic","",$fontfamily);
283
if(!(strpos($fontfamily,"Bold")===FALSE)){
284
$fontfamily=str_replace("Bold","",$fontfamily);
285
$fontstyle=$fontstyle." Bold";
287
if(!(strpos($fontfamily,"Italic")===FALSE)){
288
$fontfamily=str_replace("Italic","",$fontfamily);
289
$fontstyle=$fontstyle." Italic";
294
if ($graphelement->getName()=="text"){
295
if($key=="x") $textx=$val;
296
if($key=="y") $texty=$val;
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;
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;
314
if($key=="rx") $rx=$val;
315
if($key=="ry") $ry=$val;
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"){
333
$dochr=substr($workstr,$j,1);
334
if($dochr==" "||$dochr=="("||$dochr==")"){
335
if(trim($dostr)!=""&&$dostr!="matrix"){
336
$params[$noparams++]=$dostr;
347
}while($j<=strlen($workstr));
348
if(trim($dostr)!=""){
349
$params[$noparams++]=$dostr;
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";
356
}elseif ($key == "stroke"){
357
echo "" .'c.strokeStyle = "' . $val . '";' . "\n";
359
}elseif ($key == "opacity"){
361
}elseif ($key == "fill"){
363
if(strpos($val,"url(")===false){
364
echo "" .'c.fillStyle = "' . $val. '";' . "\n";
366
echo "c.fillStyle=".substr($val,5,strlen($val)-6).";\n";
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";
380
echo "c.fillStyle=".substr($fillstyle,5,strlen($fillstyle)-6).";\n";
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";
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";
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);
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);
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);
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")) {
430
$defsstring.="c.beginPath();\n";
432
echo "c.beginPath();\n";
435
// dostr loop for polygons. Bugfix: if old char is e, then we do not break string at -
445
$dochr=substr($workstr,$j,1);
446
if(($dochr=="-" && $oldchr!="e" && $oldchr!="E")||$dochr==","||$dochr==" "){
447
if(trim($dostr)!=""){
448
$params[$noparams++]=$dostr;
459
}while($j<=strlen($workstr));
460
if(trim($dostr)!=""){
461
$params[$noparams++]=$dostr;
464
for($j=0;$j<$noparams;$j+=2){
467
$defsstring.="c.moveTo(".$params[$j].",".$params[$j+1].");\n";
469
echo "c.moveTo(".$params[$j].",".$params[$j+1].");\n";
473
$defsstring.="c.lineTo(".$params[$j].",".$params[$j+1].");\n";
475
echo "c.lineTo(".$params[$j].",".$params[$j+1].");\n";
480
// If a polygon close path if not i.e. polyline keep it open
481
if($noparams>=2&&$graphelement->getName()=="polygon"){
483
$defsstring.="c.lineTo(".$params[0].",".$params[1].");\n";
485
echo "c.lineTo(".$params[0].",".$params[1].");\n";
490
echo "c.globalAlpha = $opacity;\n";
493
if($fillstyle=="none"&&$linestyle=="none"){
495
echo 'c.fillStyle = "#000";';
497
echo "c.fill();\n\n";
500
if($fillstyle!="none"){
503
if($linestyle=="none") echo "\n";
506
if($linestyle!="none"){
508
echo "c.stroke();\n\n";
513
$defsstring.="c.clip();\n\n";
516
}elseif ($key == "d") {
523
// Draw d line commands. This is a fix for the bug that requires the line settings to be assigned before the line commands
527
echo "c.beginPath();\n";
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"){
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
556
$dochr=substr($workstr,$j,1);
557
if(($dochr=="-" && $oldchr!="e" && $oldchr!="E")||$dochr==","||$dochr==" "){
558
if(trim($dostr)!=""){
559
$params[$noparams++]=$dostr;
570
}while($j<=strlen($workstr));
571
if(trim($dostr)!=""){
572
$params[$noparams++]=$dostr;
576
if($command=="M" || $command=="m"){
577
for($j=0;$j<$noparams;$j+=2){
579
// Normal moveto set cx,cy
583
echo "c.moveTo(".$cx.",".$cy.");\n";
587
}else if($command=="m"){
591
echo "c.moveTo(".$cx.",".$cy.");\n";
598
echo "c.moveTo(".$cx.",".$cy.");\n";
606
echo "c.lineTo(".$cx.",".$cy.");\n";
607
}else if($command=="m"){
610
echo "c.lineTo(".$cx.",".$cy.");\n";
614
}else if ($command=="C"||$command=="c"){
616
for($j=0;$j<$noparams;$j+=6){
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];
638
echo "c.bezierCurveTo(".$p1x.",".$p1y.",".$p2x.",".$p2y.",".$cx.",".$cy.");\n";
641
}else if ($command=="S"||$command=="s"){
642
//context . quadraticCurveTo(cpx, cpy, x, y)
644
for($j=0;$j<$noparams;$j+=4){
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];
662
echo "c.bezierCurveTo(".$lastpointx.",".$lastpointy.",".$p1x.",".$p1y.",".$cx.",".$cy.");\n";
665
}else if ($command=="V"||$command=="v"){
667
for($j=0;$j<$noparams;$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
674
echo "c.lineTo(".$cx.",".$cy.");\n";
677
}else if ($command=="H"||$command=="h"){
679
for($j=0;$j<$noparams;$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
686
echo "c.lineTo(".$cx.",".$cy.");\n";
689
}else if ($command=="L"||$command=="l"){
691
for($j=0;$j<$noparams;$j+=2){
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
700
echo "c.lineTo(".$cx.",".$cy.");\n";
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){
711
$largeflag=$params[3];
712
$sweepflag=$params[4];
715
echo "c.lineTo(".$cx.",".$cy.");\n";
726
}while($i<=strlen($str));
728
echo "c.globalAlpha = $opacity;\n";
730
if($fillstyle=="none"&&$linestyle=="none"){
731
echo 'c.fillStyle = "#000";';
733
echo "c.fill();\n\n";
735
if($fillstyle!="none"){
736
// echo "c.save();\n\n";
737
// echo "c.scale(2.5,2.5);\n";
739
// echo "c.restore();\n\n";
740
if($linestyle=="none") echo "\n";
742
if($linestyle!="none"){
743
echo "c.stroke();\n";
751
if($graphelement->getName()=="text"){
753
echo "c.globalAlpha = $opacity;\n";
755
echo "c.beginPath();\n";
757
echo "c.font = '".$fontstyle." ".$fontline."px ".$fontfamily."';\n";
759
if(isset($translate)&&isset($rotate)&&isset($scale)){
765
if(isset($textx)&&isset($texty)){
766
echo "c.fillText('".$textline."',".$textx.",".$texty.");\n";
768
echo "c.fillText('".$textline."',0,0);\n";
772
if($linestyle!="none"){
773
if(isset($textx)&&isset($texty)){
774
echo "c.strokeText('".$textline."',".$textx.",".$texty.");\n";
776
echo "c.strokeText('".$textline."',0,0);\n";
780
echo "c.restore();\n\n";
782
}elseif($graphelement->getName()=="rect"){
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];
792
echo $clipdefs[strval($clipid)];
795
echo "c.globalAlpha = $opacity;\n";
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";
807
// echo "c.restore();\n\n";
809
if($linestyle=="none") echo "\n";
811
if($linestyle!="none"){
812
echo "c.stroke();\n";
814
// This rectangle must be clipped!
815
if(isset($attrs['clip-path'])){
816
echo "c.restore();\n";
108
if( isset( $_POST ['svgname'])) {
109
$svg = simplexml_load_file( $_POST ['svgname'] );
110
// Recurse into elements and add to element stack
111
// It is important to only process hierarchies of g elements and layers
112
foreach( $svg as $element ) {
113
if( $element -> getName() == "clipPath" || $element -> getName() == "defs" || $element -> getName() == "g" || $element -> getName() == "linearGradient" || $element -> getName() == "defs" || $element -> getName() == "radialGradient" ) {
114
if( $element -> getName() == "clipPath" || $element -> getName() == "defs" || $element -> getName() == "g" || $element -> getName() == "linearGradient" || $element -> getName() == "radialGradient" ) {
115
$graphnodes [$elementcounter] = $element;
118
recurseelement($element);
119
}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") {
120
// Add element to queue
121
$graphnodes [$elementcounter] = $element;
124
echo "//Unknown element: ".$element -> getName()."\n";
132
foreach( $graphnodes as $graphelement ) {
133
// Clear Line Style and Fill Styles
137
// For text element get
138
if( $graphelement -> getName() == "text" ) {
139
if( isset( $graphelement[0])) {
140
$textline = $graphelement[0];
143
// To get ID comment/code
144
$attrs = $graphelement -> attributes();
145
$xlinkattrs = $graphelement -> attributes( 'http://www.w3.org/1999/xlink' );
146
// For use element get
147
if( $graphelement -> getName() == "use" ) {
148
if( isset( $attrs['id'] )) {
149
// We are in an id use statement
150
$clipid = strval( $attrs['id'] );
152
// We are in the reference use statement
153
$clippaths [$clipid] = substr( strval( $xlinkattrs ['href'] ),1);
156
if( $graphelement -> getName() == "linearGradient" ) {
157
if( isset( $attrs ['id'] )) {
158
$gradientname = $attrs ['id'];
160
if( !isset( $attrs['x1'] )) {
161
// Linear Gradient is not complete, this means that it is an inkscape element!
163
} else if( isset( $xlinkattrs ['href'] )) {
164
echo "var ".$gradientname." = c.createLinearGradient( ".$attrs['x1']." , ".$attrs['y1']." , ".$attrs['x2']." , ".$attrs['y2']." );\n";
165
// Now we create a new gradient with the following properties
166
$gradientref = $xlinkattrs ['href'];
167
$gradientref = substr( $gradientref, 1, strlen( $gradientref ) -1 );
168
if( isset( $colorstops ["$gradientref"] )){
169
foreach( $colorstops ["$gradientref"] as $key => $value) {
170
echo $gradientname.".addColorStop( ".$value." );\n";
174
echo " var ".$gradientname." = c.createLinearGradient( ".$attrs['x1']." , ".$attrs['y1']." , ".$attrs['x2']." , ".$attrs['y2']." );\n";
176
} else if( $graphelement -> getName() == "radialGradient" ) {
177
if( isset( $attrs ['id'] )) {
178
$gradientname = $attrs ['id'];
180
if( !isset( $attrs ['cx'])) {
181
// Radial Gradient is not complete, this means that it is an inkscape element!
183
} else if( isset( $xlinkattrs ['href'])) {
184
echo " var ".$gradientname." = c.createRadialGradient( ".$attrs['cx']." , ".$attrs['cy']." , 0 , ".$attrs['cx']." , ".$attrs['cy']." , ".$attrs['r']." );\n";
185
// Now we create a new gradient with the following properties
186
$gradientref = $xlinkattrs ['href'];
187
$gradientref = substr( $gradientref, 1, strlen( $gradientref )-1);
188
if( isset( $colorstops ["$gradientref"])) {
189
foreach( $colorstops ["$gradientref"] as $key => $value) {
190
echo $gradientname.".addColorStop( ".$value." );\n";
194
echo " var ".$gradientname." = c.createRadialGradient( ".$attrs['cx']." , ".$attrs['cy']." , 0, ".$attrs['cx']." , ".$attrs['cy']." , ".$attrs['r']." );\n";
196
} else if( $graphelement -> getName() == "stop" ) {
197
$stopcolor = $attrs ['style'];
198
if( strpos( $stopcolor, ";" , 11) !== false ) {
199
$stopcolorend = strpos( $stopcolor, ";" , 11);
201
$stopcolorend = strlen( $stopcolor );
203
$stopcolor = substr( $stopcolor, 11, $stopcolorend - 11 );
205
if( isset( $colorstops ["$gradientname"] )) {
206
array_push( $colorstops ["$gradientname"], $attrs['offset'].", '".$stopcolor."' " );
209
array_push( $poo, $attrs ['offset'].", '".$stopcolor."' " );
210
$colorstops ["$gradientname"] = $poo;
213
echo $gradientname.".addColorStop( ".$attrs['offset'].", '".$stopcolor."' );\n";
216
// We assume that defsid is the only use of ID
217
if( isset( $attrs ['id'] )) $defsid = $attrs ['id'];
219
// For each attribute of svg
220
// We process attributes after gradients but before the drawing elements.
221
foreach( $graphelement -> attributes() as $key => $val ) {
222
// Get font parameters!
223
if( $key == "if" && $graphelement -> getName() == "text" ) {
226
// Get font parameters!
227
if( $key == "font-size" && $graphelement -> getName() == "text" ) {
230
if( $key == "font-family" && $graphelement -> getName() == "text" ) {
232
$fontfamily = str_replace( "'", "", $fontfamily );
234
if( !( strpos( $fontfamily, "-Oblique" ) === FALSE )) {
235
$fontfamily = str_replace( "-Oblique", "", $fontfamily );
238
if( !( strpos( $fontfamily, "-Bold" ) === FALSE )) {
239
$fontfamily = str_replace( "-Bold", "", $fontfamily );
242
if( !( strpos( $fontfamily, "-Italic" ) === FALSE )) {
243
$fontfamily = str_replace( "-Italic", "", $fontfamily );
244
$fontstyle = "Italic";
246
if( !( strpos( $fontfamily, "Bold" ) === FALSE )) {
247
$fontfamily = str_replace( "Bold", "", $fontfamily );
248
$fontstyle = $fontstyle."Bold";
250
if( !( strpos( $fontfamily, "Italic" ) === FALSE )) {
251
$fontfamily = str_replace( "Italic", "", $fontfamily );
252
$fontstyle = $fontstyle."Italic";
255
if( $graphelement -> getName() == "text" ) {
263
if( $graphelement -> getName() == "rect" ) {
270
if( $key == "width" ) {
273
if( $key == "height" ) {
277
if( $graphelement -> getName() == "ellipse" || $graphelement -> getName() == "circle" ) {
278
// Element is either a circle or an ellipse
296
if(( $key == "x1" || $key == "y1" || $key == "x2" || $key == "y2" ) && $graphelement -> getName() == "line" ) {
297
// Element is a line element with 4 coordinate parameters
310
} else if( $key == "transform" && $graphelement -> getName() == "text" ) {
317
$dochr = substr( $workstr, $j, 1 );
318
if( $dochr == " " || $dochr == "( " || $dochr == " ) ") {
319
if( trim( $dostr ) != "" && $dostr != "matrix" ) {
320
$params [$noparams++] = $dostr;
322
if( $dochr == "-" ) {
331
}while( $j <= strlen( $workstr ));
332
if( trim( $dostr ) != "" ) {
333
$params [$noparams++] = $dostr;
335
$translate = "c.translate( ".$params[4].", ".$params[5]." );\n";
336
$rotate = "c.rotate( ".$params[1]." , ".$params[2]." );\n";
337
$scale = "c.scale( ".$params[0]." , ".$params[3]." );\n";
338
} else if( $key == "stroke" ) {
339
echo "" .'c.strokeStyle = "' . $val . '";' . "\n";
341
} else if( $key == "opacity" ) {
343
} else if( $key == "fill" ) {
344
if( $val != "none" ) {
345
if( strpos( $val, "url( ") === false) {
346
echo "" .'c.fillStyle = "' . $val. '";' . "\n";
348
echo "c.fillStyle = ".substr( $val, 5, strlen( $val ) - 6 ).";\n";
352
} else if ($key == "style" ) {
353
$fillpos = strpos( $val, "fill:" );
354
if( $fillpos !== false ) {
355
$fillposend = strpos( $val, ";", $fillpos);
356
if( $fillposend === false ) {
357
$fillposend = strlen( $val );
359
$fillstyle = substr( $val, $fillpos + 5, $fillposend - $fillpos - 5 );
360
if( $fillstyle != "none" ) {
361
if(strpos($fillstyle,"url(")===false){
362
echo "c.fillStyle = '".$fillstyle ."';\n";
364
echo "c.fillStyle = ".substr( $fillstyle, 5, strlen( $fillstyle ) - 6 ).";\n";
368
$strokepos = strpos( $val, "stroke:" );
369
if( $strokepos !== false ) {
370
$strokeposend = strpos( $val, ";", $strokepos );
371
if( $strokeposend === false ) {
372
$strokeposend = strlen( $val );
374
$linestyle = substr( $val, $strokepos + 7, $strokeposend - $strokepos - 7 );
375
if( $linestyle != "none" ) {
376
echo "" .'c.strokeStyle = "' . $linestyle . '";' . "\n";
379
$strokepos = strpos( $val, "stroke-width:" );
380
if( $strokepos !== false ) {
381
$strokeposend = strpos( $val, ";", $strokepos );
382
if( $strokeposend === false ) {
383
$strokeposend = strlen( $val );
385
$strokewidth = substr( $val, $strokepos + 13, $strokeposend - $strokepos - 13 );
386
$strokewidth = str_replace( "px", "", $strokewidth );
387
echo "\n" . 'c.lineWidth = "' . $strokewidth . '";' . "\n";
389
$fontsizepos = strpos( $val, "font-size:" );
390
if( $fontsizepos !== false ) {
391
$fontsizeend = strpos( $val, ";", $fontsizepos);
392
if( $fontsizeend === false ) {
393
$fontsizeend = strlen( $val );
395
$fontline = substr( $val, $fontsizepos + 10, $fontsizeend - $fontsizepos - 10 );
396
$fontline = str_replace( "px", "", $fontline);
398
$fontfamilypos = strpos( $val, "font-family:" );
399
if( $fontfamilypos !== false ) {
400
$fontfamilyend = strpos( $val, ";", $fontfamilypos);
401
if( $fontfamilyend === false ) {
402
$fontfamilyend=strlen($val);
404
$fontfamily = substr( $val, $fontfamilypos + 12, $fontfamilyend - $fontfamilypos - 12 );
406
$fontstylepos = strpos( $val, "font-style:" );
407
if( $fontstylepos !== false ) {
408
$fontstyleend = strpos( $val, ";", $fontstylepos );
409
if( $fontstyleend === false ) {
410
$fontstyleend=strlen($val);
412
$fontstyle = substr( $val, $fontstylepos + 11, $fontstyleend - $fontstylepos - 11 );
414
} else if( $key == "stroke-width" ) {
415
echo "\n" . 'c.lineWidth = "' . $val . '";' . "\n";
416
} else if( $key == "points" &&( $graphelement -> getName() == "polygon" || $graphelement -> getName() == "polyline" || $graphelement -> getName() == "line" )) {
418
$defsstring. = "c.beginPath();\n";
420
echo "c.beginPath();\n";
422
// dostr loop for polygons. Bugfix: if old char is e, then we do not break string at -
432
$dochr = substr( $workstr, $j, 1 );
433
if( ( $dochr == "-" && $oldchr != "e" && $oldchr != "E" ) || $dochr == "," || $dochr == " " ) {
434
if( trim( $dostr ) != "" ) {
435
$params [$noparams++] = $dostr;
437
if( $dochr == "-" ) {
446
} while( $j <= strlen( $workstr ));
447
if( trim( $dostr ) != "") {
448
$params [$noparams++] = $dostr;
450
for( $j = 0; $j < $noparams; $j += 2) {
453
$defsstring. = "c.moveTo( ".$params [$j].",".$params [$j+1].");\n";
455
echo "c.moveTo( ".$params[$j].",".$params[$j+1].");\n";
459
$defsstring. = "c.lineTo( ".$params[$j].",".$params[$j+1].");\n";
461
echo "c.lineTo( ".$params[$j].",".$params[$j+1].");\n";
465
// If a polygon close path if not i.e. polyline keep it open
466
if( $noparams >= 2 && $graphelement -> getName() == "polygon" ) {
468
$defsstring. = "c.lineTo( ".$params[0].",".$params[1]." );\n";
470
echo "c.lineTo( ".$params[0].",".$params[1]." );\n";
474
echo "c.globalAlpha = $opacity;\n";
476
if( $fillstyle == "none" && $linestyle == "none" ) {
478
echo 'c.fillStyle = "#000";';
480
echo "c.fill();\n\n";
483
if( $fillstyle != "none" ) {
486
if( $linestyle == "none" ) {
491
if( $linestyle != "none" ) {
493
echo "c.stroke();\n\n";
497
$defsstring. = "c.clip();\n\n";
499
} else if ( $key == "d" ) {
503
// Draw d line commands. This is a fix for the bug that requires the line settings to be assigned before the line commands
504
if( isset( $dval )) {
505
echo "c.beginPath();\n";
518
$chr = substr( $str, $i, 1 );
519
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 )) {
520
// Process Parameters for any parameter command
521
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" ) {
528
// dochr loop for other drawing commands. Bug fix: If we encounter - and before it is an e we do nothing, otherwise proceed as normal
531
$dochr=substr($workstr,$j,1);
532
if(($dochr=="-" && $oldchr!="e" && $oldchr!="E")||$dochr==","||$dochr==" "){
533
if(trim($dostr)!=""){
534
$params[$noparams++]=$dostr;
545
} while( $j <= strlen( $workstr ));
546
if( trim( $dostr ) != "" ) {
547
$params [$noparams++] = $dostr;
550
if( $command == "M" || $command == "m" ) {
551
for( $j = 0; $j < $noparams; $j += 2 ) {
553
// Normal moveto set cx,cy
554
if( $command == "M" ) {
557
echo "c.moveTo(".$cx.",".$cy.");\n";
561
} else if( $command == "m" ) {
565
echo "c.moveTo(".$cx.",".$cy.");\n";
571
$cy += $params[$j+1];
572
echo "c.moveTo( ".$cx.",".$cy." );\n";
577
if( $command == "M" ) {
580
echo "c.lineTo(".$cx.",".$cy.");\n";
581
} else if( $command == "m" ) {
583
$cy += $params[$j+1];
584
echo "c.lineTo(".$cx.",".$cy.");\n";
588
} else if( $command == "C" || $command == "c" ) {
590
for( $j = 0; $j < $noparams; $j += 6 ) {
591
if( $command == "C" ) {
593
$p1y = $params[$j+1];
594
$p2x = $params[$j+2];
595
$p2y = $params[$j+3];
600
echo "c.bezierCurveTo( ".$p1x.",".$p1y.",".$p2x.",".$p2y.",".$cx.",".$cy.");\n";
601
// Curveto absolute set cx to final point, other coordinates are control points
602
} else if( $command == "c" ) {
603
// Curveto relative set cx to final point, other coordinates are relative control points
604
$p1x=$cx+$params[$j];
605
$p1y=$cy+$params[$j+1];
606
$p2x=$cx+$params[$j+2];
607
$p2y=$cy+$params[$j+3];
612
echo "c.bezierCurveTo(".$p1x.",".$p1y.",".$p2x.",".$p2y.",".$cx.",".$cy.");\n";
615
} else if( $command == "S" || $command == "s" ) {
616
//context . quadraticCurveTo(cpx, cpy, x, y)
618
for( $j = 0; $j < $noparams; $j += 4 ) {
619
if( $command == "S" ) {
626
echo "c.bezierCurveTo(".$lastpointx.",".$lastpointy.",".$p1x.",".$p1y.",".$cx.",".$cy.");\n";
627
// Curveto absolute set cx to final point, other coordinates are control points
628
} else if( $command == "s" ) {
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];
636
echo "c.bezierCurveTo(".$lastpointx.",".$lastpointy.",".$p1x.",".$p1y.",".$cx.",".$cy.");\n";
639
} else if( $command == "V" || $command == "v" ) {
641
for($j=0;$j<$noparams;$j++){
644
echo "c.lineTo(".$cx.",".$cy.");\n";
645
} else if( $command == "v" ) {
646
// Curveto relative set cx to final point, other coordinates are relative control points
648
echo "c.lineTo(".$cx.",".$cy.");\n";
651
} else if( $command == "H" || $command == "h" ) {
653
for($j=0;$j<$noparams;$j++){
656
echo "c.lineTo(".$cx.",".$cy.");\n";
657
} else if( $command == "h" ) {
658
// Curveto relative set cx to final point, other coordinates are relative control points
660
echo "c.lineTo(".$cx.",".$cy.");\n";
663
} else if( $command == "L" || $command == "l" ) {
665
for($j=0;$j<$noparams;$j+=2){
669
echo "c.lineTo(".$cx.",".$cy.");\n";
670
} else if( $command == "l" ) {
671
// Curveto relative set cx to final point, other coordinates are relative control points
674
echo "c.lineTo(".$cx.",".$cy.");\n";
677
} else if( $command == "Z" || $command == "z" ) {
678
echo "c.lineTo(".$firstpointx.",".$firstpointy.");\n";
679
} else if( $command == "A" || $command == "a" ) {
680
// To avoid hard math - draw arc as a line
681
for( $j = 0; $j < $noparams; $j += 7 ) {
685
$largeflag = $params[3];
686
$sweepflag = $params[4];
689
echo "c.lineTo(".$cx.",".$cy.");\n";
699
} while( $i <= strlen( $str ));
700
echo "c.globalAlpha = $opacity;\n";
701
if( $fillstyle == "none" && $linestyle == "none" ) {
702
echo 'c.fillStyle = "#000";';
704
echo "c.fill();\n\n";
706
if( $fillstyle != "none" ) {
707
// echo "c.save();\n\n";
708
// echo "c.scale(2.5,2.5);\n";
710
// echo "c.restore();\n\n";
711
if( $linestyle == "none" ) {
821
}elseif($graphelement->getName()=="circle"||$graphelement->getName()=="ellipse"){
822
echo "c.globalAlpha = $opacity;\n";
824
echo "c.beginPath();\n";
831
$xsp=$cx-($rx*0.552);
832
$xep=$cx+($rx*0.552);
833
$ysp=$cy-($ry*0.552);
834
$yep=$cy+($ry*0.552);
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";
842
if($fillstyle!="none"){
844
if($linestyle=="none") echo "\n";
846
if($linestyle!="none"){
847
echo "c.stroke();\n";
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";
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";
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";
871
}elseif($graphelement->getName()=="defs"){
874
}elseif($graphelement->getName()=="defsend"){
876
$clipdefs[strval($defsid)]=$defsstring;
715
if( $linestyle != "none" ) {
716
echo "c.stroke();\n";
721
if( $graphelement -> getName() == "text" ) {
722
echo "c.globalAlpha = $opacity;\n";
723
echo "c.beginPath();\n";
725
echo "c.font = '".$fontstyle." ".$fontline."px ".$fontfamily."';\n";
726
if( isset( $translate ) && isset( $rotate ) && isset( $scale )) {
731
if( isset( $textx ) && isset( $texty )) {
732
echo "c.fillText( '".$textline."',".$textx.",".$texty." );\n";
734
echo "c.fillText('".$textline."',0,0);\n";
736
if( $linestyle != "none" ) {
737
if( isset( $textx ) && isset( $texty )) {
738
echo "c.strokeText('".$textline."',".$textx.",".$texty.");\n";
740
echo "c.strokeText('".$textline."',0,0);\n";
743
echo "c.restore();\n\n";
744
} else if( $graphelement -> getName() == "rect" ) {
745
// This rectangle must be clipped!
746
if( isset( $attrs['clip-path'] )) {
747
$clipid = substr( $attrs['clip-path'], 5);
748
$clipid = substr( $clipid, 0, strlen( $clipid ) - 1 );
749
$clipid = $clippaths [$clipid];
751
echo $clipdefs[strval($clipid)];
753
echo "c.globalAlpha = $opacity;\n";
754
echo "c.beginPath();\n";
755
echo "c.moveTo(".$linex1.",".$liney1.");\n";
756
echo "c.lineTo(".($linex1+$linex2).",".($liney1).");\n";
757
echo "c.lineTo(".($linex1+$linex2).",".($liney1+$liney2).");\n";
758
echo "c.lineTo(".($linex1).",".($liney1+$liney2).");\n";
759
echo "c.lineTo(".($linex1).",".($liney1).");\n";
760
if( $fillstyle != "none" ) {
761
// echo "c.save();\n\n";
762
// echo "c.scale(1,1);\n";
764
// echo "c.restore();\n\n";
765
if( $linestyle == "none" ) echo "\n";
767
if( $linestyle != "none" ) {
768
echo "c.stroke();\n";
770
// This rectangle must be clipped!
771
if( isset( $attrs ['clip-path'] )) {
772
echo "c.restore();\n";
775
} else if( $graphelement -> getName() == "circle" || $graphelement -> getName() == "ellipse" ) {
776
echo "c.globalAlpha = $opacity;\n";
777
echo "c.beginPath();\n";
782
$xsp = $cx - ( $rx*0.552 );
783
$xep = $cx + ( $rx*0.552 );
784
$ysp = $cy - ( $ry*0.552 );
785
$yep = $cy + ( $ry*0.552 );
786
echo "c.moveTo(".$cx.",".$ys.");\n";
787
echo "c.bezierCurveTo(".$xsp.",".$ys.",".$xs.",".$ysp.",".$xs.",".$cy.");\n";
788
echo "c.bezierCurveTo(".$xs.",".$yep.",".$xsp.",".$ye.",".$cx.",".$ye.");\n";
789
echo "c.bezierCurveTo(".$xep.",".$ye.",".$xe.",".$yep.",".$xe.",".$cy.");\n";
790
echo "c.bezierCurveTo(".$xe.",".$ysp.",".$xep.",".$ys.",".$cx.",".$ys.");\n";
791
if( $fillstyle != "none" ) {
793
if( $linestyle == "none" ) echo "\n";
795
if( $linestyle != "none" ) {
796
echo "c.stroke();\n";
799
} else if( $graphelement -> getName() == "line" ) {
800
echo "context.beginPath();\n";
801
echo "context.moveTo(".$linex1.",".$liney1.");\n";
802
echo "context.lineTo(".$linex1.",".$liney1.");\n";
803
echo "context.stroke();\n";
804
} else if( $graphelement -> getName() == "g" ) {
805
// We only print groups that have an ID
806
// if(isset($attrs['id'])){
807
echo "//-------------------------------\n";
808
echo "// Group: ".$attrs['id']."\n";
809
echo "//-------------------------------\n";
811
} else if( $graphelement -> getName() == "eg" ) {
812
// We only print groups that have an ID
813
if( isset( $attrs['id'] )) {
814
echo "//-------------------------------\n";
815
echo "// GroupEnd: ".$attrs['id']."\n";
816
echo "//-------------------------------\n";
819
} else if( $graphelement -> getName() == "defs" ) {
822
} else if( $graphelement -> getName() == "defsend" ) {
823
if( $defsid != "" ) {
824
$clipdefs[strval($defsid)]=$defsstring;
b'\\ No newline at end of file'