⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 apiosdrender.c

📁 mstar 776 开发的车载dvd
💻 C
📖 第 1 页 / 共 5 页
字号:
///////////////////////////////////////////////////////////////////////////////////////////////////
// File name: apiOsdRender.c
// Copyright: MStar Semiconductor Inc.
// Description: OSD API Functions
///////////////////////////////////////////////////////////////////////////////////////////////////


//------------------------------------------------------------------------------
// Include Files
//------------------------------------------------------------------------------
#include <DataType.h>
#include "apiOsd.h"
//#include "apiOSDMathUtil.h"
#include "apiOSDUtil.h"
#include "apiOsdRender.h"
#include "MApp_Font.h"
#include "DrvGE.h"
#include "msAPI_OSD.h"

//------------------------------------------------------------------------------
// Defines
//------------------------------------------------------------------------------
#define SHADOW_OFFSET 4
#define ROUND_RADIUS  5
#define BUBBLE_HEIGHT 15
#define BUBBLE_SHIFT  4
extern BMPHANDLE  Osdcp_bmpHandle[];
extern MSAPI_GEBitmapFmt gbmpfmt;
extern OSDClrBtn clrBtn1;
extern FONT Font[];
//-------------------------------------------------------------------------------------------------
// Local Function Prototypes
//-------------------------------------------------------------------------------------------------
//static void _Mask_Rect(void *src, Pos *orig, int pitch, U8 corner, U32 colorKill, U32 colorShow, U8 op, GC_ColorFmt fmt);
//static void _MApi_Osd_SetAlphaBlending ( OSD_ALPHA_BLENDING *pAlpha_Blending);
//static BOOLEAN _osdDrawTriangle(OsdGC *pGC,
//                                                        OSD_COLOR_FMT eOSD_COLOR_FMT,
//                                                        TriangleStyle style,
//                                                        Rect *r,
//                                                        OSD_COLOR color,
//                                                        OSD_ALPHA_BLENDING *pAlpha_Blending);

BOOLEAN _msApi_Osd_DrawFillRect( OsdGC *pGC,
                                    Rect *r,
                                    OSD_COLOR_FMT eOSD_COLOR_FMT,
                                    OSD_COLOR fromColor,
                                    OSD_COLOR toColor,
                                    U8 u8Gradient,
                                    OSD_ALPHA_BLENDING *pAlpha_Blending);


static BOOLEAN _OSD_Render_BeginDraw (OsdGC *pGC);


//-------------------------------------------------------------------------------------------------
// Local Variables
//-------------------------------------------------------------------------------------------------
//static U8 maskNorthEast[ROUND_RADIUS][ROUND_RADIUS];
//static U8 maskNorthWest[ROUND_RADIUS][ROUND_RADIUS];
//static U8 maskSouthEast[ROUND_RADIUS][ROUND_RADIUS];
//static U8 maskSouthWest[ROUND_RADIUS][ROUND_RADIUS];
//static U8 maskNorthWestPos[ROUND_RADIUS];
static OsdGC *_pGC_current;
//static S32    _s32GC_RefCnt;
//static U16 _pWstringBuf[MaxTextOutLen+1];




//-------------------------------------------------------------------------------------------------
// _MApi_Osd_SetAlphaBlending: Set Alpha Blending for GE
// @param pAlpha_Blending \b IN: Alpha Blending input parameter
//-------------------------------------------------------------------------------------------------
static void _MApi_Osd_SetAlphaBlending ( OSD_ALPHA_BLENDING *pAlpha_Blending)
{
    MDrv_GE_SetAlpha(pAlpha_Blending->bEnable_Blend, pAlpha_Blending->eBLEND_COEF, pAlpha_Blending->eALPHA_SRC_FROM, pAlpha_Blending->u8Constant_Alpha);
}



