// Applies simple sharpening to the row data to improve performance of the 1D Readers.
        public override BitArray getBlackRow(int y, BitArray row)
        {
            LuminanceSource source = LuminanceSource;
            int width = source.Width;
            if (row == null || row.Size < width)
            {
                row = new BitArray(width);
            }
            else
            {
                row.clear();
            }

            initArrays(width);
            sbyte[] localLuminances = source.getRow(y, luminances);
            int[] localBuckets = buckets;
            for (int x = 0; x < width; x++)
            {
                int pixel = localLuminances[x] & 0xff;
                localBuckets[pixel >> LUMINANCE_SHIFT]++;
            }
            int blackPoint = estimateBlackPoint(localBuckets);

            int left = localLuminances[0] & 0xff;
            int center = localLuminances[1] & 0xff;
            for (int x = 1; x < width - 1; x++)
            {
                int right = localLuminances[x + 1] & 0xff;
                // A simple -1 4 -1 box filter with a weight of 2.
                int luminance = ((center << 2) - left - right) >> 1;
                if (luminance < blackPoint)
                {
                    row.set_Renamed(x);
                }
                left = center;
                center = right;
            }
            return row;
        }
 /// <summary> A fast method to retrieve one row of data from the matrix as a BitArray.
 /// 
 /// </summary>
 /// <param name="y">The row to retrieve
 /// </param>
 /// <param name="row">An optional caller-allocated BitArray, will be allocated if null or too small
 /// </param>
 /// <returns> The resulting BitArray - this reference should always be used even when passing
 /// your own row
 /// </returns>
 public BitArray getRow(int y, BitArray row)
 {
     if (row == null || row.Size < width)
     {
         row = new BitArray(width);
     }
     int offset = y * rowSize;
     for (int x = 0; x < rowSize; x++)
     {
         row.setBulk(x << 5, bits[offset + x]);
     }
     return row;
 }