/*
 * @file hv_mw_OsdDraw.h
 * @brief Header file of osd draw.
 *
 * @verbatim
 * ==============================================================================
 *                        ##### How to use #####
 * ==============================================================================
 * (+) Use Hv_Mw_OsdDrawInit() to init osd draw data.
 * (+) Use Hv_Mw_OsdDraw() to draw osd to hardware.
 * (+) Use Hv_Mw_OsdShow() to display osd.
 * (+) Use Hv_Mw_OsdAnimitionDraw() to draw osd animition.
 * (+) Use Hv_Mw_OsdSceneSetPositionRatio() to set a scene's position by ratio(0-100)
 * (+) Use Hv_Mw_OsdSceneSetPosition() to set a scene's position directly
 *
 * @endverbatim
 * @author HiView SoC Software Team
 * @version 1.0.0
 * @date 2022-09-01
 */

#ifndef _HV_MW_OSD_DRAW_H
#define _HV_MW_OSD_DRAW_H

#include "hv_comm_Event.h"
#include "hv_drv_OsdTypes.h"

typedef enum _OsdLogoState
{
    OSD_LOGO_WAITING_SHOW,
    OSD_LOGO_DRAWING,
    OSD_LOGO_SHOWING,
    OSD_LOGO_HIDEING,
    OSD_LOGO_DONE,
} OsdLogoState;

/**
 * @brief 返回是否有OSD正在显示
 * @return BOOL  HV_TRUE-是，HV_FALSE-否
 */
BOOL Hv_Mw_OsdCheckIsShowing(VOID);

/**
 * @brief 初始化OSD draw相关数据结构
 */
VOID Hv_Mw_OsdDrawInit(VOID);

#ifdef HV_SCALER_DEBUG_VERSION
/**
 * @brief 设置当前Logo状态
 * @param[in] enState Logo状态
 */
 VOID Hv_Mw_OsdSetLogoState(OsdLogoState enState);
#endif

/**
 * @brief 返回当前Logo状态
 * @return OsdLogoState  当前Logo状态
 */
OsdLogoState Hv_Mw_OsdGetLogoState(VOID);

/**
 * @brief 设置跳过LOGO
 */
VOID Hv_Mw_OsdSetLogoBypass(VOID);

/**
 * @brief 获取是否跳过LOGO
 * @return BOOL HV_TRUE-是，HV_FALSE-否
 */
BOOL Hv_Mw_OsdGetLogoBypass(VOID);

#if (HV_PROJECT_CONFIG_OSD_ANIMITION_SUPPORT == HV_CONFIG_ON)
/**
 * @brief 设置当前帧是否有改变
 * @param[in] bIsModify 是否改变
 */
VOID Hv_Mw_OsdDrawSetFrameModify(BOOL bIsModify);
#endif

/**
 * @brief 画OSD
 * @param[in] pstEvent OsdEvent事件
 * @return Status  返回值：成功-HV_SUCCESS，失败-HV_FAILURE， 继续-HV_CONTINUE
 */
Status Hv_Mw_OsdDraw(OsdEvent *pstEvent);

/**
 * @brief 显示OSD
 * @param[in] pstEvent OsdEvent事件
 * @return Status  返回值：成功-HV_SUCCESS，失败-HV_FAILURE， 继续-HV_CONTINUE
 */
Status Hv_Mw_OsdShow(OsdEvent *pstEvent);

/**
 * @brief 显示OSD完成
 * @param[in] pstEvent OsdEvent事件
 * @return Status  返回值：成功-HV_SUCCESS，失败-HV_FAILURE， 继续-HV_CONTINUE
 */
Status Hv_Mw_OsdShowDone(OsdEvent *pstEvent);

/**
 * @brief 获取一个font（字符型）组件的位置大小
 * @param[in] stCp Osd组件
 * @return OsdBox  组件的位置大小信息
 */
OsdBox Hv_Mw_OsdGetFontComponentBox(OsdComponent stCp);

#if (HV_PROJECT_CONFIG_OSD_CPU_CANVAS_SUPPORT == HV_CONFIG_ON)
VOID Hv_Mw_OsdCanvasWaveInit(OsdComponent stCp, USHORT16 usXStep, UCHAR8 ucPointW, UCHAR8 ucPointH);
VOID Hv_Mw_OsdCanvasWaveAppendPoint(USHORT16 usY);
#endif

/**
 * @brief 获取OSD显示区域大小
 * @param[in] pusWidth Osd宽度指针
 * @param[in] pusHeight Osd高度指针
 */
VOID Hv_Mw_OsdGetDisplaySize(USHORT16 *pusWidth, USHORT16 *pusHeight);

#if (HV_PROJECT_CONFIG_OSD_ROTATION == HV_CONFIG_ON)
/**
 * @brief 实现OSD原地旋转，计算并获取旋转时应当设置的位置
 * @param[in] pusX 传入当前X位置，获取原地旋转需要设置的X值
 * @param[in] pusY 传入当前Y位置，获取原地旋转需要设置的Y值
 * @param[in] enPrevRot 之前的旋转角度
 * @param[in] enNewRot 新的旋转角度
 */
VOID Hv_Mw_OsdCalculateRotateInplacePostion(USHORT16 *pusX, USHORT16 *pusY, OsdRotationType enPrevRot, OsdRotationType enNewRot);
#endif

