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 shadows
 *
 */
class awShadow {

        /**
         * Shadow on left and top sides
         *
         * @var int
         */
        const LEFT_TOP = 1;

        /**
         * Shadow on left and bottom sides
         *
         * @var int
         */
        const LEFT_BOTTOM = 2;
        

        /**
         * Shadow on right and top sides
         *
         * @var int
         */
        const RIGHT_TOP = 3;

        /**
         * Shadow on right and bottom sides
         *
         * @var int
         */
        const RIGHT_BOTTOM = 4;
        
        /**
         * In mode
         *
         * @var int
         */
        const IN = 1;
        
        /**
         * Out mode
         *
         * @var int
         */
        const OUT = 2;

        /**
         * Shadow size
         *
         * @var int
         */
        private $size = 0;
        
        /**
         * Hide shadow ?
         *
         * @var bool
         */
        protected $hide = FALSE;

        /**
         * Shadow color
         *
         * @var Color
         */
        private $color;

        /**
         * Shadow position
         *
         * @var int
         */
        private $position;

        /**
         * Smooth shadow ?
         *
         * @var bool
         */
        private $smooth = FALSE;
        
        /**
         * Shadow constructor
         *
         * @param int $position Shadow position
         */
        public function __construct($position) {
                $this->setPosition($position);
        }
        
        /**
         * Hide shadow ?
         *
         * @param bool $hide
         */
        public function hide($hide = TRUE) {
                $this->hide = (bool)$hide;
        }
        
        /**
         * Show shadow ?
         *
         * @param bool $show
         */
        public function show($show = TRUE) {
                $this->hide = (bool)!$show;
        }
        
        /**
         * Change shadow size
         *
         * @param int $size
         * @param bool $smooth Smooth the shadow (facultative argument)
         */
        public function setSize($size, $smooth = NULL) {
                $this->size = (int)$size;
                if($smooth !== NULL) {
                        $this->smooth($smooth);
                }
        }
        
        /**
         * Change shadow color
         *
         * @param awColor $color
         */
        public function setColor(awColor $color) {
                $this->color = $color;
        }
        
        /**
         * Change shadow position
         *
         * @param int $position
         */
        public function setPosition($position) {
                $this->position = (int)$position;
        }
        
        /**
         * Smooth shadow ?
         *
         * @param bool $smooth
         */
        public function smooth($smooth) {
                $this->smooth = (bool)$smooth;
        }
        
        /**
         * Get the space taken by the shadow
         *
         * @return Side
         */
        public function getSpace() {
        
                return new awSide(
                        ($this->position === awShadow::LEFT_TOP or $this->position === awShadow::LEFT_BOTTOM) ? $this->size : 0,
                        ($this->position === awShadow::RIGHT_TOP or $this->position === awShadow::RIGHT_BOTTOM) ? $this->size : 0,
                        ($this->position === awShadow::LEFT_TOP or $this->position === awShadow::RIGHT_TOP) ? $this->size : 0,
                        ($this->position === awShadow::LEFT_BOTTOM or $this->position === awShadow::RIGHT_BOTTOM) ? $this->size : 0
                );
        
        }
        
