📄 msapi_osd.c
字号:
u8LastSpaceIndex = 0;//Reset variable
u16LastSpace_Width = 0; //Reset variable
if(pclrBtn->Fontfmt.flag & GEFONT_FLAG_VARWIDTH)
{
if(pclrBtn->bStringIndexWidth == CHAR_IDX_1BYTE)
{
while(width<max_width && cut_strlen<total_strlen)
{
MDrv_GE_GetBBox_X(font_handle, pu8Str[cut_strlen++], &BBox_X_Info);
width += (BBox_X_Info.u8Width*scale + gap);
if ((pu8Str[(cut_strlen-1)]==0x20)||((pu8Str[(cut_strlen-1)]>=0x80)&&(pu8Str[(cut_strlen-1)]<=0x9F)) )//if Space Char or Control code
{
u8LastSpaceIndex = cut_strlen;//Set the LastSpaceIndex to current string index.
u16LastSpace_Width = width; //Set the LastSpace_Width to current string width.
bGetLastSpaceinSingleLine = TRUE;
if ( pu8Str[(cut_strlen-1)]==0x8A )
{
pu8Str[(cut_strlen-1)]=0x20;
break;
}
else
{
pu8Str[(cut_strlen-1)]=0x20;
}
}
}
}
else //(pclrBtn->bStringIndexWidth == CHAR_IDX_2BYTE)
{
pu16Str = (U16*)pu8Str;
while(width<max_width && cut_strlen<total_strlen)
{
MDrv_GE_GetBBox_X(font_handle, pu16Str[cut_strlen++], &BBox_X_Info);
width += (BBox_X_Info.u8Width*scale + gap);
if ((pu16Str[(cut_strlen-1)]==0x20)||((pu16Str[(cut_strlen-1)]>=0x80)&&(pu16Str[(cut_strlen-1)]<=0x9F)) )//if Space Char or Control code
{
u8LastSpaceIndex = cut_strlen;//Set the LastSpaceIndex to current string index.
u16LastSpace_Width = width; //Set the LastSpace_Width to current string width.
bGetLastSpaceinSingleLine = TRUE;
if ( pu16Str[(cut_strlen-1)]==0x8A )
{
pu16Str[(cut_strlen-1)]=0x20;
break;
}
else
{
pu16Str[(cut_strlen-1)]=0x20;
}
}
}
}
}
else
{
while(width<max_width && cut_strlen<total_strlen)
{
cut_strlen++;
width += (finfo.width + gap);
if ((pu8Str[(cut_strlen-1)]==0x20)||((pu8Str[(cut_strlen-1)]>=0x80)&&(pu8Str[(cut_strlen-1)]<=0x9F)) )//if Space Char or Control code
{
u8LastSpaceIndex = cut_strlen;//Set the LastSpaceIndex to current string index.
u16LastSpace_Width = width; //Set the LastSpace_Width to current string width.
bGetLastSpaceinSingleLine = TRUE;
if ( pu8Str[(cut_strlen-1)]==0x8A )
{
pu8Str[(cut_strlen-1)]=0x20;
break;
}
else
{
pu8Str[(cut_strlen-1)]=0x20;
}
}
}
}
if(width > max_width)
{
cut_strlen--;
}
//Set new cut string length to last Space index
if (bGetLastSpaceinSingleLine&&u8LastSpaceIndex&&(total_strlen > cut_strlen))
{
#if (Very_Long_Word_Case==1)
if ( u16LastSpace_Width>((U16)(max_width/2)) )
#endif
{
cut_strlen = u8LastSpaceIndex;
}
}
//Set new cut string length to last Space index
APIOSD_DBG(printf("DrawSmartText>> cut_strlen = %bu\n", cut_strlen));
if(cut_strlen == 0)
{
break;
}
else
{
width = (cut_strlen+1) * offset_len;
pStr = msAPI_Memory_Allocate(width);
if(pStr)
{
memcpy(pStr, pu8Str, width);
if(pclrBtn->bStringIndexWidth == CHAR_IDX_1BYTE)
{
pStr[cut_strlen] = 0;
}
else
{
//pu16Str[cut_strlen] = 0;
((U16*)pStr)[cut_strlen]=0;
}
msAPI_OSD_DrawText(font_handle, pStr, pclrBtn);
MSAPI_MEMORY_FREE(pStr);
}
total_strlen -= cut_strlen;
pu8Str += (cut_strlen*offset_len);
}
pclrBtn->y += pclrBtn->height;
}
pclrBtn->y = buf_y;
}
#endif //#if USE_EPG
#endif // #if (!BOOTLOADER_SYSTEM)
/******************************************************************************/
/// API for draw frame::
/// @param pclrBtn \b IN color
/******************************************************************************/
void msAPI_OSD_DrawFrame(OSDClrBtn *pclrBtn)
{
GEClrBlock clrBlock;
GELineFmt lineFmt;
/* check range */
/*
if(pclrBtn->bFrameWidth==0)
{
return;
}
else if((pclrBtn->x + pclrBtn->width) > NEWUI_MAIN_MENU_GWIN_WIDTH)
{
return;
}
else if((pclrBtn->y + pclrBtn->height) > NEWUI_MAIN_MENU_GWIN_HEIGHT)
{
return;
}
*/
#if GE_DRIVER_TEST
GELineRect.LineRectCoordinate.direction = 0x00;
GELineRect.Gradient_Color_Flag = GECOLOR_FLAG_CONSTANT ;
GELineRect.ARGBClr.ForeGroundColor.u32Num
= (pclrBtn->f_clr&0xff00ff00) + ((pclrBtn->f_clr&0xff)<<16) +((pclrBtn->f_clr>>16)&0xff);
// draw upper rectangle fill
GELineRect.LineRectCoordinate.direction = 0x00;
GELineRect.Gradient_Color_Flag = GECOLOR_FLAG_CONSTANT ;
GELineRect.LineRectCoordinate.v0_x = pclrBtn->x;
GELineRect.LineRectCoordinate.v0_y = pclrBtn->y;
GELineRect.LineRectCoordinate.v1_x = pclrBtn->x + pclrBtn->width - 1;
GELineRect.LineRectCoordinate.v1_y = pclrBtn->y + pclrBtn->bFrameWidth-1;
MDrv_GE_RectDraw(&GELineRect);
// draw lower rectangle fill
GELineRect.Gradient_Color_Flag = GECOLOR_FLAG_NONCHANGE;
GELineRect.LineRectCoordinate.v0_y = pclrBtn->y + pclrBtn->height - pclrBtn->bFrameWidth;
GELineRect.LineRectCoordinate.v1_y = pclrBtn->y + pclrBtn->height - 1;
MDrv_GE_RectDraw(&GELineRect);
// draw left rectangle fill
GELineRect.Gradient_Color_Flag = GECOLOR_FLAG_NONCHANGE;
GELineRect.LineRectCoordinate.v0_y = pclrBtn->y;
GELineRect.LineRectCoordinate.v1_x = pclrBtn->x + pclrBtn->bFrameWidth - 1;
GELineRect.LineRectCoordinate.v1_y = pclrBtn->y + pclrBtn->height -1 ;
MDrv_GE_RectDraw(&GELineRect);
// draw right rectangle fill
GELineRect.Gradient_Color_Flag = GECOLOR_FLAG_NONCHANGE;
GELineRect.LineRectCoordinate.v0_x = pclrBtn->x + pclrBtn->width - pclrBtn->bFrameWidth;
GELineRect.LineRectCoordinate.v1_x = pclrBtn->x + pclrBtn->width - 1;
MDrv_GE_RectDraw(&GELineRect);
#else
clrBlock.x = pclrBtn->x;
clrBlock.y = pclrBtn->y;
clrBlock.width = pclrBtn->width;
clrBlock.height = pclrBtn->height;
memcpy(&clrBlock.clr, &pclrBtn->f_clr, 4);
lineFmt.width = pclrBtn->bFrameWidth;
MDrv_GE_RectFrame(&clrBlock, &lineFmt);
#endif
}
/******************************************************************************/
/// API for draw block::
/// @param pclrBtn \b IN color
/******************************************************************************/
void msAPI_OSD_DrawBlock(OSDClrBtn *pclrBtn)
{
GEClrBlock clrBlock;
GELineRectInfo GELineRect;
GELineFmt lineFmt;
GERectFmt rfmt;
/* check range */
/*
if((pclrBtn->x + pclrBtn->width) > NEWUI_MAIN_MENU_GWIN_WIDTH)
{
return;
}
else if((pclrBtn->y + pclrBtn->height) > NEWUI_MAIN_MENU_GWIN_HEIGHT)
{
return;
}
*/
/* set start point coordinate */
clrBlock.x = pclrBtn->x;
clrBlock.y = pclrBtn->y;
GELineRect.LineRectCoordinate.v0_x = pclrBtn->x;
GELineRect.LineRectCoordinate.v0_y = pclrBtn->y;
#if GE_DRIVER_TEST
switch(pclrBtn->u8Gradient)
{
default:
case CONSTANT_COLOR:
GELineRect.LineRectCoordinate.direction = 0x0;
GELineRect.LineRectCoordinate.v1_x = pclrBtn->x + pclrBtn->width -1;
GELineRect.LineRectCoordinate.v1_y = pclrBtn->y + pclrBtn->height -1;
GELineRect.Gradient_Color_Flag = GECOLOR_FLAG_CONSTANT;
GELineRect.ARGBClr.ForeGroundColor.u32Num
= (pclrBtn->b_clr&0xff00ff00) + ((pclrBtn->b_clr&0xff)<<16) +((pclrBtn->b_clr>>16)&0xff);
MDrv_GE_RectDraw(&GELineRect);
break;
case GRADIENT_X_COLOR:
GELineRect.LineRectCoordinate.direction = 0x0;
GELineRect.LineRectCoordinate.v1_x = pclrBtn->x + pclrBtn->width-1;
GELineRect.LineRectCoordinate.v1_y = pclrBtn->y + pclrBtn->height-1;
GELineRect.Gradient_Color_Flag = GECOLOR_FLAG_GRADIENT_X;
GELineRect.ARGBClr.ForeGroundColor.u32Num
= (pclrBtn->b_clr&0xff00ff00) + ((pclrBtn->b_clr&0xff)<<16) +((pclrBtn->b_clr>>16)&0xff);
GELineRect.ARGBClr.GradientXColor.u32Num
= (pclrBtn->g_clr&0xff00ff00) + ((pclrBtn->g_clr&0xff)<<16) +((pclrBtn->g_clr>>16)&0xff);
MDrv_GE_RectDraw(&GELineRect);
break;
case GRADIENT_Y_COLOR:
GELineRect.LineRectCoordinate.direction = 0x0;
GELineRect.LineRectCoordinate.v1_x = pclrBtn->x + pclrBtn->width-1;
GELineRect.LineRectCoordinate.v1_y = pclrBtn->y + pclrBtn->height-1;
GELineRect.Gradient_Color_Flag = GECOLOR_FLAG_GRADIENT_Y;
GELineRect.ARGBClr.ForeGroundColor.u32Num
= (pclrBtn->b_clr&0xff00ff00) + ((pclrBtn->b_clr&0xff)<<16) +((pclrBtn->b_clr>>16)&0xff);
GELineRect.ARGBClr.GradientYColor.u32Num
= (pclrBtn->g_clr&0xff00ff00) + ((pclrBtn->g_clr&0xff)<<16) +((pclrBtn->g_clr>>16)&0xff);
MDrv_GE_RectDraw(&GELineRect);
break;
case GRADIENT_X_CENTER_COLOR:
GELineRect.LineRectCoordinate.direction = 0x0;
GELineRect.LineRectCoordinate.v1_x = pclrBtn->x + (pclrBtn->width>>1) - 1;
GELineRect.LineRectCoordinate.v1_y = pclrBtn->y + pclrBtn->height -1 ;
GELineRect.Gradient_Color_Flag = GECOLOR_FLAG_GRADIENT_X;
GELineRect.ARGBClr.ForeGroundColor.u32Num
= (pclrBtn->b_clr&0xff00ff00) + ((pclrBtn->b_clr&0xff)<<16) +((pclrBtn->b_clr>>16)&0xff);
GELineRect.ARGBClr.GradientXColor.u32Num
= (pclrBtn->g_clr&0xff00ff00) + ((pclrBtn->g_clr&0xff)<<16) +((pclrBtn->g_clr>>16)&0xff);
MDrv_GE_RectDraw(&GELineRect);
GELineRect.LineRectCoordinate.v0_x = pclrBtn->x + pclrBtn->width-1;
GELineRect.Gradient_Color_Flag = GECOLOR_FLAG_NONCHANGE;
GELineRect.LineRectCoordinate.direction = 0x01; //x direction change
MDrv_GE_RectDraw(&GELineRect);
break;
case GRADIENT_Y_CENTER_COLOR:
GELineRect.LineRectCoordinate.direction = 0x0;
GELineRect.LineRectCoordinate.v1_x = pclrBtn->x + pclrBtn->width -1;
GELineRect.LineRectCoordinate.v1_y = pclrBtn->y + (pclrBtn->height>>1) -1;
GELineRect.Gradient_Color_Flag = GECOLOR_FLAG_GRADIENT_Y;
GELineRect.ARGBClr.ForeGroundColor.u32Num
= (pclrBtn->b_clr&0xff00ff00) + ((pclrBtn->b_clr&0xff)<<16) +((pclrBtn->b_clr>>16)&0xff);
GELineRect.ARGBClr.GradientYColor.u32Num
= (pclrBtn->g_clr&0xff00ff00) + ((pclrBtn->g_clr&0xff)<<16) +((pclrBtn->g_clr>>16)&0xff);
MDrv_GE_RectDraw(&GELineRect);
GELineRect.LineRectCoordinate.direction = 0x02; //y direction change
GELineRect.LineRectCoordinate.v0_y = pclrBtn->y + pclrBtn->height - 1;
GELineRect.Gradient_Color_Flag = GECOLOR_FLAG_NONCHANGE;
MDrv_GE_RectDraw(&GELineRect);
break;
}
/* draw rectangle frame */
if(pclrBtn->fHighLight && pclrBtn->bFrameWidth)
{
GELineRect.ARGBClr.ForeGroundColor.u32Num
= (pclrBtn->f_clr&0xff00ff00) + ((pclrBtn->f_clr&0xff)<<16) +((pclrBtn->f_clr>>16)&0xff);
// draw upper rectangle fill
GELineRect.LineRectCoordinate.direction = 0x00;
GELineRect.Gradient_Color_Flag = GECOLOR_FLAG_CONSTANT ;
GELineRect.LineRectCoordinate.v0_x = pclrBtn->x;
GELineRect.LineRectCoordinate.v0_y = pclrBtn->y;
GELineRect.LineRectCoordinate.v1_x = pclrBtn->x + pclrBtn->width - 1;
GELineRect.LineRectCoordinate.v1_y = pclrBtn->y + pclrBtn->bFrameWidth-1;
MDrv_GE_RectDraw(&GELineRect);
// draw lower rectangle fill
GELineRect.Gradient_Color_Flag = GECOLOR_FLAG_NONCHANGE;
GELineRect.LineRectCoordinate.v0_y = pclrBtn->y + pclrBtn->height - pclrBtn->bFrameWidth;
GELineRect.LineRectCoordinate.v1_y = pclrBtn->y + pclrBtn->height - 1;
MDrv_GE_RectDraw(&GELineRect);
// draw left rectangle fill
GELineRect.Gradient_Color_Flag = GECOLOR_FLAG_NONCHANGE;
GELineRect.LineRectCoordinate.v0_y = pclrBtn->y;
GELineRect.LineRectCoordinate.v1_x = pclrBtn->x + pclrBtn->bFrameWidth - 1;
GELineRect.LineRectCoordinate.v1_y = pclrBtn->y + pclrBtn->height -1 ;
MDrv_GE_RectDraw(&GELineRect);
// draw right rectangle fill
GELineRect.Gradient_Color_Flag = GECOLOR_FLAG_NONCHANGE;
GELineRect.LineRectCoordinate.v0_x = pclrBtn->x + pclrBtn->width - pclrBtn->bFrameWidth;
GELineRect.LineRectCoordinate.v1_x = pclrBtn->x + pclrBtn->width - 1;
MDrv_GE_RectDraw(&GELineRect);
}
#else
switch(pclrBtn->u8Gradient)
{
default:
case CONSTANT_COLOR:
clrBlock.width = pclrBtn->width;
clrBlock.height = pclrBtn->height;
/* set gradient color */
rfmt.flag = GERECT_FLAG_COLOR_CONSTANT;
memcpy(&clrBlock.clr, &pclrBtn->b_clr, 4);
/* draw rectangle */
MDrv_GE_Rectangle(&clrBlock, &rfmt);
break;
case GRADIENT_X_COLOR:
memcpy(&clrBlock.clr, &pclrBtn->b_clr, 4);
memcpy(&rfmt.e_clr, &pclrBtn->g_clr, 4);
clrBlock.width = pclrBtn->width;
clrBlock.height = pclrBtn->height;
memcpy(&clrBlock.clr, &pclrBtn->b_clr, 4);
/* set gradient color */
rfmt.flag = GERECT_FLAG_COLOR_GRADIENT_X;
memcpy(&rfmt.e_clr, &pclrBtn->g_clr, 4);
/* draw rectangle */
MDrv_GE_Rectangle(&clrBlock, &rfmt);
break;
case GRADIENT_Y_COLOR:
memcpy(&clrBlock.clr, &pclrBtn->b_clr, 4);
memcpy(&rfmt.e_clr, &pclrBtn->g_clr, 4);
clrBlock.width = pclrBtn->width;
clrBlock.height = pclrBtn->height;
memcpy(&clrBlock.clr, &pclrBtn->b_clr, 4);
/* set gradient color */
rfmt.flag = GERECT_FLAG_COLOR_GRADIENT_Y;
memcpy(&rfmt.e_clr, &pclrBtn->g_clr, 4);
/* draw rectangle */
MDrv_GE_Rectangle(&clrBlock, &rfmt);
break;
case GRADIENT_X_CENTER_COLOR:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -