📄 apiosdrender.c
字号:
///////////////////////////////////////////////////////////////////////////////////////////////////
// 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 + -