1212
1313namespace chillerlan \QRCode \Data ;
1414
15- use function abs , call_user_func ;
15+ use function abs , call_user_func_array ;
1616
1717/**
1818 * The sole purpose of this class is to receive a QRMatrix object and run the pattern tests on it.
@@ -58,7 +58,7 @@ public function testPattern():int{
5858 $ penalty = 0 ;
5959
6060 for ($ level = 1 ; $ level <= 4 ; $ level ++){
61- $ penalty += call_user_func ([$ this , 'testLevel ' .$ level ]);
61+ $ penalty += call_user_func_array ([$ this , 'testLevel ' .$ level], [ $ this -> matrix -> matrix ( true ) ]);
6262 }
6363
6464 return (int )$ penalty ;
@@ -67,12 +67,12 @@ public function testPattern():int{
6767 /**
6868 * Checks for each group of five or more same-colored modules in a row (or column)
6969 *
70- * @return float
70+ * @return int
7171 */
72- protected function testLevel1 (): float {
72+ protected function testLevel1 (array $ m ): int {
7373 $ penalty = 0 ;
7474
75- foreach ($ this -> matrix -> matrix () as $ y => $ row ){
75+ foreach ($ m as $ y => $ row ){
7676 foreach ($ row as $ x => $ val ){
7777 $ count = 0 ;
7878
@@ -84,11 +84,11 @@ protected function testLevel1():float{
8484
8585 for ($ rx = -1 ; $ rx <= 1 ; $ rx ++){
8686
87- if (($ ry === 0 && $ rx === 0 ) || ($ x + $ rx < 0 || $ this ->moduleCount <= $ x + $ rx )){
87+ if (($ ry === 0 && $ rx === 0 ) || (( $ x + $ rx) < 0 || $ this ->moduleCount <= ( $ x + $ rx) )){
8888 continue ;
8989 }
9090
91- if ($ this -> matrix -> check ( $ x + $ rx , $ y + $ ry ) === ( $ val >> 8 > 0 ) ){
91+ if ($ m [ $ y + $ ry ][ $ x + $ rx ] === $ val ){
9292 $ count ++;
9393 }
9494
@@ -108,107 +108,90 @@ protected function testLevel1():float{
108108 /**
109109 * Checks for each 2x2 area of same-colored modules in the matrix
110110 *
111- * @return float
111+ * @return int
112112 */
113- protected function testLevel2 (): float {
113+ protected function testLevel2 (array $ m ): int {
114114 $ penalty = 0 ;
115115
116- foreach ($ this -> matrix -> matrix () as $ y => $ row ){
116+ foreach ($ m as $ y => $ row ){
117117
118- if ($ y > $ this ->moduleCount - 2 ){
118+ if ($ y > ( $ this ->moduleCount - 2 ) ){
119119 break ;
120120 }
121121
122122 foreach ($ row as $ x => $ val ){
123123
124- if ($ x > $ this ->moduleCount - 2 ){
124+ if ($ x > ( $ this ->moduleCount - 2 ) ){
125125 break ;
126126 }
127127
128- $ count = 0 ;
129-
130- if ($ val >> 8 > 0 ){
131- $ count ++;
132- }
133-
134- if ($ this ->matrix ->check ($ y , $ x + 1 )){
135- $ count ++;
136- }
137-
138- if ($ this ->matrix ->check ($ y + 1 , $ x )){
139- $ count ++;
140- }
141-
142- if ($ this ->matrix ->check ($ y + 1 , $ x + 1 )){
143- $ count ++;
128+ if (
129+ $ val === $ m [$ y ][$ x + 1 ]
130+ && $ val === $ m [$ y + 1 ][$ x ]
131+ && $ val === $ m [$ y + 1 ][$ x + 1 ]
132+ ){
133+ $ penalty ++;
144134 }
145-
146- if ($ count === 0 || $ count === 4 ){
147- $ penalty += 3 ;
148- }
149-
150135 }
151136 }
152137
153- return $ penalty ;
138+ return 3 * $ penalty ;
154139 }
155140
156141 /**
157- * Checks if there are patterns that look similar to the finder patterns
142+ * Checks if there are patterns that look similar to the finder patterns (1:1:3:1:1 ratio)
158143 *
159- * @return float
144+ * @return int
160145 */
161- protected function testLevel3 (): float {
162- $ penalty = 0 ;
146+ protected function testLevel3 (array $ m ): int {
147+ $ penalties = 0 ;
163148
164- foreach ($ this -> matrix -> matrix () as $ y => $ row ){
149+ foreach ($ m as $ y => $ row ){
165150 foreach ($ row as $ x => $ val ){
166151
167- if ($ x <= $ this ->moduleCount - 7 ){
168- if (
169- $ this ->matrix ->check ($ x , $ y )
170- && !$ this ->matrix ->check ($ x + 1 , $ y )
171- && $ this ->matrix ->check ($ x + 2 , $ y )
172- && $ this ->matrix ->check ($ x + 3 , $ y )
173- && $ this ->matrix ->check ($ x + 4 , $ y )
174- && !$ this ->matrix ->check ($ x + 5 , $ y )
175- && $ this ->matrix ->check ($ x + 6 , $ y )
176- ){
177- $ penalty += 40 ;
178- }
152+ if (
153+ ($ x + 6 ) < $ this ->moduleCount
154+ && $ val
155+ && !$ m [$ y ][$ x + 1 ]
156+ && $ m [$ y ][$ x + 2 ]
157+ && $ m [$ y ][$ x + 3 ]
158+ && $ m [$ y ][$ x + 4 ]
159+ && !$ m [$ y ][$ x + 5 ]
160+ && $ m [$ y ][$ x + 6 ]
161+ ){
162+ $ penalties ++;
179163 }
180164
181- if ($ y <= $ this ->moduleCount - 7 ){
182- if (
183- $ this ->matrix ->check ($ x , $ y )
184- && !$ this ->matrix ->check ($ x , $ y + 1 )
185- && $ this ->matrix ->check ($ x , $ y + 2 )
186- && $ this ->matrix ->check ($ x , $ y + 3 )
187- && $ this ->matrix ->check ($ x , $ y + 4 )
188- && !$ this ->matrix ->check ($ x , $ y + 5 )
189- && $ this ->matrix ->check ($ x , $ y + 6 )
190- ){
191- $ penalty += 40 ;
192- }
165+ if (
166+ ($ y + 6 ) < $ this ->moduleCount
167+ && $ val
168+ && !$ m [$ y + 1 ][$ x ]
169+ && $ m [$ y + 2 ][$ x ]
170+ && $ m [$ y + 3 ][$ x ]
171+ && $ m [$ y + 4 ][$ x ]
172+ && !$ m [$ y + 5 ][$ x ]
173+ && $ m [$ y + 6 ][$ x ]
174+ ){
175+ $ penalties ++;
193176 }
194177
195178 }
196179 }
197180
198- return $ penalty ;
181+ return $ penalties * 40 ;
199182 }
200183
201184 /**
202185 * Checks if more than half of the modules are dark or light, with a larger penalty for a larger difference
203186 *
204187 * @return float
205188 */
206- protected function testLevel4 ():float {
189+ protected function testLevel4 (array $ m ):float {
207190 $ count = 0 ;
208191
209- foreach ($ this -> matrix -> matrix () as $ y => $ row ){
192+ foreach ($ m as $ y => $ row ){
210193 foreach ($ row as $ x => $ val ){
211- if ($ val >> 8 > 0 ){
194+ if ($ val ){
212195 $ count ++;
213196 }
214197 }
0 commit comments