123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263 |
- <?php
- declare(strict_types = 1);
- namespace BaconQrCode\Renderer\Module;
- use BaconQrCode\Encoder\ByteMatrix;
- use BaconQrCode\Exception\InvalidArgumentException;
- use BaconQrCode\Renderer\Path\Path;
- /**
- * Renders individual modules as dots.
- */
- final class DotsModule implements ModuleInterface
- {
- public const LARGE = 1;
- public const MEDIUM = .8;
- public const SMALL = .6;
- /**
- * @var float
- */
- private $size;
- public function __construct(float $size)
- {
- if ($size <= 0 || $size > 1) {
- throw new InvalidArgumentException('Size must between 0 (exclusive) and 1 (inclusive)');
- }
- $this->size = $size;
- }
- public function createPath(ByteMatrix $matrix) : Path
- {
- $width = $matrix->getWidth();
- $height = $matrix->getHeight();
- $path = new Path();
- $halfSize = $this->size / 2;
- $margin = (1 - $this->size) / 2;
- for ($y = 0; $y < $height; ++$y) {
- for ($x = 0; $x < $width; ++$x) {
- if (! $matrix->get($x, $y)) {
- continue;
- }
- $pathX = $x + $margin;
- $pathY = $y + $margin;
- $path = $path
- ->move($pathX + $this->size, $pathY + $halfSize)
- ->ellipticArc($halfSize, $halfSize, 0, false, true, $pathX + $halfSize, $pathY + $this->size)
- ->ellipticArc($halfSize, $halfSize, 0, false, true, $pathX, $pathY + $halfSize)
- ->ellipticArc($halfSize, $halfSize, 0, false, true, $pathX + $halfSize, $pathY)
- ->ellipticArc($halfSize, $halfSize, 0, false, true, $pathX + $this->size, $pathY + $halfSize)
- ->close()
- ;
- }
- }
- return $path;
- }
- }
|