        /**
         * Draw shadow
         *
         * @param awDriver $driver
         * @param awPoint $p1 Top-left point
         * @param awPoint $p2 Right-bottom point
         * @param int Drawing mode
         */
        public function draw(awDriver $driver, awPoint $p1, awPoint $p2, $mode) {
        
                if($this->hide) {
                        return;
                }
        
                if($this->size <= 0) {
                        return;
                }
                
                $driver = clone $driver;
                
                $color = ($this->color instanceof awColor) ? $this->color : new awColor(125, 125, 125);
        
                switch($this->position) {
                
                        case awShadow::RIGHT_BOTTOM :
                        
                                if($mode === awShadow::OUT) {
                                        $t1 = $p1->move(0, 0);
                                        $t2 = $p2->move($this->size + 1, $this->size + 1);
                                } else { // PHP 4 compatibility
                                        $t1 = $p1->move(0, 0);
                                        $t2 = $p2->move(0, 0);
                                }
                
                                $width = $t2->x - $t1->x;
                                $height = $t2->y - $t1->y;
                
                                $driver->setAbsPosition($t1->x + $driver->x, $t1->y + $driver->y);
                        
                                $driver->filledRectangle(
                                        $color,
                                        new awLine(
                                                new awPoint($width - $this->size, $this->size),
                                                new awPoint($width - 1, $height - 1)
                                        )
                                );
                        
                                $driver->filledRectangle(
                                        $color,
                                        new awLine(
                                                new awPoint($this->size, $height - $this->size),
                                                new awPoint($width - $this->size - 1, $height - 1)
                                        )
                                );
                                
                                $this->smoothPast($driver, $color, $width, $height);
                                
                                break;
                
                        case awShadow::LEFT_TOP :
                        
                                if($mode === awShadow::OUT) {
                                        $t1 = $p1->move(- $this->size, - $this->size);
                                        $t2 = $p2->move(0, 0);
                                } else { // PHP 4 compatibility
                                        $t1 = $p1->move(0, 0);
                                        $t2 = $p2->move(0, 0);
                                }
                
                                $width = $t2->x - $t1->x;
                                $height = $t2->y - $t1->y;
                
                                $driver->setAbsPosition($t1->x + $driver->x, $t1->y + $driver->y);
                                
                                $height = max($height + 1, $this->size);
                        
                                $driver->filledRectangle(
                                        $color,
                                        new awLine(
                                                new awPoint(0, 0),
                                                new awPoint($this->size - 1, $height - $this->size - 1)
                                        )
                                );
                        
                                $driver->filledRectangle(
                                        $color,
                                        new awLine(
                                                new awPoint($this->size, 0),
                                                new awPoint($width - $this->size - 1, $this->size - 1)
                                        )
                                );
                                
                                $this->smoothPast($driver, $color, $width, $height);
                                
                                break;
                
                        case awShadow::RIGHT_TOP :
                        
                                if($mode === awShadow::OUT) {
                                        $t1 = $p1->move(0, - $this->size);
                                        $t2 = $p2->move($this->size + 1, 0);
                                } else { // PHP 4 compatibility
                                        $t1 = $p1->move(0, 0);
                                        $t2 = $p2->move(0, 0);
                                }
                
                                $width = $t2->x - $t1->x;
                                $height = $t2->y - $t1->y;
                
                                $driver->setAbsPosition($t1->x + $driver->x, $t1->y + $driver->y);
                                
                                $height = max($height + 1, $this->size);
                        
                                $driver->filledRectangle(
                                        $color,
                                        new awLine(
                                                new awPoint($width - $this->size, 0),
                                                new awPoint($width - 1, $height - $this->size - 1)
                                        )
                                );
                        
                                $driver->filledRectangle(
                                        $color,
                                        new awLine(
                                                new awPoint($this->size, 0),
                                                new awPoint($width - $this->size - 1, $this->size - 1)
                                        )
                                );
                                
                                $this->smoothFuture($driver, $color, $width, $height);
                                
                                break;
                
                        case awShadow::LEFT_BOTTOM :
                        
                                if($mode === awShadow::OUT) {
                                        $t1 = $p1->move(- $this->size, 0);
                                        $t2 = $p2->move(0, $this->size + 1);
                                } else { // PHP 4 compatibility
                                        $t1 = $p1->move(0, 0);
                                        $t2 = $p2->move(0, 0);
                                }
                
                                $width = $t2->x - $t1->x;
                                $height = $t2->y - $t1->y;
                
                                $driver->setAbsPosition($t1->x + $driver->x, $t1->y + $driver->y);
                        
                                $driver->filledRectangle(
                                        $color,
                                        new awLine(
                                                new awPoint(0, $this->size),
                                                new awPoint($this->size - 1, $height - 1)
                                        )
                                );
                        
                                $driver->filledRectangle(
                                        $color,
                                        new awLine(
                                                new awPoint($this->size, $height - $this->size),
                                                new awPoint($width - $this->size - 1, $height - 1)
                                        )
                                );
                                
                                $this->smoothFuture($driver, $color, $width, $height);
                                
                                break;
                
                }
        
        }
        
        private function smoothPast(awDriver $driver, awColor $color, $width, $height) {
                
                if($this->smooth) {
                
                        for($i = 0; $i < $this->size; $i++) {
                                for($j = 0; $j <= $i; $j++) {
                                        $driver->point(
                                                $color,
                                                new awPoint($i, $j + $height - $this->size)
                                        );
                                }
                        }
                        
                        for($i = 0; $i < $this->size; $i++) {
                                for($j = 0; $j <= $i; $j++) {
                                        $driver->point(
                                                $color,
                                                new awPoint($width - $this->size + $j, $i)
                                        );
                                }
                        }
                        
                }
                
        }
        
        private function smoothFuture(awDriver $driver, awColor $color, $width, $height) {
                
                if($this->smooth) {
                
                        for($i = 0; $i < $this->size; $i++) {
                                for($j = 0; $j <= $i; $j++) {
                                        $driver->point(
                                                $color,
                                                new awPoint($i, $this->size - $j - 1)
                                        );
                                }
                        }
                        
                        for($i = 0; $i < $this->size; $i++) {
                                for($j = 0; $j <= $i; $j++) {
                                        $driver->point(
                                                $color,
                                                new awPoint($width - $this->size + $j, $height - $i - 1)
                                        );
                                }
                        }
                        
                }
        }

}

registerClass('Shadow');
?>