Example #1
0
        public State appendFLGn(int eci)
        {
            State result    = shiftAndAppend(HighLevelEncoder.MODE_PUNCT, 0); // 0: FLG(n)
            Token token     = result.token;
            int   bitsAdded = 3;

            if (eci < 0)
            {
                token = token.add(0, 3); // 0: FNC1
            }
            else if (eci > 999999)
            {
                throw new ArgumentException("ECI code must be between 0 and 999999");
            }
            else
            {
                byte[] eciDigits = AztecWriter.DEFAULT_CHARSET.GetBytes(eci.ToString());
                token = token.add(eciDigits.Length, 3); // 1-6: number of ECI digits
                for (int ii = 0; ii < eciDigits.Length; ii++)
                {
                    token = token.add(eciDigits[ii] - '0' + 2, 4);
                }
                bitsAdded += eciDigits.Length * 4;
            }
            return(new State(token, mode, 0, bitCount + bitsAdded));
        }
Example #2
0
        /// <summary>
        /// Create a new state representing this state, but an additional character
        /// output in Binary Shift mode.
        /// </summary>
        public State addBinaryShiftChar(int index)
        {
            Token token    = this.token;
            int   mode     = this.mode;
            int   bitCount = this.bitCount;

            if (this.mode == HighLevelEncoder.MODE_PUNCT || this.mode == HighLevelEncoder.MODE_DIGIT)
            {
                //assert binaryShiftByteCount == 0;
                int latch = HighLevelEncoder.LATCH_TABLE[mode][HighLevelEncoder.MODE_UPPER];
                token     = token.add(latch & 0xFFFF, latch >> 16);
                bitCount += latch >> 16;
                mode      = HighLevelEncoder.MODE_UPPER;
            }
            int deltaBitCount =
                (binaryShiftByteCount == 0 || binaryShiftByteCount == 31) ? 18 :
                (binaryShiftByteCount == 62) ? 9 : 8;
            State result = new State(token, mode, binaryShiftByteCount + 1, bitCount + deltaBitCount);

            if (result.binaryShiftByteCount == 2047 + 31)
            {
                // The string is as long as it's allowed to be.  We should end it.
                result = result.endBinaryShift(index + 1);
            }
            return(result);
        }
Example #3
0
        /// <summary>
        /// Create a new state representing this state, with a temporary shift
        /// to a different mode to output a single value.
        /// </summary>
        public State shiftAndAppend(int mode, int value)
        {
            Token token            = this.token;
            int   thisModeBitCount = this.mode == HighLevelEncoder.MODE_DIGIT ? 4 : 5;

            // Shifts exist only to UPPER and PUNCT, both with tokens size 5.
            token = token.add(HighLevelEncoder.SHIFT_TABLE[this.mode][mode], thisModeBitCount);
            token = token.add(value, 5);
            return(new State(token, this.mode, 0, this.bitCount + thisModeBitCount + 5));
        }
Example #4
0
        /// <summary>
        /// Create a new state representing this state with a latch to a (not
        /// necessary different) mode, and then a code.
        /// </summary>
        public State latchAndAppend(int mode, int value)
        {
            int   bitCount = this.bitCount;
            Token token    = this.token;

            if (mode != this.mode)
            {
                int latch = HighLevelEncoder.LATCH_TABLE[this.mode][mode];
                token     = token.add(latch & 0xFFFF, latch >> 16);
                bitCount += latch >> 16;
            }
            int latchModeBitCount = mode == HighLevelEncoder.MODE_DIGIT ? 4 : 5;

            token = token.add(value, latchModeBitCount);
            return(new State(token, mode, 0, bitCount + latchModeBitCount));
        }
Example #5
0
 /// <summary>
 /// Create a new state representing this state, with a temporary shift
 /// to a different mode to output a single value.
 /// </summary>
 public State shiftAndAppend(int mode, int value)
 {
    //assert binaryShiftByteCount == 0 && this.mode != mode;
    Token token = this.token;
    int thisModeBitCount = this.mode == HighLevelEncoder.MODE_DIGIT ? 4 : 5;
    // Shifts exist only to UPPER and PUNCT, both with tokens size 5.
    token = token.add(HighLevelEncoder.SHIFT_TABLE[this.mode][mode], thisModeBitCount);
    token = token.add(value, 5);
    return new State(token, this.mode, 0, this.bitCount + thisModeBitCount + 5);
 }