📄 readbox.c
字号:
AECHAR* pAEDaw = NULL;
int nTem = 0;
uint16 i;
uint16 nMaxLine;
if(NULL == pReadBox->m_pnListTable) //检查索引表是否存在
return;
if(READBOX_STATE_STOK != pReadBox->m_eState) //检查是否为正确状态
return;
//IDISPLAY_FillRect(pReadBox->m_pThis->m_pIDisplay , pReadBox->m_pAPPRect , pReadBox->m_colorList[pReadBox->m_nColorBack]);
//设置前景色
//IDISPLAY_SetColor(pReadBox->m_pThis->m_pIDisplay , CLR_USER_BACKGROUND , pReadBox->m_colorList[pReadBox->m_nColorBack]);
IDISPLAY_SetColor(pReadBox->m_pThis->m_pIDisplay , CLR_USER_BACKGROUND , pReadBox->m_colorList[7]);
IDISPLAY_ClearScreen(pReadBox->m_pThis->m_pIDisplay);
//IDISPLAY_SetColor(pReadBox->m_pThis->m_pIDisplay , CLR_USER_TEXT , pReadBox->m_colorList[pReadBox->m_nColorText]);
IDISPLAY_SetColor(pReadBox->m_pThis->m_pIDisplay , CLR_USER_TEXT , pReadBox->m_colorList[6]);
//获得正确最大行数
nMaxLine = MIN(pReadBox->m_nMaxScrLine , (uint16)(pReadBox->m_nLtTa - pReadBox->m_nIndex));
for(i = 0 ; i <= nMaxLine ; i++)
{
pAEDaw = pReadBox->m_pAENowTmp + (pReadBox->m_pnListTable[pReadBox->m_nIndex + i] - pReadBox->m_pnListTable[pReadBox->m_nIndex]);
nTem = pReadBox->m_pnListTable[pReadBox->m_nIndex + i + 1] - pReadBox->m_pnListTable[pReadBox->m_nIndex + i];
//三星手机专用
//switch(*pAEDaw)
//{
//case 0xfeff:
// pAEDaw++;
// nTem--;
// break;
//}
//samla:
// switch(*(pAEDaw + nTem - 1))
// {//去掉000d,000a这两个长度再三星手机上是乱码
// case 0x000d:
// case 0x000a:
// if(0 < nTem)
// {
// nTem--;
// goto samla;
// }
// break;
// }
//三星手机专用
DrawLine(pReadBox , i , pAEDaw , nTem);
}
//回调绘制
FUN_COMMANDRUN(READRC_STATE_STOK , pReadBox->m_nLtTa - 1 , pReadBox->m_nIndex);
IDISPLAY_Update(pReadBox->m_pThis->m_pIDisplay);
if(pReadBox->m_bStopRead)//如果没有暂停自动播放就继续刷新
ISHELL_SetTimer(pReadBox->m_pThis->m_pIShell , pReadBox->m_nTime[pReadBox->m_nLooktype-1] , (PFNNOTIFY )DrawReadT , (void*)pReadBox);
}
void CReadBox_Draw(CReadBox* pReadBox)
{
if(pReadBox->m_bIsActive)
CReadBox_ReDraw(pReadBox);
}
//////////////////////////////////////////////////////////////////////////
//回调
void MapNotify(CNotifyPar* pNotify)
{
CReadBox* pReadBox = (CReadBox*)pNotify->m_pvUser;
switch(pNotify->m_code)
{
case FILEMAP_NONE: //预留
return;
case FILEMAP_REDA: //建立索引表
{
switch(pReadBox->m_eState)
{
case READBOX_STATE_NONE: //无状态
return;
case READBOX_STATE_CRIN: //正在建立索引
switch(pReadBox->bFileEnd) //是否为文件的结束
{
case TRUE: //如果是文件的结束
pReadBox->m_eState = READBOX_STATE_STOK;
pReadBox->m_pnListTable[pReadBox->m_nLtTa] = (uint16)(pReadBox->m_pFileMap->m_nTotalSize >> 1);//添加最后一行索引
if(FALSE == CReadBox_GoToLabel(pReadBox , pReadBox->nNowLabel))
{
CReadBox_ClsReadFile(pReadBox);
FUN_COMMANDRUN(READRC_ERRAL_AERR , READRC_PAGEG_IERR , 0);
}
return;
default:
{
if(FALSE == CreateTable(pReadBox , pNotify))
{
CReadBox_ClsReadFile(pReadBox);
FUN_COMMANDRUN(READRC_ERRAL_AERR, READRC_CREAT_IDER , 0);
}
}
}
return;
case READBOX_STATE_STOK:
{
pReadBox->m_pAENowTmp = (AECHAR*)pNotify->m_pDataBeg;
CReadBox_Draw(pReadBox);
}
return;
}
}
return;
case FILEMAP_IERR:
CReadBox_ClsReadFile(pReadBox);
FUN_COMMANDRUN(READRC_ERRAL_AERR , READRC_FIMAP_IERR , 0);
return;
}
}
//////////////////////////////////////////////////////////////////////////
// CReadBox 内部使用的函数, //
// //
// //
//////////////////////////////////////////////////////////////////////////
//二分查找算计算法
uint32 BinSearch(uint16 nList[] , uint16 nIndex , uint32 nSize)
{//REABBOX_BINSEARCH_ERR ERRCode
int32 nMax;
int32 nlow , nhigh , nmid;
nMax = nSize - 1;
nlow = 0;
nhigh = nMax;
if(nhigh <= nlow)
return REABBOX_BINSEARCH_ERR;
while(nlow <= nhigh)
{
nmid=(nlow + nhigh) / 2;
if(nList[nmid] <= nIndex)
{
switch(nMax - nmid)
{
case 0:
if(nList[nmid] == nIndex)
return nmid;
else
return REABBOX_BINSEARCH_ERR;
default:
if(nList[nmid + 1] > nIndex)
return nmid;
}
}
if(nList[nmid] > nIndex)
nhigh = nmid - 1;
else
nlow = nmid + 1;
}
return REABBOX_BINSEARCH_ERR;
}
boolean CreateTable(CReadBox* pReadBox , CNotifyPar* pNotify)
{
boolean bRet = FALSE;
AECHAR* pBeg = NULL;
AECHAR* pEnd = NULL;
//AECHAR* pTemp = NULL;
uint32 nLenPi = 0;//移动的最大偏移
uint32 nReadSize = 0;
//////////////////////////////////////////////////////////////////////////
//参数检查,可能检查的过分了
if(NULL == pNotify)
return FALSE;
if(NULL == pNotify->m_pDataBeg || NULL == pNotify->m_pDataEnd)
return FALSE;
//////////////////////////////////////////////////////////////////////////
//pNotify->m_nMaxDataSize 如果等于0说明已经是文件的结束
pBeg = (AECHAR*)pNotify->m_pDataEnd;
nLenPi = MIN(READBOX_INDEX_SETP , (pNotify->m_nMaxDataSize / 2));
pEnd = pBeg + nLenPi;
//计算安全测量范围
//////////////////////////////////////////////////////////////////////////
//到此得到了可以计算AECHAR的开始和结素指针 (pEnd - pBeg)为本次处理最多字符数
nReadSize = MesureText(pReadBox , pBeg , pEnd);
if(NULL != pReadBox->m_pFileMap && 0 != pReadBox->m_pFileMap->m_nTotalSize)
FUN_COMMANDRUN(READRC_CREAT_INDX , (uint32)((pReadBox->m_pFileMap->m_nIndex * 100) / pReadBox->m_pFileMap->m_nTotalSize) , 0);
if(!pReadBox->bFileEnd)
{
bRet = CFileMap_GetData(pReadBox->m_pFileMap , NOW_READ , nReadSize , &pReadBox->bFileEnd);
}
return bRet;
}
uint32 MesureText(CReadBox* pReadBox , AECHAR* pBeg , AECHAR* pEnd)
{
int16 nMaxLeng = 0; //最大长度
int nChar = 0; //临时空间变量
AECHAR* pTem = NULL; //
AECHAR* pForTem; //
int i; //临时变量
nMaxLeng = pEnd - pBeg;
if(nMaxLeng > READBOX_INDEX_BACK) //说明已经到文件结尾的最后READBOX_INDEX_BACK大小
pEnd -= READBOX_INDEX_BACK;
pTem = pBeg;
while(pTem < pEnd)
{
if(NULL == pReadBox->m_pFileMap)
return 0;
if(nMaxLeng <= READBOX_INDEX_BACK)
IDISPLAY_MeasureTextEx(pReadBox->m_pThis->m_pIDisplay , AEE_FONT_NORMAL, pTem , pEnd - pTem , pReadBox->m_ncxScreen , &nChar);
else
IDISPLAY_MeasureTextEx(pReadBox->m_pThis->m_pIDisplay , AEE_FONT_NORMAL, pTem , READBOX_INDEX_BACK , pReadBox->m_ncxScreen , &nChar);
pForTem = pTem;
for(i = 0 ; i < nChar ; i++)
{
switch(*pForTem)
{
case 0x000d:
break;
case 0x000a:
goto outme;
}
pForTem++;
}
outme:
i = (i == nChar) ? nChar : i + 1;
pTem += i;
//////////////////////////////////////////////////////////////////////////
//将本行插近索引表
if(pReadBox->m_nLtTa < pReadBox->m_nLtMx)
{
pReadBox->m_pnListTable[pReadBox->m_nLtTa] = pReadBox->nTotalChar;
}
else
{
CReadBox_ClsReadFile(pReadBox);
FUN_COMMANDRUN(READRC_ERRAL_AERR , READRC_CREAT_IDER , 0);
}
pReadBox->m_nLtTa++;
pReadBox->nTotalChar += i;
}
return (uint32)pTem - (uint32)pBeg;
}
//////////////////////////////////////////////////////////////////////////
//绘制文字行,主要为了兼容小字体
void DrawLine(CReadBox* pReadBox , uint16 nLine , AECHAR* pDraw , int nLen)
{
IDISPLAY_DrawText(pReadBox->m_pThis->m_pIDisplay , AEE_FONT_NORMAL , pDraw , nLen , pReadBox->m_pAPPRect->x , (int)(pReadBox->m_pAPPRect->y + (nLine * (pReadBox->m_nBeLine + pReadBox->nFontH))) - pReadBox->m_nPicY , pReadBox->m_pAPPRect , 0);
}
//////////////////////////////////////////////////////////////////////////
//自动阅读效果 回调函数
void DrawReadT(CReadBox* pReadBox)
{
if(FALSE == pReadBox->m_bIsActive || FALSE == pReadBox->m_bStopRead)
return;
switch(pReadBox->m_nLooktype)
{
case 1:
pReadBox->m_nPicY += 2;
if(pReadBox->m_nPicY >= (pReadBox->m_nBeLine + pReadBox->nFontH))
ISHELL_PostEvent(pReadBox->m_pThis->m_pIShell , ISHELL_ActiveApplet(pReadBox->m_pThis->m_pIShell) , EVT_MY , AVK_DOWN , 0);
else
{
CReadBox_ReDraw(pReadBox);
ISHELL_SetTimer(pReadBox->m_pThis->m_pIShell , pReadBox->m_nTime[0] , (PFNNOTIFY )DrawReadT , (void*)pReadBox);
}
return;
case 2:
ISHELL_PostEvent(pReadBox->m_pThis->m_pIShell , ISHELL_ActiveApplet(pReadBox->m_pThis->m_pIShell) , EVT_MY , AVK_DOWN , 0);
ISHELL_SetTimer(pReadBox->m_pThis->m_pIShell , pReadBox->m_nTime[1] , (PFNNOTIFY )DrawReadT , (void*)pReadBox);
return;
case 3:
ISHELL_PostEvent(pReadBox->m_pThis->m_pIShell , ISHELL_ActiveApplet(pReadBox->m_pThis->m_pIShell) , EVT_MY , AVK_RIGHT , 0);
ISHELL_SetTimer(pReadBox->m_pThis->m_pIShell , 100*pReadBox->m_nTime[2] , (PFNNOTIFY )DrawReadT , (void*)pReadBox);
return;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -