New file |
0,0 → 1,406 |
<?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'); |
?> |