Exemplo n.º 1
0
        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;
                            }
                        }
                    }
                }
            }
        }
Exemplo n.º 2
0
        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));
        }
Exemplo n.º 3
0
        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;
                    }
                }
            }
        }
Exemplo n.º 4
0
        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;
            }
        }
Exemplo n.º 5
0
        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);
        }
Exemplo n.º 6
0
        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);
        }
Exemplo n.º 7
0
        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);
        }