/*
 * Copyright@ Samsung Electronics Co. LTD
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
*/

/*!
 * \file      ExynosRect.h
 * \brief     header file for ExynosRect
 * \author    Sangwoo, Park(sw5771.park@samsung.com)
 * \date      2011/06/02
 *
 * <b>Revision History: </b>
 * - 2010/06/03 : Sangwoo, Park(sw5771.park@samsung.com) \n
 *   Initial version
 *
 * - 2012/03/14 : sangwoo.park(sw5771.park@samsung.com) \n
 *   Change file, struct name to ExynosXXX.
 *
 */

#ifndef EXYNOS_RECT_H_
#define EXYNOS_RECT_H_

//! Rectangle information
/*!
 * \ingroup Exynos
 */
struct ExynosRect
{
    int x;           //!< x pos
    int y;           //!< y pos
    int w;           //!< width
    int h;           //!< height
    int fullW;       //!< full width of image
    int fullH;       //!< full height of image
    int colorFormat; //!< V4L2_PIX_FMT_XXX

#ifdef __cplusplus
    //! Constructor
    ExynosRect(int _x_ = 0,
            int _y_ = 0,
            int _w_ = 0,
            int _h_ = 0,
            int _fullW_ = 0,
            int _fullH_ = 0,
            int _colorFormat_ = 0)
    {
        x = _x_;
        y = _y_;
        w = _w_;
        h = _h_;
        fullW = _fullW_;
        fullH = _fullH_;
        colorFormat = _colorFormat_;
    }

    //! Constructor
    ExynosRect(const ExynosRect *other)
    {
        x           = other->x;
        y           = other->y;
        w           = other->w;
        h           = other->h;
        fullW       = other->fullW;
        fullH       = other->fullH;
        colorFormat = other->colorFormat;
    }

    //! Operator(=) override
    ExynosRect& operator =(const ExynosRect &other)
    {
        x           = other.x;
        y           = other.y;
        w           = other.w;
        h           = other.h;
        fullW       = other.fullW;
        fullH       = other.fullH;
        colorFormat = other.colorFormat;
        return *this;
    }

    //! Operator(==) override
    bool operator ==(const ExynosRect &other) const
    {
        return (   x           == other.x
                && y           == other.y
                && w           == other.w
                && h           == other.h
                && fullW       == other.fullW
                && fullH       == other.fullH
                && colorFormat == other.colorFormat);
    }

    //! Operator(!=) override
    bool operator !=(const ExynosRect &other) const
    {
        // use operator(==)
        return !(*this == other);
    }
#endif
};

//! Clip information
/*!
 * \ingroup Exynos
 */
struct ExynosRect2
{
    int x1; //!< Left   (The x-coordinate value of upper-left corner)
    int y1; //!< Top    (The y-coordinate value of upper-left corner)
    int x2; //!< Right  (The x-coordinate value of lower-right corner)
    int y2; //!< Bottom (The y-coordinate value of lower-right corner)

#ifdef __cplusplus
    //! Constructor
    ExynosRect2(int _x1_ = 0, int _y1_ = 0, int _x2_ = 0, int _y2_ = 0)
    {
        x1 = _x1_;
        y1 = _y1_;
        x2 = _x2_;
        y2 = _y2_;
    }

    //! Constructor
    ExynosRect2(const ExynosRect2 *other)
    {
        x1 = other->x1;
        y1 = other->y1;
        x2 = other->x2;
        y2 = other->y2;
    }

    //! Operator(=) override
    ExynosRect2& operator =(const ExynosRect2 &other)
    {
        x1 = other.x1;
        y1 = other.y1;
        x2 = other.x2;
        y2 = other.y2;
        return *this;
    }

    //! Operator(==) override
    bool operator ==(const ExynosRect2 &other) const
    {
        return (   x1 == other.x1
                && y1 == other.y1
                && x2 == other.x2
                && y2 == other.y2);
    }

    //! Operator(!=) override
    bool operator !=(const ExynosRect2 &other) const
    {
        // use operator(==)
        return !(*this == other);
    }
#endif
};

#endif //EXYNOS_RECT_H_
