*/ define("SHADOW_LEFT_TOP", 1); define("SHADOW_LEFT_BOTTOM", 2); define("SHADOW_RIGHT_TOP", 3); define("SHADOW_RIGHT_BOTTOM", 4); define("SHADOW_IN", 1); define("SHADOW_OUT", 2); /* */ /** * Draw shadows * */ class awShadow { /** * Shadow on left and top sides * * @var int */ /** * Shadow on left and bottom sides * * @var int */ /** * Shadow on right and top sides * * @var int */ /** * Shadow on right and bottom sides * * @var int */ /** * In mode * * @var int */ /** * Out mode * * @var int */ /** * Shadow size * * @var int */ var $size = 0; /** * Hide shadow ? * * @var bool */ var $hide = FALSE; /** * Shadow color * * @var Color */ var $color; /** * Shadow position * * @var int */ var $position; /** * Smooth shadow ? * * @var bool */ var $smooth = FALSE; /** * Shadow constructor * * @param int $position Shadow position */ function awShadow($position) { $this->setPosition($position); } /** * Hide shadow ? * * @param bool $hide */ function hide($hide = TRUE) { $this->hide = (bool)$hide; } /** * Show shadow ? * * @param bool $show */ function show($show = TRUE) { $this->hide = (bool)!$show; } /** * Change shadow size * * @param int $size * @param bool $smooth Smooth the shadow (facultative argument) */ function setSize($size, $smooth = NULL) { $this->size = (int)$size; if($smooth !== NULL) { $this->smooth($smooth); } } /** * Change shadow color * * @param $color */ function setColor($color) { $this->color = $color; } /** * Change shadow position * * @param int $position */ function setPosition($position) { $this->position = (int)$position; } /** * Smooth shadow ? * * @param bool $smooth */ function smooth($smooth) { $this->smooth = (bool)$smooth; } /** * Get the space taken by the shadow * * @return Side */ function getSpace() { return new awSide( ($this->position === SHADOW_LEFT_TOP or $this->position === SHADOW_LEFT_BOTTOM) ? $this->size : 0, ($this->position === SHADOW_RIGHT_TOP or $this->position === SHADOW_RIGHT_BOTTOM) ? $this->size : 0, ($this->position === SHADOW_LEFT_TOP or $this->position === SHADOW_RIGHT_TOP) ? $this->size : 0, ($this->position === SHADOW_LEFT_BOTTOM or $this->position === SHADOW_RIGHT_BOTTOM) ? $this->size : 0 ); } /** * Draw shadow * * @param $drawer * @param $p1 Top-left point * @param $p2 Right-bottom point * @param int Drawing mode */ function draw($drawer, $p1, $p2, $mode) { if($this->hide) { return; } if($this->size <= 0) { return; } $color = (is_a($this->color, 'awColor')) ? $this->color : new awColor(125, 125, 125); switch($this->position) { case SHADOW_RIGHT_BOTTOM : if($mode === SHADOW_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; $drawer->setAbsPosition($t1->x + $drawer->x, $t1->y + $drawer->y); $drawer->filledRectangle( $color, new awLine( new awPoint($width - $this->size, $this->size), new awPoint($width - 1, $height - 1) ) ); $drawer->filledRectangle( $color, new awLine( new awPoint($this->size, $height - $this->size), new awPoint($width - $this->size - 1, $height - 1) ) ); $this->smoothPast($drawer, $color, $width, $height); break; case SHADOW_LEFT_TOP : if($mode === SHADOW_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; $drawer->setAbsPosition($t1->x + $drawer->x, $t1->y + $drawer->y); $height = max($height + 1, $this->size); $drawer->filledRectangle( $color, new awLine( new awPoint(0, 0), new awPoint($this->size - 1, $height - $this->size - 1) ) ); $drawer->filledRectangle( $color, new awLine( new awPoint($this->size, 0), new awPoint($width - $this->size - 1, $this->size - 1) ) ); $this->smoothPast($drawer, $color, $width, $height); break; case SHADOW_RIGHT_TOP : if($mode === SHADOW_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; $drawer->setAbsPosition($t1->x + $drawer->x, $t1->y + $drawer->y); $height = max($height + 1, $this->size); $drawer->filledRectangle( $color, new awLine( new awPoint($width - $this->size, 0), new awPoint($width - 1, $height - $this->size - 1) ) ); $drawer->filledRectangle( $color, new awLine( new awPoint($this->size, 0), new awPoint($width - $this->size - 1, $this->size - 1) ) ); $this->smoothFuture($drawer, $color, $width, $height); break; case SHADOW_LEFT_BOTTOM : if($mode === SHADOW_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; $drawer->setAbsPosition($t1->x + $drawer->x, $t1->y + $drawer->y); $drawer->filledRectangle( $color, new awLine( new awPoint(0, $this->size), new awPoint($this->size - 1, $height - 1) ) ); $drawer->filledRectangle( $color, new awLine( new awPoint($this->size, $height - $this->size), new awPoint($width - $this->size - 1, $height - 1) ) ); $this->smoothFuture($drawer, $color, $width, $height); break; } } function smoothPast($drawer, $color, $width, $height) { if($this->smooth) { for($i = 0; $i < $this->size; $i++) { for($j = 0; $j <= $i; $j++) { $drawer->point( $color, new awPoint($i, $j + $height - $this->size) ); } } for($i = 0; $i < $this->size; $i++) { for($j = 0; $j <= $i; $j++) { $drawer->point( $color, new awPoint($width - $this->size + $j, $i) ); } } } } function smoothFuture($drawer, $color, $width, $height) { if($this->smooth) { for($i = 0; $i < $this->size; $i++) { for($j = 0; $j <= $i; $j++) { $drawer->point( $color, new awPoint($i, $this->size - $j - 1) ); } } for($i = 0; $i < $this->size; $i++) { for($j = 0; $j <= $i; $j++) { $drawer->point( $color, new awPoint($width - $this->size + $j, $height - $i - 1) ); } } } } } registerClass('Shadow'); ?>