private TestCaseData GenerateRandomTestCaseData(int version)
        {
			int matrixSize = VersionDetail.Width(version);
			ByteMatrix matrix = new ByteMatrix(matrixSize, matrixSize);
			EmbedAlignmentPattern(matrix, version);
			return new TestCaseData(version, matrix.ToBitMatrix()).SetName(string.Format(s_TestNameFormat, matrixSize, version));
		}
예제 #2
0
		private TestCaseData GenerateRandomTestCaseData(int version, int totalCodewords, Random randomizer)
        {
			int matrixSize = VersionDetail.Width(version);
			ByteMatrix matrix = new ByteMatrix(matrixSize, matrixSize);
			BitVector codewords = GenerateDataCodewords(totalCodewords, randomizer);
			EmbedAlignmentPattern(matrix, version, codewords);
			return new TestCaseData(version, matrix.ToBitMatrix(), codewords).SetName(string.Format(s_TestNameFormat, matrixSize, version));
		}
예제 #3
0
		// The mask penalty calculation is complicated.  See Table 21 of JISX0510:2004 (p.45) for details.
		// Basically it applies four rules and summate all penalties.
		private static int calculateMaskPenalty(ByteMatrix matrix)
		{
			int penalty = 0;
			penalty += MaskUtil.applyMaskPenaltyRule1(matrix);
			penalty += MaskUtil.applyMaskPenaltyRule2(matrix);
			penalty += MaskUtil.applyMaskPenaltyRule3(matrix);
			penalty += MaskUtil.applyMaskPenaltyRule4(matrix);
			return penalty;
		}
예제 #4
0
		// Build 2D matrix of QR Code from "dataBits" with "m_EcLevelInternal", "version" and "getMaskPattern". On
		// success, store the result in "matrix" and return true.
		internal static void  buildMatrix(BitVector dataBits, ErrorCorrectionLevelInternal m_EcLevelInternal, int version, int maskPattern, ByteMatrix matrix)
		{
			clearMatrix(matrix);
			embedBasicPatterns(version, matrix);
			// Type information appear with any version.
			embedTypeInfo(m_EcLevelInternal, maskPattern, matrix);
			// Version info appear if version >= 7.
			maybeEmbedVersionInfo(version, matrix);
			// Data should be embedded at end.
			embedDataBits(dataBits, maskPattern, matrix);
		}
예제 #5
0
 public static ByteMatrix ToByteMatrix(this BitMatrix bitMatrix)
 {
     ByteMatrix result = new ByteMatrix(bitMatrix.Width, bitMatrix.Width);
     for (int i = 0; i < bitMatrix.Width; i++)
     {
         for (int j = 0; j < bitMatrix.Width; j++)
         {
             result[i, j] = (sbyte)(bitMatrix[i, j] ? 1 : 0);
         }
     }
     return result;
 }
예제 #6
0
		public void PerformanceTest(int rules, ByteMatrix bMatrix, BitMatrix bitMatrix)
		{
			Stopwatch sw = new Stopwatch();
			int timesofTest = 1000;
			
			Penalty penalty = new PenaltyFactory().CreateByRule((PenaltyRules)rules);
			
			
			string[] timeElapsed = new string[2];
			
			sw.Start();
			
			for(int i = 0; i < timesofTest; i++)
			{
				penalty.PenaltyCalculate(bitMatrix);
			}
			
			sw.Stop();
			
			timeElapsed[0] = sw.ElapsedMilliseconds.ToString();
			
			sw.Reset();
			
			sw.Start();
			
			for(int i = 0; i < timesofTest; i++)
			{
				switch(rules)
				{
					case 1:
						MaskUtil.applyMaskPenaltyRule1(bMatrix);
						break;
					case 2:
						MaskUtil.applyMaskPenaltyRule2(bMatrix);
						break;
					case 3:
						MaskUtil.applyMaskPenaltyRule3(bMatrix);
						break;
					case 4:
						MaskUtil.applyMaskPenaltyRule4(bMatrix);
						break;
					default:
						throw new InvalidOperationException(string.Format("Unsupport Rules {0}", rules.ToString()));
				}
			}
			sw.Stop();
			
			timeElapsed[1] = sw.ElapsedMilliseconds.ToString();
			
			
			Assert.Pass("Terminator performance {0} Tests~ QrCode.Net: {1} ZXing: {2}", timesofTest, timeElapsed[0], timeElapsed[1]);
			
		}
