1
0
aclindsay.com/svgparser/parser/objects/Element.php

184 lines
5.8 KiB
PHP
Raw Permalink Normal View History

2011-02-24 14:25:26 -05:00
<?php
/*
SVG to dojox.gfx Parser
Copyright (C) 2009 Aaron Lindsay <aclindsay@aclindsay.com>
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
class Element {
private $id;
private $styles;
private $transforms;
private $transform;
public function __construct() {
$this->id = "";
$this->styles = array();
$this->transforms = array();
$this->transform = new Transform();
}
public function setId($newId) {
$this->id = $newId;
}
public function getId() {
return $this->id;
}
public function setStyles($newStyles) {
$this->styles = array();
$smallerStyles = split(";", $newStyles);
foreach($smallerStyles as $small) {
$parts = split(":", $small);
$this->styles[$parts[0]] = $parts[1];
}
}
public function setStyle($key, $style) {
$this->styles[$key] = $style;
}
public function getStyles() {
return $this->styles;
}
public function getStyle($key) {
if ($this->styles && array_key_exists($key, $this->styles))
return $this->styles[$key];
else
return null;
}
public function setStroke($stroke) {
$this->styles["stroke"] = $stroke;
}
public function setStrokeWidth($width) {
$this->styles["stroke-width"] = $width;
}
public function setStrokeLinecap($linecap) {
$this->styles["stroke-linecap"] = $linecap;
}
public function setFill($fill) {
$this->styles["fill"] = $fill;
}
//$transform is a string of transformations
public function setTransforms($transform) {
$this->transforms = array();
$this->addTransforms($transform);
$this->combineTransforms();
}
//$transform is a string of transformations
public function addTransforms($transform) {
$parts = split("\\)", $transform);
foreach ($parts as $part) {
//because ')' is the last character, we'll get an empty string here if we don't watch out
if ($part == "")
break;
$transform = split("\\(", trim($part));
switch (trim($transform[0])) {
case "matrix":
//get all the matrix elements, create a new transform and set them
$elements = split("[[:blank:],]+", trim($transform[1]));
$transformObject = new Transform();
$transformObject->setFullMatrix($elements[0], $elements[1], $elements[2], $elements[3], $elements[4], $elements[5]);
$this->transforms[] = $transformObject;
break;
case "translate":
//get all the matrix elements, create a new translate transform and set them
$elements = split("[[:blank:],]+", trim($transform[1]));
$transformObject = new Transform();
$transformObject->setTranslate($elements[0], $elements[1]);
$this->transforms[] = $transformObject;
break;
case "scale":
//get all the matrix elements, create a new scale transform and set them
$elements = split("[[:blank:],]+", trim($transform[1]));
$transformObject = new Transform();
if (count($elements) > 1)
$transformObject->setScale($elements[0], $elements[1]);
else
$transformObject->setScale($elements[0]);
$this->transforms[] = $transformObject;
break;
case "rotate":
//get all the matrix elements, create a new rotate transform and set them
$elements = split("[[:blank:],]+", trim($transform[1]));
//if there are 3 arguments, they are angle, and (x,y) coordinates of the point to rotate about
//to handle this, we translate, rotate, and translate back
if (count($elements) >= 3) {
$transformObject1 = new Transform();
$transformObject1->setTranslate(-$elements[1], -$elements[2]);
$this->transforms[] = $transformObject1;
$transformObject2 = new Transform();
$transformObject2->setRotate($elements[0]);
$this->transforms[] = $transformObject2;
$transformObject3 = new Transform();
$transformObject3->setTranslate($elements[1], $elements[2]);
$this->transforms[] = $transformObject3;
} else {
$transformObject = new Transform();
$transformObject->setRotate($elements[0]);
$this->transforms[] = $transformObject;
}
break;
case "skewX":
//get all the matrix elements, create a new skew transform and set them
$elements = split("[[:blank:],]+", trim($transform[1]));
$transformObject = new Transform();
$transformObject->setSkewX($elements[0]);
$this->transforms[] = $transformObject;
break;
case "skewY":
//get all the matrix elements, create a new skew transform and set them
$elements = split("[[:blank:],]+", trim($transform[1]));
$transformObject = new Transform();
$transformObject->setSkewY($elements[0]);
$this->transforms[] = $transformObject;
break;
}
}
//combine all these into one transform
$this->combineTransforms();
}
//combine all transforms into one transform and store in $this->transform
private function combineTransforms() {
$one = new Transform();
foreach ($this->transforms as $transform)
$one->multiplyBy($transform);
$this->transform = $one;
}
public function setTransform($transform) {
$this->transform = $transform;
$this->transforms = array();
$this->transforms[] = $transform;
}
public function getTransform() {
return $this->transform;
}
//an ARRAY of Transform objects is returned
public function getTransforms() {
return $this->transforms;
}
}
?>