private static int[] findAsteriskPattern(BitArray row)
{
int width = row.Size;
int rowOffset = 0;
while (rowOffset < width)
{
if (row.get_Renamed(rowOffset))
{
break;
}
rowOffset++;
}
int counterPosition = 0;
var counters = new int[9];
int patternStart = rowOffset;
bool isWhite = false;
int patternLength = counters.Length;
for (int i = rowOffset; i < width; i++)
{
bool pixel = row.get_Renamed(i);
if (pixel ^ isWhite)
{
counters[counterPosition]++;
}
else
{
if (counterPosition == patternLength - 1)
{
if (toNarrowWidePattern(counters) == ASTERISK_ENCODING)
{
// Look for whitespace before start pattern, >= 50% of width of start pattern
if (row.isRange(Math.Max(0, patternStart - (i - patternStart)/2), patternStart, false))
{
return new[] {patternStart, i};
}
}
patternStart += counters[0] + counters[1];
for (int y = 2; y < patternLength; y++)
{
counters[y - 2] = counters[y];
}
counters[patternLength - 2] = 0;
counters[patternLength - 1] = 0;
counterPosition--;
}
else
{
counterPosition++;
}
counters[counterPosition] = 1;
isWhite = !isWhite;
}
}
throw ReaderException.Instance;
}