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

📄 setupdisp.c

📁 瑞星微公司RK27XX系列芯片的SDK开发包
💻 C
字号:
/******************************************************************/
/*   Copyright (C) 2007 ROCK-CHIPS FUZHOU . All Rights Reserved.  */
/*******************************************************************
File        :  setupdisp.c
Desc        :  实现 低级安装过程中的显示 .

Author      : huangsl
Date        : 2007-09-19
Notes       : 安装类型:
                1.在没有任何系统的情况下 的安装 -- 此时安装程序没有任何系统接口和资源澹(包括字库).
                    此种情况下,无须用户干预.
                2.系统正常运行下的升级 安装.
              安装模式:
                通过脚本和PC工具生产安装固件,然后有专门的安装程序来执行该固件.
              相关工作:
                1.两种情况下的文件结构安排.
                2.安装接口 扩展性问题--跨版本安装.
                3.安装固件如何生成--脚本生成还是模块生成.
                4.如果安装过程中断电,如何保证安全性.

$Log: setupdisp.c,v $
Revision 1.3  2008/06/19 04:43:27  Administrator
代码整理!

Revision 1.2  2008/06/13 07:08:55  Administrator
HJ 更新三级 LOAD 工程!

Revision 1.1.1.1  2008/05/07 04:15:08  Administrator
no message

Revision 1.1.1.1  2008/03/06 13:29:10  Lingzhaojun
no message

Revision 1.3  2008/01/07 12:52:19  Huangshilin
no message

Revision 1.1.1.1  2007/12/21 02:35:43  Lingzhaojun
12.21

Revision 1.1  2007/11/23 08:04:12  Huangshilin
增加安装接口.

Revision 1.3  2007/10/20 04:46:30  Huangshilin
for RK2700

Revision 1.2  2007/10/08 02:57:03  Lingzhaojun
添加版本自动注释脚本

* huangsl             2007-09-19      for rk27.
*
*********************************************************************/
#define _ROCK_SYSGLOBAL_H_ //NOT INCLUDE SYSGLOBA.H
#include "include.h"
#include    "lib\process\rkbin.h"
#include    "setup.h"
#include    "setupGlobal.h"
/*****************************************************************************/

/*****************************************************************************/

/*****************************************************************************/
#if defined(SETUP)
/*****************************************************************************/
//如果打包, 于 LCD_W,LCD_H 相关的 变量 需要 提取出来.
//把 所有 sizeof 的 语句都 换成 全局变量.

/*****************************************************************************/

//EXTERN
//extern int LCDC_GetStatus(void);
/*****************************************************************************/

