code: protected static void recordPattern(BitArray row,
                                        int start,
                                        int[] counters) throws NotFoundException {
      int numCounters = counters.length;
      Arrays.fill(counters, 0, numCounters, 0);
      int end = row.getSize();
      if (start >= end) {
        throw NotFoundException.getNotFoundInstance();
      }
      boolean isWhite = !row.get(start);
      int counterPosition = 0;
      int i = start;
      while (i < end) {
        if (row.get(i) != isWhite) {
          counters[counterPosition]++;
        } else {
          if (++counterPosition == numCounters) {
            break;
          } else {
            counters[counterPosition] = 1;
            isWhite = !isWhite;
          }
        }
        i++;
      }
      // If we read fully the last section of pixels and filled up our counters -- or filled
      // the last counter but ran off the side of the image, OK. Otherwise, a problem.
      if (!(counterPosition == numCounters || (counterPosition == numCounters - 1 && i == end))) {
        throw NotFoundException.getNotFoundInstance();
      }
    }
docs: Records the size of successive runs of white and black pixels in a row, starting at a given point.
  The values are recorded in the given array, and the number of runs recorded is equal to the size
  of the array. If the row starts on a white pixel at the given start point, then the first count
  recorded is the run of white pixels starting from that point; likewise it is the count of a run
  of black pixels if the row begin on a black pixels at that point.
  
  @param row row to count from
  @param start offset into row to start at
  @param counters array into which to record counts
  @throws NotFoundException if counters cannot be filled entirely from row before running out
  of pixels