text.c
上传用户:fy98168
上传日期:2015-06-26
资源大小:13771k
文件大小:20k
- #include "text.h"
- #include "db.h"
- #include "flash.h"
- #include "zk.h"
- #define TEXT_USE_MEMCPY FALSE /*KB_OSD_BYTES=2时为FALSE,否则为TRUE*/
- /* 全局变量 */
- static UINT8 gTxtTypeE; /*英文字体型号*/
- static UINT8 gTxtTypeC; /*中文字体型号*/
- #define TEXT_MAX_PIXELS (640 * 48)/*一行文本允许的最大像素*/
- static UINT8 *gTxtPicBuf; /*存放一行文本字符显示数*/
- static UINT8 anOneWordPic[48*48*KB_OSD_BYTES];/*一个字符的显示数据*/
- static UINT8 gTxtBmpBuf[48*48/8];/*字符点阵数据*/
- /* 20点阵字库数据 */
- extern unsigned char j_zk20[355700];
- extern unsigned char ZK_CHN_16[];
- extern unsigned char ZK_ENG_16[];
- /*字库基址*/
- static UINT8* gTxtE24;
- static UINT8* gTxtX24;
- static UINT8* gTxtC24;
- static UINT8* gTxtE16;
- static UINT8* gTxtX16;
- static UINT8* gTxtC16;
- static UINT8* gTxtE20;
- static UINT8* gTxtX20;
- static UINT8* gTxtC20;
- /*=============================================================
- 函数名称 : KB_TxtInit
- 功 能 :初始化文本显示
- 入 口 : 无
- 出 口 : 无
- 返 回 : 无
- 描 述 : 设置相关的静态全局变量,
- 包括显示方式,字体的型号,
- 字库地址,显示缓存
- =============================================================*/
- void KB_TxtInit(void)
- {
- UINT8 *pcTextData;
- KB_TxtSetCharType(TEXT_ENG24X12);
- KB_TxtSetHZType(TEXT_HZ24X24);
- {
- pcTextData = (UINT8*)KB_FlashGetSectorAddr(KB_DB_ZK_SECTOR);
- gTxtE24 = (UINT8 *)(pcTextData + 4097);
- gTxtX24 = (UINT8 *)(pcTextData + 22339);
- gTxtC24 = (UINT8 *)(pcTextData + 259221);
- gTxtE16 = ZK_ENG_16;
- gTxtX16 = ZK_CHN_16;
- gTxtC16 = gTxtX16+ 1410*32;
- gTxtE20 = (UINT8 *)j_zk20;
- gTxtX20 = gTxtE20 + 3200;
- gTxtC20 = gTxtX20 + 14100;
- }
- gTxtPicBuf = (UINT8*)KB_OSDAllocate(640, 48);
- }
- /*=============================================================
- 函数名称 : KB_TxtSetCharType
- 功 能 : 设置英文字体型号
- 入 口 : UINT8 nCharType 字体型号
- 出 口 : 无
- 返 回 : 无
- =============================================================*/
- void KB_TxtSetCharType(UINT8 nCharType)
- {
- if(nCharType >= TEXT_MAXENGTYPE)
- {
- nCharType = 0;
- }
- gTxtTypeE = nCharType;
- }
- /*=============================================================
- 函数名称 : KB_TxtSetCharType
- 功 能 : 设置中文字体型号
- 入 口 : UINT8 nHZType 字体型号
- 出 口 : 无
- 返 回 : 无
- =============================================================*/
- void KB_TxtSetHZType(UINT8 nHZType)
- {
- if(nHZType >= TEXT_MAXHZTYPE)
- {
- nHZType = 0;
- }
- gTxtTypeC = nHZType;
- }
- /*=============================================================
- 函数名称 : KB_TxtGetData
- 功 能 : 从文本字符串取第一个有效的中文或英文字符,
- 获得该字符在当前文本型号下的点阵数据
- 入 口 : char **io_ppcStr 待处理的字符串
- 出 口 : UINT8 *o_pcData 返回的点阵数据
- INT32 *o_pnWidth 点阵的宽度
- INT32 *o_pnHeight 点阵的高度
- 返 回 : TEXT_TRUE---成功,TEXT_FALSE ---文本结束
- =============================================================*/
- INT32 KB_TxtGetData(char **io_ppcStr, UINT8 *o_pcData,
- INT32 *o_pnWidth, INT32 *o_pnHeight)
- {
- UINT8 byte1, byte2; /* 第一和第二个字节 */
- UINT8 *searchHead; /* 检索头 */
- INT32 qh, wh; /* 区号和位号 */
- INT32 hzOffset; /* 汉字偏移 */
- long offset; /* 偏移,以字节为单位 */
- INT32 sectNum; /* 要检取的字节数 */
- INT32 loop;
- byte1 = (UINT8)( (*io_ppcStr)[0] );
- byte2 = (UINT8)( (*io_ppcStr)[1] );
- if(byte1 == 0) /* [1] = 0 */
- {
- return TEXT_FALSE; /* 返回TEXT_FALSE */
- }
- else if(byte1 < 0x80) /* [1] < 0x80 */
- {
- *io_ppcStr = *io_ppcStr + 1; /* 字符串跳过一个字节 */
- switch(gTxtTypeE)
- {
- case TEXT_ENG16X8: /* 英文8*16 */
- #ifndef FONT_FONT20_REPLACE_ENG16
- *o_pnWidth = 8;
- *o_pnHeight = 16;
- searchHead = gTxtE16; /* 检索头 */
- sectNum = (8 * 16)/8; /* 要取的字节数 */
- break;
- #endif
- case TEXT_ENG20X10: /* 英文10*20 */
- *o_pnWidth = 10;
- *o_pnHeight = 20;
- searchHead = gTxtE20; /* 检索头 */
- sectNum = (10 * 20)/8; /* 要取的字节数 */
- break;
- default: /* 英文12*24或其他 */
- *o_pnWidth = 12;
- *o_pnHeight = 24;
- searchHead = gTxtE24; /* 检索头 */
- sectNum = (12 * 24)/8; /* 要取的字节数 */
- break;
- }
- offset = byte1 * sectNum;
- }
- else /* [1] >= 0x80 */
- {
- if(byte2 < 0x80) /* [2] < 0x80 error */
- {
- *io_ppcStr = *io_ppcStr + 1; /* 字符串跳过一个字节 */
- switch(gTxtTypeE)
- {
- case TEXT_ENG16X8: /* 英文8*16 */
- #ifndef FONT_FONT20_REPLACE_ENG16
- *o_pnWidth = 8;
- *o_pnHeight = 16;
- searchHead = gTxtE16; /* 检索头 */
- sectNum = (8 * 16)/8; /* 要取的字节数 */
- break;
- #endif
- case TEXT_ENG20X10: /* 英文10*20 */
- *o_pnWidth = 10;
- *o_pnHeight = 20;
- searchHead = gTxtE20; /* 检索头 */
- sectNum = (10 * 20)/8; /* 要取的字节数 */
- break;
- default: /* 英文12*24或其他 */
- *o_pnWidth = 12;
- *o_pnHeight = 24;
- searchHead = gTxtE24; /* 检索头 */
- sectNum = (12 * 24)/8; /* 要取的字节数 */
- break;
- }
- offset = 0; /* 偏移为0 */
- }
- else /* [2] >= 0x80 */
- {
- *io_ppcStr = *io_ppcStr + 2; /* 字符串跳过二个字节 */
- qh = (INT32)byte1 - 160; /* 区号和位号 */
- wh = (INT32)byte2 - 160;
- hzOffset = 94 * (qh - 1) + (wh - 1); /* 汉字检索偏移 */
- switch(gTxtTypeC)
- {
- case TEXT_HZ16X16: /* 汉字16*16 */
- sectNum = (16 * 16)/8; /* 要取的字节数 */
- *o_pnWidth = 16;
- *o_pnHeight = 16;
- /*1-3 在特殊字符区*/
- if( hzOffset <= 281 && hzOffset >= 0) /* 0 <= [汉字检索偏移] <=281 */
- {
- offset = hzOffset * sectNum; /* 偏移 */
- searchHead = gTxtX16; /* 检索头 */
- }
- /*16-87在汉字字符区*/
- else if(hzOffset >= 1410 && hzOffset <= 8177) /* 1410 <= [汉字检索偏移] <= 5164 */
- {
- offset = (hzOffset - 1410)*sectNum; /* 偏移 */
- searchHead = gTxtC16; /* 检索头 */
- }
- /*88-94取特殊字符区的第一个字符*/
- else /* 其他 */
- {
- offset = 0; /* 偏移 */
- searchHead = gTxtX16; /* 检索头 */
- }
- break;
-
- case TEXT_HZ20X20: /* 汉字20*20 */
- sectNum = (20 * 20)/8; /* 要取的字节数 */
- *o_pnWidth = 20;
- *o_pnHeight = 20;
- if( hzOffset <= 281 && hzOffset >= 0) /* 0 <= [汉字检索偏移] <=281 */
- {
- offset = hzOffset * sectNum; /* 偏移 */
- searchHead = gTxtX20; /* 检索头 */
- }
- else if(hzOffset >= 1410 && hzOffset <= 8177) /* 1410 <= [汉字检索偏移] <= 5164 */
- {
- offset = (hzOffset - 1410)*sectNum; /* 偏移 */
- searchHead = gTxtC20; /* 检索头 */
- }
- else /* 其他 */
- {
- offset = 0; /* 偏移 */
- searchHead = gTxtX20; /* 检索头 */
- }
- break;
- default: /* 汉字24*24或其他 */
- sectNum = 24*24 / 8; /* 要取的字节数 */
- *o_pnWidth = 24;
- *o_pnHeight = 24;
- if(hzOffset >= 0 && hzOffset <= 281) /* 0 <= [汉字检索偏移] <=281 */
- {
- offset = hzOffset * sectNum; /* 偏移 */
- searchHead = gTxtX24; /* 检索头 */
- }
- else if(hzOffset >= 1410 && hzOffset <= 8177) /* 1410 <= [汉字检索偏移] <= 5164 */
- {
- offset = (hzOffset - 1410) * sectNum; /* 偏移 */
- searchHead = gTxtC24; /* 检索头 */
- }
- else /* 其他 */
- {
- offset = 0; /* 偏移 */
- searchHead = gTxtX24; /* 检索头 */
- }
- break;
- }
- }
- }
- for(loop = 0; loop < sectNum; loop ++)
- {
- o_pcData[loop] = searchHead[offset + loop];
- }
-
- return TEXT_TRUE;
- }
- /*=============================================================
- 函数名称 : KB_TxtGetStrWidHei
- 功 能 :求出文本字符串在当前中英文字体型号下的显示宽高
- 它会处理掉无效字符
- 入 口 : char * i_pcStr 待解析的文本字符串
- 出 口 : INT32 * o_pnWidth 文本字符串的宽度
- INT32 * o_pnHeight 文本字符串的高度
- 返 回 : 无
- =============================================================*/
- void KB_TxtGetStrWidHei(char * i_pcStr, INT32 * o_pnWidth, INT32 * o_pnHeight)
- {
- UINT8 byte1, byte2; /* 第一和第二个字节 */
- INT32 width, height;
- INT32 loop;
- /* 初始化 */
- width = 0;
- height = 0;
- loop = 0;
- byte1 = (UINT8)i_pcStr[loop];
- byte2 = (UINT8)i_pcStr[loop + 1];
- while(byte1 != 0) /* byte1 == 0 时退出 */
- {
- if(byte1 < 0x80) /* [1] < 0x80 */
- {
- loop = loop + 1; /* 字符串跳过一个字节 */
- switch(gTxtTypeE)
- {
- case TEXT_ENG16X8: /* 英文8*16 */
- #ifndef FONT_FONT20_REPLACE_ENG16
- width += 8;
- height = (height > 16)?height:16;
- break;
- #endif
- case TEXT_ENG20X10: /* 英文10*20 */
- width += 10;
- height = (height > 20)?height:20;
- break;
- default: /* 英文12*24或其他 */
- width += 12;
- height = (height > 24)?height:24;
- break;
- }
- } /* end if (byte1 < 0x80) */
- else /* [1] >= 0x80 */
- {
- if(byte2 < 0x80) /* [2] < 0x80 error */
- {
- loop = loop + 1; /* 字符串跳过一个字节 */
- switch(gTxtTypeE)
- {
- case TEXT_ENG16X8: /* 英文8*16 */
- #ifndef FONT_FONT20_REPLACE_ENG16
- width += 8;
- height = (height > 16)?height : 16;
- break;
- #endif
- case TEXT_ENG20X10: /* 英文8*16 */
- width += 10;
- height = (height > 20)?height : 20;
- break;
-
- default: /* 英文12*24或其他 */
- width += 12;
- height = (height > 24)?height : 24;
- break;
- }
- }
- else /* [2] >= 0x80 */
- {
- loop = loop + 2; /* 字符串跳过二个字节 */
- switch(gTxtTypeC)
- {
- case TEXT_HZ16X16: /* 汉字16*16 */
- width += 16;
- height = (height > 16)?height:16;
- break;
- case TEXT_HZ20X20: /* 汉字20*20 */
- width += 20;
- height = (height > 20)?height:20;
- break;
- default: /* 汉字24*24或其他 */
- width += 24;
- height = (height > 24)?height : 24;
- break;
- }
- }
- } /* end else byte1 < 0 */
- byte1 = (char)i_pcStr[loop];
- byte2 = (char)i_pcStr[loop + 1];
- }/* end while */
- *o_pnWidth = width;
- *o_pnHeight = height;
- }
- /*=============================================================
- 函数名称 : KB_TxtConverTxtData
- 功 能 : 由字符点阵数据获取字符显示数据
- 入 口 : INT32 i_nWidth 字符点阵宽度
- INT32 i_nHeight 字符点阵高度
- ColrRef nTextBgColor 字符背景色
- ColrRef nTextColor 字符前景色
- UINT8 * i_pcSrcData 字符点阵数据
- UINT8 nTimeHR 水平显示放大倍数
- UINT8 nTimeVT 垂直显示放大倍数
- 出 口 : UINT8 * o_pcTarData 字符显示数据
- 返 回 : 无
- =============================================================*/
- static void KB_TxtConverTxtData(INT32 i_nWidth, INT32 i_nHeight, ColrRef nTextBgColor,
- ColrRef nTextColor, UINT8 * i_pcSrcData,
- UINT8 nTimeHR, UINT8 nTimeVT,
- UINT8 * o_pcTarData)
- {
- INT32 bitsCount;
- INT32 loop;
- UINT8 byte;
- UINT8 value;
- INT32 VTLoop, HRLoop;
- INT32 index;
- UINT8 acBGOsdBytes[KB_OSD_BYTES];
- UINT8 acTextOsdBytes[KB_OSD_BYTES];
- UINT8 acOsdBytes[KB_OSD_BYTES];
- UINT16 *pnDestData;
- UINT16 *pnSrcData;
- UINT16 *pnBGData;
- UINT16 *pnTextData;
- UINT16 *pnOsdData;
- #if (KB_OSD_BYTES == 2)
- UINT16 nTextData;
- #endif
- #if (KB_OSD_BYTES == 3)
- KB_OSDRGB tColor;
- #endif
- #if (KB_OSD_BYTES == 2)
- KB_OSD_ColorRef_TO_ARGB16(nTextBgColor, acBGOsdBytes);
- KB_OSD_ColorRef_TO_ARGB16(nTextColor, acTextOsdBytes);
- #elif (KB_OSD_BYTES == 3)
- KB_OSDRef2Rgb(nTextBgColor, &tColor);
- memcpy(acBGOsdBytes, &tColor, 3);
- KB_OSDRef2Rgb(nTextColor, &tColor);
- memcpy(acTextOsdBytes, &tColor, 3);
- #endif
- //对于KB_OSD_BYTES == 2 ,则TEXT_USE_MEMCPY == TRUE,
- //对于KB_OSD_BYTES == 3, 则TEXT_USE_MEMCPY == TRUE
- pnDestData = (UINT16 *)o_pcTarData;
- pnSrcData = (UINT16 *)i_pcSrcData;
- pnTextData = (UINT16 *)acTextOsdBytes;
- pnBGData = (UINT16 *)acBGOsdBytes;
- pnOsdData = (UINT16 *)acOsdBytes;
- bitsCount = i_nWidth * i_nHeight;
- for(loop = 0; loop < bitsCount; loop ++)
- {
- byte = i_pcSrcData[loop>>3]; /*点所在字节*/
- value = (byte<<(loop%8))&0x80;
- if(value == 0x80)
- {
- #if (TEXT_USE_MEMCPY == TRUE)
- memcpy(acOsdBytes, acTextOsdBytes, KB_OSD_BYTES);
- #else
- nTextData = *pnTextData;
- #endif
- }
- else
- {
- #if (TEXT_USE_MEMCPY == TRUE)
- memcpy(acOsdBytes, acBGOsdBytes, KB_OSD_BYTES);
- #else
- nTextData = *pnBGData;
- #endif
- }
- for(VTLoop = 0; VTLoop < nTimeVT; VTLoop ++)
- {
- for(HRLoop = 0; HRLoop < nTimeHR; HRLoop ++)
- {
- #if (TEXT_USE_MEMCPY == TRUE)
- index = (i_nWidth * nTimeHR * (loop / i_nWidth * nTimeVT + VTLoop)
- + (loop % i_nWidth) * nTimeHR + HRLoop) * KB_OSD_BYTES;
- memcpy(o_pcTarData + index, acOsdBytes, KB_OSD_BYTES);
- #else
- index = (i_nWidth * nTimeHR * (loop / i_nWidth * nTimeVT + VTLoop)
- + (loop % i_nWidth) * nTimeHR + HRLoop);
- pnDestData[index] = nTextData;
- #endif
- }
- }/* end VTLoop */
- }
- }
- /*=============================================================
- 函数名称 : KB_TxtCopyRectData
- 功 能 : 将一个文本字符的显示数据,拷贝到另外 的存储区
- 该存储区保存有原osd 的数据,故可根据需要实现
- 透明效果
- 入 口 : INT32 i_nSrcWidth 源 矩形区域内的宽
- INT32 i_nSrcHeight 源 矩形区域内的高
- INT32 i_nTarWidth 目的矩形区域的宽
- INT32 i_nX 源矩形区域相对于目的的X 偏移
- INT32 i_nY 源矩形区域相对于目的的Y偏移
- UINT8 * i_pnSrcData 源矩形区域内的文本数据
- ColrRef nBGColor 文本背景色,在透明效果下,
- 背景色不显示相当于透明色
- UINT8 nTranFlag 透明效果标志位
- UINT8 * o_pnTarData 目的矩形区域内的原始数据
- 出 口 :UINT8 * o_pnTarData 存入源文本字符显示数据之后的目的数据
- 返 回 : 无
- =============================================================*/
- static void KB_TxtCopyRectData(INT32 i_nSrcWidth, INT32 i_nSrcHeight, INT32 i_nTarWidth,
- INT32 i_nX, INT32 i_nY, UINT8 * i_pnSrcData,
- ColrRef nBGColor, UINT8 nTranFlag,
- UINT8 * o_pnTarData)
- {
- INT32 loop, loopCount;
- INT32 cur_x, cur_y, nTarOffset;
- UINT8 acOsdBytes[KB_OSD_BYTES];
- UINT16 *pnDestData;
- UINT16 *pnSrcData;
- UINT16 *pnBGData;
- #if (KB_OSD_BYTES == 3)
- KB_OSDRGB tColor;
- #endif
-
-
- #if (KB_OSD_BYTES == 2)
- KB_OSD_ColorRef_TO_ARGB16(nBGColor, acOsdBytes);
- #elif (KB_OSD_BYTES == 3)
- KB_OSDRef2Rgb(nBGColor, &tColor);
- memcpy(acOsdBytes, &tColor, 3);
- #endif
- pnDestData = (UINT16 *)o_pnTarData;
- pnSrcData = (UINT16 *)i_pnSrcData;
- pnBGData = (UINT16 *)acOsdBytes;
- loopCount = i_nSrcWidth * i_nSrcHeight;
-
- if (nTranFlag == TEXT_TRUE)
- {
- for(loop = 0; loop < loopCount; loop ++)
- {
- cur_x = i_nX + loop % i_nSrcWidth;
- cur_y = i_nY + loop / i_nSrcWidth;
- #if (TEXT_USE_MEMCPY == TRUE)
- if( memcmp(i_pnSrcData + loop * KB_OSD_BYTES, acOsdBytes, KB_OSD_BYTES) != 0)
- {
- nTarOffset = (cur_y * i_nTarWidth + cur_x) * KB_OSD_BYTES;
- memcpy(o_pnTarData + nTarOffset, i_pnSrcData + loop * KB_OSD_BYTES, KB_OSD_BYTES);
- }
- #else
- if (pnSrcData[loop] != *pnBGData)
- {
- nTarOffset = (cur_y * i_nTarWidth + cur_x);
- pnDestData[nTarOffset] = pnSrcData[loop];
- }
- #endif
- }
- }
- else
- {
- for(loop = 0; loop < loopCount; loop ++)
- {
- cur_x = i_nX + loop % i_nSrcWidth;
- cur_y = i_nY + loop / i_nSrcWidth;
- #if (TEXT_USE_MEMCPY == TRUE)
- nTarOffset = (cur_y * i_nTarWidth + cur_x) * KB_OSD_BYTES;
- memcpy(o_pnTarData + nTarOffset, i_pnSrcData + loop * KB_OSD_BYTES, KB_OSD_BYTES);
- #else
- nTarOffset = (cur_y * i_nTarWidth + cur_x);
- pnDestData[nTarOffset] = pnSrcData[loop];
- #endif
- }
- }
- }
- /*=============================================================
- 函数名称 : KB_TxtWriteStrToRect
- 功 能 :由文本字符串得到所需效果的显示数据
- 入 口 : char * i_pcStr 待显示的文本字符串
- ColrRef nBGColor 文本背景色
- ColrRef tTextColor 文本颜色
- UINT8 nTimeHR 水平放大倍数
- UINT8 nTimeVT 垂直放大倍数
- UINT8 nTranFlag 透明效果标志
- UINT8 * o_pcTarData 存放用于显示的数据
- 出 口 :
- 返 回 : RETOK ---成功,RETFIAL1 ---失败
- =============================================================*/
- static void KB_TxtWriteStrToRect(char * i_pcStr, ColrRef nBGColor, ColrRef tTextColor,
- UINT8 nTimeHR, UINT8 nTimeVT,
- UINT8 nTranFlag, UINT8 * o_pcTarData)
- {
- INT32 width, height;
- INT32 strWidth, strHeight;
- INT32 x, y;
- long sumPixels;
- KB_TxtGetStrWidHei(i_pcStr, &strWidth, &strHeight);
- strWidth *= nTimeHR;
- strHeight *= nTimeVT;
- sumPixels = (strWidth * strHeight);
- if(sumPixels > TEXT_MAX_PIXELS)
- {
- printf("nERROR===KB_TxtWriteStrToRect==文本像素超过TEXT_MAX_PIXELSn");
- return;
- }
- x = 0;
- while( KB_TxtGetData(&i_pcStr, gTxtBmpBuf, &width, &height) != TEXT_FALSE)
- {
- KB_TxtConverTxtData(width, height, nBGColor, tTextColor, gTxtBmpBuf, nTimeHR, nTimeVT,
- anOneWordPic);
- height *= nTimeVT;
- width *= nTimeHR;
- y = strHeight - height;/*下对齐*/
- KB_TxtCopyRectData(width, height, strWidth, x, y, anOneWordPic, nBGColor, nTranFlag, o_pcTarData);
- x += width;
- }
- }
- unsigned char *KB_TxtGetDataFromLib(KB_OSDRect *pRect,ColrRef fColor,ColrRef bColor,UINT8 nTimeHR,UINT8 nTimeVT,UINT8* pStr,UINT32 *width,UINT32 *height)
- {
- INT32 strLength, strHeight;
- KB_OSDRect tRect;
- KB_TxtGetStrWidHei((char*)pStr,&strLength,&strHeight);
- strLength*=nTimeHR;
- strHeight*=nTimeVT;
- tRect.nX=pRect->nX;
- tRect.nY=pRect->nY;
- tRect.nWidth=strLength;
- tRect.nHeight=strHeight;
- *width=strLength;
- *height=strHeight;
-
- if((strLength*strHeight)==0||(strLength*strHeight)>TEXT_MAX_PIXELS)
- return NULL;
- KB_TxtWriteStrToRect((char*)pStr,bColor,fColor,nTimeHR,nTimeVT,0,gTxtPicBuf);
- return gTxtPicBuf;
- }