📄 setupdisp.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 + -