terminateBits static method

void terminateBits(
  1. int numDataBytes,
  2. BitArray bits
)

Terminate bits as described in 8.4.8 and 8.4.9 of JISX0510:2004 (p.24).

Implementation

static void terminateBits(int numDataBytes, BitArray bits) {
  final capacity = numDataBytes * 8;
  if (bits.size > capacity) {
    throw WriterException(
      'data bits cannot fit in the QR Code ${bits.size} > $capacity',
    );
  }
  // Append Mode.TERMINATE if there is enough space (value is 0000)
  for (int i = 0; i < 4 && bits.size < capacity; ++i) {
    bits.appendBit(false);
  }
  // Append termination bits. See 8.4.8 of JISX0510:2004 (p.24) for details.
  // If the last byte isn't 8-bit aligned, we'll add padding bits.
  final numBitsInLastByte = bits.size & 0x07;
  if (numBitsInLastByte > 0) {
    for (int i = numBitsInLastByte; i < 8; i++) {
      bits.appendBit(false);
    }
  }
  // If we have more space, we'll fill the space with padding patterns defined in 8.4.9 (p.24).
  final numPaddingBytes = numDataBytes - bits.sizeInBytes;
  for (int i = 0; i < numPaddingBytes; ++i) {
    bits.appendBits((i & 0x01) == 0 ? 0xEC : 0x11, 8);
  }
  if (bits.size != capacity) {
    throw WriterException('Bits size does not equal capacity');
  }
}