import React, { useEffect } from "react"; import {defaultViewBox} from "../../utils/util"; import {ParamTypes} from "../../constant/ParamTypes"; import {getTypeTable, QRPointType} from "../../utils/qrcodeHandler"; function listPoints(qrcode, params) { if (!qrcode) return [] const nCount = qrcode.getModuleCount(); const typeTable = getTypeTable(qrcode); const pointList = []; const g1 = []; const g2 = []; let width2 = params[0] / 100; let width1 = params[1] / 100; let posType = params[2]; let id = 0; if (width2 <= 0) width2 = 80; let available = []; let ava2 = []; for (let x = 0; x < nCount; x++) { available[x] = []; ava2[x] = []; for (let y = 0; y < nCount; y++) { available[x][y] = true; ava2[x][y] = true; } } for (let y = 0; y < nCount; y++) { for (let x = 0; x < nCount; x++) { if (qrcode.isDark(x, y) == false) continue; else if (typeTable[x][y] == QRPointType.POS_CENTER) { if (posType == 0) { pointList.push(); } else if (posType == 1) { pointList.push(); pointList.push(); pointList.push(); pointList.push(); pointList.push(); } } else if (typeTable[x][y] == QRPointType.POS_OTHER) { if (posType == 0) { pointList.push(); } } else { if (available[x][y] && ava2[x][y] && x < nCount - 2 && y < nCount - 2) { let ctn = true; for (let i = 0; i < 3; i++) { for (let j = 0; j < 3; j++) { if (ava2[x + i][y + j] === false) { ctn = false; } } } if (ctn && qrcode.isDark(x + 2, y) && qrcode.isDark(x + 1, y + 1) && qrcode.isDark(x, y + 2) && qrcode.isDark(x + 2, y + 2)) { g1.push() g1.push() available[x][y] = false; available[x + 2][y] = false; available[x][y + 2] = false; available[x + 2][y + 2] = false; available[x + 1][y + 1] = false; for (let i = 0; i < 3; i++) { for (let j = 0; j < 3; j++) { ava2[x + i][y + j] = false; } } } } if (available[x][y] && ava2[x][y] && x < nCount - 1 && y < nCount - 1) { let ctn = true; for (let i = 0; i < 2; i++) { for (let j = 0; j < 2; j++) { if (ava2[x + i][y + j] === false) { ctn = false; } } } if (ctn && qrcode.isDark(x + 1, y) && qrcode.isDark(x, y + 1) && qrcode.isDark(x + 1, y + 1)) { g1.push() g1.push() for (let i = 0; i < 2; i++) { for (let j = 0; j < 2; j++) { available[x + i][y + j] = false; ava2[x + i][y + j] = false; } } } } if (available[x][y] && ava2[x][y]) { if (y === 0 || (y > 0 && (!qrcode.isDark(x, y - 1) || !ava2[x][y - 1]))) { let start = y; let end = y; let ctn = true; while (ctn && end < nCount) { if (qrcode.isDark(x, end) && ava2[x][end]) { end++; } else { ctn = false; } } if (end - start > 2) { for (let i = start; i < end; i++) { ava2[x][i] = false; available[x][i] = false; } g2.push() g2.push() } } } if (available[x][y] && ava2[x][y]) { if (x === 0 || (x > 0 && (!qrcode.isDark(x - 1, y) || !ava2[x - 1][y]))) { let start = x; let end = x; let ctn = true; while (ctn && end < nCount) { if (qrcode.isDark(end, y) && ava2[end][y]) { end++; } else { ctn = false; } } if (end - start > 1) { for (let i = start; i < end; i++) { ava2[i][y] = false; available[i][y] = false; } g2.push() } } } if (available[x][y]) { pointList.push() } } } } for (let i = 0; i < g1.length; i++) { pointList.push(g1[i]); } for (let i = 0; i < g2.length; i++) { pointList.push(g2[i]); } return pointList; } function getParamInfo() { return [ { type: ParamTypes.TEXT_EDITOR, key: '信息点缩放', default: 70, }, { type: ParamTypes.TEXT_EDITOR, key: 'x 宽度', default: 70, }, { type: ParamTypes.SELECTOR, key: '定位点样式', default: 1, choices: [ "矩形", "DSJ", ] }, ] } const RenderDSJ = ({ qrcode, params, setParamInfo}) => { useEffect(() => { setParamInfo(getParamInfo()); }, [setParamInfo]); return ( {listPoints(qrcode, params)} ) } export default RenderDSJ