ng-zorro-antd
Version:
An enterprise-class UI components based on Ant Design and Angular
87 lines • 15.1 kB
JavaScript
/**
* Use of this source code is governed by an MIT-style license that can be
* found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE
*/
import qrcodegen from './qrcodegen';
export const ERROR_LEVEL_MAP = {
L: qrcodegen.QrCode.Ecc.LOW,
M: qrcodegen.QrCode.Ecc.MEDIUM,
Q: qrcodegen.QrCode.Ecc.QUARTILE,
H: qrcodegen.QrCode.Ecc.HIGH
};
const DEFAULT_SIZE = 160;
const DEFAULT_SCALE = 10;
const DEFAULT_PADDING = 10;
const DEFAULT_COLOR = '#000000';
const DEFAULT_BACKGROUND_COLOR = '#FFFFFF';
const DEFAULT_ICONSIZE = 40;
const DEFAULT_LEVEL = 'M';
export const plotQRCodeData = (value, level = DEFAULT_LEVEL) => {
if (!value) {
return null;
}
return qrcodegen.QrCode.encodeText(value, ERROR_LEVEL_MAP[level]);
};
export function drawCanvas(canvas, value, size = DEFAULT_SIZE, scale = DEFAULT_SCALE, padding = DEFAULT_PADDING, color = DEFAULT_COLOR, backgroundColor = DEFAULT_BACKGROUND_COLOR, iconSize = DEFAULT_ICONSIZE, icon) {
const ctx = canvas.getContext('2d');
const formattedPadding = formatPadding(padding);
canvas.style.width = `${size}px`;
canvas.style.height = `${size}px`;
if (!value) {
ctx.fillStyle = 'rgba(0, 0, 0, 0)';
ctx.fillRect(0, 0, canvas.width, canvas.height);
return;
}
canvas.width = value.size * scale + formattedPadding[1] + formattedPadding[3];
canvas.height = value.size * scale + formattedPadding[0] + formattedPadding[2];
if (!icon) {
drawCanvasBackground(ctx, canvas.width, canvas.height, scale, backgroundColor);
drawCanvasColor(ctx, value, scale, formattedPadding, backgroundColor, color);
}
else {
const iconImg = new Image();
iconImg.src = icon;
iconImg.crossOrigin = 'anonymous';
iconImg.width = iconSize * (canvas.width / size);
iconImg.height = iconSize * (canvas.width / size);
iconImg.onload = () => {
drawCanvasBackground(ctx, canvas.width, canvas.height, scale, backgroundColor);
drawCanvasColor(ctx, value, scale, formattedPadding, backgroundColor, color);
const iconCoordinate = canvas.width / 2 - (iconSize * (canvas.width / size)) / 2;
ctx.fillRect(iconCoordinate, iconCoordinate, iconSize * (canvas.width / size), iconSize * (canvas.width / size));
ctx.drawImage(iconImg, iconCoordinate, iconCoordinate, iconSize * (canvas.width / size), iconSize * (canvas.width / size));
};
iconImg.onerror = () => {
drawCanvasBackground(ctx, canvas.width, canvas.height, scale, backgroundColor);
drawCanvasColor(ctx, value, scale, formattedPadding, backgroundColor, color);
};
}
}
export function drawCanvasColor(ctx, value, scale, padding, backgroundColor, color) {
for (let y = 0; y < value.size; y++) {
for (let x = 0; x < value.size; x++) {
ctx.fillStyle = value.getModule(x, y) ? color : backgroundColor;
ctx.fillRect(padding[3] + x * scale, padding[0] + y * scale, scale, scale);
}
}
}
export function drawCanvasBackground(ctx, width, height, scale, backgroundColor) {
for (let y = 0; y < height; y++) {
for (let x = 0; x < width; x++) {
ctx.fillStyle = backgroundColor;
ctx.fillRect(x * scale, y * scale, scale, scale);
}
}
}
export function formatPadding(padding) {
if (Array.isArray(padding)) {
// Build an array of 4 elements and repeat values from padding as necessary to set the value of the array
return Array(4)
.fill(0)
.map((_, index) => padding[index % padding.length]);
}
else {
return [padding, padding, padding, padding];
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXJjb2RlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vY29tcG9uZW50cy9xci1jb2RlL3FyY29kZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFFSCxPQUFPLFNBQVMsTUFBTSxhQUFhLENBQUM7QUFFcEMsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUErRDtJQUN6RixDQUFDLEVBQUUsU0FBUyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRztJQUMzQixDQUFDLEVBQUUsU0FBUyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTTtJQUM5QixDQUFDLEVBQUUsU0FBUyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsUUFBUTtJQUNoQyxDQUFDLEVBQUUsU0FBUyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSTtDQUNwQixDQUFDO0FBRVgsTUFBTSxZQUFZLEdBQUcsR0FBRyxDQUFDO0FBQ3pCLE1BQU0sYUFBYSxHQUFHLEVBQUUsQ0FBQztBQUN6QixNQUFNLGVBQWUsR0FBRyxFQUFFLENBQUM7QUFDM0IsTUFBTSxhQUFhLEdBQUcsU0FBUyxDQUFDO0FBQ2hDLE1BQU0sd0JBQXdCLEdBQUcsU0FBUyxDQUFDO0FBQzNDLE1BQU0sZ0JBQWdCLEdBQUcsRUFBRSxDQUFDO0FBQzVCLE1BQU0sYUFBYSxHQUFpQyxHQUFHLENBQUM7QUFFeEQsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFHLENBQzVCLEtBQWEsRUFDYixRQUFzQyxhQUFhLEVBQzFCLEVBQUU7SUFDM0IsSUFBSSxDQUFDLEtBQUssRUFBRTtRQUNWLE9BQU8sSUFBSSxDQUFDO0tBQ2I7SUFDRCxPQUFPLFNBQVMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUNwRSxDQUFDLENBQUM7QUFFRixNQUFNLFVBQVUsVUFBVSxDQUN4QixNQUF5QixFQUN6QixLQUE4QixFQUM5QixJ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QWEsRUFDYixlQUF1QjtJQUV2QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQy9CLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDOUIsR0FBRyxDQUFDLFNBQVMsR0FBRyxlQUFlLENBQUM7WUFDaEMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsS0FBSyxFQUFFLENBQUMsR0FBRyxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO1NBQ2xEO0tBQ0Y7QUFDSCxDQUFDO0FBRUQsTUFBTSxVQUFVLGFBQWEsQ0FBQyxPQUEwQjtJQUN0RCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUU7UUFDMUIseUdBQXlHO1FBQ3pHLE9BQU8sS0FBSyxDQUFDLENBQUMsQ0FBQzthQUNaLElBQUksQ0FBQyxDQUFDLENBQUM7YUFDUCxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0tBQ3ZEO1NBQU07UUFDTCxPQUFPLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7S0FDN0M7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2dpdGh1Yi5jb20vTkctWk9SUk8vbmctem9ycm8tYW50ZC9ibG9iL21hc3Rlci9MSUNFTlNFXG4gKi9cblxuaW1wb3J0IHFyY29kZWdlbiBmcm9tICcuL3FyY29kZWdlbic7XG5cbmV4cG9ydCBjb25zdCBFUlJPUl9MRVZFTF9NQVA6IHsgW2luZGV4IGluICdMJyB8ICdNJyB8ICdRJyB8ICdIJ106IHFyY29kZWdlbi5RckNvZGUuRWNjIH0gPSB7XG4gIEw6IHFyY29kZWdlbi5RckNvZGUuRWNjLkxPVyxcbiAgTTogcXJjb2RlZ2VuLlFyQ29kZS5FY2MuTUVESVVNLFxuICBROiBxcmNvZGVnZW4uUXJDb2RlLkVjYy5RVUFSVElMRSxcbiAgSDogcXJjb2RlZ2VuLlFyQ29kZS5FY2MuSElHSFxufSBhcyBjb25zdDtcblxuY29uc3QgREVGQVVMVF9TSVpFID0gMTYwO1xuY29uc3QgREVGQVVMVF9TQ0FMRSA9IDEwO1xuY29uc3QgREVGQVVMVF9QQURESU5HID0gMTA7XG5jb25zdCBERUZBVUxUX0NPTE9SID0gJyMwMDAwMDAnO1xuY29uc3QgREVGQVVMVF9CQUNLR1JPVU5EX0NPTE9SID0gJyNGRkZGRkYnO1xuY29uc3QgREVGQVVMVF9JQ09OU0laRSA9IDQwO1xuY29uc3QgREVGQVVMVF9MRVZFTDoga2V5b2YgdHlwZW9mIEVSUk9SX0xFVkVMX01BUCA9ICdNJztcblxuZXhwb3J0IGNvbnN0IHBsb3RRUkNvZGVEYXRhID0gKFxuICB2YWx1ZTogc3RyaW5nLFxuICBsZXZlbDoga2V5b2YgdHlwZW9mIEVSUk9SX0xFVkVMX01BUCA9IERFRkFVTFRfTEVWRUxcbik6IHFyY29kZWdlbi5RckNvZGUgfCBudWxsID0+IHtcbiAgaWYgKCF2YWx1ZSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHJldHVybiBxcmNvZGVnZW4uUXJDb2RlLmVuY29kZVRleHQodmFsdWUsIEVSUk9SX0xFVkVMX01BUFtsZXZlbF0pO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGRyYXdDYW52YXMoXG4gIGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQsXG4gIHZhbHVlOiBxcmNvZGVnZW4uUXJDb2RlIHwgbnVsbCxcbiAgc2l6ZSA9IERFRkFVTFRfU0laRSxcbiAgc2NhbGUgPSBERUZBVUxUX1NDQUxFLFxuICBwYWRkaW5nOiBudW1iZXIgfCBudW1iZXJbXSA9IERFRkFVTFRfUEFERElORyxcbiAgY29sb3IgPSBERUZBVUxUX0NPTE9SLFxuICBiYWNrZ3JvdW5kQ29sb3IgPSBERUZBVUxUX0JBQ0tHUk9VTkRfQ09MT1IsXG4gIGljb25TaXplID0gREVGQVVMVF9JQ09OU0laRSxcbiAgaWNvbj86IHN0cmluZ1xuKTogdm9pZCB7XG4gIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpIGFzIENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRDtcbiAgY29uc3QgZm9ybWF0dGVkUGFkZGluZyA9IGZvcm1hdFBhZGRpbmcocGFkZGluZyk7XG4gIGNhbnZhcy5zdHlsZS53aWR0aCA9IGAke3NpemV9cHhgO1xuICBjYW52YXMuc3R5bGUuaGVpZ2h0ID0gYCR7c2l6ZX1weGA7XG4gIGlmICghdmFsdWUpIHtcbiAgICBjdHguZmlsbFN0eWxlID0gJ3JnYmEoMCwgMCwgMCwgMCknO1xuICAgIGN0eC5maWxsUmVjdCgwLCAwLCBjYW52YXMud2lkdGgsIGNhbnZhcy5oZWlnaHQpO1xuICAgIHJldHVybjtcbiAgfVxuICBjYW52YXMud2lkdGggPSB2YWx1ZS5zaXplICogc2NhbGUgKyBmb3JtYXR0ZWRQYWRkaW5nWzFdICsgZm9ybWF0dGVkUGFkZGluZ1szXTtcbiAgY2FudmFzLmhlaWdodCA9IHZhbHVlLnNpemUgKiBzY2FsZSArIGZvcm1hdHRlZFBhZGRpbmdbMF0gKyBmb3JtYXR0ZWRQYWRkaW5nWzJdO1xuICBpZiAoIWljb24pIHtcbiAgICBkcmF3Q2FudmFzQmFja2dyb3VuZChjdHgsIGNhbnZhcy53aWR0aCwgY2FudmFzLmhlaWdodCwgc2NhbGUsIGJhY2tncm91bmRDb2xvcik7XG4gICAgZHJhd0NhbnZhc0NvbG9yKGN0eCwgdmFsdWUsIHNjYWxlLCBmb3JtYXR0ZWRQYWRkaW5nLCBiYWNrZ3JvdW5kQ29sb3IsIGNvbG9yKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBpY29uSW1nID0gbmV3IEltYWdlKCk7XG4gICAgaWNvbkltZy5zcmMgPSBpY29uO1xuICAgIGljb25JbWcuY3Jvc3NPcmlnaW4gPSAnYW5vbnltb3VzJztcbiAgICBpY29uSW1nLndpZHRoID0gaWNvblNpemUgKiAoY2FudmFzLndpZHRoIC8gc2l6ZSk7XG4gICAgaWNvbkltZy5oZWlnaHQgPSBpY29uU2l6ZSAqIChjYW52YXMud2lkdGggLyBzaXplKTtcbiAgICBpY29uSW1nLm9ubG9hZCA9ICgpID0+IHtcbiAgICAgIGRyYXdDYW52YXNCYWNrZ3JvdW5kKGN0eCwgY2FudmFzLndpZHRoLCBjYW52YXMuaGVpZ2h0LCBzY2FsZSwgYmFja2dyb3VuZENvbG9yKTtcbiAgICAgIGRyYXdDYW52YXNDb2xvcihjdHgsIHZhbHVlLCBzY2FsZSwgZm9ybWF0dGVkUGFkZGluZywgYmFja2dyb3VuZENvbG9yLCBjb2xvcik7XG4gICAgICBjb25zdCBpY29uQ29vcmRpbmF0ZSA9IGNhbnZhcy53aWR0aCAvIDIgLSAoaWNvblNpemUgKiAoY2FudmFzLndpZHRoIC8gc2l6ZSkpIC8gMjtcblxuICAgICAgY3R4LmZpbGxSZWN0KGljb25Db29yZGluYXRlLCBpY29uQ29vcmRpbmF0ZSwgaWNvblNpemUgKiAoY2FudmFzLndpZHRoIC8gc2l6ZSksIGljb25TaXplICogKGNhbnZhcy53aWR0aCAvIHNpemUpKTtcbiAgICAgIGN0eC5kcmF3SW1hZ2UoXG4gICAgICAgIGljb25JbWcsXG4gICAgICAgIGljb25Db29yZGluYXRlLFxuICAgICAgICBpY29uQ29vcmRpbmF0ZSxcbiAgICAgICAgaWNvblNpemUgKiAoY2FudmFzLndpZHRoIC8gc2l6ZSksXG4gICAgICAgIGljb25TaXplICogKGNhbnZhcy53aWR0aCAvIHNpemUpXG4gICAgICApO1xuICAgIH07XG4gICAgaWNvbkltZy5vbmVycm9yID0gKCkgPT4ge1xuICAgICAgZHJhd0NhbnZhc0JhY2tncm91bmQoY3R4LCBjYW52YXMud2lkdGgsIGNhbnZhcy5oZWlnaHQsIHNjYWxlLCBiYWNrZ3JvdW5kQ29sb3IpO1xuICAgICAgZHJhd0NhbnZhc0NvbG9yKGN0eCwgdmFsdWUsIHNjYWxlLCBmb3JtYXR0ZWRQYWRkaW5nLCBiYWNrZ3JvdW5kQ29sb3IsIGNvbG9yKTtcbiAgICB9O1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkcmF3Q2FudmFzQ29sb3IoXG4gIGN0eDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJELFxuICB2YWx1ZTogcXJjb2RlZ2VuLlFyQ29kZSxcbiAgc2NhbGU6IG51bWJlcixcbiAgcGFkZGluZzogbnVtYmVyW10sXG4gIGJhY2tncm91bmRDb2xvcjogc3RyaW5nLFxuICBjb2xvcjogc3RyaW5nXG4pOiB2b2lkIHtcbiAgZm9yIChsZXQgeSA9IDA7IHkgPCB2YWx1ZS5zaXplOyB5KyspIHtcbiAgICBmb3IgKGxldCB4ID0gMDsgeCA8IHZhbHVlLnNpemU7IHgrKykge1xuICAgICAgY3R4LmZpbGxTdHlsZSA9IHZhbHVlLmdldE1vZHVsZSh4LCB5KSA/IGNvbG9yIDogYmFja2dyb3VuZENvbG9yO1xuICAgICAgY3R4LmZpbGxSZWN0KHBhZGRpbmdbM10gKyB4ICogc2NhbGUsIHBhZGRpbmdbMF0gKyB5ICogc2NhbGUsIHNjYWxlLCBzY2FsZSk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkcmF3Q2FudmFzQmFja2dyb3VuZChcbiAgY3R4OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQsXG4gIHdpZHRoOiBudW1iZXIsXG4gIGhlaWdodDogbnVtYmVyLFxuICBzY2FsZTogbnVtYmVyLFxuICBiYWNrZ3JvdW5kQ29sb3I6IHN0cmluZ1xuKTogdm9pZCB7XG4gIGZvciAobGV0IHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHtcbiAgICBmb3IgKGxldCB4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHtcbiAgICAgIGN0eC5maWxsU3R5bGUgPSBiYWNrZ3JvdW5kQ29sb3I7XG4gICAgICBjdHguZmlsbFJlY3QoeCAqIHNjYWxlLCB5ICogc2NhbGUsIHNjYWxlLCBzY2FsZSk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRQYWRkaW5nKHBhZGRpbmc6IG51bWJlciB8IG51bWJlcltdKTogbnVtYmVyW10ge1xuICBpZiAoQXJyYXkuaXNBcnJheShwYWRkaW5nKSkge1xuICAgIC8vIEJ1aWxkIGFuIGFycmF5IG9mIDQgZWxlbWVudHMgYW5kIHJlcGVhdCB2YWx1ZXMgZnJvbSBwYWRkaW5nIGFzIG5lY2Vzc2FyeSB0byBzZXQgdGhlIHZhbHVlIG9mIHRoZSBhcnJheVxuICAgIHJldHVybiBBcnJheSg0KVxuICAgICAgLmZpbGwoMClcbiAgICAgIC5tYXAoKF8sIGluZGV4KSA9PiBwYWRkaW5nW2luZGV4ICUgcGFkZGluZy5sZW5ndGhdKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gW3BhZGRpbmcsIHBhZGRpbmcsIHBhZGRpbmcsIHBhZGRpbmddO1xuICB9XG59XG4iXX0=