- int minDimension = width < height ? width : height;\r
- int startX = (width - minDimension) >> 1;\r
- int startY = (height - minDimension) >> 1;\r
- for (int n = 0; n < minDimension; n++) {\r
- int luminance = source.getLuminance(startX + n, startY + n);\r
- histogram[luminance >> LUMINANCE_SHIFT]++;\r
+ // We used to sample a diagonal in the 2D case, but it missed a lot of pixels, and it required\r
+ // n calls to getLuminance(). We had a net improvement of 63 blackbox tests decoded by\r
+ // sampling several rows from the middle of the image, using getLuminanceRow(). We read more\r
+ // pixels total, but with fewer function calls, and more continguous memory.\r
+ for (int y = 1; y < 5; y++) {\r
+ int row = height * y / 5;\r
+ int[] localLuminances = source.getLuminanceRow(row, luminances);\r
+ int right = width * 4 / 5;\r
+ for (int x = width / 5; x < right; x++) {\r
+ histogram[localLuminances[x] >> LUMINANCE_SHIFT]++;\r
+ }\r