diff --git a/src/Data/QRMatrix.php b/src/Data/QRMatrix.php index 68a0b4f88..9f1ee3bfb 100755 --- a/src/Data/QRMatrix.php +++ b/src/Data/QRMatrix.php @@ -314,6 +314,18 @@ class QRMatrix{ return $this; } + /** + * Flips the value of the module at ($x, $y) + */ + public function flip(int $x, int $y):self{ + + if(isset($this->matrix[$y][$x])){ + $this->matrix[$y][$x] ^= $this::IS_DARK; + } + + return $this; + } + /** * Checks whether the module at ($x, $y) is of the given $M_TYPE * @@ -617,7 +629,7 @@ class QRMatrix{ continue; } - $this->set($x, $y, ($val & $this::IS_DARK) !== $this::IS_DARK, $val); + $this->flip($x, $y); } } @@ -774,7 +786,7 @@ class QRMatrix{ } if($mask($x, $y)){ - $this->set($x, $y, ($val & $this::IS_DARK) !== $this::IS_DARK, $val); + $this->flip($x, $y); } } } diff --git a/tests/Data/QRMatrixTest.php b/tests/Data/QRMatrixTest.php index 47c1dfb26..84ebebb59 100755 --- a/tests/Data/QRMatrixTest.php +++ b/tests/Data/QRMatrixTest.php @@ -518,6 +518,26 @@ final class QRMatrixTest extends TestCase{ (new QRCode($o))->addByteSegment('testdata')->getQRMatrix()->setLogoSpace(37, 37); } + /** + * Tests flipping the value of a module + */ + public function testFlip():void{ + $this->matrix->set(20, 20, true, QRMatrix::M_TEST); + + // cover checkType() + $this::assertTrue($this->matrix->checkType(20, 20, QRMatrix::M_TEST)); + // verify the current state (dark) + $this::assertSame(QRMatrix::M_TEST_DARK, $this->matrix->get(20, 20)); + // flip + $this->matrix->flip(20, 20); + // verify flip + $this::assertSame(QRMatrix::M_TEST, $this->matrix->get(20, 20)); + // flip again + $this->matrix->flip(20, 20); + // verify flip + $this::assertSame(QRMatrix::M_TEST_DARK, $this->matrix->get(20, 20)); + } + /** * Tests checking whether the M_TYPE of a module is not one of an array of M_TYPES */