예제 #7
0
		// Apply mask penalty rule 2 and return the penalty. Find 2x2 blocks with the same color and give
		// penalty to them.
		internal static int applyMaskPenaltyRule2(ByteMatrix matrix)
		{
			int penalty = 0;
		    for (int y = 0; y < matrix.Height - 1; ++y)
			{
				for (int x = 0; x < matrix.Width - 1; ++x)
				{
					int value_Renamed = matrix[x,y];
                    if (value_Renamed == matrix[x + 1, y] && value_Renamed == matrix[x, y + 1] && value_Renamed == matrix[x + 1, y + 1])
					{
						penalty += 3;
					}
				}
			}
			return penalty;
		}
예제 #8
0
		// Apply mask penalty rule 3 and return the penalty. Find consecutive cells of 00001011101 or
		// 10111010000, and give penalty to them.  If we find patterns like 000010111010000, we give
		// penalties twice (i.e. 40 * 2).
		internal static int applyMaskPenaltyRule3(ByteMatrix matrix)
		{
			int penalty = 0;
		    int width = matrix.Width;
			int height = matrix.Height;
			for (int y = 0; y < height; ++y)
			{
				for (int x = 0; x < width; ++x)
				{
					// Tried to simplify following conditions but failed.
					if (x + 6 < width && matrix[x,y] == 1 && matrix[x + 1,y] == 0 && matrix[x + 2,y] == 1 && matrix[x + 3,y] == 1 && matrix[x + 4,y] == 1 && matrix[x + 5,y] == 0 && matrix[x + 6,y] == 1 && ((x + 10 < width && matrix[x + 7,y] == 0 && matrix[x + 8,y] == 0 && matrix[x + 9,y] == 0 && matrix[x + 10,y] == 0) || (x - 4 >= 0 && matrix[x - 1,y] == 0 && matrix[x - 2,y] == 0 && matrix[x - 3,y] == 0 && matrix[x - 4,y] == 0)))
					{
						penalty += 40;
					}
					if (y + 6 < height && matrix[x,y] == 1 && matrix[x,y + 1] == 0 && matrix[x,y + 2] == 1 && matrix[x,y + 3] == 1 && matrix[x,y + 4] == 1 && matrix[x,y + 5] == 0 && matrix[x,y + 6] == 1 && ((y + 10 < height && matrix[x,y + 7] == 0 && matrix[x,y + 8] == 0 && matrix[x,y + 9] == 0 && matrix[x,y + 10] == 0) || (y - 4 >= 0 && matrix[x,y - 1] == 0 && matrix[x,y - 2] == 0 && matrix[x,y - 3] == 0 && matrix[x,y - 4] == 0)))
					{
						penalty += 40;
					}
				}
			}
			return penalty;
		}
        private static ByteMatrix FromGraphics(string[] lines)
        {
            var matrix = new ByteMatrix(lines.Length, lines.Length);
            for (int j = 0; j < matrix.Width; j++)
            {
                for (int i = 0; i < matrix.Width; i++)
                {
                    sbyte value = -1;
                    switch (lines[j][i])
                    {
                        case s_0Char:
                            value = 0;
                            break;
                        case s_1Char:
                            value = 1;
                            break;
                    }

                    matrix[i, j] = value;
                }
            }
            return matrix;
        }
예제 #10
0
		private void EmbedAlignmentPattern(ByteMatrix matrix, int version, BitVector codewords)
        {
            matrix.Clear(-1);
            MatrixUtil.embedBasicPatterns(version, matrix);
            MatrixUtil.embedDataBits(codewords, -1, matrix);
        }
예제 #11
0
		internal static int chooseMaskPattern(BitVector bits, ErrorCorrectionLevelInternal m_EcLevelInternal, int version, ByteMatrix matrix)
		{
			
			int minPenalty = System.Int32.MaxValue; // Lower penalty is better.
			int bestMaskPattern = - 1;
			// We try all mask patterns to choose the best one.
			for (int maskPattern = 0; maskPattern < QRCodeInternal.NUM_MASK_PATTERNS; maskPattern++)
			{
				MatrixUtil.buildMatrix(bits, m_EcLevelInternal, version, maskPattern, matrix);
				int penalty = calculateMaskPenalty(matrix);
				if (penalty < minPenalty)
				{
					minPenalty = penalty;
					bestMaskPattern = maskPattern;
				}
			}
			return bestMaskPattern;
		}
