UNPKG

@nuintun/qrcode

Version:

A pure JavaScript QRCode encode and decode library.

76 lines (71 loc) 2.52 kB
/** * @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 */ 'use strict'; 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;