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; } } ?>