490 lines
8.6 KiB
PHP
Executable File
490 lines
8.6 KiB
PHP
Executable File
<?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');
|