//-------------------------------------------------------------------------------------------------
/// MApi_Osd_DrawLine : line draw on buffer
/// @param pGC              \b IN: the GC
/// @param start            \b IN: Start point of line
/// @param end              \b IN: End point of line
/// @param eOSD_COLOR_FMT   \b IN: input Color Format (I8 or ARGB8888)
/// @param fromColor        \b IN: Start of Gradient color (I8 or ARGB8888)
/// @param toColor          \b IN: End of Gradient color (I8 or ARGB8888)
/// @param bGradient        \b IN: TRUE/FALSE Enable Gradient/Disable Gradient
/// @param lt               \b IN: line type
/// @param pAlpha_Blending  \b IN: Alpha Blending input parameter
/// @return TRUE/FALSE : Sucess/Fail
//-------------------------------------------------------------------------------------------------
BOOLEAN MApi_Osd_DrawLine( OsdGC *pGC,
                        Pos *Start,
                        Pos *End,
                        OSD_COLOR_FMT eOSD_COLOR_FMT,
                        OSD_COLOR fromColor,
                        OSD_COLOR toColor,
                        BOOLEAN bGradient,
                        U8 Linewidth,
                        LineType lt,
                        OSD_ALPHA_BLENDING *pAlpha_Blending)
{
	OSDClrLine line;
	Pos start, end, tmp;

    start = *Start;
    end = *End;
    if (start.x > end.x)    // switch
    {
        tmp = start;
        start = end;
        end = tmp;
    }

	_OSD_Render_BeginDraw (pGC);

	_MApi_Osd_SetAlphaBlending (pAlpha_Blending);

	line.x1 = start.x;
	line.y1 = start.y;
	line.x2 = end.x;
	line.y2 = end.y;
	line.u32LineColor = fromColor;
	line.u8LineWidth = Linewidth;
	msAPI_OSD_DrawLine(&line);

	MApi_Osd_EndDraw (pGC);

    /*_OSD_Render_BeginDraw (pGC);

    if(lt == eSolidLine)
        MDrv_GE_PE_Set_Line_Pattern(false, 0, 0);
    else
        MDrv_GE_PE_Set_Line_Pattern(true, 0x33, 4);

    GE_DRAW_LINE_INFO lInfo = {0};

    _MApi_Osd_SetAlphaBlending (pAlpha_Blending);

    if (bGradient && (fromColor.u32AllColorValue != toColor.u32AllColorValue))
        MDrv_GE_PE_SetDither (TRUE);

    lInfo.x1       = start->x;
    lInfo.y1       = start->y;
    lInfo.x2       = end->x;
    lInfo.y2       = end->y;

    if (eOSD_COLOR_FMT == OSD_ARGB8888)
    {
        if (pGC ->fmt == FMT_I8)
        {
            PRINTE ("MApi_Osd_DrawLine: Input Color FMT is ARGB888 but Output Color FMT is I8 ");
            return FALSE;
        }

        lInfo.fmt = GE_FMT_ARGB8888;

        lInfo.colorRange.color_s.a = fromColor.a;
        lInfo.colorRange.color_s.r = fromColor.r;
        lInfo.colorRange.color_s.g = fromColor.g;
        lInfo.colorRange.color_s.b = fromColor.b;
        lInfo.width    = Linewidth;
        lInfo.flag     = bGradient;
        lInfo.colorRange.color_e.a  = toColor .a;
        lInfo.colorRange.color_e.r  = toColor .r;
        lInfo.colorRange.color_e.g  = toColor .g;
        lInfo.colorRange.color_e.b  = toColor .b;
    }

    else if (eOSD_COLOR_FMT == OSD_I8)
    {
        if (pGC ->fmt != FMT_I8)
        {
            PRINTE ("MApi_Osd_DrawLine: Input Color FMT is I8 but Output Color FMT isn't I8 ");
            return FALSE;
        }

        lInfo.fmt = GE_FMT_I8;
        lInfo.colorRange.color_s.a = 0;
        lInfo.colorRange.color_s.r = 0;
        lInfo.colorRange.color_s.g = 0;
        lInfo.colorRange.color_s.b = fromColor.ColorIndex;
        lInfo.width    = Linewidth;
        lInfo.flag     = GELINE_FLAG_COLOR_CONSTANT;
        lInfo.colorRange.color_e.a  = 0;
        lInfo.colorRange.color_e.r  = 0;
        lInfo.colorRange.color_e.g  = 0;
        lInfo.colorRange.color_e.b  = fromColor.ColorIndex;
    }
    else
    {
        PRINTE ("MApi_Osd_DrawLine: Unknow Input Color FMT");
        return FALSE;
    }

    MDrv_GE_PE_DrawLine(&lInfo);

    if(lt == eDashLine)
        MDrv_GE_PE_Set_Line_Pattern(false, 0, 0);

    MApi_Osd_EndDraw (pGC);*/

    return TRUE;
}





