// Applies a single threshold to an 8x8 block of pixels.
 private static void  threshold8x8Block(sbyte[] luminances, int xoffset, int yoffset, int threshold, int stride, BitMatrix matrix)
 {
     for (int y = 0; y < 8; y++)
     {
         int offset = (yoffset + y) * stride + xoffset;
         for (int x = 0; x < 8; x++)
         {
             int pixel = luminances[offset + x] & 0xff;
             if (pixel < threshold)
             {
                 matrix.set_Renamed(xoffset + x, yoffset + y);
             }
         }
     }
 }
        public override BitMatrix sampleGrid(BitMatrix image, int dimension, PerspectiveTransform transform)
        {
            BitMatrix bits = new BitMatrix(dimension);

            float[] points = new float[dimension << 1];
            for (int y = 0; y < dimension; y++)
            {
                int max = points.Length;
                //UPGRADE_WARNING: Data types in Visual C# might be different.  Verify the accuracy of narrowing conversions. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1042'"
                float iValue = (float)y + 0.5f;
                for (int x = 0; x < max; x += 2)
                {
                    //UPGRADE_WARNING: Data types in Visual C# might be different.  Verify the accuracy of narrowing conversions. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1042'"
                    points[x]     = (float)(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)
                    {
                        //UPGRADE_WARNING: Data types in Visual C# might be different.  Verify the accuracy of narrowing conversions. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1042'"
                        if (image.get_Renamed((int)points[x], (int)points[x + 1]))
                        {
                            // Black(-ish) pixel
                            bits.set_Renamed(x >> 1, y);
                        }
                    }
                }
                catch (System.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);
        }
		public override BitMatrix sampleGrid(BitMatrix image, int dimension, PerspectiveTransform transform)
		{
			BitMatrix bits = new BitMatrix(dimension);
			float[] points = new float[dimension << 1];
			for (int y = 0; y < dimension; y++)
			{
				int max = points.Length;
				//UPGRADE_WARNING: Data types in Visual C# might be different.  Verify the accuracy of narrowing conversions. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1042'"
				float iValue = (float) y + 0.5f;
				for (int x = 0; x < max; x += 2)
				{
					//UPGRADE_WARNING: Data types in Visual C# might be different.  Verify the accuracy of narrowing conversions. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1042'"
					points[x] = (float) (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)
					{
						//UPGRADE_WARNING: Data types in Visual C# might be different.  Verify the accuracy of narrowing conversions. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1042'"
						if (image.get_Renamed((int) points[x], (int) points[x + 1]))
						{
							// Black(-ish) pixel
							bits.set_Renamed(x >> 1, y);
						}
					}
				}
				catch (System.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;
		}
		// Applies a single threshold to an 8x8 block of pixels.
		private static void  threshold8x8Block(sbyte[] luminances, int xoffset, int yoffset, int threshold, int stride, BitMatrix matrix)
		{
			for (int y = 0; y < 8; y++)
			{
				int offset = (yoffset + y) * stride + xoffset;
				for (int x = 0; x < 8; x++)
				{
					int pixel = luminances[offset + x] & 0xff;
					if (pixel < threshold)
					{
						matrix.set_Renamed(xoffset + x, yoffset + y);
					}
				}
			}
		}