#define GUIDSP_PAINT_BEGIN           for( hLine = 0  ; hLine <  rect->h ; hLine++ )\
                                                                {\
                                                                for( wLine = 0 ; wLine < rect->w ; wLine++ )\
                                                                    {

#define GUIDSP_PAINT_END               pSource++; pDest++; }\
                                                                pSource += JumpLenSource;\
                                                                pDest += JumpLenDest;\
                                                                }

void ISetupBmpPaint(LCD_RGBDATA     *pDest , LCD_RGBDATA     *pSource  ,
                    UHRECT *rect , DispMode xTransp)

{

    INT32U                  JumpLenSource = 0;
    INT32U                  JumpLenDest = gLcdW - rect->w;
    INT32U                  hLine , wLine;

    if (xTransp == DSPM_Transp)
    {
        GUIDSP_PAINT_BEGIN
        if (*pSource != COLOR_BLACK)
        {
            *pDest = (*pSource) ;
        }
        GUIDSP_PAINT_END
    }
    else
    {
        GUIDSP_PAINT_BEGIN
        *pDest = (*pSource) ;
        GUIDSP_PAINT_END
    }
}

void ISetupDrawBmpMem0(INT16U x, INT16U y,
                       LCD_RGBDATA  *pSource , DispMode xTransp)
{

    LCD_RGBDATA     *pDest;
    UHRECT   rect;
    rect.x = x;
    rect.y = y;
    rect.w = gSetupBmpHead.w;
    rect.h = gSetupBmpHead.h;

    pDest = gSetupLcdLogic + y * gLcdW + x;
    ISetupBmpPaint(pDest, pSource, &rect, xTransp);

}
#if 0
// 从 x,y起始位置 显示 位图.
INT32U  ISetupDispBmp(INT32U x , INT32U y , INT32U offSet , INT32U size , MY_FILE* file)
{
    FSFileSeek(file , offSet , 0);
    FSFileRead(&gSetupBmpHead , sizeof(gSetupBmpHead) , file);
    size -= sizeof(gSetupBmpHead);
    if (gSetupBmpHead.w == gLcdW)
    {
        LCD_RGBDATA     *pDest = gSetupLcdLogic + y * gLcdW + x;
        FSFileRead(pDest, size , file);
    }
    else
    {
        FSFileRead(gSetupLcdLogicBake, size , file);
        ISetupDrawBmpMem0(x , y , gSetupLcdLogicBake, DSPM_Normal);
    }

    gSetupStrCopy = 0;
    SETUP_LCDUPDATE();
    return 0;
}
/*****************************************************************************/
// 从 x,y起始位置 显示 字符串--已经转换位 黑白位图.
INT32U  ISetupDispString(INT32U x , INT32U y , INT32U offSet , INT32U size , MY_FILE* file)
{
    LCD_RGBDATA     *pDest = gSetupLcdLogic + y * gLcdW;

    //如果没有拷贝 背景,则 拷贝.
    if (gSetupStrCopy == 0)
    {
        memcpy(gSetupStringBake , pDest , gSetupCopySize);
        gSetupStrCopy = 1;
        gSetupStrBakeY = y;
    }

    else
        //如果已经拷贝.
    {
        if (gSetupStrBakeY != y)
        {
#if 0
            pDest = gGuiDspLcdLogic + gSetupStrBakeY * gLcdW ;
            memcpy(pDest , gSetupStringBake , sizeof(gSetupStringBake));
            pDest = gGuiDspLcdLogic + y * gLcdW ;
            memcpy(gSetupStringBake, pDest , sizeof(gSetupStringBake));
            gSetupStrBakeY = y;
#else
            //拷贝新的背景.
            memcpy(gSetupStringBake , pDest , gSetupCopySize);
            gSetupStrCopy = 1;
            gSetupStrBakeY = y;
#endif
        }
        else
        {
            memcpy(pDest , gSetupStringBake , gSetupCopySize);
        }
    }

    // 在显示 脚本字符串的时候,如果和 拷贝文件字符串重叠,则需要清空.
    if (gSetupDrawStrCopy == 1)
    {
        pDest = gSetupLcdLogic + gSetupDrawStrY * gLcdW ;
        memcpy(pDest , gSetupDrawString , gSetupCopySize);
        gSetupDrawStrCopy = 0;
    }

    //DRAW STRING .
    FSFileSeek(file , offSet , 0);
    FSFileRead(&gSetupBmpHead , sizeof(gSetupBmpHead) , file);
    size -= sizeof(gSetupBmpHead);

    FSFileRead(gSetupLcdLogicBake, size , file);
    ISetupDrawBmpMem0(x , y , gSetupLcdLogicBake, DSPM_Transp);
    SETUP_LCDUPDATE();
    return 0;
}


INT32U  ISetupDispFontFile(INT32U offSet12 , INT32U offSet16,
                           INT32U offSet24 , INT32U TotalSize, MY_FILE* file)
{
    gDspFont12Ptr = (INT8U*)MALLOC(TotalSize);
    if (gDspFont12Ptr == NULL)
    {
        return 1;
    }
    FSFileSeek(file , offSet12 , 0);
    if (FSFileRead(gDspFont12Ptr , TotalSize , file) !=  TotalSize)
    {
        return 2;
    }
    gDspFont16Ptr = gDspFont12Ptr + (offSet16 - offSet12);
    gDspFont24Ptr = gDspFont12Ptr + (offSet24 - offSet12);
    return 0;
}

#endif

/*****************************************************************************/
void ISetupDispDrawChar(LCD_RGBDATA *dramBuff , INT8U * charData, INT16U charW, INT16U charH)
{
    INT16U          w, h;

    INT16U          charBytes = 2;  //每个字符 每行占用的 BYTE数目.
    INT32U          CurrLineChar;
    LCD_RGBDATA     *CurrLineBuffer;

    if (charH > 16)
    {
        charBytes = 3;
    }

    //每次画一行,从左到右.
    for (h = 0; h < charH ; h++)
    {
        //每行的字符数据凑成一个 INT32U。

        CurrLineChar = ((INT32U)charData[0]) << 24
                       | ((INT32U)charData[1]) << 16 | ((INT32U)charData[2]) << 8;
        charData += charBytes;

        CurrLineBuffer = dramBuff;
        dramBuff += gLcdW;

        w = 0 ;
        while (w < charW)
        {
            if (CurrLineChar  & (0x80000000U >> w))
            {
                //    *CurrLineBuffer =  GUIDSP_GRAYCOLOR( &colorattr->forward );
                *CurrLineBuffer =  COLOR_WHITE;
            }
            CurrLineBuffer++;
            w++;
        }
    }
}


INT32U  ISetupDispDrawString(INT32U x , INT32U y , char *string , INT32U font)
{
    LCD_RGBDATA     *pDest = gSetupLcdLogic + y * gLcdW;
    char            character;
    INT8U           *fontDataBuff;
    INT8U           *fontPtr = gDspFont12Ptr;
    INT32U          ftSize = 28;
    INT16U          charW;
    INT32U          positionX = x;

    if (gDspFont12Ptr == NULL)
        return 1;

    if (gSetupDrawStrCopy == 0)
    {
        memcpy(gSetupDrawString , pDest , gSetupCopySize);
        gSetupDrawStrCopy = 1;
        gSetupDrawStrY = y;
    }
    else if (gSetupDrawStrY != y)
    {
#if 0
        pDest = gGuiDspLcdLogic + gSetupDrawStrY * gLcdW ;
        memcpy(pDest , gSetupDrawString , sizeof(gSetupDrawString));
        pDest = gGuiDspLcdLogic + y * gLcdW ;
        memcpy(gSetupDrawString, pDest , sizeof(gSetupDrawString));
        gSetupDrawStrY = y;
#else
        memcpy(gSetupDrawString , pDest , gSetupCopySize);
        gSetupDrawStrCopy = 1;
        gSetupDrawStrY = y;
#endif
    }
    else
    {
        memcpy(pDest , gSetupDrawString , gSetupCopySize);
    }

    if (font == 16)
    {
        fontPtr = gDspFont16Ptr ;
        ftSize = 36;
    }
    else if (font == 24)
    {
        fontPtr = gDspFont24Ptr ;
        ftSize = 76;
    }

    pDest += x;
    while (((character = *string++)  != 0) && (character != 0x000d)
            && positionX < gLcdW - font  // 080325,huangsl,增加长度限制,防止 字符串没有终结符的意外.
          )
    {
        if (character > 0x80 || character < 0x20)  //非 ASCII 码.
            continue;

        // 0xc4 -- 文件头部信息.
        fontDataBuff = fontPtr + 0XC4 + (INT32U)(character - 0x20) * ftSize ;

        //前面2个 INT16U 为宽度和高度.
#if 0
        if (character&0xFF00)
            charW = (INT16U)font;
        else
        {
            charW = (INT16U)fontDataBuff[1];   //fontDataBuff[0] 为高 8 位 ,可以忽略,只取低 8位.
        }
#else
        charW = (INT16U)fontDataBuff[1];
#endif
        positionX += charW;

        if (positionX > gLcdW)  /* NO NEXT PAGE */
        {
            break;
        }
        ISetupDispDrawChar(pDest ,  &fontDataBuff[4] , charW, (INT16U) font);
        pDest += charW;
    }

    SETUP_LCDUPDATE();
    return positionX;
}

/*****************************************************************************/


/*****************************************************************************/
#endif // SETUP
/****************************************************************/
//---------END OF FILE---------//
/****************************************************************/



⌨️ 快捷键说明

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