• Модуль: ui
  • Путь к файлу: ~/bitrix/modules/ui/lib/barcode/barcodegenerator.php
  • Класс: BitrixUIBarcodeBarcodeGenerator
  • Вызов: BarcodeGenerator::qr_create_matrix
private function qr_create_matrix($version, $data) {
	$size = $version * 4 + 17;
	$matrix = array();
	for ($i = 0; $i < $size; $i++) {
		$row = array();
		for ($j = 0; $j < $size; $j++) {
			$row[] = 0;
		}
		$matrix[] = $row;
	}
	/* Finder patterns. */
	for ($i = 0; $i < 8; $i++) {
		for ($j = 0; $j < 8; $j++) {
			$m = (($i == 7 || $j == 7) ? 2 :
				(($i == 0 || $j == 0 || $i == 6 || $j == 6) ? 3 :
					(($i == 1 || $j == 1 || $i == 5 || $j == 5) ? 2 : 3)));
			$matrix[$i][$j] = $m;
			$matrix[$size - $i - 1][$j] = $m;
			$matrix[$i][$size - $j - 1] = $m;
		}
	}
	/* Alignment patterns. */
	if ($version >= 2) {
		$alignment = $this->qr_alignment_patterns[$version - 2];
		foreach ($alignment as $i) {
			foreach ($alignment as $j) {
				if (!$matrix[$i][$j]) {
					for ($ii = -2; $ii <= 2; $ii++) {
						for ($jj = -2; $jj <= 2; $jj++) {
							$m = (max(abs($ii), abs($jj)) & 1) ^ 3;
							$matrix[$i + $ii][$j + $jj] = $m;
						}
					}
				}
			}
		}
	}
	/* Timing patterns. */
	for ($i = $size - 9; $i >= 8; $i--) {
		$matrix[$i][6] = ($i & 1) ^ 3;
		$matrix[6][$i] = ($i & 1) ^ 3;
	}
	/* Dark module. Such an ominous name for such an innocuous thing. */
	$matrix[$size - 8][8] = 3;
	/* Format information area. */
	for ($i = 0; $i <= 8; $i++) {
		if (!$matrix[$i][8]) $matrix[$i][8] = 1;
		if (!$matrix[8][$i]) $matrix[8][$i] = 1;
		if ($i && !$matrix[$size - $i][8]) $matrix[$size - $i][8] = 1;
		if ($i && !$matrix[8][$size - $i]) $matrix[8][$size - $i] = 1;
	}
	/* Version information area. */
	if ($version >= 7) {
		for ($i = 9; $i < 12; $i++) {
			for ($j = 0; $j < 6; $j++) {
				$matrix[$size - $i][$j] = 1;
				$matrix[$j][$size - $i] = 1;
			}
		}
	}
	/* Data. */
	$col = $size - 1;
	$row = $size - 1;
	$dir = -1;
	$offset = 0;
	$length = count($data);
	while ($col > 0 && $offset < $length) {
		if (!$matrix[$row][$col]) {
			$matrix[$row][$col] = $data[$offset] ? 5 : 4;
			$offset++;
		}
		if (!$matrix[$row][$col - 1]) {
			$matrix[$row][$col - 1] = $data[$offset] ? 5 : 4;
			$offset++;
		}
		$row += $dir;
		if ($row < 0 || $row >= $size) {
			$dir = -$dir;
			$row += $dir;
			$col -= 2;
			if ($col == 6) $col--;
		}
	}
	return array($size, $matrix);
}