| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150 | <?phpdeclare(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;    }}
 |