184 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			184 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?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;
 | |
| 	}
 | |
| }
 | |
| ?>
 |