Data Structures
=============================

.. ocv:class:: ocl::oclMat

OpenCV C++ 1-D or 2-D dense array class ::

    class CV_EXPORTS oclMat
    {
    public:
        //! default constructor
        oclMat();
        //! constructs oclMatrix of the specified size and type (_type is CV_8UC1, CV_64FC3, CV_32SC(12) etc.)
        oclMat(int rows, int cols, int type);
        oclMat(Size size, int type);
        //! constucts oclMatrix and fills it with the specified value _s.
        oclMat(int rows, int cols, int type, const Scalar &s);
        oclMat(Size size, int type, const Scalar &s);
        //! copy constructor
        oclMat(const oclMat &m);

        //! constructor for oclMatrix headers pointing to user-allocated data
        oclMat(int rows, int cols, int type, void *data, size_t step = Mat::AUTO_STEP);
        oclMat(Size size, int type, void *data, size_t step = Mat::AUTO_STEP);

        //! creates a matrix header for a part of the bigger matrix
        oclMat(const oclMat &m, const Range &rowRange, const Range &colRange);
        oclMat(const oclMat &m, const Rect &roi);

        //! builds oclMat from Mat. Perfom blocking upload to device.
        explicit oclMat (const Mat &m);

        //! destructor - calls release()
        ~oclMat();

        //! assignment operators
        oclMat &operator = (const oclMat &m);
        //! assignment operator. Perfom blocking upload to device.
        oclMat &operator = (const Mat &m);
        oclMat &operator = (const oclMatExpr& expr);

        //! pefroms blocking upload data to oclMat.
        void upload(const cv::Mat &m);


        //! downloads data from device to host memory. Blocking calls.
        operator Mat() const;
        void download(cv::Mat &m) const;

        //! convert to _InputArray
        operator _InputArray();

        //! convert to _OutputArray
        operator _OutputArray();

        //! returns a new oclMatrix header for the specified row
        oclMat row(int y) const;
        //! returns a new oclMatrix header for the specified column
        oclMat col(int x) const;
        //! ... for the specified row span
        oclMat rowRange(int startrow, int endrow) const;
        oclMat rowRange(const Range &r) const;
        //! ... for the specified column span
        oclMat colRange(int startcol, int endcol) const;
        oclMat colRange(const Range &r) const;

        //! returns deep copy of the oclMatrix, i.e. the data is copied
        oclMat clone() const;

        //! copies those oclMatrix elements to "m" that are marked with non-zero mask elements.
        // It calls m.create(this->size(), this->type()).
        // It supports any data type
        void copyTo( oclMat &m, const oclMat &mask = oclMat()) const;

        //! converts oclMatrix to another datatype with optional scalng. See cvConvertScale.
        void convertTo( oclMat &m, int rtype, double alpha = 1, double beta = 0 ) const;

        void assignTo( oclMat &m, int type = -1 ) const;

        //! sets every oclMatrix element to s
        oclMat& operator = (const Scalar &s);
        //! sets some of the oclMatrix elements to s, according to the mask
        oclMat& setTo(const Scalar &s, const oclMat &mask = oclMat());
        //! creates alternative oclMatrix header for the same data, with different
        // number of channels and/or different number of rows. see cvReshape.
        oclMat reshape(int cn, int rows = 0) const;

        //! allocates new oclMatrix data unless the oclMatrix already has specified size and type.
        // previous data is unreferenced if needed.
        void create(int rows, int cols, int type);
        void create(Size size, int type);

        //! allocates new oclMatrix with specified device memory type.
        void createEx(int rows, int cols, int type, DevMemRW rw_type, DevMemType mem_type);
        void createEx(Size size, int type, DevMemRW rw_type, DevMemType mem_type);

        //! decreases reference counter;
        // deallocate the data when reference counter reaches 0.
        void release();

        //! swaps with other smart pointer
        void swap(oclMat &mat);

        //! locates oclMatrix header within a parent oclMatrix. See below
        void locateROI( Size &wholeSize, Point &ofs ) const;
        //! moves/resizes the current oclMatrix ROI inside the parent oclMatrix.
        oclMat& adjustROI( int dtop, int dbottom, int dleft, int dright );
        //! extracts a rectangular sub-oclMatrix
        // (this is a generalized form of row, rowRange etc.)
        oclMat operator()( Range rowRange, Range colRange ) const;
        oclMat operator()( const Rect &roi ) const;

        oclMat& operator+=( const oclMat& m );
        oclMat& operator-=( const oclMat& m );
        oclMat& operator*=( const oclMat& m );
        oclMat& operator/=( const oclMat& m );

        //! returns true if the oclMatrix data is continuous
        // (i.e. when there are no gaps between successive rows).
        // similar to CV_IS_oclMat_CONT(cvoclMat->type)
        bool isContinuous() const;
        //! returns element size in bytes,
        // similar to CV_ELEM_SIZE(cvMat->type)
        size_t elemSize() const;
        //! returns the size of element channel in bytes.
        size_t elemSize1() const;
        //! returns element type, similar to CV_MAT_TYPE(cvMat->type)
        int type() const;
        //! returns element type, i.e. 8UC3 returns 8UC4 because in ocl
        //! 3 channels element actually use 4 channel space
        int ocltype() const;
        //! returns element type, similar to CV_MAT_DEPTH(cvMat->type)
        int depth() const;
        //! returns element type, similar to CV_MAT_CN(cvMat->type)
        int channels() const;
        //! returns element type, return 4 for 3 channels element,
        //!becuase 3 channels element actually use 4 channel space
        int oclchannels() const;
        //! returns step/elemSize1()
        size_t step1() const;
        //! returns oclMatrix size:
        // width == number of columns, height == number of rows
        Size size() const;
        //! returns true if oclMatrix data is NULL
        bool empty() const;

        //! matrix transposition
        oclMat t() const;

        /*! includes several bit-fields:
          - the magic signature
          - continuity flag
          - depth
          - number of channels
          */
        int flags;
        //! the number of rows and columns
        int rows, cols;
        //! a distance between successive rows in bytes; includes the gap if any
        size_t step;
        //! pointer to the data(OCL memory object)
        uchar *data;

        //! pointer to the reference counter;
        // when oclMatrix points to user-allocated data, the pointer is NULL
        int *refcount;

        //! helper fields used in locateROI and adjustROI
        //datastart and dataend are not used in current version
        uchar *datastart;
        uchar *dataend;

        //! OpenCL context associated with the oclMat object.
        Context *clCxt;
        //add offset for handle ROI, calculated in byte
        int offset;
        //add wholerows and wholecols for the whole matrix, datastart and dataend are no longer used
        int wholerows;
        int wholecols;
    };

Basically speaking, the ``oclMat`` is the mirror of ``Mat`` with the extension of OCL feature, the members have the same meaning and useage of ``Mat`` except following:

* ``datastart`` and ``dataend`` are replaced with ``wholerows`` and ``wholecols``

* Only basic flags are supported in ``oclMat`` (i.e. depth number of channels)

* All the 3-channel matrix (i.e. RGB image) are represented by 4-channel matrix in ``oclMat``. It means 3-channel image have 4-channel space with the last channel unused. We provide a transparent interface to handle the difference between OpenCV ``Mat`` and ``oclMat``.
    For example: If a ``oclMat`` has 3 channels, ``channels()`` returns 3 and ``oclchannels()`` returns 4