<?php
/*
* (c) Jeroen van den Enden <info@endroid.nl>
*
* This source file is subject to the MIT license that is bundled
* with this source code in the file LICENSE.
*/
namespace Endroid\QrCode;
use Endroid\QrCode\Exception\InvalidPathException;
use Endroid\QrCode\Exception\InvalidWriterException;
use Endroid\QrCode\Exception\UnsupportedExtensionException;
use Endroid\QrCode\Writer\WriterInterface;
class QrCode implements QrCodeInterface
{
const LABEL_FONT_PATH_DEFAULT = __DIR__.'/../assets/noto_sans.otf';
/**
* @var string
*/
protected $text;
/**
* @var int
*/
protected $size = 300;
/**
* @var int
*/
protected $margin = 10;
/**
* @var array
*/
protected $foregroundColor = [
'r' => 0,
'g' => 0,
'b' => 0,
];
/**
* @var array
*/
protected $backgroundColor = [
'r' => 255,
'g' => 255,
'b' => 255,
];
/**
* @var string
*/
protected $encoding = 'UTF-8';
/**
* @var ErrorCorrectionLevel
*/
protected $errorCorrectionLevel;
/**
* @var string
*/
protected $logoPath;
/**
* @var int
*/
protected $logoWidth;
/**
* @var string
*/
protected $label;
/**
* @var int
*/
protected $labelFontSize = 16;
/**
* @var string
*/
protected $labelFontPath = self::LABEL_FONT_PATH_DEFAULT;
/**
* @var LabelAlignment
*/
protected $labelAlignment;
/**
* @var array
*/
protected $labelMargin = [
't' => 0,
'r' => 10,
'b' => 10,
'l' => 10,
];
/**
* @var WriterRegistryInterface
*/
protected $writerRegistry;
/**
* @var WriterInterface
*/
protected $writer;
/**
* @var bool
*/
protected $validateResult = false;
/**
* @param string $text
*/
public function __construct($text = '')
{
$this->text = $text;
$this->errorCorrectionLevel = new ErrorCorrectionLevel(ErrorCorrectionLevel::LOW);
$this->labelAlignment = new LabelAlignment(LabelAlignment::CENTER);
$this->writerRegistry = new StaticWriterRegistry();
}
/**
* @param string $text
*
* @return $this
*/
public function setText($text)
{
$this->text = $text;
return $this;
}
/**
* {@inheritdoc}
*/
public function getText()
{
return $this->text;
}
/**
* @param int $size
*
* @return $this
*/
public function setSize($size)
{
$this->size = $size;
return $this;
}
/**
* {@inheritdoc}
*/
public function getSize()
{
return $this->size;
}
/**
* @param int $margin
*
* @return $this
*/
public function setMargin($margin)
{
$this->margin = $margin;
return $this;
}
/**
* {@inheritdoc}
*/
public function getMargin()
{
return $this->margin;
}
/**
* @param array $foregroundColor
*
* @return $this
*/
public function setForegroundColor($foregroundColor)
{
$this->foregroundColor = $foregroundColor;
return $this;
}
/**
* {@inheritdoc}
*/
public function getForegroundColor()
{
return $this->foregroundColor;
}
/**
* @param array $backgroundColor
*
* @return $this
*/
public function setBackgroundColor($backgroundColor)
{
$this->backgroundColor = $backgroundColor;
return $this;
}
/**
* {@inheritdoc}
*/
public function getBackgroundColor()
{
return $this->backgroundColor;
}
/**
* @param string $encoding
*
* @return $this
*/
public function setEncoding($encoding)
{
$this->encoding = $encoding;
return $this;
}
/**
* {@inheritdoc}
*/
public function getEncoding()
{
return $this->encoding;
}
/**
* @param string $errorCorrectionLevel
*
* @return $this
*/
public function setErrorCorrectionLevel($errorCorrectionLevel)
{
$this->errorCorrectionLevel = new ErrorCorrectionLevel($errorCorrectionLevel);
return $this;
}
/**
* {@inheritdoc}
*/
public function getErrorCorrectionLevel()
{
return $this->errorCorrectionLevel->getValue();
}
/**
* @param string $logoPath
*
* @return $this
*
* @throws InvalidPathException
*/
public function setLogoPath($logoPath)
{
$logoPath = realpath($logoPath);
if (!is_file($logoPath)) {
throw new InvalidPathException('Invalid logo path: '.$logoPath);
}
$this->logoPath = $logoPath;
return $this;
}
/**
* {@inheritdoc}
*/
public function getLogoPath()
{
return $this->logoPath;
}
/**
* @param int $logoWidth
*
* @return $this
*/
public function setLogoWidth($logoWidth)
{
$this->logoWidth = $logoWidth;
return $this;
}
/**
* {@inheritdoc}
*/
public function getLogoWidth()
{
return $this->logoWidth;
}
/**
* @param string $label
* @param int $labelFontSize
* @param string $labelFontPath
* @param string $labelAlignment
* @param array $labelMargin
*
* @return $this
*/
public function setLabel($label, $labelFontSize = null, $labelFontPath = null, $labelAlignment = null, $labelMargin = null)
{
$this->label = $label;
if (null !== $labelFontSize) {
$this->setLabelFontSize($labelFontSize);
}
if (null !== $labelFontPath) {
$this->setLabelFontPath($labelFontPath);
}
if (null !== $labelAlignment) {
$this->setLabelAlignment($labelAlignment);
}
if (null !== $labelMargin) {
$this->setLabelMargin($labelMargin);
}
return $this;
}
/**
* {@inheritdoc}
*/
public function getLabel()
{
return $this->label;
}
/**
* @param int $labelFontSize
*
* @return $this
*/
public function setLabelFontSize($labelFontSize)
{
$this->labelFontSize = $labelFontSize;
return $this;
}
/**
* {@inheritdoc}
*/
public function getLabelFontSize()
{
return $this->labelFontSize;
}
/**
* @param string $labelFontPath
*
* @return $this
*
* @throws InvalidPathException
*/
public function setLabelFontPath($labelFontPath)
{
$labelFontPath = realpath($labelFontPath);
if (!is_file($labelFontPath)) {
throw new InvalidPathException('Invalid label font path: '.$labelFontPath);
}
$this->labelFontPath = $labelFontPath;
return $this;
}
/**
* {@inheritdoc}
*/
public function getLabelFontPath()
{
return $this->labelFontPath;
}
/**
* @param string $labelAlignment
*
* @return $this
*/
public function setLabelAlignment($labelAlignment)
{
$this->labelAlignment = new LabelAlignment($labelAlignment);
return $this;
}
/**
* {@inheritdoc}
*/
public function getLabelAlignment()
{
return $this->labelAlignment->getValue();
}
/**
* @param int[] $labelMargin
*
* @return $this
*/
public function setLabelMargin(array $labelMargin)
{
$this->labelMargin = array_merge($this->labelMargin, $labelMargin);
return $this;
}
/**
* {@inheritdoc}
*/
public function getLabelMargin()
{
return $this->labelMargin;
}
/**
* @param WriterRegistryInterface $writerRegistry
*
* @return $this
*/
public function setWriterRegistry(WriterRegistryInterface $writerRegistry)
{
$this->writerRegistry = $writerRegistry;
return $this;
}
/**
* @param WriterInterface $writer
*
* @return $this
*/
public function setWriter(WriterInterface $writer)
{
$this->writer = $writer;
return $this;
}
/**
* @param WriterInterface $name
*
* @return WriterInterface
*/
public function getWriter($name = null)
{
if (!is_null($name)) {
return $this->writerRegistry->getWriter($name);
}
if ($this->writer instanceof WriterInterface) {
return $this->writer;
}
return $this->writerRegistry->getDefaultWriter();
}
/**
* @param string $name
*
* @return $this
*
* @throws InvalidWriterException
*/
public function setWriterByName($name)
{
$this->writer = $this->writerRegistry->getWriter($name);
return $this;
}
/**
* @param string $path
*
* @return $this
*/
public function setWriterByPath($path)
{
$extension = pathinfo($path, PATHINFO_EXTENSION);
$this->setWriterByExtension($extension);
return $this;
}
/**
* @param string $extension
*
* @return $this
*
* @throws UnsupportedExtensionException
*/
public function setWriterByExtension($extension)
{
foreach ($this->writerRegistry->getWriters() as $writer) {
if ($writer->supportsExtension($extension)) {
$this->writer = $writer;
return $this;
}
}
throw new UnsupportedExtensionException('Missing writer for extension "'.$extension.'"');
}
/**
* @param bool $validateResult
*
* @return $this
*/
public function setValidateResult($validateResult)
{
$this->validateResult = $validateResult;
return $this;
}
/**
* {@inheritdoc}
*/
public function getValidateResult()
{
return $this->validateResult;
}
/**
* @return string
*/
public function writeString()
{
return $this->getWriter()->writeString($this);
}
/**
* @return string
*/
public function writeDataUri()
{
return $this->getWriter()->writeDataUri($this);
}
/**
* @param string $path
*/
public function writeFile($path)
{
return $this->getWriter()->writeFile($this, $path);
}
/**
* @return string
*
* @throws InvalidWriterException
*/
public function getContentType()
{
return $this->getWriter()->getContentType();
}
}