150 Zeilen
3 KiB
PHP
150 Zeilen
3 KiB
PHP
<?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;
|
|
}
|
|
}
|