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');