13
13
namespace chillerlan \QRCode \Data ;
14
14
15
15
use chillerlan \QRCode \QRCode ;
16
+ use Closure ;
16
17
17
18
use function array_fill , array_key_exists , array_push , array_unshift , count , floor , in_array , max , min , range ;
18
19
@@ -547,6 +548,7 @@ public function mapData(array $data, int $maskPattern):QRMatrix{
547
548
$ this ->maskPattern = $ maskPattern ;
548
549
$ byteCount = count ($ data );
549
550
$ size = $ this ->moduleCount - 1 ;
551
+ $ mask = $ this ->getMask ($ this ->maskPattern );
550
552
551
553
for ($ i = $ size , $ y = $ size , $ inc = -1 , $ byteIndex = 0 , $ bitIndex = 7 ; $ i > 0 ; $ i -= 2 ){
552
554
@@ -565,7 +567,7 @@ public function mapData(array $data, int $maskPattern):QRMatrix{
565
567
$ v = (($ data [$ byteIndex ] >> $ bitIndex ) & 1 ) === 1 ;
566
568
}
567
569
568
- if ($ this -> getMask ($ x , $ y, $ maskPattern ) === 0 ){
570
+ if ($ mask ($ x , $ y ) === 0 ){
569
571
$ v = !$ v ;
570
572
}
571
573
@@ -602,32 +604,27 @@ public function mapData(array $data, int $maskPattern):QRMatrix{
602
604
*
603
605
* @internal
604
606
*
605
- * @param int $x
606
- * @param int $y
607
607
* @param int $maskPattern
608
608
*
609
- * @return int
609
+ * @return \Closure
610
610
* @throws \chillerlan\QRCode\Data\QRCodeDataException
611
611
*/
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
628
616
}
629
617
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 ];
631
628
}
632
629
633
630
}
0 commit comments