Source of file AbstractRenderer.php
Size: 13,400 Bytes - Last Modified: 2014-03-12T23:21:18+01:00
/home/theseer/Downloads/ZendFramework-2.3.0/library/Zend/Barcode/Renderer/AbstractRenderer.php
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519 | <?php /** * Zend Framework (http://framework.zend.com/) * * @link http://github.com/zendframework/zf2 for the canonical source repository * @copyright Copyright (c) 2005-2014 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ namespace Zend\Barcode\Renderer; use Traversable; use Zend\Barcode\Barcode; use Zend\Barcode\Exception as BarcodeException; use Zend\Barcode\Object; use Zend\Stdlib\ArrayUtils; /** * Class for rendering the barcode */ abstract class AbstractRenderer implements RendererInterface { /** * Namespace of the renderer for autoloading * @var string */ protected $rendererNamespace = 'Zend\Barcode\Renderer'; /** * Renderer type * @var string */ protected $type = null; /** * Activate/Deactivate the automatic rendering of exception * @var bool */ protected $automaticRenderError = false; /** * Offset of the barcode from the top of the rendering resource * @var int */ protected $topOffset = 0; /** * Offset of the barcode from the left of the rendering resource * @var int */ protected $leftOffset = 0; /** * Horizontal position of the barcode in the rendering resource * @var int */ protected $horizontalPosition = 'left'; /** * Vertical position of the barcode in the rendering resource * @var int */ protected $verticalPosition = 'top'; /** * Module size rendering * @var float */ protected $moduleSize = 1; /** * Barcode object * @var Object\ObjectInterface */ protected $barcode; /** * Drawing resource */ protected $resource; /** * Show a transparent background * @var Boolean */ protected $transparentBackground = false; /** * Constructor * @param array|Traversable $options */ public function __construct($options = null) { if ($options instanceof Traversable) { $options = ArrayUtils::iteratorToArray($options); } if (is_array($options)) { $this->setOptions($options); } $this->type = strtolower(substr( get_class($this), strlen($this->rendererNamespace) + 1 )); } /** * Set renderer state from options array * @param array $options * @return AbstractRenderer */ public function setOptions($options) { foreach ($options as $key => $value) { $method = 'set' . $key; if (method_exists($this, $method)) { $this->$method($value); } } return $this; } /** * Set renderer namespace for autoloading * * @param string $namespace * @return AbstractRenderer */ public function setRendererNamespace($namespace) { $this->rendererNamespace = $namespace; return $this; } /** * Retrieve renderer namespace * * @return string */ public function getRendererNamespace() { return $this->rendererNamespace; } /** * Set whether background should be transparent * Will work for SVG and Image (png and gif only) * * @param $bool * @return $this */ public function setTransparentBackground($bool) { $this->transparentBackground = $bool; return $this; } /** * @return bool */ public function getTransparentBackground() { return $this->transparentBackground; } /** * Retrieve renderer type * @return string */ public function getType() { return $this->type; } /** * Manually adjust top position * @param int $value * @return AbstractRenderer * @throws Exception\OutOfRangeException */ public function setTopOffset($value) { if (!is_numeric($value) || intval($value) < 0) { throw new Exception\OutOfRangeException( 'Vertical position must be greater than or equals 0' ); } $this->topOffset = intval($value); return $this; } /** * Retrieve vertical adjustment * @return int */ public function getTopOffset() { return $this->topOffset; } /** * Manually adjust left position * @param int $value * @return AbstractRenderer * @throws Exception\OutOfRangeException */ public function setLeftOffset($value) { if (!is_numeric($value) || intval($value) < 0) { throw new Exception\OutOfRangeException( 'Horizontal position must be greater than or equals 0' ); } $this->leftOffset = intval($value); return $this; } /** * Retrieve vertical adjustment * @return int */ public function getLeftOffset() { return $this->leftOffset; } /** * Activate/Deactivate the automatic rendering of exception * @param bool $value * @return AbstractRenderer */ public function setAutomaticRenderError($value) { $this->automaticRenderError = (bool) $value; return $this; } /** * Horizontal position of the barcode in the rendering resource * @param string $value * @return AbstractRenderer * @throws Exception\UnexpectedValueException */ public function setHorizontalPosition($value) { if (!in_array($value, array('left', 'center', 'right'))) { throw new Exception\UnexpectedValueException( "Invalid barcode position provided must be 'left', 'center' or 'right'" ); } $this->horizontalPosition = $value; return $this; } /** * Horizontal position of the barcode in the rendering resource * @return string */ public function getHorizontalPosition() { return $this->horizontalPosition; } /** * Vertical position of the barcode in the rendering resource * @param string $value * @return AbstractRenderer * @throws Exception\UnexpectedValueException */ public function setVerticalPosition($value) { if (!in_array($value, array('top', 'middle', 'bottom'))) { throw new Exception\UnexpectedValueException( "Invalid barcode position provided must be 'top', 'middle' or 'bottom'" ); } $this->verticalPosition = $value; return $this; } /** * Vertical position of the barcode in the rendering resource * @return string */ public function getVerticalPosition() { return $this->verticalPosition; } /** * Set the size of a module * @param float $value * @return AbstractRenderer * @throws Exception\OutOfRangeException */ public function setModuleSize($value) { if (!is_numeric($value) || floatval($value) <= 0) { throw new Exception\OutOfRangeException( 'Float size must be greater than 0' ); } $this->moduleSize = floatval($value); return $this; } /** * Set the size of a module * @return float */ public function getModuleSize() { return $this->moduleSize; } /** * Retrieve the automatic rendering of exception * @return bool */ public function getAutomaticRenderError() { return $this->automaticRenderError; } /** * Set the barcode object * @param Object\ObjectInterface $barcode * @return AbstractRenderer */ public function setBarcode(Object\ObjectInterface $barcode) { $this->barcode = $barcode; return $this; } /** * Retrieve the barcode object * @return Object\ObjectInterface */ public function getBarcode() { return $this->barcode; } /** * Checking of parameters after all settings * @return bool */ public function checkParams() { $this->checkBarcodeObject(); $this->checkSpecificParams(); return true; } /** * Check if a barcode object is correctly provided * @return void * @throws Exception\RuntimeException */ protected function checkBarcodeObject() { if ($this->barcode === null) { throw new Exception\RuntimeException( 'No barcode object provided' ); } } /** * Calculate the left and top offset of the barcode in the * rendering support * * @param float $supportHeight * @param float $supportWidth * @return void */ protected function adjustPosition($supportHeight, $supportWidth) { $barcodeHeight = $this->barcode->getHeight(true) * $this->moduleSize; if ($barcodeHeight != $supportHeight && $this->topOffset == 0) { switch ($this->verticalPosition) { case 'middle': $this->topOffset = floor( ($supportHeight - $barcodeHeight) / 2); break; case 'bottom': $this->topOffset = $supportHeight - $barcodeHeight; break; case 'top': default: $this->topOffset = 0; break; } } $barcodeWidth = $this->barcode->getWidth(true) * $this->moduleSize; if ($barcodeWidth != $supportWidth && $this->leftOffset == 0) { switch ($this->horizontalPosition) { case 'center': $this->leftOffset = floor( ($supportWidth - $barcodeWidth) / 2); break; case 'right': $this->leftOffset = $supportWidth - $barcodeWidth; break; case 'left': default: $this->leftOffset = 0; break; } } } /** * Draw the barcode in the rendering resource * * @throws BarcodeException\ExceptionInterface * @return mixed */ public function draw() { try { $this->checkParams(); $this->initRenderer(); $this->drawInstructionList(); } catch (BarcodeException\ExceptionInterface $e) { if ($this->automaticRenderError && !($e instanceof BarcodeException\RendererCreationException)) { $barcode = Barcode::makeBarcode( 'error', array('text' => $e->getMessage()) ); $this->setBarcode($barcode); $this->resource = null; $this->initRenderer(); $this->drawInstructionList(); } else { throw $e; } } return $this->resource; } /** * Sub process to draw the barcode instructions * Needed by the automatic error rendering */ private function drawInstructionList() { $instructionList = $this->barcode->draw(); foreach ($instructionList as $instruction) { switch ($instruction['type']) { case 'polygon': $this->drawPolygon( $instruction['points'], $instruction['color'], $instruction['filled'] ); break; case 'text': //$text, $size, $position, $font, $color, $alignment = 'center', $orientation = 0) $this->drawText( $instruction['text'], $instruction['size'], $instruction['position'], $instruction['font'], $instruction['color'], $instruction['alignment'], $instruction['orientation'] ); break; default: throw new Exception\UnexpectedValueException( 'Unkown drawing command' ); } } } /** * Checking of parameters after all settings * @return void */ abstract protected function checkSpecificParams(); /** * Initialize the rendering resource * @return void */ abstract protected function initRenderer(); /** * Draw a polygon in the rendering resource * @param array $points * @param int $color * @param bool $filled */ abstract protected function drawPolygon($points, $color, $filled = true); /** * Draw a polygon in the rendering resource * @param string $text * @param float $size * @param array $position * @param string $font * @param int $color * @param string $alignment * @param float $orientation */ abstract protected function drawText( $text, $size, $position, $font, $color, $alignment = 'center', $orientation = 0 ); } |