Ejemplo n.º 1
0
        /**
         * Revert the mask removal done while reading the code words. The bit matrix should revert to its original state.
         */
        internal void Remask()
        {
            if (parsedFormatInfo == null)
            {
                return; // We have no format information, and have no data mask
            }
            int dimension = bitMatrix.Height;

            DataMask.UnmaskBitMatrix(parsedFormatInfo.DataMask, bitMatrix, dimension);
        }
Ejemplo n.º 2
0
        private static void testMaskAcrossDimensions(int reference, Func <int, int, bool> condition)
        {
            DataMask mask = DataMask.forReference(reference);

            for (int version = 1; version <= 40; version++)
            {
                int dimension = 17 + 4 * version;
                testMask(mask, dimension, condition);
            }
        }
Ejemplo n.º 3
0
        private static void testMask(int reference, int dimension, Func <int, int, bool> condition)
        {
            BitMatrix bits = new BitMatrix(dimension);

            DataMask.unmaskBitMatrix(reference, bits, dimension);
            for (int i = 0; i < dimension; i++)
            {
                for (int j = 0; j < dimension; j++)
                {
                    Assert.AreEqual(
                        condition(i, j),
                        bits[j, i],
                        "(" + i + ',' + j + ')');
                }
            }
        }
Ejemplo n.º 4
0
        /// <summary> <p>Reads the bits in the {@link BitMatrix} representing the finder pattern in the
        /// correct order in order to reconstruct the codewords bytes contained within the
        /// QR Code.</p>
        ///
        /// </summary>
        /// <returns> bytes encoded within the QR Code
        /// </returns>
        /// <throws>  ReaderException if the exact number of bytes expected is not read </throws>
        internal byte[] ReadCodewords()
        {
            FormatInformation formatInfo = ReadFormatInformation();

            if (formatInfo == null)
            {
                return(null);
            }
            Version version = ReadVersion();

            if (version == null)
            {
                return(null);
            }

            // Get the data mask for the format used in this QR Code. This will exclude
            // some bits from reading as we wind through the bit matrix.
            int dimension = bitMatrix.Height;

            DataMask.UnmaskBitMatrix(formatInfo.DataMask, bitMatrix, dimension);

            BitMatrix functionPattern = version.BuildFunctionPattern();

            bool readingUp = true;

            byte[] result       = new byte[version.TotalCodewords];
            int    resultOffset = 0;
            int    currentByte  = 0;
            int    bitsRead     = 0;

            // Read columns in pairs, from right to left
            for (int j = dimension - 1; j > 0; j -= 2)
            {
                if (j == 6)
                {
                    // Skip whole column with vertical alignment pattern;
                    // saves time and makes the other code proceed more cleanly
                    j--;
                }
                // Read alternatingly from bottom to top then top to bottom
                for (int count = 0; count < dimension; count++)
                {
                    int i = readingUp ? dimension - 1 - count : count;
                    for (int col = 0; col < 2; col++)
                    {
                        // Ignore bits covered by the function pattern
                        if (!functionPattern[j - col, i])
                        {
                            // Read a bit
                            bitsRead++;
                            currentByte <<= 1;
                            if (bitMatrix[j - col, i])
                            {
                                currentByte |= 1;
                            }
                            // If we've made a whole byte, save it off
                            if (bitsRead == 8)
                            {
                                result[resultOffset++] = (byte)currentByte;
                                bitsRead    = 0;
                                currentByte = 0;
                            }
                        }
                    }
                }
                readingUp ^= true; // readingUp = !readingUp; // switch directions
            }
            if (resultOffset != version.TotalCodewords)
            {
                return(null);
            }
            return(result);
        }
Ejemplo n.º 5
0
 private static void testMask(DataMask mask, int dimension, Func<int, int, bool> condition)
 {
    BitMatrix bits = new BitMatrix(dimension);
    mask.unmaskBitMatrix(bits, dimension);
    for (int i = 0; i < dimension; i++)
    {
       for (int j = 0; j < dimension; j++)
       {
          Assert.AreEqual(
              condition(i, j),
              bits[j, i],
              "(" + i + ',' + j + ')');
       }
    }
 }