@nuintun/qrcode
Version:
A pure JavaScript QRCode encode and decode library.
101 lines (96 loc) • 3.1 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
*/
'use strict';
const Point = require('../common/Point.cjs');
const utils = require('../common/utils.cjs');
/**
* @module Pattern
*/
function calculateIntersectRatio({ ratios }) {
return ratios[utils.toInt32(ratios.length / 2)] / 2;
}
class Pattern extends Point.Point {
#noise;
#width;
#height;
#rect;
#moduleSize;
#combined = 1;
#ratios;
#intersectRadius;
static noise(pattern) {
return pattern.#noise;
}
static width(pattern) {
return pattern.#width;
}
static height(pattern) {
return pattern.#height;
}
static combined(pattern) {
return pattern.#combined;
}
static rect(pattern) {
return pattern.#rect;
}
static equals(pattern, x, y, width, height) {
const { modules } = pattern.#ratios;
const intersectRadius = pattern.#intersectRadius;
if (Math.abs(x - pattern.x) <= intersectRadius && Math.abs(y - pattern.y) <= intersectRadius) {
const moduleSizeThis = pattern.#moduleSize;
const moduleSize = (width + height) / modules / 2;
const moduleSizeDiff = Math.abs(moduleSize - moduleSizeThis);
if (moduleSizeDiff <= 1 || moduleSizeDiff <= moduleSizeThis) {
return true;
}
}
return false;
}
static combine(pattern, x, y, width, height, noise) {
const combined = pattern.#combined;
const combinedCombined = combined + 1;
const combinedX = (pattern.x * combined + x) / combinedCombined;
const combinedY = (pattern.y * combined + y) / combinedCombined;
const combinedNoise = (pattern.#noise * combined + noise) / combinedCombined;
const combinedWidth = (pattern.#width * combined + width) / combinedCombined;
const combinedHeight = (pattern.#height * combined + height) / combinedCombined;
const combinedPattern = new Pattern(pattern.#ratios, combinedX, combinedY, combinedWidth, combinedHeight, combinedNoise);
combinedPattern.#combined = combinedCombined;
return combinedPattern;
}
constructor(ratios, x, y, width, height, noise) {
super(x, y);
const { modules } = ratios;
const widthHalf = width / 2;
const heightHalf = height / 2;
const xModuleSize = width / modules;
const yModuleSize = height / modules;
const xModuleSizeHalf = xModuleSize / 2;
const yModuleSizeHalf = yModuleSize / 2;
const ratio = calculateIntersectRatio(ratios);
const moduleSize = (xModuleSize + yModuleSize) / 2;
this.#noise = noise;
this.#width = width;
this.#height = height;
this.#ratios = ratios;
this.#moduleSize = moduleSize;
this.#rect = [
x - widthHalf + xModuleSizeHalf,
y - heightHalf + yModuleSizeHalf,
x + widthHalf - xModuleSizeHalf,
y + heightHalf - yModuleSizeHalf
];
this.#intersectRadius = moduleSize * ratio;
}
get moduleSize() {
return this.#moduleSize;
}
}
exports.Pattern = Pattern;