private void SetupPositionAdjustPattern() { var pos = QRUtil.GetPatternPosition(_typeNumber); for (var i = 0; i < pos.Length; i += 1) { for (var j = 0; j < pos.Length; j += 1) { var row = pos[i]; var col = pos[j]; if (_modules[row, col] != null) { continue; } for (var r = -2; r <= 2; r += 1) { for (var c = -2; c <= 2; c += 1) { if (r == -2 || r == 2 || c == -2 || c == 2 || (r == 0 && c == 0)) { _modules[row + r, col + c] = true; } else { _modules[row + r, col + c] = false; } } } } } }
private byte[] CreateData(int typeNumber, ErrorCorrectLevel errorCorrectLevel, List <QR8BitByte> dataList) { var rsBlocks = QRRSBlock.GetRSBlocks(typeNumber, errorCorrectLevel); var buffer = new QRBitBuffer(); for (var i = 0; i < dataList.Count; i += 1) { var data = dataList[i]; buffer.Put((int)data.Mode, 4); buffer.Put(data.Length, QRUtil.GetLengthInBits(data.Mode, typeNumber)); data.Write(buffer); } // calc num max data. var totalDataCount = 0; for (var i = 0; i < rsBlocks.Length; i += 1) { totalDataCount += rsBlocks[i].DataCount; } if (buffer.LengthInBits > totalDataCount * 8) { throw new OverflowException( $"code length overflow. ({buffer.LengthInBits}>{totalDataCount * 8})" ); } // end code if (buffer.LengthInBits + 4 <= totalDataCount * 8) { buffer.Put(0, 4); } // padding while (buffer.LengthInBits % 8 != 0) { buffer.PutBit(false); } // padding while (true) { if (buffer.LengthInBits >= totalDataCount * 8) { break; } buffer.Put(Pad0, 8); if (buffer.LengthInBits >= totalDataCount * 8) { break; } buffer.Put(Pad1, 8); } return(CreateBytes(buffer, rsBlocks)); }
private void MapData(byte[] data, MaskPattern maskPattern) { var inc = -1; var row = _moduleCount - 1; var bitIndex = 7; var byteIndex = 0; for (var col = _moduleCount - 1; col > 0; col -= 2) { if (col == 6) { col -= 1; } while (true) { for (var c = 0; c < 2; c += 1) { if (_modules[row, col - c] == null) { var dark = false; if (byteIndex < data.Length) { dark = (((uint)data[byteIndex] >> bitIndex) & 1) == 1; } var mask = QRUtil.GetMask(maskPattern, row, col - c); if (mask) { dark = !dark; } _modules[row, col - c] = dark; bitIndex -= 1; if (bitIndex == -1) { byteIndex += 1; bitIndex = 7; } } } row += inc; if (row < 0 || _moduleCount <= row) { row -= inc; inc = -inc; break; } } } }
private void SetupTypeNumber(bool test) { var bits = QRUtil.GetBchTypeNumber(_typeNumber); for (var i = 0; i < 18; i += 1) { var mod = (!test && ((bits >> i) & 1) == 1); _modules[i / 3, i % 3 + _moduleCount - 8 - 3] = mod; } for (var i = 0; i < 18; i += 1) { var mod = (!test && ((bits >> i) & 1) == 1); _modules[i % 3 + _moduleCount - 8 - 3, i / 3] = mod; } }
private MaskPattern GetBestMaskPattern() { var minLostPoint = 0; MaskPattern pattern = 0; for (var i = 0; i < 8; i += 1) { MakeImpl(true, (MaskPattern)i); var lostPoint = QRUtil.GetLostPoint(this); if (i == 0 || minLostPoint > lostPoint) { minLostPoint = lostPoint; pattern = (MaskPattern)i; } } return(pattern); }
private void SetupTypeInfo(bool test, MaskPattern maskPattern) { var data = ((int)_errorCorrectLevel << 3) | (int)maskPattern; var bits = QRUtil.GetBchTypeInfo(data); // vertical for (var i = 0; i < 15; i += 1) { var mod = (!test && ((bits >> i) & 1) == 1); if (i < 6) { _modules[i, 8] = mod; } else if (i < 8) { _modules[i + 1, 8] = mod; } else { _modules[_moduleCount - 15 + i, 8] = mod; } } // horizontal for (var i = 0; i < 15; i += 1) { var mod = (!test && ((bits >> i) & 1) == 1); if (i < 8) { _modules[8, _moduleCount - i - 1] = mod; } else if (i < 9) { _modules[8, 15 - i - 1 + 1] = mod; } else { _modules[8, 15 - i - 1] = mod; } } // fixed module _modules[_moduleCount - 8, 8] = (!test); }
private byte[] CreateBytes(QRBitBuffer buffer, QRRSBlock[] rsBlocks) { var offset = 0; var maxDcCount = 0; var maxEcCount = 0; var dcdata = new int[rsBlocks.Length][]; var ecdata = new int[rsBlocks.Length][]; for (var r = 0; r < rsBlocks.Length; r += 1) { var dcCount = rsBlocks[r].DataCount; var ecCount = rsBlocks[r].TotalCount - dcCount; maxDcCount = Math.Max(maxDcCount, dcCount); maxEcCount = Math.Max(maxEcCount, ecCount); dcdata[r] = new int[dcCount]; for (var i = 0; i < dcdata[r].Length; i += 1) { dcdata[r][i] = 0xff & buffer.GetByte(i + offset); } offset += dcCount; var rsPoly = QRUtil.GetErrorCorrectPolynomial(ecCount); var rawPoly = new QRPolynomial(dcdata[r], rsPoly.Length - 1); var modPoly = rawPoly.Mod(rsPoly); ecdata[r] = new int[rsPoly.Length - 1]; for (var i = 0; i < ecdata[r].Length; i += 1) { var modIndex = i + modPoly.Length - ecdata[r].Length; ecdata[r][i] = (modIndex >= 0) ? modPoly[modIndex] : 0; } } var totalCodeCount = 0; for (var i = 0; i < rsBlocks.Length; i += 1) { totalCodeCount += rsBlocks[i].TotalCount; } var data = new byte[totalCodeCount]; var index = 0; for (var i = 0; i < maxDcCount; i += 1) { for (var r = 0; r < rsBlocks.Length; r += 1) { if (i < dcdata[r].Length) { data[index] = (byte)dcdata[r][i]; index += 1; } } } for (var i = 0; i < maxEcCount; i += 1) { for (var r = 0; r < rsBlocks.Length; r += 1) { if (i < ecdata[r].Length) { data[index] = (byte)ecdata[r][i]; index += 1; } } } return(data); }