Class BitMatrix

  • All Implemented Interfaces:
    Cloneable

    public final class BitMatrix
    extends Object
    implements Cloneable

    Represents a 2D matrix of bits. In function arguments below, and throughout the common module, x is the column position, and y is the row position. The ordering is always x, y. The origin is at the top-left.

    Internally the bits are represented in a 1-D array of 32-bit ints. However, each row begins with a new int. This is done intentionally so that we can copy out a row into a BitArray very efficiently.

    The ordering of bits is row-major. Within each int, the least significant bits are used first, meaning they represent lower x values. This is compatible with BitArray's implementation.

    Author:
    Sean Owen, dswitkin@google.com (Daniel Switkin)
    • Constructor Detail

      • BitMatrix

        public BitMatrix​(int dimension)
        Creates an empty square BitMatrix.
        Parameters:
        dimension - height and width
      • BitMatrix

        public BitMatrix​(int width,
                         int height)
        Creates an empty BitMatrix.
        Parameters:
        width - bit matrix width
        height - bit matrix height
    • Method Detail

      • parse

        public static BitMatrix parse​(boolean[][] image)
        Interprets a 2D array of booleans as a BitMatrix, where "true" means an "on" bit.
        Parameters:
        image - bits of the image, as a row-major 2D array. Elements are arrays representing rows
        Returns:
        BitMatrix representation of image
      • get

        public boolean get​(int x,
                           int y)

        Gets the requested bit, where true means black.

        Parameters:
        x - The horizontal component (i.e. which column)
        y - The vertical component (i.e. which row)
        Returns:
        value of given bit in matrix
      • set

        public void set​(int x,
                        int y)

        Sets the given bit to true.

        Parameters:
        x - The horizontal component (i.e. which column)
        y - The vertical component (i.e. which row)
      • unset

        public void unset​(int x,
                          int y)
      • flip

        public void flip​(int x,
                         int y)

        Flips the given bit.

        Parameters:
        x - The horizontal component (i.e. which column)
        y - The vertical component (i.e. which row)
      • xor

        public void xor​(BitMatrix mask)
        Exclusive-or (XOR): Flip the bit in this BitMatrix if the corresponding mask bit is set.
        Parameters:
        mask - XOR mask
      • clear

        public void clear()
        Clears all bits (sets to false).
      • setRegion

        public void setRegion​(int left,
                              int top,
                              int width,
                              int height)

        Sets a square region of the bit matrix to true.

        Parameters:
        left - The horizontal position to begin at (inclusive)
        top - The vertical position to begin at (inclusive)
        width - The width of the region
        height - The height of the region
      • getRow

        public BitArray getRow​(int y,
                               BitArray row)
        A fast method to retrieve one row of data from the matrix as a BitArray.
        Parameters:
        y - The row to retrieve
        row - An optional caller-allocated BitArray, will be allocated if null or too small
        Returns:
        The resulting BitArray - this reference should always be used even when passing your own row
      • setRow

        public void setRow​(int y,
                           BitArray row)
        Parameters:
        y - row to set
        row - BitArray to copy from
      • rotate180

        public void rotate180()
        Modifies this BitMatrix to represent the same but rotated 180 degrees
      • getEnclosingRectangle

        public int[] getEnclosingRectangle()
        This is useful in detecting the enclosing rectangle of a 'pure' barcode.
        Returns:
        left,top,width,height enclosing rectangle of all 1 bits, or null if it is all white
      • getTopLeftOnBit

        public int[] getTopLeftOnBit()
        This is useful in detecting a corner of a 'pure' barcode.
        Returns:
        x,y coordinate of top-left-most 1 bit, or null if it is all white
      • getBottomRightOnBit

        public int[] getBottomRightOnBit()
      • getWidth

        public int getWidth()
        Returns:
        The width of the matrix
      • getHeight

        public int getHeight()
        Returns:
        The height of the matrix
      • getRowSize

        public int getRowSize()
        Returns:
        The row size of the matrix
      • hashCode

        public int hashCode()
        Overrides:
        hashCode in class Object
      • toString

        public String toString()
        Overrides:
        toString in class Object
        Returns:
        string representation using "X" for set and " " for unset bits
      • toString

        public String toString​(String setString,
                               String unsetString)
        Parameters:
        setString - representation of a set bit
        unsetString - representation of an unset bit
        Returns:
        string representation of entire matrix utilizing given strings
      • toString

        @Deprecated
        public String toString​(String setString,
                               String unsetString,
                               String lineSeparator)
        Deprecated.
        call toString(String,String) only, which uses \n line separator always
        Parameters:
        setString - representation of a set bit
        unsetString - representation of an unset bit
        lineSeparator - newline character in string representation
        Returns:
        string representation of entire matrix utilizing given strings and line separator