/**
 * @brief 直接设置scene的绝对位置(包括scene旋转之后的位置)
 * @param[in] ucSceneId scene的id
 * @param[in] usX x方向位置
 * @param[in] usY y方向位置
 */
VOID Hv_Mw_OsdSceneSetAbsolutePosition(UCHAR8 ucSceneId, USHORT16 usX, USHORT16 usY);

/**
 * @brief 取消设置scene的绝对位置
 * @param[in] ucSceneId scene的id
 */
VOID Hv_Mw_OsdSceneCancelAbsolutePosition(UCHAR8 ucSceneId);

/**
 * @brief 设置一个scene的位置（按比例）
 * @param[in] ucSceneId scene的id
 * @param[in] bIsX 是否为x方向（否则为y方向）
 * @param[in] usRatio 位置比例，输入范围：0~100
 * @param[in] usLimitStart 限制最小起始位置，为0时不限制（使用实际屏幕大小）
 * @param[in] usLimitEnd 限制最大结束位置，为0xffff时不限制（使用实际屏幕大小）
 * @return USHORT16 实际设置值（pixel）
 */
USHORT16 Hv_Mw_OsdSceneSetPositionRatio(UCHAR8 ucSceneId, BOOL bIsX, USHORT16 usRatio, USHORT16 usLimitStart, USHORT16 usLimitEnd);

/**
 * @brief 设置一个scene的位置（实际值）
 * @param[in] ucSceneId scene的id
 * @param[in] usX x方向位置
 * @param[in] usY y方向位置
 */
VOID Hv_Mw_OsdSceneSetPosition(UCHAR8 ucSceneId, USHORT16 usX, USHORT16 usY);

/**
 * @brief 计算box在边框中的碰撞反射
 * @param[in] stBorder 边框结构
 * @param[in] pstBox box结构
 * @param[in] usDx x方向步长
 * @param[in] usDy y方向步长
 */
VOID Hv_Mw_OsdCalculateCollisionBox(OsdBox stBorder, OsdBox *pstBox, USHORT16 usDx, USHORT16 usDy);

/**
 * @brief 设置OSD显示透明度
 * @param[in] ucAlpha 透明度值(0~128)
 */
VOID Hv_Mw_OsdSetTransparency(UCHAR8 ucAlpha);

/**
 * @brief 获取中央区域的颜色平均值的反色
 * @return UINT32 RGB值
 */
UINT32 Hv_Mw_OsdGetPartColor(VOID);

/**
 * @brief 设置颜色抓取位置区域（用于动态准星）
 * @param[in] usXstart 起始X
 * @param[in] usXend 结束X
 * @param[in] usYstart 起始Y
 * @param[in] usYend 结束Y
 */
VOID Hv_Mw_OsdColorCaptureSetArea(USHORT16 usXstart, USHORT16 usXend, USHORT16 usYstart, USHORT16 usYend);

/**
 * @brief 根据组件初始化颜色抓取位置区域（用于动态准星）
 * @param[in] stCp 组件类型及索引
 */
VOID Hv_Mw_OsdColorCapturePositionInit(OsdComponent stCp);
VOID Hv_Mw_OsdColorCapturePositionInitWithGap(OsdComponent stCp, USHORT16 usGap);

/**
 * @brief 动态准星使能
 * @param[in] bEnable 使能
 */
VOID Hv_Mw_OsdDynCrosshairEnable(BOOL bEnable);

/**
 * @brief 获取动态准星区域的背景颜色均值
 * @return UINT32 背景颜色均值（RGB888）
 */
UINT32 Hv_Mw_OsdGetDynCrosshairBgAvgColor(VOID);

/**
 * @brief 计算动态准星的反色值
 * @return UINT32 准星色值（RGB888）
 */
UINT32 Hv_Mw_OsdCalculateRevertColor(VOID);

/**
 * @brief 设置OSD组件的颜色值
 * @param[in] stCp 组件类型及索引
 * @param[in] uiRGB RGB888颜色值
 */
VOID Hv_Mw_OsdSetComponentColor(OsdComponent stCp, UINT32 uiRGB);

/**
 * @brief 设置OSD旋转
 * @param[in] enRotate 旋转角度：0, 90, 180, 270
 */
VOID Hv_Mw_OsdSetRotateType(OsdRotationType enRotate);

/**
 * @brief 设置OSD不旋转的scene
 * @param[in] ucSceneId scene的id
 * @param[in] bSkip 是否不旋转，HV_TRUE-是，HV_FALSE-否
 */
VOID Hv_Mw_OsdSceneSetRotateSkip(UCHAR8 ucSceneId, BOOL bSkip);

/**
 * @brief 获取指定scene是否不旋转
 * @return BOOL 是否不旋转，HV_TRUE-是，HV_FALSE-否
 */
BOOL Hv_Mw_OsdSceneGetRotateSkip(UCHAR8 ucSceneId);

/**
 * @brief 设置Osd菜单语言
 * @param[in] usLangId 语言项的id
 */
VOID Hv_Mw_OsdSetLanguage(USHORT16 usLangId);

#ifdef HV_SCALER_DEBUG_VERSION
/**
 * @brief 输出OSD资源统计数据信息
 */
VOID Hv_Mw_OsdResourceDebugStat(VOID);

/**
 * @brief 输出Userdata统计数据信息
 */
VOID Hv_Mw_OsdUserdataDebugStat(VOID);

/**
 * @brief 清除OSD debug信息
 */
VOID Hv_Mw_OsdDbgDrawClear(VOID);
#endif

#endif