예제 #12
0
		// Apply mask penalty rule 4 and return the penalty. Calculate the ratio of dark cells and give
		// penalty if the ratio is far from 50%. It gives 10 penalty for 5% distance. Examples:
		// -   0% => 100
		// -  40% =>  20
		// -  45% =>  10
		// -  50% =>   0
		// -  55% =>  10
		// -  55% =>  20
		// - 100% => 100
		internal static int applyMaskPenaltyRule4(ByteMatrix matrix)
		{
			int numDarkCells = 0;
		    int width = matrix.Width;
			int height = matrix.Height;
			for (int y = 0; y < height; ++y)
			{
				for (int x = 0; x < width; ++x)
				{
					if (matrix[x,y] == 1)
					{
						numDarkCells += 1;
					}
				}
			}
			int numTotalCells = matrix.Height * matrix.Width;
			double darkRatio = (double) numDarkCells / numTotalCells;
			//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'"
			return System.Math.Abs((int) (darkRatio * 100 - 50)) / 5 * 10;
		}
예제 #13
0
		// Note that we cannot unify the function with embedPositionDetectionPattern() despite they are
		// almost identical, since we cannot write a function that takes 2D arrays in different sizes in
		// C/C++. We should live with the fact.
		private static void  embedPositionAdjustmentPattern(int xStart, int yStart, ByteMatrix matrix)
		{
			// We know the width and height.
			if (POSITION_ADJUSTMENT_PATTERN[0].Length != 5 || POSITION_ADJUSTMENT_PATTERN.Length != 5)
			{
				throw new WriterException("Bad position adjustment");
			}
			for (int y = 0; y < 5; ++y)
			{
				for (int x = 0; x < 5; ++x)
				{
					if (!isEmpty(matrix[yStart + y, xStart + x]))
					{
						throw new WriterException();
					}
				    matrix[yStart + y, xStart + x] = (sbyte)POSITION_ADJUSTMENT_PATTERN[y][x];
				}
			}
		}
예제 #14
0
		// Embed the lonely dark dot at left bottom corner. JISX0510:2004 (p.46)
		private static void  embedDarkDotAtLeftBottomCorner(ByteMatrix matrix)
		{
			if (matrix[matrix.Height - 8, 8] == 0)
			{
				throw new WriterException();
			}
		    matrix[matrix.Height - 8, 8] = (sbyte)1;
		}
예제 #15
0
		// Embed position adjustment patterns if need be.
		private static void  maybeEmbedPositionAdjustmentPatterns(int version, ByteMatrix matrix)
		{
			if (version < 2)
			{
				// The patterns appear if version >= 2
				return ;
			}
			int index = version - 1;
			int[] coordinates = POSITION_ADJUSTMENT_PATTERN_COORDINATE_TABLE[index];
			int numCoordinates = POSITION_ADJUSTMENT_PATTERN_COORDINATE_TABLE[index].Length;
			for (int i = 0; i < numCoordinates; ++i)
			{
				for (int j = 0; j < numCoordinates; ++j)
				{
					int y = coordinates[i];
					int x = coordinates[j];
					if (x == - 1 || y == - 1)
					{
						continue;
					}
					// If the cell is unset, we embed the position adjustment pattern here.
					if (isEmpty(matrix[y, x]))
					{
						// -2 is necessary since the x/y coordinates point to the center of the pattern, not the
						// left top corner.
						embedPositionAdjustmentPattern(x - 2, y - 2, matrix);
					}
				}
			}
		}
예제 #16
0
		// Helper function for applyMaskPenaltyRule1. We need this for doing this calculation in both
		// vertical and horizontal orders respectively.
		private static int applyMaskPenaltyRule1Internal(ByteMatrix matrix, bool isHorizontal)
		{
			int penalty = 0;
			int numSameBitCells = 0;
			int prevBit = - 1;
			// Horizontal mode:
			//   for (int i = 0; i < matrix.height(); ++i) {
			//     for (int j = 0; j < matrix.width(); ++j) {
			//       int bit = matrix.get(i, j);
			// Vertical mode:
			//   for (int i = 0; i < matrix.width(); ++i) {
			//     for (int j = 0; j < matrix.height(); ++j) {
			//       int bit = matrix.get(j, i);
			int iLimit = isHorizontal?matrix.Height:matrix.Width;
			int jLimit = isHorizontal?matrix.Width:matrix.Height;
		    for (int i = 0; i < iLimit; ++i)
			{
				for (int j = 0; j < jLimit; ++j)
				{
					int bit = isHorizontal?matrix[j,i]:matrix[i,j];
					if (bit == prevBit)
					{
						numSameBitCells += 1;
						// Found five repetitive cells with the same color (bit).
						// We'll give penalty of 3.
						if (numSameBitCells == 5)
						{
							penalty += 3;
						}
						else if (numSameBitCells > 5)
						{
							// After five repetitive cells, we'll add the penalty one
							// by one.
							penalty += 1;
						}
					}
					else
					{
						numSameBitCells = 1; // Include the cell itself.
						prevBit = bit;
					}
				}
				numSameBitCells = 0; // Clear at each row/column.
			}
			return penalty;
		}
예제 #17
0
		private static void  embedHorizontalSeparationPattern(int xStart, int yStart, ByteMatrix matrix)
		{
			// We know the width and height.
			if (HORIZONTAL_SEPARATION_PATTERN[0].Length != 8 || HORIZONTAL_SEPARATION_PATTERN.Length != 1)
			{
				throw new WriterException("Bad horizontal separation pattern");
			}
			for (int x = 0; x < 8; ++x)
			{
				if (!isEmpty(matrix[yStart, xStart + x]))
				{
					throw new WriterException();
				}
			    matrix[yStart, xStart + x] = (sbyte)HORIZONTAL_SEPARATION_PATTERN[0][x];
			}
		}
예제 #18
0
		public void Penalty4PTest(ByteMatrix bMatrix, BitMatrix bitMatrix)
		{
			PerformanceTest(4, bMatrix, bitMatrix);
		}
예제 #19
0
		private static void  embedTimingPatterns(ByteMatrix matrix)
		{
			// -8 is for skipping position detection patterns (size 7), and two horizontal/vertical
			// separation patterns (size 1). Thus, 8 = 7 + 1.
			for (int i = 8; i < matrix.Width - 8; ++i)
			{
				int bit = (i + 1) % 2;
				// Horizontal line.
				if (!isValidValue(matrix[6, i]))
				{
					throw new WriterException();
				}
				if (isEmpty(matrix[6, i]))
				{
				    matrix[6, i] = (sbyte)bit;
				}
			    // Vertical line.
				if (!isValidValue(matrix[i, 6]))
				{
					throw new WriterException();
				}
				if (isEmpty(matrix[i, 6]))
				{
				    matrix[i, 6] = (sbyte)bit;
				}
			}
		}
예제 #20
0
 private void FillRandom(ByteMatrix matrix, Random randomizer)
 {
     for (int i = 0; i < matrix.Width; i++)
     {
         for (int j = 0; j < matrix.Height; j++)
         {
             var randomValue = randomizer.Next(0, 2);
             matrix[i, j] = (sbyte)randomValue;
         }
     }
 }
예제 #21
0
		internal BitMatrix GetOriginal(int matrixSize, Random randomizer, out ByteMatrix matrix)
        {
            matrix = new ByteMatrix(matrixSize, matrixSize);

            FillRandom(matrix, randomizer);
            return matrix.ToBitMatrix();
        }
예제 #22
0
		// Embed basic patterns. On success, modify the matrix and return true.
		// The basic patterns are:
		// - Position detection patterns
		// - Timing patterns
		// - Dark dot at the left bottom corner
		// - Position adjustment patterns, if need be
		internal static void  embedBasicPatterns(int version, ByteMatrix matrix)
		{
			// Let's get started with embedding big squares at corners.
			embedPositionDetectionPatternsAndSeparators(matrix);
			// Then, embed the dark dot at the left bottom corner.
			embedDarkDotAtLeftBottomCorner(matrix);
			
			// Position adjustment patterns appear if version >= 2.
			maybeEmbedPositionAdjustmentPatterns(version, matrix);
			// Timing patterns should be embedded after position adj. patterns.
			embedTimingPatterns(matrix);
		}
