123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150 |
- <?php
- declare(strict_types = 1);
- namespace BaconQrCode\Encoder;
- use SplFixedArray;
- use Traversable;
- /**
- * Byte matrix.
- */
- final class ByteMatrix
- {
- /**
- * Bytes in the matrix, represented as array.
- *
- * @var SplFixedArray<SplFixedArray<int>>
- */
- private $bytes;
- /**
- * Width of the matrix.
- *
- * @var int
- */
- private $width;
- /**
- * Height of the matrix.
- *
- * @var int
- */
- private $height;
- public function __construct(int $width, int $height)
- {
- $this->height = $height;
- $this->width = $width;
- $this->bytes = new SplFixedArray($height);
- for ($y = 0; $y < $height; ++$y) {
- $this->bytes[$y] = SplFixedArray::fromArray(array_fill(0, $width, 0));
- }
- }
- /**
- * Gets the width of the matrix.
- */
- public function getWidth() : int
- {
- return $this->width;
- }
- /**
- * Gets the height of the matrix.
- */
- public function getHeight() : int
- {
- return $this->height;
- }
- /**
- * Gets the internal representation of the matrix.
- *
- * @return SplFixedArray<SplFixedArray<int>>
- */
- public function getArray() : SplFixedArray
- {
- return $this->bytes;
- }
- /**
- * @return Traversable<int>
- */
- public function getBytes() : Traversable
- {
- foreach ($this->bytes as $row) {
- foreach ($row as $byte) {
- yield $byte;
- }
- }
- }
- /**
- * Gets the byte for a specific position.
- */
- public function get(int $x, int $y) : int
- {
- return $this->bytes[$y][$x];
- }
- /**
- * Sets the byte for a specific position.
- */
- public function set(int $x, int $y, int $value) : void
- {
- $this->bytes[$y][$x] = $value;
- }
- /**
- * Clears the matrix with a specific value.
- */
- public function clear(int $value) : void
- {
- for ($y = 0; $y < $this->height; ++$y) {
- for ($x = 0; $x < $this->width; ++$x) {
- $this->bytes[$y][$x] = $value;
- }
- }
- }
- public function __clone()
- {
- $this->bytes = clone $this->bytes;
- foreach ($this->bytes as $index => $row) {
- $this->bytes[$index] = clone $row;
- }
- }
- /**
- * Returns a string representation of the matrix.
- */
- public function __toString() : string
- {
- $result = '';
- for ($y = 0; $y < $this->height; $y++) {
- for ($x = 0; $x < $this->width; $x++) {
- switch ($this->bytes[$y][$x]) {
- case 0:
- $result .= ' 0';
- break;
- case 1:
- $result .= ' 1';
- break;
- default:
- $result .= ' ';
- break;
- }
- }
- $result .= "\n";
- }
- return $result;
- }
- }
|