//-------------------------------------------------------------------------------------------------
/// MApi_Osd_DrawRectangleBorder : rectangle border drawing on buffer
/// @param pGC                  \b IN: the GC
/// @param  r                   \b IN: rectangle to draw
/// @param  eOSD_COLOR_FMT      \b IN: input Color Format (I8 or ARGB8888)
/// @param  colorLeftTop        \b IN: Border Left & Top color (I8 or ARGB8888)
/// @param  colorRightDown      \b IN: Border Right & Down color  (I8 or ARGB8888)
/// @param  thickness           \b IN: border thickness
/// @param  lt                  \b IN: line type
/// @param  pAlpha_Blending     \b IN: Alpha Blending input parameter
/// @return TRUE/FALSE : Sucess/Fail
//-------------------------------------------------------------------------------------------------
BOOLEAN MApi_Osd_DrawRectangleBorder(  OsdGC *pGC,
                                    Rect *r,
                                    OSD_COLOR_FMT eOSD_COLOR_FMT,
                                    OSD_COLOR colorLeftTop,
                                    OSD_COLOR colorRightDown,
                                    U8 thickness,
                                    LineType lt,
                                    OSD_ALPHA_BLENDING *pAlpha_Blending)
{
    Pos a, b;
    Rect R;
    U8 i;

    for(i=0; i<thickness; i++)
    {
        RECT(R, r->left+i, r->top+i, r->width-(i<<1), r->height-(i<<1));
        POS(a, R.left, R.top);
        POS(b, (R.left+R.width-1), R.top);
        MApi_Osd_DrawLine(pGC, &a, &b, eOSD_COLOR_FMT, colorLeftTop, colorLeftTop, FALSE, 1, lt, pAlpha_Blending);

		POS(a, (R.left+R.width-1), R.top);
        POS(b, (R.left+R.width-1), (R.top+R.height-1));
        MApi_Osd_DrawLine(pGC, &a, &b, eOSD_COLOR_FMT, colorRightDown, colorRightDown, FALSE, 1, lt, pAlpha_Blending);

		POS(a, R.left, R.top);
        POS(b, R.left, (R.top+R.height-1));
        MApi_Osd_DrawLine(pGC, &a, &b, eOSD_COLOR_FMT, colorRightDown, colorRightDown, FALSE, 1, lt, pAlpha_Blending);

		POS(a, R.left, (R.top+R.height-1));
        POS(b, (R.left+R.width-1), (R.top+R.height-1));
        MApi_Osd_DrawLine(pGC, &a, &b, eOSD_COLOR_FMT, colorLeftTop, colorLeftTop, FALSE, 1, lt, pAlpha_Blending);
    }

    return TRUE;
}

