1313namespace chillerlan \QRCode \Data ;
1414
1515use chillerlan \QRCode \QRCode ;
16+ use Closure ;
1617
1718use function array_fill , array_key_exists , array_push , array_unshift , count , floor , in_array , max , min , range ;
1819
@@ -547,6 +548,7 @@ public function mapData(array $data, int $maskPattern):QRMatrix{
547548 $ this ->maskPattern = $ maskPattern ;
548549 $ byteCount = count ($ data );
549550 $ size = $ this ->moduleCount - 1 ;
551+ $ mask = $ this ->getMask ($ this ->maskPattern );
550552
551553 for ($ i = $ size , $ y = $ size , $ inc = -1 , $ byteIndex = 0 , $ bitIndex = 7 ; $ i > 0 ; $ i -= 2 ){
552554
@@ -565,7 +567,7 @@ public function mapData(array $data, int $maskPattern):QRMatrix{
565567 $ v = (($ data [$ byteIndex ] >> $ bitIndex ) & 1 ) === 1 ;
566568 }
567569
568- if ($ this -> getMask ($ x , $ y, $ maskPattern ) === 0 ){
570+ if ($ mask ($ x , $ y ) === 0 ){
569571 $ v = !$ v ;
570572 }
571573
@@ -602,32 +604,27 @@ public function mapData(array $data, int $maskPattern):QRMatrix{
602604 *
603605 * @internal
604606 *
605- * @param int $x
606- * @param int $y
607607 * @param int $maskPattern
608608 *
609- * @return int
609+ * @return \Closure
610610 * @throws \chillerlan\QRCode\Data\QRCodeDataException
611611 */
612- protected function getMask (int $ x , int $ y , int $ maskPattern ):int {
613- $ a = $ y + $ x ;
614- $ m = $ y * $ x ;
615-
616- if ($ maskPattern >= 0 && $ maskPattern < 8 ){
617- // this is literally the same as the stupid switch...
618- return [
619- $ a % 2 ,
620- $ x % 2 ,
621- $ y % 3 ,
622- $ a % 3 ,
623- ((int )($ y / 2 ) + (int )($ x / 3 )) % 2 ,
624- $ m % 2 + $ m % 3 ,
625- ($ m % 2 + $ m % 3 ) % 2 ,
626- ($ m % 3 + $ a % 2 ) % 2
627- ][$ maskPattern ];
612+ protected function getMask (int $ maskPattern ):Closure {
613+
614+ if ((0b111 & $ maskPattern ) !== $ maskPattern ){
615+ throw new QRCodeDataException ('invalid mask pattern ' ); // @codeCoverageIgnore
628616 }
629617
630- throw new QRCodeDataException ('invalid mask pattern ' ); // @codeCoverageIgnore
618+ return [
619+ 0b000 => function ($ x , $ y ):int { return ($ x + $ y ) % 2 ; },
620+ 0b001 => function ($ x , $ y ):int { return $ x % 2 ; },
621+ 0b010 => function ($ x , $ y ):int { return $ y % 3 ; },
622+ 0b011 => function ($ x , $ y ):int { return ($ x + $ y ) % 3 ; },
623+ 0b100 => function ($ x , $ y ):int { return ((int )($ x / 2 ) + (int )($ y / 3 )) % 2 ; },
624+ 0b101 => function ($ x , $ y ):int { return (($ x * $ y ) % 2 ) + (($ x * $ y ) % 3 ); },
625+ 0b110 => function ($ x , $ y ):int { return ((($ x * $ y ) % 2 ) + (($ x * $ y ) % 3 )) % 2 ; },
626+ 0b111 => function ($ x , $ y ):int { return ((($ x * $ y ) % 3 ) + (($ x + $ y ) % 2 )) % 2 ; },
627+ ][$ maskPattern ];
631628 }
632629
633630}
0 commit comments