static decode(image, imageTopLeft, imageBottomLeft, imageTopRight, imageBottomRight, minCodewordWidth, maxCodewordWidth) {
			let boundingBox = new BoundingBox(image, imageTopLeft, imageBottomLeft, imageTopRight, imageBottomRight);
			let leftRowIndicatorColumn = null;
			let rightRowIndicatorColumn = null;
			let detectionResult;
			for (let firstPass /*boolean*/ = true;; firstPass = false) {
				if (imageTopLeft != null) {
					leftRowIndicatorColumn = PDF417ScanningDecoder.getRowIndicatorColumn(image, boundingBox, imageTopLeft, true, minCodewordWidth, maxCodewordWidth);
				}
				if (imageTopRight != null) {
					rightRowIndicatorColumn = PDF417ScanningDecoder.getRowIndicatorColumn(image, boundingBox, imageTopRight, false, minCodewordWidth, maxCodewordWidth);
				}
				detectionResult = PDF417ScanningDecoder.merge(leftRowIndicatorColumn, rightRowIndicatorColumn);
				if (detectionResult == null) {
					throw NotFoundException.getNotFoundInstance();
				}
				let resultBox = detectionResult.getBoundingBox();
				if (firstPass && resultBox != null &&
					(resultBox.getMinY() < boundingBox.getMinY() || resultBox.getMaxY() > boundingBox.getMaxY())) {
					boundingBox = resultBox;
				}
				else {
					break;
				}
			}
			detectionResult.setBoundingBox(boundingBox);
			let maxBarcodeColumn = detectionResult.getBarcodeColumnCount() + 1;
			detectionResult.setDetectionResultColumn(0, leftRowIndicatorColumn);
			detectionResult.setDetectionResultColumn(maxBarcodeColumn, rightRowIndicatorColumn);
			let leftToRight = leftRowIndicatorColumn != null;
			for (let barcodeColumnCount /*int*/ = 1; barcodeColumnCount <= maxBarcodeColumn; barcodeColumnCount++) {
				let barcodeColumn = leftToRight ? barcodeColumnCount : maxBarcodeColumn - barcodeColumnCount;
				if (detectionResult.getDetectionResultColumn(barcodeColumn) !== /* null */ undefined) {
					// This will be the case for the opposite row indicator column, which doesn't need to be decoded again.
					continue;
				}
				let detectionResultColumn;
				if (barcodeColumn === 0 || barcodeColumn === maxBarcodeColumn) {
					detectionResultColumn = new DetectionResultRowIndicatorColumn(boundingBox, barcodeColumn === 0);
				}
				else {
					detectionResultColumn = new DetectionResultColumn(boundingBox);
				}
				detectionResult.setDetectionResultColumn(barcodeColumn, detectionResultColumn);
				let startColumn = -1;
				let previousStartColumn = startColumn;
				// TODO start at a row for which we know the start position, then detect upwards and downwards from there.
				for (let imageRow /*int*/ = boundingBox.getMinY(); imageRow <= boundingBox.getMaxY(); imageRow++) {
					startColumn = PDF417ScanningDecoder.getStartColumn(detectionResult, barcodeColumn, imageRow, leftToRight);
					if (startColumn < 0 || startColumn > boundingBox.getMaxX()) {
						if (previousStartColumn === -1) {
							continue;
						}
						startColumn = previousStartColumn;
					}
					let codeword = PDF417ScanningDecoder.detectCodeword(image, boundingBox.getMinX(), boundingBox.getMaxX(), leftToRight, startColumn, imageRow, minCodewordWidth, maxCodewordWidth);
					if (codeword != null) {
						detectionResultColumn.setCodeword(imageRow, codeword);
						previousStartColumn = startColumn;
						minCodewordWidth = Math.min(minCodewordWidth, codeword.getWidth());
						maxCodewordWidth = Math.max(maxCodewordWidth, codeword.getWidth());
					}
				}
			}
			return PDF417ScanningDecoder.createDecoderResult(detectionResult);
		}
@TODO don't pass in minCodewordWidth and maxCodewordWidth, pass in barcode columns for start and stop pattern

columns. That way width can be deducted from the pattern column.
This approach also allows to detect more details about the barcode, e.g. if a bar type (white or black) is wider
than it should be. This can happen if the scanner used a bad blackpoint.

@param BitMatrix
@param image
@param ResultPoint
@param imageTopLeft
@param ResultPoint
@param imageBottomLeft
@param ResultPoint
@param imageTopRight
@param ResultPoint
@param imageBottomRight
@param int
@param minCodewordWidth
@param int
@param maxCodewordWidth

@throws NotFoundException
@throws FormatException
@throws ChecksumException