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