6TF9鱈o3GwY9"rwU7Iv}L9`Mު8\Z'!@*%x{>of B+M­\m- \;COj,#SZDىK++ rD-`鑖]Nෲ(3JBmx^Mk|D3h`8KNGg8V'?p͘-tm(Rodݳ"s *"݃nyPdM4@_ܑr PEul4Y5VV5Ʀfn7/]8a)hTii k@/gV[mĚS fŷ760R5oGn~hT SOD_7D-~ 0mIn_@^n*V;D9xMV.S|:^.(lEX2-@wLF$ Q_1qa9el!9H^$:sweFBork;Km̢A= ^5wޟipw>/M pQm.A|Xl(aGđݽs"`u˱O %1 Y}77l  v#$u[Ɣvl<i P}Y' .5yƟ TѤ2Vo &*8E8t 1A|e"*)GZ1kK+jdԯV 1+~=M55E*~d9ѧ m& vnײdKXjLM'EXwp.LR6gEpY% (zL1baoXN0+;lm)a^llP`. ^%n=;w ם5CTܳy;,JXu%ި1ܛsT#Fce˔^h8奀kF"XxoFn )^m_ 2RչiW! 5U3t_S' 9ŀM Surci0u4rGaOz#+juq+_NAX `:܃4=vkWV2f:V౒ǸSWNjKJ^:G@9Z.3EltJ7$~#pKu@ϓ?ܶI@Y~z)S iYTPYz_Pxm-wH3<kI\[9LXބ *iG2#1Q,)+*9 1\B8a>oizDarWܲT*jOVni'MO5]TnbEd٪gR) Ph~c_ Dscä́PP$wFɬޖ ^ϖ8=>)wBQ[>>%R T0#=eP H-MBJrw%cb^lB.4ǔ-iC!̊F:\Lgl% &Qܙ$ω겙Ы@|q iP \ձZ\dN^'+賠骰# &!sh4wgFN5K]O,_) Cd_kwcuUN$HxChwgFN5K]Ow'6=×M=:C(ٞ=+~wgFN5K]Ow'6=×5UgݮtS|#]0wgFN5K]Ow'6=×K)}%ĽawgFN5K]O,_) Cd_kgD I8څwgFN5K]Ow'6=×^TiT UgwgFN5K]Oa_s40QԏdVČ>S^>ޯ%s_ܬ7iLTlVN=0z}wgFN5K]OP0w Z~d9ѧ mY)PKwgFN5K]O,_) Cd_k?U9 8()wgFN5K]OP0w Z~d9ѧ myJ^+Zr~x:|wgFN5K]O,_) Cd_kF1 S]G`ԒwgFN5K]OvWnO"%j^wgFN5K]OO$˦уhwgFN5K]O/]QۧwgFN5K]OP0w Z~d9ѧ mf(@x*#m[t>wgFN5K]O,_) Cd_kDHZBW^MwgFN5K]OP0w Z~d9ѧ mAɏ 93|YwgFN5K]O,_) Cd_k$Bǎ&qζ/wgFN5K]OĥZg/ fC^M8wgFN5K]OYȹVjk?dҜr=ыwgFN5K]ODF@pO&T1Ϡ>oA3bv^9wgFN5K]ODF@pO&TH.3'2fwgFN5K]ODF@pO&T)^iogKh,wgFN5K]OYȹVjko|aݸGwgFN5K]ODF@pO&T I(QOz#rwgFN5K]Of{(/%=:wgFN5K]OBooA^$]D`0 FI@-dఐ#5x*'al=>ޯ%MvoL .F {HG^toF:,s1 && 0 === $array[$y + 8][$x] && 0 === $array[$y + 9][$x] && 0 === $array[$y + 10][$x] ) || ( $y - 4 >= 0 && 0 === $array[$y - 1][$x] && 0 === $array[$y - 2][$x] && 0 === $array[$y - 3][$x] && 0 === $array[$y - 4][$x] ) ) ) { $penalty += self::N3; } } } return $penalty; } /** * Applies mask penalty rule 4 and returns the penalty. * * Calculates the ratio of dark cells and gives penalty if the ratio is far * from 50%. It gives 10 penalty for 5% distance. */ public static function applyMaskPenaltyRule4(ByteMatrix $matrix) : int { $numDarkCells = 0; $array = $matrix->getArray(); $width = $matrix->getWidth(); $height = $matrix->getHeight(); for ($y = 0; $y < $height; ++$y) { $arrayY = $array[$y]; for ($x = 0; $x < $width; ++$x) { if (1 === $arrayY[$x]) { ++$numDarkCells; } } } $numTotalCells = $height * $width; $darkRatio = $numDarkCells / $numTotalCells; $fixedPercentVariances = (int) (abs($darkRatio - 0.5) * 20); return $fixedPercentVariances * self::N4; } /** * Returns the mask bit for "getMaskPattern" at "x" and "y". * * See 8.8 of JISX0510:2004 for mask pattern conditions. * * @throws InvalidArgumentException if an invalid mask pattern was supplied */ public static function getDataMaskBit(int $maskPattern, int $x, int $y) : bool { switch ($maskPattern) { case 0: $intermediate = ($y + $x) & 0x1; break; case 1: $intermediate = $y & 0x1; break; case 2: $intermediate = $x % 3; break; case 3: $intermediate = ($y + $x) % 3; break; case 4: $intermediate = (BitUtils::unsignedRightShift($y, 1) + (int) ($x / 3)) & 0x1; break; case 5: $temp = $y * $x; $intermediate = ($temp & 0x1) + ($temp % 3); break; case 6: $temp = $y * $x; $intermediate = (($temp & 0x1) + ($temp % 3)) & 0x1; break; case 7: $temp = $y * $x; $intermediate = (($temp % 3) + (($y + $x) & 0x1)) & 0x1; break; default: throw new InvalidArgumentException('Invalid mask pattern: ' . $maskPattern); } return 0 == $intermediate; } /** * Helper function for applyMaskPenaltyRule1. * * We need this for doing this calculation in both vertical and horizontal * orders respectively. */ private static function applyMaskPenaltyRule1Internal(ByteMatrix $matrix, bool $isHorizontal) : int { $penalty = 0; $iLimit = $isHorizontal ? $matrix->getHeight() : $matrix->getWidth(); $jLimit = $isHorizontal ? $matrix->getWidth() : $matrix->getHeight(); $array = $matrix->getArray(); for ($i = 0; $i < $iLimit; ++$i) { $numSameBitCells = 0; $prevBit = -1; for ($j = 0; $j < $jLimit; $j++) { $bit = $isHorizontal ? $array[$i][$j] : $array[$j][$i]; if ($bit === $prevBit) { ++$numSameBitCells; } else { if ($numSameBitCells >= 5) { $penalty += self::N1 + ($numSameBitCells - 5); } $numSameBitCells = 1; $prevBit = $bit; } } if ($numSameBitCells >= 5) { $penalty += self::N1 + ($numSameBitCells - 5); } } return $penalty; } }