findMulti method
Implementation
List<FinderPatternInfo> findMulti(DecodeHint? hints) {
final tryHarder = hints?.tryHarder ?? false;
final maxI = image.height;
final maxJ = image.width;
int iSkip = (3 * maxI) ~/ (4 * FinderPatternFinder.maxModules);
if (iSkip < FinderPatternFinder.minSkip || tryHarder) {
iSkip = FinderPatternFinder.minSkip;
}
final stateCount = [0, 0, 0, 0, 0];
for (int i = iSkip - 1; i < maxI; i += iSkip) {
FinderPatternFinder.doClearCounts(stateCount);
int currentState = 0;
for (int j = 0; j < maxJ; j++) {
if (image.get(j, i)) {
if ((currentState & 1) == 1) {
currentState++;
}
stateCount[currentState]++;
} else {
if ((currentState & 1) == 0) {
if (currentState == 4) {
if (FinderPatternFinder.foundPatternCross(stateCount) &&
handlePossibleCenter(stateCount, i, j)) {
currentState = 0;
FinderPatternFinder.doClearCounts(stateCount);
} else {
FinderPatternFinder.doShiftCounts2(stateCount);
currentState = 3;
}
} else {
stateCount[++currentState]++;
}
} else {
stateCount[currentState]++;
}
}
}
if (FinderPatternFinder.foundPatternCross(stateCount)) {
handlePossibleCenter(stateCount, i, maxJ);
}
}
final patternInfo = _selectMultipleBestPatterns();
final result = <FinderPatternInfo>[];
for (List<FinderPattern> pattern in patternInfo) {
ResultPoint.orderBestPatterns(pattern);
result.add(FinderPatternInfo(pattern));
}
if (result.isEmpty) {
return _emptyResultArray;
} else {
return result.toList();
}
}