예제 #23
0
		private static void  embedVerticalSeparationPattern(int xStart, int yStart, ByteMatrix matrix)
		{
			// We know the width and height.
			if (VERTICAL_SEPARATION_PATTERN[0].Length != 1 || VERTICAL_SEPARATION_PATTERN.Length != 7)
			{
				throw new WriterException("Bad vertical separation pattern");
			}
			for (int y = 0; y < 7; ++y)
			{
				if (!isEmpty(matrix[yStart + y, xStart]))
				{
					throw new WriterException();
				}
			    matrix[yStart + y, xStart] = (sbyte)VERTICAL_SEPARATION_PATTERN[y][0];
			}
		}
예제 #24
0
		// Apply mask penalty rule 1 and return the penalty. Find repetitive cells with the same color and
		// give penalty to them. Example: 00000 or 11111.
		internal static int applyMaskPenaltyRule1(ByteMatrix matrix)
		{
			return applyMaskPenaltyRule1Internal(matrix, true) + applyMaskPenaltyRule1Internal(matrix, false);
		}
예제 #25
0
		internal static void  encode(System.String content, ErrorCorrectionLevelInternal m_EcLevelInternal, System.Collections.Hashtable hints, QRCodeInternal qrCodeInternal)
		{
			
			System.String encoding = hints == null?null:(System.String) hints[EncodeHintType.CHARACTER_SET];
			if (encoding == null)
			{
				encoding = DEFAULT_BYTE_MODE_ENCODING;
			}
			
			// Step 1: Choose the mode (encoding).
			Mode mode = chooseMode(content, encoding);
			
			// Step 2: Append "bytes" into "dataBits" in appropriate encoding.
			BitVector dataBits = new BitVector();
			appendBytes(content, mode, dataBits, encoding);
			// Step 3: Initialize QR code that can contain "dataBits".
			int numInputBytes = dataBits.sizeInBytes();
			initQRCode(numInputBytes, m_EcLevelInternal, mode, qrCodeInternal);
			
			// Step 4: Build another bit vector that contains header and data.
			BitVector headerAndDataBits = new BitVector();
			
			// Step 4.5: Append ECI message if applicable
			if (mode == Mode.BYTE && !DEFAULT_BYTE_MODE_ENCODING.Equals(encoding))
			{
				CharacterSetECI eci = CharacterSetECI.getCharacterSetECIByName(encoding);
				if (eci != null)
				{
					appendECI(eci, headerAndDataBits);
				}
			}
			
			appendModeInfo(mode, headerAndDataBits);
			
			int numLetters = mode.Equals(Mode.BYTE)?dataBits.sizeInBytes():content.Length;
			appendLengthInfo(numLetters, qrCodeInternal.Version, mode, headerAndDataBits);
			headerAndDataBits.appendBitVector(dataBits);
			
			// Step 5: Terminate the bits properly.
			terminateBits(qrCodeInternal.NumDataBytes, headerAndDataBits);
			
			// Step 6: Interleave data bits with error correction code.
			BitVector finalBits = new BitVector();
			interleaveWithECBytes(headerAndDataBits, qrCodeInternal.NumTotalBytes, qrCodeInternal.NumDataBytes, qrCodeInternal.NumRSBlocks, finalBits);
			
			// Step 7: Choose the mask pattern and set to "QRCodeInternal".
			ByteMatrix matrix = new ByteMatrix(qrCodeInternal.MatrixWidth, qrCodeInternal.MatrixWidth);
			qrCodeInternal.MaskPattern = chooseMaskPattern(finalBits, qrCodeInternal.EcLevelInternal, qrCodeInternal.Version, matrix);
			
			// Step 8.  Build the matrix and set it to "QRCodeInternal".
			MatrixUtil.buildMatrix(finalBits, qrCodeInternal.EcLevelInternal, qrCodeInternal.Version, qrCodeInternal.MaskPattern, matrix);
			qrCodeInternal.Matrix = matrix;
			// Step 9.  Make sure we have a valid QR Code.
			if (!qrCodeInternal.Valid)
			{
				throw new WriterException("Invalid QR code: " + qrCodeInternal.ToString());
			}
		}
