@nuintun/qrcode
Version:
A pure JavaScript QRCode encode and decode library.
76 lines (71 loc) • 2.52 kB
JavaScript
/**
* @module QRCode
* @package @nuintun/qrcode
* @license MIT
* @version 5.0.2
* @author nuintun <nuintun@qq.com>
* @description A pure JavaScript QRCode encode and decode library.
* @see https://github.com/nuintun/qrcode#readme
*/
;
const Pattern = require('./Pattern.cjs');
const utils = require('../common/utils.cjs');
const scanline = require('./utils/scanline.cjs');
const pattern = require('./utils/pattern.cjs');
/**
* @module PatternFinder
*/
class PatternFinder {
#strict;
#matrix;
#ratios;
#patterns = [];
constructor(matrix, ratios, strict) {
this.#matrix = matrix;
this.#ratios = ratios;
this.#strict = strict;
}
get matrix() {
return this.#matrix;
}
get patterns() {
return this.#patterns;
}
match(x, y, scanline$1, overscan) {
const matrix = this.#matrix;
const ratios = this.#ratios;
let centerX = scanline.centerFromScanlineEnd(scanline$1, x);
const [centerY, vertical] = pattern.alignCrossPattern(matrix, centerX, y, overscan, ratios, true);
if (centerY >= 0) {
let horizontal;
// Re-horizontal check.
[centerX, horizontal] = pattern.alignCrossPattern(matrix, centerX, centerY, overscan, ratios);
if (centerX >= 0) {
const slash = scanline.getDiagonalScanline(matrix, centerX, centerY, overscan);
const backslash = scanline.getDiagonalScanline(matrix, centerX, centerY, overscan, true);
if (pattern.isDiagonalScanlineCheckPassed(slash, backslash, ratios, this.#strict)) {
const noise = pattern.calculatePatternNoise(ratios, horizontal, vertical, slash, backslash);
const width = utils.accumulate(horizontal);
const height = utils.accumulate(vertical);
const patterns = this.#patterns;
const { length } = patterns;
let combined = false;
for (let i = 0; i < length; i++) {
const pattern = patterns[i];
// Look for about the same center and module size.
if (Pattern.Pattern.equals(pattern, centerX, centerY, width, height)) {
combined = true;
patterns[i] = Pattern.Pattern.combine(pattern, centerX, centerY, width, height, noise);
break;
}
}
// Hadn't found this before; save it.
if (!combined) {
patterns.push(new Pattern.Pattern(ratios, centerX, centerY, width, height, noise));
}
}
}
}
}
}
exports.PatternFinder = PatternFinder;