renderResult static method

BitMatrix renderResult(
  1. QRCode code,
  2. int width,
  3. int height,
  4. int quietZone,
)

Renders the given QRCode as a BitMatrix, scaling the same to be compliant with the provided dimensions.

If no scaling is required, both width and height arguments should be non-positive numbers.

@param code QRCode to be adapted as a BitMatrix @param width desired width for the QRCode (in pixel units) @param height desired height for the QRCode (in pixel units) @param quietZone the size of the QR quiet zone (in pixel units) @return BitMatrix instance

@throws IllegalStateException if code does not have a QRCode.matrix

@throws NullPointerException if code is null

Implementation

static BitMatrix renderResult(
  QRCode code,
  int width,
  int height,
  int quietZone,
) {
  final input = code.matrix;
  if (input == null) {
    throw StateError('ByteMatrix input is null');
  }
  final inputWidth = input.width;
  final inputHeight = input.height;
  final qrWidth = inputWidth + (quietZone * 2);
  final qrHeight = inputHeight + (quietZone * 2);
  final outputWidth = math.max(width, qrWidth);
  final outputHeight = math.max(height, qrHeight);

  final multiple = math.min(outputWidth ~/ qrWidth, outputHeight ~/ qrHeight);
  // Padding includes both the quiet zone and the extra white pixels to accommodate the requested
  // dimensions. For example, if input is 25x25 the QR will be 33x33 including the quiet zone.
  // If the requested size is 200x160, the multiple will be 4, for a QR of 132x132. These will
  // handle all the padding from 100x100 (the actual QR) up to 200x160.
  final leftPadding = (outputWidth - (inputWidth * multiple)) ~/ 2;
  final topPadding = (outputHeight - (inputHeight * multiple)) ~/ 2;

  final output = BitMatrix(outputWidth, outputHeight);

  for (int inputY = 0, outputY = topPadding;
      inputY < inputHeight;
      inputY++, outputY += multiple) {
    // Write the contents of this row of the barcode
    for (int inputX = 0, outputX = leftPadding;
        inputX < inputWidth;
        inputX++, outputX += multiple) {
      if (input.get(inputX, inputY) == 1) {
        output.setRegion(outputX, outputY, multiple, multiple);
      }
    }
  }

  return output;
}