Version.php 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687
  1. <?php
  2. /**
  3. * BaconQrCode
  4. *
  5. * @link http://github.com/Bacon/BaconQrCode For the canonical source repository
  6. * @copyright 2013 Ben 'DASPRiD' Scholzen
  7. * @license http://opensource.org/licenses/BSD-2-Clause Simplified BSD License
  8. */
  9. namespace BaconQrCode\Common;
  10. use SplFixedArray;
  11. /**
  12. * Version representation.
  13. */
  14. class Version
  15. {
  16. /**
  17. * Version decode information.
  18. *
  19. * @var array
  20. */
  21. protected static $versionDecodeInfo = array(
  22. 0x07c94, 0x085bc, 0x09a99, 0x0a4d3, 0x0bbf6, 0x0c762, 0x0d847, 0x0e60d,
  23. 0x0f928, 0x10b78, 0x1145d, 0x12a17, 0x13532, 0x149a6, 0x15683, 0x168c9,
  24. 0x177ec, 0x18ec4, 0x191e1, 0x1afab, 0x1b08e, 0x1cc1a, 0x1d33f, 0x1ed75,
  25. 0x1f250, 0x209d5, 0x216f0, 0x228ba, 0x2379f, 0x24b0b, 0x2542e, 0x26a64,
  26. 0x27541, 0x28c69
  27. );
  28. /**
  29. * Cached version instances.
  30. *
  31. * @var array
  32. */
  33. protected static $versions = array();
  34. /**
  35. * Version number of this version.
  36. *
  37. * @var integer
  38. */
  39. protected $versionNumber;
  40. /**
  41. * Alignment pattern centers.
  42. *
  43. * @var SplFixedArray
  44. */
  45. protected $alignmentPatternCenters;
  46. /**
  47. * Error correction blocks.
  48. *
  49. * @var SplFixedArray
  50. */
  51. protected $errorCorrectionBlocks;
  52. /**
  53. * Total number of codewords.
  54. *
  55. * @var integer
  56. */
  57. protected $totalCodewords;
  58. /**
  59. * Creates a new version.
  60. *
  61. * @param integer $versionNumber
  62. * @param SplFixedArray $alignmentPatternCenters
  63. * @param SplFixedArray $ecBlocks
  64. */
  65. protected function __construct(
  66. $versionNumber,
  67. SplFixedArray $alignmentPatternCenters,
  68. SplFixedArray $ecBlocks
  69. ) {
  70. $this->versionNumber = $versionNumber;
  71. $this->alignmentPatternCenters = $alignmentPatternCenters;
  72. $this->errorCorrectionBlocks = $ecBlocks;
  73. $totalCodewords = 0;
  74. $ecCodewords = $ecBlocks[0]->getEcCodewordsPerBlock();
  75. foreach ($ecBlocks[0]->getEcBlocks() as $ecBlock) {
  76. $totalCodewords += $ecBlock->getCount() * ($ecBlock->getDataCodewords() + $ecCodewords);
  77. }
  78. $this->totalCodewords = $totalCodewords;
  79. }
  80. /**
  81. * Gets the version number.
  82. *
  83. * @return integer
  84. */
  85. public function getVersionNumber()
  86. {
  87. return $this->versionNumber;
  88. }
  89. /**
  90. * Gets the alignment pattern centers.
  91. *
  92. * @return SplFixedArray
  93. */
  94. public function getAlignmentPatternCenters()
  95. {
  96. return $this->alignmentPatternCenters;
  97. }
  98. /**
  99. * Gets the total number of codewords.
  100. *
  101. * @return integer
  102. */
  103. public function getTotalCodewords()
  104. {
  105. return $this->totalCodewords;
  106. }
  107. /**
  108. * Gets the dimension for the current version.
  109. *
  110. * @return integer
  111. */
  112. public function getDimensionForVersion()
  113. {
  114. return 17 + 4 * $this->versionNumber;
  115. }
  116. /**
  117. * Gets the number of EC blocks for a specific EC level.
  118. *
  119. * @param ErrorCorrectionLevel $ecLevel
  120. * @return integer
  121. */
  122. public function getEcBlocksForLevel(ErrorCorrectionLevel $ecLevel)
  123. {
  124. return $this->errorCorrectionBlocks[$ecLevel->getOrdinal()];
  125. }
  126. /**
  127. * Gets a provisional version number for a specific dimension.
  128. *
  129. * @param integer $dimension
  130. * @return Version
  131. * @throws Exception\InvalidArgumentException
  132. */
  133. public static function getProvisionalVersionForDimension($dimension)
  134. {
  135. if ($dimension % 4 !== 1) {
  136. throw new Exception\InvalidArgumentException('Dimension is not 1 mod 4');
  137. }
  138. return self::getVersionForNumber(($dimension - 17) >> 2);
  139. }
  140. /**
  141. * Gets a version instance for a specific version number.
  142. *
  143. * @param integer $versionNumber
  144. * @return Version
  145. * @throws Exception\InvalidArgumentException
  146. */
  147. public static function getVersionForNumber($versionNumber)
  148. {
  149. if ($versionNumber < 1 || $versionNumber > 40) {
  150. throw new Exception\InvalidArgumentException('Version number must be between 1 and 40');
  151. }
  152. if (!isset(self::$versions[$versionNumber])) {
  153. self::buildVersion($versionNumber);
  154. }
  155. return self::$versions[$versionNumber - 1];
  156. }
  157. /**
  158. * Decodes version information from an integer and returns the version.
  159. *
  160. * @param integer $versionBits
  161. * @return Version|null
  162. */
  163. public static function decodeVersionInformation($versionBits)
  164. {
  165. $bestDifference = PHP_INT_MAX;
  166. $bestVersion = 0;
  167. foreach (self::$versionDecodeInfo as $i => $targetVersion) {
  168. if ($targetVersion === $versionBits) {
  169. return self::getVersionForNumber($i + 7);
  170. }
  171. $bitsDifference = FormatInformation::numBitsDiffering($versionBits, $targetVersion);
  172. if ($bitsDifference < $bestDifference) {
  173. $bestVersion = $i + 7;
  174. $bestDifference = $bitsDifference;
  175. }
  176. }
  177. if ($bestDifference <= 3) {
  178. return self::getVersionForNumber($bestVersion);
  179. }
  180. return null;
  181. }
  182. /**
  183. * Builds the function pattern for the current version.
  184. *
  185. * @return BitMatrix
  186. */
  187. public function buildFunctionPattern()
  188. {
  189. $dimension = $this->getDimensionForVersion();
  190. $bitMatrix = new BitMatrix($dimension);
  191. // Top left finder pattern + separator + format
  192. $bitMatrix->setRegion(0, 0, 9, 9);
  193. // Top right finder pattern + separator + format
  194. $bitMatrix->setRegion($dimension - 8, 0, 8, 9);
  195. // Bottom left finder pattern + separator + format
  196. $bitMatrix->setRegion(0, $dimension - 8, 9, 8);
  197. // Alignment patterns
  198. $max = count($this->alignmentPatternCenters);
  199. for ($x = 0; $x < $max; $x++) {
  200. $i = $this->alignmentPatternCenters[$x] - 2;
  201. for ($y = 0; $y < $max; $y++) {
  202. if (($x === 0 && ($y === 0 || $y === $max - 1)) || ($x === $max - 1 && $y === 0)) {
  203. // No alignment patterns near the three finder paterns
  204. continue;
  205. }
  206. $bitMatrix->setRegion($this->alignmentPatternCenters[$y] - 2, $i, 5, 5);
  207. }
  208. }
  209. // Vertical timing pattern
  210. $bitMatrix->setRegion(6, 9, 1, $dimension - 17);
  211. // Horizontal timing pattern
  212. $bitMatrix->setRegion(9, 6, $dimension - 17, 1);
  213. if ($this->versionNumber > 6) {
  214. // Version info, top right
  215. $bitMatrix->setRegion($dimension - 11, 0, 3, 6);
  216. // Version info, bottom left
  217. $bitMatrix->setRegion(0, $dimension - 11, 6, 3);
  218. }
  219. return $bitMatrix;
  220. }
  221. /**
  222. * Returns a string representation for the version.
  223. *
  224. * @return string
  225. */
  226. public function __toString()
  227. {
  228. return (string) $this->versionNumber;
  229. }
  230. /**
  231. * Build and cache a specific version.
  232. *
  233. * See ISO 18004:2006 6.5.1 Table 9.
  234. *
  235. * @param integer $versionNumber
  236. * @return void
  237. */
  238. protected static function buildVersion($versionNumber)
  239. {
  240. switch ($versionNumber) {
  241. case 1:
  242. $patterns = array();
  243. $ecBlocks = array(
  244. new EcBlocks(7, new EcBlock(1, 19)),
  245. new EcBlocks(10, new EcBlock(1, 16)),
  246. new EcBlocks(13, new EcBlock(1, 13)),
  247. new EcBlocks(17, new EcBlock(1, 9)),
  248. );
  249. break;
  250. case 2:
  251. $patterns = array(6, 18);
  252. $ecBlocks = array(
  253. new EcBlocks(10, new EcBlock(1, 34)),
  254. new EcBlocks(16, new EcBlock(1, 28)),
  255. new EcBlocks(22, new EcBlock(1, 22)),
  256. new EcBlocks(28, new EcBlock(1, 16)),
  257. );
  258. break;
  259. case 3:
  260. $patterns = array(6, 22);
  261. $ecBlocks = array(
  262. new EcBlocks(15, new EcBlock(1, 55)),
  263. new EcBlocks(26, new EcBlock(1, 44)),
  264. new EcBlocks(18, new EcBlock(2, 17)),
  265. new EcBlocks(22, new EcBlock(2, 13)),
  266. );
  267. break;
  268. case 4:
  269. $patterns = array(6, 26);
  270. $ecBlocks = array(
  271. new EcBlocks(20, new EcBlock(1, 80)),
  272. new EcBlocks(18, new EcBlock(2, 32)),
  273. new EcBlocks(26, new EcBlock(3, 24)),
  274. new EcBlocks(16, new EcBlock(4, 9)),
  275. );
  276. break;
  277. case 5:
  278. $patterns = array(6, 30);
  279. $ecBlocks = array(
  280. new EcBlocks(26, new EcBlock(1, 108)),
  281. new EcBlocks(24, new EcBlock(2, 43)),
  282. new EcBlocks(18, new EcBlock(2, 15), new EcBlock(2, 16)),
  283. new EcBlocks(22, new EcBlock(2, 11), new EcBlock(2, 12)),
  284. );
  285. break;
  286. case 6:
  287. $patterns = array(6, 34);
  288. $ecBlocks = array(
  289. new EcBlocks(18, new EcBlock(2, 68)),
  290. new EcBlocks(16, new EcBlock(4, 27)),
  291. new EcBlocks(24, new EcBlock(4, 19)),
  292. new EcBlocks(28, new EcBlock(4, 15)),
  293. );
  294. break;
  295. case 7:
  296. $patterns = array(6, 22, 38);
  297. $ecBlocks = array(
  298. new EcBlocks(20, new EcBlock(2, 78)),
  299. new EcBlocks(18, new EcBlock(4, 31)),
  300. new EcBlocks(18, new EcBlock(2, 14), new EcBlock(4, 15)),
  301. new EcBlocks(26, new EcBlock(4, 13)),
  302. );
  303. break;
  304. case 8:
  305. $patterns = array(6, 24, 42);
  306. $ecBlocks = array(
  307. new EcBlocks(24, new EcBlock(2, 97)),
  308. new EcBlocks(22, new EcBlock(2, 38), new EcBlock(2, 39)),
  309. new EcBlocks(22, new EcBlock(4, 18), new EcBlock(2, 19)),
  310. new EcBlocks(26, new EcBlock(4, 14), new EcBlock(2, 15)),
  311. );
  312. break;
  313. case 9:
  314. $patterns = array(6, 26, 46);
  315. $ecBlocks = array(
  316. new EcBlocks(30, new EcBlock(2, 116)),
  317. new EcBlocks(22, new EcBlock(3, 36), new EcBlock(2, 37)),
  318. new EcBlocks(20, new EcBlock(4, 16), new EcBlock(4, 17)),
  319. new EcBlocks(24, new EcBlock(4, 12), new EcBlock(4, 13)),
  320. );
  321. break;
  322. case 10:
  323. $patterns = array(6, 28, 50);
  324. $ecBlocks = array(
  325. new EcBlocks(18, new EcBlock(2, 68), new EcBlock(2, 69)),
  326. new EcBlocks(26, new EcBlock(4, 43), new EcBlock(1, 44)),
  327. new EcBlocks(24, new EcBlock(6, 19), new EcBlock(2, 20)),
  328. new EcBlocks(28, new EcBlock(6, 15), new EcBlock(2, 16)),
  329. );
  330. break;
  331. case 11:
  332. $patterns = array(6, 30, 54);
  333. $ecBlocks = array(
  334. new EcBlocks(20, new EcBlock(4, 81)),
  335. new EcBlocks(30, new EcBlock(1, 50), new EcBlock(4, 51)),
  336. new EcBlocks(28, new EcBlock(4, 22), new EcBlock(4, 23)),
  337. new EcBlocks(24, new EcBlock(3, 12), new EcBlock(8, 13)),
  338. );
  339. break;
  340. case 12:
  341. $patterns = array(6, 32, 58);
  342. $ecBlocks = array(
  343. new EcBlocks(24, new EcBlock(2, 92), new EcBlock(2, 93)),
  344. new EcBlocks(22, new EcBlock(6, 36), new EcBlock(2, 37)),
  345. new EcBlocks(26, new EcBlock(4, 20), new EcBlock(6, 21)),
  346. new EcBlocks(28, new EcBlock(7, 14), new EcBlock(4, 15)),
  347. );
  348. break;
  349. case 13:
  350. $patterns = array(6, 34, 62);
  351. $ecBlocks = array(
  352. new EcBlocks(26, new EcBlock(4, 107)),
  353. new EcBlocks(22, new EcBlock(8, 37), new EcBlock(1, 38)),
  354. new EcBlocks(24, new EcBlock(8, 20), new EcBlock(4, 21)),
  355. new EcBlocks(22, new EcBlock(12, 11), new EcBlock(4, 12)),
  356. );
  357. break;
  358. case 14:
  359. $patterns = array(6, 26, 46, 66);
  360. $ecBlocks = array(
  361. new EcBlocks(30, new EcBlock(3, 115), new EcBlock(1, 116)),
  362. new EcBlocks(24, new EcBlock(4, 40), new EcBlock(5, 41)),
  363. new EcBlocks(20, new EcBlock(11, 16), new EcBlock(5, 17)),
  364. new EcBlocks(24, new EcBlock(11, 12), new EcBlock(5, 13)),
  365. );
  366. break;
  367. case 15:
  368. $patterns = array(6, 26, 48, 70);
  369. $ecBlocks = array(
  370. new EcBlocks(22, new EcBlock(5, 87), new EcBlock(1, 88)),
  371. new EcBlocks(24, new EcBlock(5, 41), new EcBlock(5, 42)),
  372. new EcBlocks(30, new EcBlock(5, 24), new EcBlock(7, 25)),
  373. new EcBlocks(24, new EcBlock(11, 12), new EcBlock(7, 13)),
  374. );
  375. break;
  376. case 16:
  377. $patterns = array(6, 26, 50, 74);
  378. $ecBlocks = array(
  379. new EcBlocks(24, new EcBlock(5, 98), new EcBlock(1, 99)),
  380. new EcBlocks(28, new EcBlock(7, 45), new EcBlock(3, 46)),
  381. new EcBlocks(24, new EcBlock(15, 19), new EcBlock(2, 20)),
  382. new EcBlocks(30, new EcBlock(3, 15), new EcBlock(13, 16)),
  383. );
  384. break;
  385. case 17:
  386. $patterns = array(6, 30, 54, 78);
  387. $ecBlocks = array(
  388. new EcBlocks(28, new EcBlock(1, 107), new EcBlock(5, 108)),
  389. new EcBlocks(28, new EcBlock(10, 46), new EcBlock(1, 47)),
  390. new EcBlocks(28, new EcBlock(1, 22), new EcBlock(15, 23)),
  391. new EcBlocks(28, new EcBlock(2, 14), new EcBlock(17, 15)),
  392. );
  393. break;
  394. case 18:
  395. $patterns = array(6, 30, 56, 82);
  396. $ecBlocks = array(
  397. new EcBlocks(30, new EcBlock(5, 120), new EcBlock(1, 121)),
  398. new EcBlocks(26, new EcBlock(9, 43), new EcBlock(4, 44)),
  399. new EcBlocks(28, new EcBlock(17, 22), new EcBlock(1, 23)),
  400. new EcBlocks(28, new EcBlock(2, 14), new EcBlock(19, 15)),
  401. );
  402. break;
  403. case 19:
  404. $patterns = array(6, 30, 58, 86);
  405. $ecBlocks = array(
  406. new EcBlocks(28, new EcBlock(3, 113), new EcBlock(4, 114)),
  407. new EcBlocks(26, new EcBlock(3, 44), new EcBlock(11, 45)),
  408. new EcBlocks(26, new EcBlock(17, 21), new EcBlock(4, 22)),
  409. new EcBlocks(26, new EcBlock(9, 13), new EcBlock(16, 14)),
  410. );
  411. break;
  412. case 20:
  413. $patterns = array(6, 34, 62, 90);
  414. $ecBlocks = array(
  415. new EcBlocks(28, new EcBlock(3, 107), new EcBlock(5, 108)),
  416. new EcBlocks(26, new EcBlock(3, 41), new EcBlock(13, 42)),
  417. new EcBlocks(30, new EcBlock(15, 24), new EcBlock(5, 25)),
  418. new EcBlocks(28, new EcBlock(15, 15), new EcBlock(10, 16)),
  419. );
  420. break;
  421. case 21:
  422. $patterns = array(6, 28, 50, 72, 94);
  423. $ecBlocks = array(
  424. new EcBlocks(28, new EcBlock(4, 116), new EcBlock(4, 117)),
  425. new EcBlocks(26, new EcBlock(17, 42)),
  426. new EcBlocks(28, new EcBlock(17, 22), new EcBlock(6, 23)),
  427. new EcBlocks(30, new EcBlock(19, 16), new EcBlock(6, 17)),
  428. );
  429. break;
  430. case 22:
  431. $patterns = array(6, 26, 50, 74, 98);
  432. $ecBlocks = array(
  433. new EcBlocks(28, new EcBlock(2, 111), new EcBlock(7, 112)),
  434. new EcBlocks(28, new EcBlock(17, 46)),
  435. new EcBlocks(30, new EcBlock(7, 24), new EcBlock(16, 25)),
  436. new EcBlocks(24, new EcBlock(34, 13)),
  437. );
  438. break;
  439. case 23:
  440. $patterns = array(6, 30, 54, 78, 102);
  441. $ecBlocks = array(
  442. new EcBlocks(30, new EcBlock(4, 121), new EcBlock(5, 122)),
  443. new EcBlocks(28, new EcBlock(4, 47), new EcBlock(14, 48)),
  444. new EcBlocks(30, new EcBlock(11, 24), new EcBlock(14, 25)),
  445. new EcBlocks(30, new EcBlock(16, 15), new EcBlock(14, 16)),
  446. );
  447. break;
  448. case 24:
  449. $patterns = array(6, 28, 54, 80, 106);
  450. $ecBlocks = array(
  451. new EcBlocks(30, new EcBlock(6, 117), new EcBlock(4, 118)),
  452. new EcBlocks(28, new EcBlock(6, 45), new EcBlock(14, 46)),
  453. new EcBlocks(30, new EcBlock(11, 24), new EcBlock(16, 25)),
  454. new EcBlocks(30, new EcBlock(30, 16), new EcBlock(2, 17)),
  455. );
  456. break;
  457. case 25:
  458. $patterns = array(6, 32, 58, 84, 110);
  459. $ecBlocks = array(
  460. new EcBlocks(26, new EcBlock(8, 106), new EcBlock(4, 107)),
  461. new EcBlocks(28, new EcBlock(8, 47), new EcBlock(13, 48)),
  462. new EcBlocks(30, new EcBlock(7, 24), new EcBlock(22, 25)),
  463. new EcBlocks(30, new EcBlock(22, 15), new EcBlock(13, 16)),
  464. );
  465. break;
  466. case 26:
  467. $patterns = array(6, 30, 58, 86, 114);
  468. $ecBlocks = array(
  469. new EcBlocks(28, new EcBlock(10, 114), new EcBlock(2, 115)),
  470. new EcBlocks(28, new EcBlock(19, 46), new EcBlock(4, 47)),
  471. new EcBlocks(28, new EcBlock(28, 22), new EcBlock(6, 23)),
  472. new EcBlocks(30, new EcBlock(33, 16), new EcBlock(4, 17)),
  473. );
  474. break;
  475. case 27:
  476. $patterns = array(6, 34, 62, 90, 118);
  477. $ecBlocks = array(
  478. new EcBlocks(30, new EcBlock(8, 122), new EcBlock(4, 123)),
  479. new EcBlocks(28, new EcBlock(22, 45), new EcBlock(3, 46)),
  480. new EcBlocks(30, new EcBlock(8, 23), new EcBlock(26, 24)),
  481. new EcBlocks(30, new EcBlock(12, 15), new EcBlock(28, 16)),
  482. );
  483. break;
  484. case 28:
  485. $patterns = array(6, 26, 50, 74, 98, 122);
  486. $ecBlocks = array(
  487. new EcBlocks(30, new EcBlock(3, 117), new EcBlock(10, 118)),
  488. new EcBlocks(28, new EcBlock(3, 45), new EcBlock(23, 46)),
  489. new EcBlocks(30, new EcBlock(4, 24), new EcBlock(31, 25)),
  490. new EcBlocks(30, new EcBlock(11, 15), new EcBlock(31, 16)),
  491. );
  492. break;
  493. case 29:
  494. $patterns = array(6, 30, 54, 78, 102, 126);
  495. $ecBlocks = array(
  496. new EcBlocks(30, new EcBlock(7, 116), new EcBlock(7, 117)),
  497. new EcBlocks(28, new EcBlock(21, 45), new EcBlock(7, 46)),
  498. new EcBlocks(30, new EcBlock(1, 23), new EcBlock(37, 24)),
  499. new EcBlocks(30, new EcBlock(19, 15), new EcBlock(26, 16)),
  500. );
  501. break;
  502. case 30:
  503. $patterns = array(6, 26, 52, 78, 104, 130);
  504. $ecBlocks = array(
  505. new EcBlocks(30, new EcBlock(5, 115), new EcBlock(10, 116)),
  506. new EcBlocks(28, new EcBlock(19, 47), new EcBlock(10, 48)),
  507. new EcBlocks(30, new EcBlock(15, 24), new EcBlock(25, 25)),
  508. new EcBlocks(30, new EcBlock(23, 15), new EcBlock(25, 16)),
  509. );
  510. break;
  511. case 31:
  512. $patterns = array(6, 30, 56, 82, 108, 134);
  513. $ecBlocks = array(
  514. new EcBlocks(30, new EcBlock(13, 115), new EcBlock(3, 116)),
  515. new EcBlocks(28, new EcBlock(2, 46), new EcBlock(29, 47)),
  516. new EcBlocks(30, new EcBlock(42, 24), new EcBlock(1, 25)),
  517. new EcBlocks(30, new EcBlock(23, 15), new EcBlock(28, 16)),
  518. );
  519. break;
  520. case 32:
  521. $patterns = array(6, 34, 60, 86, 112, 138);
  522. $ecBlocks = array(
  523. new EcBlocks(30, new EcBlock(17, 115)),
  524. new EcBlocks(28, new EcBlock(10, 46), new EcBlock(23, 47)),
  525. new EcBlocks(30, new EcBlock(10, 24), new EcBlock(35, 25)),
  526. new EcBlocks(30, new EcBlock(19, 15), new EcBlock(35, 16)),
  527. );
  528. break;
  529. case 33:
  530. $patterns = array(6, 30, 58, 86, 114, 142);
  531. $ecBlocks = array(
  532. new EcBlocks(30, new EcBlock(17, 115), new EcBlock(1, 116)),
  533. new EcBlocks(28, new EcBlock(14, 46), new EcBlock(21, 47)),
  534. new EcBlocks(30, new EcBlock(29, 24), new EcBlock(19, 25)),
  535. new EcBlocks(30, new EcBlock(11, 15), new EcBlock(46, 16)),
  536. );
  537. break;
  538. case 34:
  539. $patterns = array(6, 34, 62, 90, 118, 146);
  540. $ecBlocks = array(
  541. new EcBlocks(30, new EcBlock(13, 115), new EcBlock(6, 116)),
  542. new EcBlocks(28, new EcBlock(14, 46), new EcBlock(23, 47)),
  543. new EcBlocks(30, new EcBlock(44, 24), new EcBlock(7, 25)),
  544. new EcBlocks(30, new EcBlock(59, 16), new EcBlock(1, 17)),
  545. );
  546. break;
  547. case 35:
  548. $patterns = array(6, 30, 54, 78, 102, 126, 150);
  549. $ecBlocks = array(
  550. new EcBlocks(30, new EcBlock(12, 121), new EcBlock(7, 122)),
  551. new EcBlocks(28, new EcBlock(12, 47), new EcBlock(26, 48)),
  552. new EcBlocks(30, new EcBlock(39, 24), new EcBlock(14, 25)),
  553. new EcBlocks(30, new EcBlock(22, 15), new EcBlock(41, 16)),
  554. );
  555. break;
  556. case 36:
  557. $patterns = array(6, 24, 50, 76, 102, 128, 154);
  558. $ecBlocks = array(
  559. new EcBlocks(30, new EcBlock(6, 121), new EcBlock(14, 122)),
  560. new EcBlocks(28, new EcBlock(6, 47), new EcBlock(34, 48)),
  561. new EcBlocks(30, new EcBlock(46, 24), new EcBlock(10, 25)),
  562. new EcBlocks(30, new EcBlock(2, 15), new EcBlock(64, 16)),
  563. );
  564. break;
  565. case 37:
  566. $patterns = array(6, 28, 54, 80, 106, 132, 158);
  567. $ecBlocks = array(
  568. new EcBlocks(30, new EcBlock(17, 122), new EcBlock(4, 123)),
  569. new EcBlocks(28, new EcBlock(29, 46), new EcBlock(14, 47)),
  570. new EcBlocks(30, new EcBlock(49, 24), new EcBlock(10, 25)),
  571. new EcBlocks(30, new EcBlock(24, 15), new EcBlock(46, 16)),
  572. );
  573. break;
  574. case 38:
  575. $patterns = array(6, 32, 58, 84, 110, 136, 162);
  576. $ecBlocks = array(
  577. new EcBlocks(30, new EcBlock(4, 122), new EcBlock(18, 123)),
  578. new EcBlocks(28, new EcBlock(13, 46), new EcBlock(32, 47)),
  579. new EcBlocks(30, new EcBlock(48, 24), new EcBlock(14, 25)),
  580. new EcBlocks(30, new EcBlock(42, 15), new EcBlock(32, 16)),
  581. );
  582. break;
  583. case 39:
  584. $patterns = array(6, 26, 54, 82, 110, 138, 166);
  585. $ecBlocks = array(
  586. new EcBlocks(30, new EcBlock(20, 117), new EcBlock(4, 118)),
  587. new EcBlocks(28, new EcBlock(40, 47), new EcBlock(7, 48)),
  588. new EcBlocks(30, new EcBlock(43, 24), new EcBlock(22, 25)),
  589. new EcBlocks(30, new EcBlock(10, 15), new EcBlock(67, 16)),
  590. );
  591. break;
  592. case 40:
  593. $patterns = array(6, 30, 58, 86, 114, 142, 170);
  594. $ecBlocks = array(
  595. new EcBlocks(30, new EcBlock(19, 118), new EcBlock(6, 119)),
  596. new EcBlocks(28, new EcBlock(18, 47), new EcBlock(31, 48)),
  597. new EcBlocks(30, new EcBlock(34, 24), new EcBlock(34, 25)),
  598. new EcBlocks(30, new EcBlock(20, 15), new EcBlock(61, 16)),
  599. );
  600. break;
  601. }
  602. self::$versions[$versionNumber - 1] = new self(
  603. $versionNumber,
  604. SplFixedArray::fromArray($patterns, false),
  605. SplFixedArray::fromArray($ecBlocks, false)
  606. );
  607. }
  608. }