first commit
This commit is contained in:
@@ -0,0 +1,124 @@
|
||||
import { Ecc } from './qrcodegen';
|
||||
// =================== ERROR_LEVEL ==========================
|
||||
export const ERROR_LEVEL_MAP = {
|
||||
L: Ecc.LOW,
|
||||
M: Ecc.MEDIUM,
|
||||
Q: Ecc.QUARTILE,
|
||||
H: Ecc.HIGH,
|
||||
};
|
||||
// =================== DEFAULT_VALUE ==========================
|
||||
export const DEFAULT_SIZE = 160;
|
||||
export const DEFAULT_LEVEL = 'M';
|
||||
export const DEFAULT_BACKGROUND_COLOR = '#FFFFFF';
|
||||
export const DEFAULT_FRONT_COLOR = '#000000';
|
||||
export const DEFAULT_NEED_MARGIN = false;
|
||||
export const DEFAULT_MINVERSION = 1;
|
||||
export const SPEC_MARGIN_SIZE = 4;
|
||||
export const DEFAULT_MARGIN_SIZE = 0;
|
||||
export const DEFAULT_IMG_SCALE = 0.1;
|
||||
// =================== UTILS ==========================
|
||||
/**
|
||||
* Generate a path string from modules
|
||||
* @param modules
|
||||
* @param margin
|
||||
* @returns
|
||||
*/
|
||||
export const generatePath = (modules, margin = 0) => {
|
||||
const ops = [];
|
||||
modules.forEach((row, y) => {
|
||||
let start = null;
|
||||
row.forEach((cell, x) => {
|
||||
if (!cell && start !== null) {
|
||||
ops.push(`M${start + margin} ${y + margin}h${x - start}v1H${start + margin}z`);
|
||||
start = null;
|
||||
return;
|
||||
}
|
||||
if (x === row.length - 1) {
|
||||
if (!cell) {
|
||||
return;
|
||||
}
|
||||
if (start === null) {
|
||||
ops.push(`M${x + margin},${y + margin} h1v1H${x + margin}z`);
|
||||
} else {
|
||||
ops.push(`M${start + margin},${y + margin} h${x + 1 - start}v1H${start + margin}z`);
|
||||
}
|
||||
return;
|
||||
}
|
||||
if (cell && start === null) {
|
||||
start = x;
|
||||
}
|
||||
});
|
||||
});
|
||||
return ops.join('');
|
||||
};
|
||||
/**
|
||||
* Excavate modules
|
||||
* @param modules
|
||||
* @param excavation
|
||||
* @returns
|
||||
*/
|
||||
export const excavateModules = (modules, excavation) => modules.slice().map((row, y) => {
|
||||
if (y < excavation.y || y >= excavation.y + excavation.h) {
|
||||
return row;
|
||||
}
|
||||
return row.map((cell, x) => {
|
||||
if (x < excavation.x || x >= excavation.x + excavation.w) {
|
||||
return cell;
|
||||
}
|
||||
return false;
|
||||
});
|
||||
});
|
||||
/**
|
||||
* Get image settings
|
||||
* @param cells The modules of the QR code
|
||||
* @param size The size of the QR code
|
||||
* @param margin
|
||||
* @param imageSettings
|
||||
* @returns
|
||||
*/
|
||||
export const getImageSettings = (cells, size, margin, imageSettings) => {
|
||||
if (imageSettings == null) {
|
||||
return null;
|
||||
}
|
||||
const numCells = cells.length + margin * 2;
|
||||
const defaultSize = Math.floor(size * DEFAULT_IMG_SCALE);
|
||||
const scale = numCells / size;
|
||||
const w = (imageSettings.width || defaultSize) * scale;
|
||||
const h = (imageSettings.height || defaultSize) * scale;
|
||||
const x = imageSettings.x == null ? cells.length / 2 - w / 2 : imageSettings.x * scale;
|
||||
const y = imageSettings.y == null ? cells.length / 2 - h / 2 : imageSettings.y * scale;
|
||||
const opacity = imageSettings.opacity == null ? 1 : imageSettings.opacity;
|
||||
let excavation = null;
|
||||
if (imageSettings.excavate) {
|
||||
const floorX = Math.floor(x);
|
||||
const floorY = Math.floor(y);
|
||||
const ceilW = Math.ceil(w + x - floorX);
|
||||
const ceilH = Math.ceil(h + y - floorY);
|
||||
excavation = { x: floorX, y: floorY, w: ceilW, h: ceilH };
|
||||
}
|
||||
const { crossOrigin } = imageSettings;
|
||||
return { x, y, h, w, excavation, opacity, crossOrigin };
|
||||
};
|
||||
/**
|
||||
* Get margin size
|
||||
* @param needMargin Whether need margin
|
||||
* @param marginSize Custom margin size
|
||||
* @returns
|
||||
*/
|
||||
export const getMarginSize = (needMargin, marginSize) => {
|
||||
if (marginSize != null) {
|
||||
return Math.max(Math.floor(marginSize), 0);
|
||||
}
|
||||
return needMargin ? SPEC_MARGIN_SIZE : DEFAULT_MARGIN_SIZE;
|
||||
};
|
||||
/**
|
||||
* Check if Path2D is supported
|
||||
*/
|
||||
export const isSupportPath2d = (() => {
|
||||
try {
|
||||
new Path2D().addPath(new Path2D());
|
||||
} catch (_a) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
})();
|
||||
Reference in New Issue
Block a user