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

📄 msapi_osd.c

📁 mstar 776 开发的车载dvd
💻 C
📖 第 1 页 / 共 5 页
字号:
		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 + -