/**
 * @file hv_drv_OsdWindow.h
 * @brief Osd driver layer window drawing interface.
 * @verbatim
 * ==============================================================================
 *                        ##### How to use this driver #####
 * ==============================================================================
 * (+) Use Hv_Drv_OsdWindow_(Draw/Update/Erase)Rect(...) to handle rect.
 * (+) Use Hv_Drv_OsdWindow_(Draw/Update/Erase)RectGrid(...) to handle rectgrid.
 * (+) Use Hv_Drv_OsdWindow_(Draw/Update/Erase)Line(...) to handle line.
 * (+) Use Hv_Drv_OsdWindow_(Draw/Update/Erase)LineGrid(...) to handle linegrid.
 * (+) Use Hv_Drv_OsdWindow_(Draw/Update/Erase)Window(...) to handle window.
 * @endverbatim
 *
 * @author HiView SoC Software Team
 * @version 0.0.1
 * @date 2022-08-22
 */

#ifndef __HV_DRV_OSDWINDOW_H
#define __HV_DRV_OSDWINDOW_H

#include "hv_comm_DataType.h"
#include "hv_mw_OsdComm.h"
#include "hv_drv_OsdTypes.h"

/**
 * @brief convert pixel format
 * @param[in] enSrcFormat source pixel format
 * @param[in] enDstFormat destination pixel format
 * @param[in] uiColor color value
 * @return color value of required format
 */
UINT32 Hv_Drv_OsdWindow_PixelFormatConvert(OsdPixelFormat enSrcFormat, OsdPixelFormat enDstFormat, UINT32 uiColor);


/**
 * @brief draw rect
 * @param[in] pstRect rect structure
 * @param[in] pstRectStyle rect style
 * @return VOID without return
 */
VOID Hv_Drv_OsdWindow_DrawRect(OsdRect *pstRect, const OsdRectStyle *pstRectStyle);

/**
 * @brief update rect
 * @param[in] pstRect rect structure
 * @param[in] pstRectStyle rect style
 * @return VOID without return
 */
VOID Hv_Drv_OsdWindow_UpdateRect(OsdRect *pstRect, const OsdRectStyle *pstRectStyle);

/**
 * @brief hide rect
 * @param[in] pstRect rect structure
 * @return VOID without return
 */
VOID Hv_Drv_OsdWindow_EraseRect(OsdRect *pstRect);

/**
 * @brief draw rectgrid
 * @param[in] pstGrid rectgrid structure
 * @param[in] pstNonHlRectStyle non-highlight rect style
 * @param[in] pstRectHighlight highlight options
 * @param[in] pstHlRectStyle highlight rect style
 * @return VOID without return
 */
VOID Hv_Drv_OsdWindow_DrawRectGrid(OsdRectGrid* pstGrid,
                                               const OsdRectStyle *pstNonHlRectStyle,
                                               const OsdRectHighlight *pstRectHighlight,
                                               const OsdRectStyle *pstHlRectStyle);
/**
 * @brief update rectgrid
 * @param[in] pstGrid rectgrid structure
 * @param[in] pstNonHlRectStyle non-highlight rect style
 * @param[in] pstRectHighlight highlight options
 * @param[in] pstHlRectStyle highlight rect style
 * @return VOID without return
 */
VOID Hv_Drv_OsdWindow_UpdateRectGrid(OsdRectGrid* pstGrid,
                                               const OsdRectStyle *pstNonHlRectStyle,
                                               const OsdRectHighlight *pstRectHighlight,
                                               const OsdRectStyle *pstHlRectStyle);
/**
 * @brief hide rectgrid
 * @param[in] pstGrid rectgrid structure
 * @return VOID without return
 */
VOID Hv_Drv_OsdWindow_EraseRectGrid(OsdRectGrid* pstGrid);

/**
 * @brief draw linegrid
 * @param[in] pstLineGrid linegrid structure
 * @param[in] pstLineHighlight highlight options
 * @return VOID without return
 */
VOID Hv_Drv_OsdWindow_DrawLineGrid(OsdLineGrid* pstLineGrid, const OsdLineHighlight *pstLineHighlight);

/**
 * @brief update linegrid
 * @param[in] pstLineGrid linegrid structure
 * @param[in] pstLineHighlight highlight options
 * @return VOID without return
 */
VOID Hv_Drv_OsdWindow_UpdateLineGrid(OsdLineGrid* pstLineGrid, const OsdLineHighlight *pstLineHighlight);

/**
 * @brief hide line grid
 * @param[in] pstLineGrid linegrid structure
 * @return VOID without return
 */
VOID Hv_Drv_OsdWindow_EraseLineGrid(OsdLineGrid* pstLineGrid);

/**
 * @brief draw line
 * @param[in] pstLine line structure
 * @return VOID without return
 */
VOID Hv_Drv_OsdWindow_DrawLine(OsdLine* pstLine);

/**
 * @brief update line
 * @param[in] pstLine line structure
 * @return VOID without return
 */
VOID Hv_Drv_OsdWindow_UpdateLine(OsdLine* pstLine);

/**
 * @brief hide line
 * @param[in] pstLine line structure
 * @return VOID without return
 */
VOID Hv_Drv_OsdWindow_EraseLine(OsdLine* pstLine);

/**
 * @brief get current window index
 * @param[in] None
 * @return current window index
 */
OsdWindowPhyId Hv_Drv_OsdWindow_GetCurrentWindow(VOID);

/**
 * @brief set current window index
 * @param[in] enIndex window index
 * @return VOID without return
 */
VOID Hv_Drv_OsdWindow_SetCurrentWindow(OsdWindowPhyId enIndex);

/**
 * @brief set all window font en
 * @param[in] bEnable enable
 */
VOID Hv_Drv_OsdWindow_SetAllFontEnable(BOOL bEnable);

/**
 * @brief disable rect/grid/line/font of all windows
 * @param[in] None
 * @return VOID without return
 */
VOID Hv_Drv_OsdWindow_DisableAll(VOID);

/**
 * @brief draw window
 * @param[in] pstWindowProp window property structure
 * @return VOID without return
 */
VOID Hv_Drv_OsdWindow_DrawWindow(OsdWindowProp *pstWindowProp);

/**
 * @brief update window property
 * @param[in] pstWindowProp window property structure
 * @return VOID without return
 */
VOID Hv_Drv_OsdWindow_UpdateWindow(OsdWindowProp *pstWindowProp);

/**
 * @brief hide window
 * @param[in] pstWindowProp window property structure
 * @return VOID without return
 */
VOID Hv_Drv_OsdWindow_EraseWindow(OsdWindowProp *pstWindowProp);

#endif
