public override BitMatrix sampleGrid(BitMatrix image, int dimension, PerspectiveTransform transform) { var bits = new BitMatrix(dimension); var points = new float[dimension << 1]; for (int y = 0; y < dimension; y++) { int max = points.Length; float iValue = y + 0.5f; for (int x = 0; x < max; x += 2) { points[x] = (x >> 1) + 0.5f; points[x + 1] = iValue; } transform.transformPoints(points); // Quick check to see if points transformed to something inside the image; // sufficient to check the endpoints checkAndNudgePoints(image, points); try { for (int x = 0; x < max; x += 2) { if (image.get_Renamed((int) points[x], (int) points[x + 1])) { // Black(-ish) pixel bits.set_Renamed(x >> 1, y); } } } catch (IndexOutOfRangeException) { // This feels wrong, but, sometimes if the finder patterns are misidentified, the resulting // transform gets "twisted" such that it maps a straight line of points to a set of points // whose endpoints are in bounds, but others are not. There is probably some mathematical // way to detect this about the transformation that I don't know yet. // This results in an ugly runtime exception despite our clever checks above -- can't have // that. We could check each point's coordinates but that feels duplicative. We settle for // catching and wrapping ArrayIndexOutOfBoundsException. throw ReaderException.Instance; } } return bits; }