Subversion Repositories Applications.gtt

Rev

Rev 61 | 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 marks
                if($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');
?>