Rev 60 | Blame | Compare with Previous | Last modification | View Log | RSS feed
<?php/** This work is hereby released into the Public Domain.* To view a copy of the public domain dedication,* visit http://creativecommons.org/licenses/publicdomain/ or send a letter to* Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.**/require_once dirname(__FILE__)."/../Graph.class.php";/*** Draw marks** @package Artichow*/class awMark {/*** Circle mark** @var int*/const CIRCLE = 1;/*** Square mark** @var int*/const SQUARE = 2;/*** Triangle mark** @var int*/const TRIANGLE = 3;/*** Inverted triangle mark** @var int*/const INVERTED_TRIANGLE = 4;/*** Rhombus mark** @var int*/const RHOMBUS = 5;/*** Cross (X) mark** @var int*/const CROSS = 6;/*** Plus mark** @var int*/const PLUS = 7;/*** Image mark** @var int*/const IMAGE = 8;/*** Star mark** @var int*/const STAR = 9;/*** Paperclip mark** @var int*/const PAPERCLIP = 10;/*** Book mark** @var int*/const BOOK = 11;/*** Must marks be hidden ?** @var bool*/protected $hide;/*** Mark type** @var int*/protected $type;/*** Mark size** @var int*/protected $size = 8;/*** Fill mark** @var Color, Gradient*/protected $fill;/*** Mark image** @var Image*/protected $image;/*** To draw marks** @var Driver*/protected $driver;/*** Move position from this vector** @var Point*/protected $move;/*** Marks border** @var Border*/public $border;/*** Build the mark*/public function __construct() {$this->fill = new awColor(255, 0, 0, 0);$this->border = new awBorder;$this->border->hide();$this->move = new awPoint(0, 0);}/*** Change mark position** @param int $x Add this interval to X coord* @param int $y Add this interval to Y coord*/public function move($x, $y) {$this->move = $this->move->move($x, $y);}/*** Hide marks ?** @param bool $hide TRUE to hide marks, FALSE otherwise*/public function hide($hide = TRUE) {$this->hide = (bool)$hide;}/*** Show marks ?** @param bool $show*/public function show($show = TRUE) {$this->hide = (bool)!$show;}/*** Change mark type** @param int $size Size in pixels*/public function setSize($size) {$this->size = (int)$size;}/*** Change mark type** @param int $type New mark type* @param int $size Mark size (can be NULL)*/public function setType($type, $size = NULL) {$this->type = (int)$type;if($size !== NULL) {$this->setSize($size);}}/*** Fill the mark with a color or a gradient** @param mixed $fill A color or a gradient*/public function setFill($fill) {if($fill instanceof awColor or $fill instanceof awGradient) {$this->fill = $fill;}}/*** Set an image* Only for awMark::IMAGE type.** @param Image An image*/public function setImage(awImage $image) {$this->image = $image;}/*** Draw the mark** @param awDriver $driver* @param awPoint $point Mark center*/public function draw(awDriver $driver, awPoint $point) {// Hide marks ?if($this->hide) {return;}// Check if we can print marksif($this->type !== NULL) {$this->driver = $driver;$realPoint = $this->move->move($point->x, $point->y);switch($this->type) {case awMark::CIRCLE :$this->drawCircle($realPoint);break;case awMark::SQUARE :$this->drawSquare($realPoint);break;case awMark::TRIANGLE :$this->drawTriangle($realPoint);break;case awMark::INVERTED_TRIANGLE :$this->drawTriangle($realPoint, TRUE);break;case awMark::RHOMBUS :$this->drawRhombus($realPoint);break;case awMark::CROSS :$this->drawCross($realPoint);break;case awMark::PLUS :$this->drawCross($realPoint, TRUE);break;case awMark::IMAGE :$this->drawImage($realPoint);break;case awMark::STAR :$this->changeType('star');$this->draw($driver, $point);break;case awMark::PAPERCLIP :$this->changeType('paperclip');$this->draw($driver, $point);break;case awMark::BOOK :$this->changeType('book');$this->draw($driver, $point);break;}}}protected function changeType($image) {$this->setType(awMARK::IMAGE);$this->setImage(new awFileImage(ARTICHOW_IMAGE.DIRECTORY_SEPARATOR.$image.'.png'));}protected function drawCircle(awPoint $point) {$this->driver->filledEllipse($this->fill,$point,$this->size, $this->size);$this->border->ellipse($this->driver,$point,$this->size, $this->size);}protected function drawSquare(awPoint $point) {list($x, $y) = $point->getLocation();$x1 = (int)($x - $this->size / 2);$x2 = $x1 + $this->size;$y1 = (int)($y - $this->size / 2);$y2 = $y1 + $this->size;$this->border->rectangle($this->driver, new awPoint($x1, $y1), new awPoint($x2, $y2));$size = $this->border->visible() ? 1 : 0;$this->driver->filledRectangle($this->fill,new awLine(new awPoint($x1 + $size, $y1 + $size),new awPoint($x2 - $size, $y2 - $size)));}protected function drawTriangle(awPoint $point, $inverted = FALSE) {list($x, $y) = $point->getLocation();$size = $this->size;$triangle = new awPolygon;// Set default style and thickness$triangle->setStyle(awPolygon::SOLID);$triangle->setThickness(1);if($inverted === TRUE) {// Bottom of the triangle$triangle->append(new awPoint($x, $y + $size / sqrt(3)));// Upper left corner$triangle->append(new awPoint($x - $size / 2, $y - $size / (2 * sqrt(3))));// Upper right corner$triangle->append(new awPoint($x + $size / 2, $y - $size / (2 * sqrt(3))));} else {// Top of the triangle$triangle->append(new awPoint($x, $y - $size / sqrt(3)));// Lower left corner$triangle->append(new awPoint($x - $size / 2, $y + $size / (2 * sqrt(3))));// Lower right corner$triangle->append(new awPoint($x + $size / 2, $y + $size / (2 * sqrt(3))));}$this->driver->filledPolygon($this->fill, $triangle);if($this->border->visible()) {$this->border->polygon($this->driver, $triangle);}}protected function drawRhombus(awPoint $point) {list($x, $y) = $point->getLocation();$rhombus = new awPolygon;// Set default style and thickness$rhombus->setStyle(awPolygon::SOLID);$rhombus->setThickness(1);// Top of the rhombus$rhombus->append(new awPoint($x, $y - $this->size / 2));// Right of the rhombus$rhombus->append(new awPoint($x + $this->size / 2, $y));// Bottom of the rhombus$rhombus->append(new awPoint($x, $y + $this->size / 2));// Left of the rhombus$rhombus->append(new awPoint($x - $this->size / 2, $y));$this->driver->filledPolygon($this->fill, $rhombus);if($this->border->visible()) {$this->border->polygon($this->driver, $rhombus);}}protected function drawCross(awPoint $point, $upright = FALSE) {list($x, $y) = $point->getLocation();if($upright === TRUE) {$x11 = (int)($x);$y11 = (int)($y - $this->size / 2);$x12 = (int)($x);$y12 = (int)($y + $this->size / 2);$y21 = (int)($y);$y22 = (int)($y);} else {$x11 = (int)($x - $this->size / 2);$y11 = (int)($y + $this->size / 2);$x12 = (int)($x + $this->size / 2);$y12 = (int)($y - $this->size / 2);$y21 = (int)($y - $this->size / 2);$y22 = (int)($y + $this->size / 2);}$x21 = (int)($x - $this->size / 2);$x22 = (int)($x + $this->size / 2);$this->driver->line($this->fill,new awLine(new awPoint($x11, $y11),new awPoint($x12, $y12)));$this->driver->line($this->fill,new awLine(new awPoint($x21, $y21),new awPoint($x22, $y22)));}protected function drawImage(awPoint $point) {if($this->image instanceof awImage) {$width = $this->image->width;$height = $this->image->height;list($x, $y) = $point->getLocation();$x1 = (int)($x - $width / 2);$x2 = $x1 + $width;$y1 = (int)($y - $width / 2);$y2 = $y1 + $height;$this->border->rectangle($this->driver, new awPoint($x1 - 1, $y1 - 1), new awPoint($x2 + 1, $y2 + 1));$this->driver->copyImage($this->image, new awPoint($x1, $y1), new awPoint($x2, $y2));}}}registerClass('Mark');?>