ng-zorro-antd
Version:
An enterprise-class UI components based on Ant Design and Angular
87 lines • 15.2 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXJjb2RlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vY29tcG9uZW50cy9xci1jb2RlL3FyY29kZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFFSCxPQUFPLFNBQVMsTUFBTSxhQUFhLENBQUM7QUFFcEMsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUErRDtJQUN6RixDQUFDLEVBQUUsU0FBUyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRztJQUMzQixDQUFDLEVBQUUsU0FBUyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTTtJQUM5QixDQUFDLEVBQUUsU0FBUyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsUUFBUTtJQUNoQyxDQUFDLEVBQUUsU0FBUyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSTtDQUNwQixDQUFDO0FBRVgsTUFBTSxZQUFZLEdBQUcsR0FBRyxDQUFDO0FBQ3pCLE1BQU0sYUFBYSxHQUFHLEVBQUUsQ0FBQztBQUN6QixNQUFNLGVBQWUsR0FBRyxFQUFFLENBQUM7QUFDM0IsTUFBTSxhQUFhLEdBQUcsU0FBUyxDQUFDO0FBQ2hDLE1BQU0sd0JBQXdCLEdBQUcsU0FBUyxDQUFDO0FBQzNDLE1BQU0sZ0JBQWdCLEdBQUcsRUFBRSxDQUFDO0FBQzVCLE1BQU0sYUFBYSxHQUFpQyxHQUFHLENBQUM7QUFFeEQsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFHLENBQzVCLEtBQWEsRUFDYixRQUFzQyxhQUFhLEVBQzFCLEVBQUU7SUFDM0IsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ1gsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBQ0QsT0FBTyxTQUFTLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDcEUsQ0FBQyxDQUFDO0FBRUYsTUFBTSxVQUFVLFVBQVUsQ0FDeEIsTUFBeUIsRUFDekIsS0FB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RUQsTUFBTSxVQUFVLG9CQUFvQixDQUNsQyxHQUE2QixFQUM3QixLQUFhLEVBQ2IsTUFBYyxFQUNkLEtBQWEsRUFDYixlQUF1QjtJQUV2QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDaEMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQy9CLEdBQUcsQ0FBQyxTQUFTLEdBQUcsZUFBZSxDQUFDO1lBQ2hDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLEtBQUssRUFBRSxDQUFDLEdBQUcsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNuRCxDQUFDO0lBQ0gsQ0FBQztBQUNILENBQUM7QUFFRCxNQUFNLFVBQVUsYUFBYSxDQUFDLE9BQTBCO0lBQ3RELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1FBQzNCLHlHQUF5RztRQUN6RyxPQUFPLEtBQUssQ0FBQyxDQUFDLENBQUM7YUFDWixJQUFJLENBQUMsQ0FBQyxDQUFDO2FBQ1AsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUN4RCxDQUFDO1NBQU0sQ0FBQztRQUNOLE9BQU8sQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztJQUM5QyxDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9naXRodWIuY29tL05HLVpPUlJPL25nLXpvcnJvLWFudGQvYmxvYi9tYXN0ZXIvTElDRU5TRVxuICovXG5cbmltcG9ydCBxcmNvZGVnZW4gZnJvbSAnLi9xcmNvZGVnZW4nO1xuXG5leHBvcnQgY29uc3QgRVJST1JfTEVWRUxfTUFQOiB7IFtpbmRleCBpbiAnTCcgfCAnTScgfCAnUScgfCAnSCddOiBxcmNvZGVnZW4uUXJDb2RlLkVjYyB9ID0ge1xuICBMOiBxcmNvZGVnZW4uUXJDb2RlLkVjYy5MT1csXG4gIE06IHFyY29kZWdlbi5RckNvZGUuRWNjLk1FRElVTSxcbiAgUTogcXJjb2RlZ2VuLlFyQ29kZS5FY2MuUVVBUlRJTEUsXG4gIEg6IHFyY29kZWdlbi5RckNvZGUuRWNjLkhJR0hcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IERFRkFVTFRfU0laRSA9IDE2MDtcbmNvbnN0IERFRkFVTFRfU0NBTEUgPSAxMDtcbmNvbnN0IERFRkFVTFRfUEFERElORyA9IDEwO1xuY29uc3QgREVGQVVMVF9DT0xPUiA9ICcjMDAwMDAwJztcbmNvbnN0IERFRkFVTFRfQkFDS0dST1VORF9DT0xPUiA9ICcjRkZGRkZGJztcbmNvbnN0IERFRkFVTFRfSUNPTlNJWkUgPSA0MDtcbmNvbnN0IERFRkFVTFRfTEVWRUw6IGtleW9mIHR5cGVvZiBFUlJPUl9MRVZFTF9NQVAgPSAnTSc7XG5cbmV4cG9ydCBjb25zdCBwbG90UVJDb2RlRGF0YSA9IChcbiAgdmFsdWU6IHN0cmluZyxcbiAgbGV2ZWw6IGtleW9mIHR5cGVvZiBFUlJPUl9MRVZFTF9NQVAgPSBERUZBVUxUX0xFVkVMXG4pOiBxcmNvZGVnZW4uUXJDb2RlIHwgbnVsbCA9PiB7XG4gIGlmICghdmFsdWUpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICByZXR1cm4gcXJjb2RlZ2VuLlFyQ29kZS5lbmNvZGVUZXh0KHZhbHVlLCBFUlJPUl9MRVZFTF9NQVBbbGV2ZWxdKTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBkcmF3Q2FudmFzKFxuICBjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50LFxuICB2YWx1ZTogcXJjb2RlZ2VuLlFyQ29kZSB8IG51bGwsXG4gIHNpemUgPSBERUZBVUxUX1NJWkUsXG4gIHNjYWxlID0gREVGQVVMVF9TQ0FMRSxcbiAgcGFkZGluZzogbnVtYmVyIHwgbnVtYmVyW10gPSBERUZBVUxUX1BBRERJTkcsXG4gIGNvbG9yID0gREVGQVVMVF9DT0xPUixcbiAgYmFja2dyb3VuZENvbG9yID0gREVGQVVMVF9CQUNLR1JPVU5EX0NPTE9SLFxuICBpY29uU2l6ZSA9IERFRkFVTFRfSUNPTlNJWkUsXG4gIGljb24/OiBzdHJpbmdcbik6IHZvaWQge1xuICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKSBhcyBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQ7XG4gIGNvbnN0IGZvcm1hdHRlZFBhZGRpbmcgPSBmb3JtYXRQYWRkaW5nKHBhZGRpbmcpO1xuICBjYW52YXMuc3R5bGUud2lkdGggPSBgJHtzaXplfXB4YDtcbiAgY2FudmFzLnN0eWxlLmhlaWdodCA9IGAke3NpemV9cHhgO1xuICBpZiAoIXZhbHVlKSB7XG4gICAgY3R4LmZpbGxTdHlsZSA9ICdyZ2JhKDAsIDAsIDAsIDApJztcbiAgICBjdHguZmlsbFJlY3QoMCwgMCwgY2FudmFzLndpZHRoLCBjYW52YXMuaGVpZ2h0KTtcbiAgICByZXR1cm47XG4gIH1cbiAgY2FudmFzLndpZHRoID0gdmFsdWUuc2l6ZSAqIHNjYWxlICsgZm9ybWF0dGVkUGFkZGluZ1sxXSArIGZvcm1hdHRlZFBhZGRpbmdbM107XG4gIGNhbnZhcy5oZWlnaHQgPSB2YWx1ZS5zaXplICogc2NhbGUgKyBmb3JtYXR0ZWRQYWRkaW5nWzBdICsgZm9ybWF0dGVkUGFkZGluZ1syXTtcbiAgaWYgKCFpY29uKSB7XG4gICAgZHJhd0NhbnZhc0JhY2tncm91bmQoY3R4LCBjYW52YXMud2lkdGgsIGNhbnZhcy5oZWlnaHQsIHNjYWxlLCBiYWNrZ3JvdW5kQ29sb3IpO1xuICAgIGRyYXdDYW52YXNDb2xvcihjdHgsIHZhbHVlLCBzY2FsZSwgZm9ybWF0dGVkUGFkZGluZywgYmFja2dyb3VuZENvbG9yLCBjb2xvcik7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgaWNvbkltZyA9IG5ldyBJbWFnZSgpO1xuICAgIGljb25JbWcuc3JjID0gaWNvbjtcbiAgICBpY29uSW1nLmNyb3NzT3JpZ2luID0gJ2Fub255bW91cyc7XG4gICAgaWNvbkltZy53aWR0aCA9IGljb25TaXplICogKGNhbnZhcy53aWR0aCAvIHNpemUpO1xuICAgIGljb25JbWcuaGVpZ2h0ID0gaWNvblNpemUgKiAoY2FudmFzLndpZHRoIC8gc2l6ZSk7XG4gICAgaWNvbkltZy5vbmxvYWQgPSAoKSA9PiB7XG4gICAgICBkcmF3Q2FudmFzQmFja2dyb3VuZChjdHgsIGNhbnZhcy53aWR0aCwgY2FudmFzLmhlaWdodCwgc2NhbGUsIGJhY2tncm91bmRDb2xvcik7XG4gICAgICBkcmF3Q2FudmFzQ29sb3IoY3R4LCB2YWx1ZSwgc2NhbGUsIGZvcm1hdHRlZFBhZGRpbmcsIGJhY2tncm91bmRDb2xvciwgY29sb3IpO1xuICAgICAgY29uc3QgaWNvbkNvb3JkaW5hdGUgPSBjYW52YXMud2lkdGggLyAyIC0gKGljb25TaXplICogKGNhbnZhcy53aWR0aCAvIHNpemUpKSAvIDI7XG5cbiAgICAgIGN0eC5maWxsUmVjdChpY29uQ29vcmRpbmF0ZSwgaWNvbkNvb3JkaW5hdGUsIGljb25TaXplICogKGNhbnZhcy53aWR0aCAvIHNpemUpLCBpY29uU2l6ZSAqIChjYW52YXMud2lkdGggLyBzaXplKSk7XG4gICAgICBjdHguZHJhd0ltYWdlKFxuICAgICAgICBpY29uSW1nLFxuICAgICAgICBpY29uQ29vcmRpbmF0ZSxcbiAgICAgICAgaWNvbkNvb3JkaW5hdGUsXG4gICAgICAgIGljb25TaXplICogKGNhbnZhcy53aWR0aCAvIHNpemUpLFxuICAgICAgICBpY29uU2l6ZSAqIChjYW52YXMud2lkdGggLyBzaXplKVxuICAgICAgKTtcbiAgICB9O1xuICAgIGljb25JbWcub25lcnJvciA9ICgpID0+IHtcbiAgICAgIGRyYXdDYW52YXNCYWNrZ3JvdW5kKGN0eCwgY2FudmFzLndpZHRoLCBjYW52YXMuaGVpZ2h0LCBzY2FsZSwgYmFja2dyb3VuZENvbG9yKTtcbiAgICAgIGRyYXdDYW52YXNDb2xvcihjdHgsIHZhbHVlLCBzY2FsZSwgZm9ybWF0dGVkUGFkZGluZywgYmFja2dyb3VuZENvbG9yLCBjb2xvcik7XG4gICAgfTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZHJhd0NhbnZhc0NvbG9yKFxuICBjdHg6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCxcbiAgdmFsdWU6IHFyY29kZWdlbi5RckNvZGUsXG4gIHNjYWxlOiBudW1iZXIsXG4gIHBhZGRpbmc6IG51bWJlcltdLFxuICBiYWNrZ3JvdW5kQ29sb3I6IHN0cmluZyxcbiAgY29sb3I6IHN0cmluZ1xuKTogdm9pZCB7XG4gIGZvciAobGV0IHkgPSAwOyB5IDwgdmFsdWUuc2l6ZTsgeSsrKSB7XG4gICAgZm9yIChsZXQgeCA9IDA7IHggPCB2YWx1ZS5zaXplOyB4KyspIHtcbiAgICAgIGN0eC5maWxsU3R5bGUgPSB2YWx1ZS5nZXRNb2R1bGUoeCwgeSkgPyBjb2xvciA6IGJhY2tncm91bmRDb2xvcjtcbiAgICAgIGN0eC5maWxsUmVjdChwYWRkaW5nWzNdICsgeCAqIHNjYWxlLCBwYWRkaW5nWzBdICsgeSAqIHNjYWxlLCBzY2FsZSwgc2NhbGUpO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZHJhd0NhbnZhc0JhY2tncm91bmQoXG4gIGN0eDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJELFxuICB3aWR0aDogbnVtYmVyLFxuICBoZWlnaHQ6IG51bWJlcixcbiAgc2NhbGU6IG51bWJlcixcbiAgYmFja2dyb3VuZENvbG9yOiBzdHJpbmdcbik6IHZvaWQge1xuICBmb3IgKGxldCB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7XG4gICAgZm9yIChsZXQgeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7XG4gICAgICBjdHguZmlsbFN0eWxlID0gYmFja2dyb3VuZENvbG9yO1xuICAgICAgY3R4LmZpbGxSZWN0KHggKiBzY2FsZSwgeSAqIHNjYWxlLCBzY2FsZSwgc2NhbGUpO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0UGFkZGluZyhwYWRkaW5nOiBudW1iZXIgfCBudW1iZXJbXSk6IG51bWJlcltdIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkocGFkZGluZykpIHtcbiAgICAvLyBCdWlsZCBhbiBhcnJheSBvZiA0IGVsZW1lbnRzIGFuZCByZXBlYXQgdmFsdWVzIGZyb20gcGFkZGluZyBhcyBuZWNlc3NhcnkgdG8gc2V0IHRoZSB2YWx1ZSBvZiB0aGUgYXJyYXlcbiAgICByZXR1cm4gQXJyYXkoNClcbiAgICAgIC5maWxsKDApXG4gICAgICAubWFwKChfLCBpbmRleCkgPT4gcGFkZGluZ1tpbmRleCAlIHBhZGRpbmcubGVuZ3RoXSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIFtwYWRkaW5nLCBwYWRkaW5nLCBwYWRkaW5nLCBwYWRkaW5nXTtcbiAgfVxufVxuIl19