예제 #26
0
		// Embed position detection patterns and surrounding vertical/horizontal separators.
		private static void  embedPositionDetectionPatternsAndSeparators(ByteMatrix matrix)
		{
			// Embed three big squares at corners.
			int pdpWidth = POSITION_DETECTION_PATTERN[0].Length;
			// Left top corner.
			embedPositionDetectionPattern(0, 0, matrix);
			// Right top corner.
			embedPositionDetectionPattern(matrix.Width - pdpWidth, 0, matrix);
			// Left bottom corner.
			embedPositionDetectionPattern(0, matrix.Width - pdpWidth, matrix);
			
			// Embed horizontal separation patterns around the squares.
			int hspWidth = HORIZONTAL_SEPARATION_PATTERN[0].Length;
			// Left top corner.
			embedHorizontalSeparationPattern(0, hspWidth - 1, matrix);
			// Right top corner.
			embedHorizontalSeparationPattern(matrix.Width - hspWidth, hspWidth - 1, matrix);
			// Left bottom corner.
			embedHorizontalSeparationPattern(0, matrix.Width - hspWidth, matrix);
			
			// Embed vertical separation patterns around the squares.
			int vspSize = VERTICAL_SEPARATION_PATTERN.Length;
			// Left top corner.
			embedVerticalSeparationPattern(vspSize, 0, matrix);
			// Right top corner.
			embedVerticalSeparationPattern(matrix.Height - vspSize - 1, 0, matrix);
			// Left bottom corner.
			embedVerticalSeparationPattern(vspSize, matrix.Height - vspSize, matrix);
		}
		private void EmbedAlignmentPattern(ByteMatrix matrix, int version)
        {
            matrix.Clear(-1);
            MatrixUtil.embedBasicPatterns(version, matrix);
            MatrixUtil.maybeEmbedVersionInfo(version, matrix);
        }
예제 #28
0
		private static void  embedPositionDetectionPattern(int xStart, int yStart, ByteMatrix matrix)
		{
			// We know the width and height.
			if (POSITION_DETECTION_PATTERN[0].Length != 7 || POSITION_DETECTION_PATTERN.Length != 7)
			{
				throw new WriterException("Bad position detection pattern");
			}
			for (int y = 0; y < 7; ++y)
			{
				for (int x = 0; x < 7; ++x)
				{
					if (!isEmpty(matrix[yStart + y, xStart + x]))
					{
						throw new WriterException();
					}
				    matrix[yStart + y, xStart + x] = (sbyte)POSITION_DETECTION_PATTERN[y][x];
				}
			}
		}
예제 #29
0
	    internal static int TryEmbedDataBits(ByteMatrix matrix, BitVector dataBits, int maskPattern)
	    {
	        int bitIndex = 0;
	        int direction = - 1;
	        // Start from the right bottom cell.
	        int x = matrix.Width - 1;
	        int y = matrix.Height - 1;
	        while (x > 0)
	        {
	            // Skip the vertical timing pattern.
	            if (x == 6)
	            {
	                x -= 1;
	            }
	            while (y >= 0 && y < matrix.Height)
	            {
	                for (int i = 0; i < 2; ++i)
	                {
	                    int xx = x - i;
	                    // Skip the cell if it's not empty.
	                    if (!isEmpty(matrix[y, xx]))
	                    {
	                        continue;
	                    }
	                    int bit;
	                    if (bitIndex < dataBits.size())
	                    {
	                        bit = dataBits.at(bitIndex);
	                        ++bitIndex;
	                    }
	                    else
	                    {
	                        // Padding bit. If there is no bit left, we'll fill the left cells with 0, as described
	                        // in 8.4.9 of JISX0510:2004 (p. 24).
	                        bit = 0;
	                    }
						
	                    // Skip masking if mask_pattern is -1.
	                    if (maskPattern != - 1)
	                    {
	                        if (MaskUtil.getDataMaskBit(maskPattern, xx, y))
	                        {
	                            bit ^= 0x1;
	                        }
	                    }
	                    matrix[y, xx] = (sbyte)bit;
	                }
	                y += direction;
	            }
	            direction = - direction; // Reverse the direction.
	            y += direction;
	            x -= 2; // Move to the left.
	        }
	        return bitIndex;
	    }
예제 #30
0
		// Set all cells to -1.  -1 means that the cell is empty (not set yet).
		//
		// JAVAPORT: We shouldn't need to do this at all. The code should be rewritten to begin encoding
		// with the ByteMatrix initialized all to zero.
		internal static void  clearMatrix(ByteMatrix matrix)
		{
			matrix.Clear(- 1);
		}