//-------------------------------------------------------------------------------------------------
/// MApi_Osd_DrawRectangleBorder : rectangle border drawing on buffer
/// @param pGC       \b IN: the GC
/// @param  r   \b IN: rectangle to draw
/// @param  eOSD_COLOR_FMT \b IN: input Color Format (I8 or ARGB8888)
/// @param  colorTopLeft \b IN: Border Top Left  color ( ARGB8888)
/// @param  colorTopRight \b IN: Border Top Right  color (ARGB8888)
/// @param  colorRightTop \b IN: Border Right Top  color ( ARGB8888)
/// @param  colorRightDown \b IN: Border Right Down color (ARGB8888)
/// @param  colorDownRight \b IN: Border Down Right  color ( ARGB8888)
/// @param  colorDownLeft \b IN: Border Down Left  color (ARGB8888)
/// @param  colorLeftDown \b IN: Border Left Down  color ( ARGB8888)
/// @param  colorLeftTop \b IN: Border Left Top color (ARGB8888)
/// @param  thickness      \b IN: border thickness
/// @param  lt                  \b IN: line type
/// @param  pAlpha_Blending  \b IN: Alpha Blending input parameter
/// @return TRUE/FALSE : Sucess/Fail
/// @Note if eOSD_COLOR_FMT == OSD_I8, colorTopRight, colorRightDown, colorDownLeft, colorLeftTop is unuseful.
//-------------------------------------------------------------------------------------------------
/*BOOLEAN MApi_Osd_DrawRectangleBorderEx(
                                    OsdGC *pGC,
                                    Rect  *r,
                                    OSD_COLOR_FMT eOSD_COLOR_FMT,
                                    OSD_COLOR colorTopLeft,
                                    OSD_COLOR  colorTopRight,
                                    OSD_COLOR  colorRightTop,
                                    OSD_COLOR colorRightDown,
                                    OSD_COLOR colorDownRight,
                                    OSD_COLOR colorDownLeft,
                                    OSD_COLOR  colorLeftDown,
                                    OSD_COLOR  colorLeftTop,
                                    U8  thickness,
                                    LineType lt,
                                    OSD_ALPHA_BLENDING *pAlpha_Blending)
{
    Pos  a, b;
    Rect R;
    U8   i;

    for(i=0; i<thickness; i++)
    {
        RECT(R, r->left+i, r->top+i, r->width-(i<<1), r->height-(i<<1));
        POS(a, R.left, R.top);
        POS(b, (R.left+R.width-1), R.top);
        MApi_Osd_DrawLine(pGC, &a, &b, eOSD_COLOR_FMT, colorTopLeft, colorTopRight, TRUE, 1, lt, pAlpha_Blending);
        POS(a, (R.left+R.width-1), (R.top+R.height-1));
        MApi_Osd_DrawLine(pGC, &b, &a, eOSD_COLOR_FMT, colorRightTop, colorRightDown, TRUE, 1, lt, pAlpha_Blending);
        POS(b, R.left, (R.top+R.height-1));
        MApi_Osd_DrawLine(pGC, &a, &b, eOSD_COLOR_FMT, colorDownRight, colorDownLeft, TRUE, 1, lt, pAlpha_Blending);
        POS(a, R.left, R.top);
        MApi_Osd_DrawLine(pGC, &b, &a, eOSD_COLOR_FMT, colorLeftDown, colorLeftTop, TRUE, 1, lt, pAlpha_Blending);
    }

    return TRUE;
}*/





//-------------------------------------------------------------------------------------------------
// MApi_Osd_DrawLine : line draw on buffer
// @param  pGC             \b IN: the GC
// @param  r               \b IN: Rectangle for draw
// @param  eOSD_COLOR_FMT  \b IN: input Color Format (I8 or ARGB8888)
// @param  fromColor       \b IN: Start of Gradient color (I8 or ARGB8888)
// @param  toColor         \b IN: End of Gradient color (I8 or ARGB8888)
// @param  u8Gradient      \b IN: Gradient Type for GE engine
//                                  GERECT_FLAG_COLOR_CONSTANT      0x0
//                                  GERECT_FLAG_COLOR_GRADIENT_X    0x1
//                                  GERECT_FLAG_COLOR_GRADIENT_Y    0x2
// @param  pAlpha_Blending \b IN: Alpha Blending input parameter
// @return TRUE/FALSE : Sucess/Fail
//-------------------------------------------------------------------------------------------------
#if 0
BOOLEAN _msApi_Osd_DrawFillRect( OsdGC *pGC,
                                    Rect *r,
                                    OSD_COLOR_FMT eOSD_COLOR_FMT,
                                    OSD_COLOR fromColor,
                                    OSD_COLOR toColor,
                                    U8 u8Gradient,
                                    OSD_ALPHA_BLENDING *pAlpha_Blending)
{
	OSDClrBtn Btn;

    _OSD_Render_BeginDraw (pGC);

    _MApi_Osd_SetAlphaBlending (pAlpha_Blending);

    Btn.x = r->left;
	Btn.y = r->top;
	Btn.width = r->width;
	Btn.height = r->height;
	Btn.b_clr = fromColor;
	Btn.g_clr = toColor;
	Btn.u8Gradient = u8Gradient;
	Btn.fHighLight = 0;
	Btn.bFrameWidth = 0;
	printf("\r\n[OSD_drawFillRect] x = %d, y = %d, width = %d, height = %d, b_clr = %x, g_clr=%x", Btn.x, Btn.y, Btn.width, Btn.height, Btn.b_clr, Btn.g_clr);
	msAPI_OSD_DrawBlock(&Btn);


#if 0
    /*if ((u8Gradient != GERECT_FLAG_COLOR_CONSTANT) &&
        (fromColor.u32AllColorValue != toColor.u32AllColorValue))
        MDrv_GE_PE_SetDither (TRUE);*/


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -