text.c
上传用户:fy98168
上传日期:2015-06-26
资源大小:13771k
文件大小:20k
源码类别:

DVD

开发平台:

C/C++

  1. #include "text.h"
  2. #include "db.h"
  3. #include "flash.h"
  4. #include "zk.h"
  5. #define TEXT_USE_MEMCPY FALSE  /*KB_OSD_BYTES=2时为FALSE,否则为TRUE*/
  6. /* 全局变量 */
  7. static UINT8  gTxtTypeE;    /*英文字体型号*/     
  8. static UINT8  gTxtTypeC;    /*中文字体型号*/
  9. #define  TEXT_MAX_PIXELS  (640 * 48)/*一行文本允许的最大像素*/
  10. static UINT8 *gTxtPicBuf;  /*存放一行文本字符显示数*/ 
  11. static UINT8 anOneWordPic[48*48*KB_OSD_BYTES];/*一个字符的显示数据*/
  12. static UINT8 gTxtBmpBuf[48*48/8];/*字符点阵数据*/
  13. /* 20点阵字库数据 */
  14. extern unsigned char j_zk20[355700];
  15. extern unsigned char ZK_CHN_16[];
  16. extern unsigned char ZK_ENG_16[];
  17. /*字库基址*/
  18. static UINT8* gTxtE24;
  19. static UINT8* gTxtX24;
  20. static UINT8* gTxtC24;
  21. static UINT8* gTxtE16;
  22. static UINT8* gTxtX16;
  23. static UINT8* gTxtC16;
  24. static UINT8* gTxtE20;
  25. static UINT8* gTxtX20;
  26. static UINT8* gTxtC20;
  27. /*=============================================================
  28.  函数名称 : KB_TxtInit
  29.  功    能 :初始化文本显示
  30.  入    口 : 无
  31.  出    口 : 无
  32.  返    回 : 无
  33.  描    述 : 设置相关的静态全局变量,
  34.                     包括显示方式,字体的型号,
  35.                     字库地址,显示缓存
  36.   =============================================================*/
  37. void KB_TxtInit(void)
  38. {
  39. UINT8 *pcTextData;
  40. KB_TxtSetCharType(TEXT_ENG24X12); 
  41. KB_TxtSetHZType(TEXT_HZ24X24);
  42. {
  43. pcTextData = (UINT8*)KB_FlashGetSectorAddr(KB_DB_ZK_SECTOR);
  44. gTxtE24 = (UINT8 *)(pcTextData + 4097); 
  45. gTxtX24 = (UINT8 *)(pcTextData + 22339); 
  46. gTxtC24 = (UINT8 *)(pcTextData + 259221);
  47. gTxtE16 = ZK_ENG_16;
  48. gTxtX16 = ZK_CHN_16; 
  49. gTxtC16 = gTxtX16+ 1410*32; 
  50. gTxtE20 = (UINT8 *)j_zk20; 
  51. gTxtX20  = gTxtE20 + 3200;
  52. gTxtC20 = gTxtX20 + 14100; 
  53. }
  54. gTxtPicBuf = (UINT8*)KB_OSDAllocate(640, 48);
  55. }
  56. /*=============================================================
  57.  函数名称 : KB_TxtSetCharType
  58.  功    能 :   设置英文字体型号
  59.  入    口 : UINT8 nCharType  字体型号
  60.  出    口 : 无
  61.  返    回 : 无
  62.  =============================================================*/
  63. void KB_TxtSetCharType(UINT8 nCharType)
  64. {
  65. if(nCharType >= TEXT_MAXENGTYPE) 
  66. {
  67. nCharType = 0;
  68. }
  69. gTxtTypeE = nCharType;
  70. }
  71. /*=============================================================
  72.  函数名称 : KB_TxtSetCharType
  73.  功    能 :   设置中文字体型号
  74.  入    口 : UINT8 nHZType  字体型号
  75.  出    口 : 无
  76.  返    回 : 无
  77.  =============================================================*/
  78. void KB_TxtSetHZType(UINT8 nHZType)
  79. {
  80. if(nHZType >= TEXT_MAXHZTYPE)
  81. {
  82. nHZType = 0;
  83. }
  84. gTxtTypeC = nHZType;
  85. }
  86. /*=============================================================
  87.  函数名称 : KB_TxtGetData
  88.  功    能 :  从文本字符串取第一个有效的中文或英文字符,
  89.                      获得该字符在当前文本型号下的点阵数据
  90.  入    口 :  char **io_ppcStr 待处理的字符串
  91.  出    口 :  UINT8 *o_pcData 返回的点阵数据
  92.                     INT32 *o_pnWidth 点阵的宽度
  93.                    INT32 *o_pnHeight 点阵的高度
  94.  返    回 :  TEXT_TRUE---成功,TEXT_FALSE ---文本结束
  95.  =============================================================*/
  96. INT32 KB_TxtGetData(char **io_ppcStr, UINT8 *o_pcData,
  97.    INT32 *o_pnWidth, INT32 *o_pnHeight)
  98. {
  99. UINT8          byte1, byte2;                 /* 第一和第二个字节 */
  100. UINT8 *searchHead;                  /* 检索头 */
  101. INT32 qh, wh;                       /* 区号和位号 */
  102. INT32           hzOffset;                     /* 汉字偏移 */
  103. long          offset;                       /* 偏移,以字节为单位 */
  104. INT32           sectNum;                      /* 要检取的字节数 */
  105. INT32           loop;
  106. byte1 = (UINT8)( (*io_ppcStr)[0] );
  107. byte2 = (UINT8)( (*io_ppcStr)[1] );
  108. if(byte1 == 0)                         /* [1] = 0 */
  109. {
  110. return TEXT_FALSE;                      /* 返回TEXT_FALSE */
  111. }
  112. else if(byte1 < 0x80)                               /* [1] < 0x80 */
  113. {
  114. *io_ppcStr = *io_ppcStr + 1;              /* 字符串跳过一个字节 */
  115. switch(gTxtTypeE)
  116. {
  117. case TEXT_ENG16X8:                    /* 英文8*16 */
  118. #ifndef FONT_FONT20_REPLACE_ENG16
  119. *o_pnWidth = 8;
  120. *o_pnHeight = 16;
  121. searchHead = gTxtE16;             /* 检索头 */
  122. sectNum = (8 * 16)/8;               /* 要取的字节数 */
  123. break;
  124. #endif
  125. case TEXT_ENG20X10:                    /* 英文10*20 */
  126. *o_pnWidth = 10;
  127. *o_pnHeight = 20;
  128. searchHead = gTxtE20;             /* 检索头 */
  129. sectNum = (10 * 20)/8;               /* 要取的字节数 */
  130. break;
  131. default:                                /* 英文12*24或其他 */
  132. *o_pnWidth = 12;
  133. *o_pnHeight = 24;
  134. searchHead = gTxtE24;             /* 检索头 */
  135. sectNum = (12 * 24)/8;             /* 要取的字节数 */ 
  136. break;
  137. }
  138. offset = byte1 * sectNum;
  139. }
  140. else                                        /* [1] >= 0x80 */
  141. {
  142. if(byte2 < 0x80)                          /* [2] < 0x80 error */
  143. {
  144. *io_ppcStr = *io_ppcStr + 1;          /* 字符串跳过一个字节 */
  145. switch(gTxtTypeE)
  146. {
  147. case TEXT_ENG16X8:                  /* 英文8*16 */
  148. #ifndef FONT_FONT20_REPLACE_ENG16
  149. *o_pnWidth = 8;
  150. *o_pnHeight = 16;
  151. searchHead = gTxtE16;         /* 检索头 */
  152. sectNum = (8 * 16)/8;           /* 要取的字节数 */
  153. break;
  154. #endif
  155. case TEXT_ENG20X10:                  /* 英文10*20 */
  156. *o_pnWidth = 10;
  157. *o_pnHeight = 20;
  158. searchHead = gTxtE20;         /* 检索头 */
  159. sectNum = (10 * 20)/8;           /* 要取的字节数 */
  160. break;
  161. default:                            /* 英文12*24或其他 */
  162. *o_pnWidth = 12;
  163. *o_pnHeight = 24;
  164. searchHead = gTxtE24;         /* 检索头 */
  165. sectNum = (12 * 24)/8;         /* 要取的字节数 */ 
  166. break;
  167. }
  168. offset = 0;                         /* 偏移为0 */
  169. }
  170. else                                    /* [2] >= 0x80 */
  171. {
  172. *io_ppcStr = *io_ppcStr + 2;           /* 字符串跳过二个字节 */
  173. qh = (INT32)byte1 - 160;     /* 区号和位号 */
  174. wh = (INT32)byte2 - 160;     
  175. hzOffset = 94 * (qh - 1) + (wh - 1); /* 汉字检索偏移 */
  176. switch(gTxtTypeC)
  177. {
  178. case TEXT_HZ16X16:                   /* 汉字16*16 */
  179. sectNum = (16 * 16)/8;           /* 要取的字节数 */
  180. *o_pnWidth = 16;
  181. *o_pnHeight = 16;
  182. /*1-3 在特殊字符区*/
  183. if( hzOffset <= 281 && hzOffset >= 0)       /* 0 <= [汉字检索偏移] <=281 */
  184. {
  185. offset = hzOffset * sectNum;       /* 偏移 */
  186. searchHead = gTxtX16;             /* 检索头 */
  187. }
  188. /*16-87在汉字字符区*/
  189. else if(hzOffset >= 1410 && hzOffset <= 8177)  /* 1410 <= [汉字检索偏移] <= 5164 */
  190. {
  191. offset = (hzOffset - 1410)*sectNum;   /* 偏移 */
  192. searchHead = gTxtC16;               /* 检索头 */
  193. }
  194. /*88-94取特殊字符区的第一个字符*/
  195. else                                      /* 其他 */
  196. {
  197. offset = 0;                           /* 偏移 */
  198. searchHead = gTxtX16;                /* 检索头 */
  199. }
  200. break;
  201. case TEXT_HZ20X20:                   /* 汉字20*20 */
  202. sectNum = (20 * 20)/8;           /* 要取的字节数 */
  203. *o_pnWidth = 20;
  204. *o_pnHeight = 20;
  205. if( hzOffset <= 281 && hzOffset >= 0)       /* 0 <= [汉字检索偏移] <=281 */
  206. {
  207. offset = hzOffset * sectNum;       /* 偏移 */
  208. searchHead = gTxtX20;             /* 检索头 */
  209. }
  210. else if(hzOffset >= 1410 && hzOffset <= 8177)  /* 1410 <= [汉字检索偏移] <= 5164 */
  211. {
  212. offset = (hzOffset - 1410)*sectNum;   /* 偏移 */
  213. searchHead = gTxtC20;               /* 检索头 */
  214. }
  215. else                                      /* 其他 */
  216. {
  217. offset = 0;                           /* 偏移 */
  218. searchHead = gTxtX20;                /* 检索头 */
  219. }
  220. break;
  221. default:                                     /* 汉字24*24或其他 */
  222. sectNum = 24*24 / 8;                     /* 要取的字节数 */
  223. *o_pnWidth = 24;
  224. *o_pnHeight = 24;
  225. if(hzOffset >= 0 && hzOffset <= 281)     /* 0 <= [汉字检索偏移] <=281 */
  226. {
  227. offset = hzOffset * sectNum;         /* 偏移 */
  228. searchHead = gTxtX24;               /* 检索头 */
  229. }
  230. else if(hzOffset >= 1410 && hzOffset <= 8177)  /* 1410 <= [汉字检索偏移] <= 5164 */
  231. {
  232. offset = (hzOffset - 1410) * sectNum;  /* 偏移 */
  233. searchHead = gTxtC24;                /* 检索头 */
  234. }
  235. else               /* 其他 */
  236. {
  237. offset = 0;                          /* 偏移 */
  238. searchHead = gTxtX24;               /* 检索头 */
  239. }
  240. break;
  241. }
  242. }
  243. }
  244. for(loop = 0; loop < sectNum; loop ++)
  245. {
  246. o_pcData[loop] = searchHead[offset + loop];
  247. }
  248.            
  249. return TEXT_TRUE;
  250. }
  251. /*=============================================================
  252.  函数名称 : KB_TxtGetStrWidHei
  253.  功    能 :求出文本字符串在当前中英文字体型号下的显示宽高
  254.                    它会处理掉无效字符
  255.  入    口 : char * i_pcStr  待解析的文本字符串
  256.  出    口 : INT32 * o_pnWidth  文本字符串的宽度
  257.                    INT32 * o_pnHeight  文本字符串的高度
  258. 返    回 : 无
  259.  =============================================================*/
  260. void KB_TxtGetStrWidHei(char * i_pcStr, INT32 * o_pnWidth, INT32 * o_pnHeight)
  261. {
  262.      UINT8          byte1, byte2;                 /* 第一和第二个字节 */
  263.      INT32           width, height;
  264. INT32           loop;
  265. /* 初始化 */
  266. width  = 0;
  267. height = 0;
  268. loop   = 0;
  269. byte1 = (UINT8)i_pcStr[loop];
  270. byte2 = (UINT8)i_pcStr[loop + 1];
  271. while(byte1 != 0)           /* byte1 == 0 时退出 */
  272. {
  273. if(byte1 < 0x80)                               /* [1] < 0x80 */
  274. {
  275. loop = loop + 1;              /* 字符串跳过一个字节 */
  276. switch(gTxtTypeE)
  277. {
  278. case TEXT_ENG16X8:                    /* 英文8*16 */
  279. #ifndef FONT_FONT20_REPLACE_ENG16
  280. width  += 8;
  281. height = (height > 16)?height:16;
  282. break;
  283. #endif
  284. case TEXT_ENG20X10:                    /* 英文10*20 */
  285. width  += 10;
  286. height = (height > 20)?height:20;
  287. break;
  288. default:                                /* 英文12*24或其他 */
  289. width  += 12;
  290. height = (height > 24)?height:24;
  291. break;
  292. }
  293. }     /* end if (byte1 < 0x80) */
  294. else                                        /* [1] >= 0x80 */
  295. {
  296. if(byte2 < 0x80)                          /* [2] < 0x80 error */
  297. {
  298. loop = loop + 1;                    /* 字符串跳过一个字节 */
  299. switch(gTxtTypeE)
  300. {
  301. case TEXT_ENG16X8:                  /* 英文8*16 */
  302. #ifndef FONT_FONT20_REPLACE_ENG16
  303. width  += 8;
  304. height = (height > 16)?height : 16;
  305. break;
  306. #endif
  307. case TEXT_ENG20X10:                  /* 英文8*16 */
  308. width  += 10;
  309. height = (height > 20)?height : 20;
  310. break;
  311. default:                            /* 英文12*24或其他 */
  312. width  += 12;
  313. height = (height > 24)?height : 24;
  314. break;
  315. }
  316. }
  317. else                                    /* [2] >= 0x80 */
  318. {
  319. loop = loop + 2;           /* 字符串跳过二个字节 */
  320. switch(gTxtTypeC)
  321. {
  322. case TEXT_HZ16X16:                   /* 汉字16*16 */
  323. width  += 16;
  324. height = (height > 16)?height:16;
  325. break;
  326. case TEXT_HZ20X20:                   /* 汉字20*20 */
  327. width  += 20;
  328. height = (height > 20)?height:20;
  329. break;
  330. default:                                     /* 汉字24*24或其他 */
  331. width  += 24;
  332. height = (height > 24)?height : 24;
  333. break;
  334. }
  335. }
  336. } /* end else byte1 < 0 */
  337. byte1 = (char)i_pcStr[loop];
  338. byte2 = (char)i_pcStr[loop + 1];
  339. }/* end while */
  340. *o_pnWidth  = width;
  341. *o_pnHeight = height;
  342. }
  343. /*=============================================================
  344.  函数名称 : KB_TxtConverTxtData
  345.  功    能 :  由字符点阵数据获取字符显示数据
  346.  入    口 : INT32 i_nWidth  字符点阵宽度
  347.                    INT32 i_nHeight  字符点阵高度
  348.                    ColrRef nTextBgColor 字符背景色
  349.                    ColrRef nTextColor      字符前景色
  350.                    UINT8 * i_pcSrcData    字符点阵数据
  351.                    UINT8  nTimeHR 水平显示放大倍数
  352.                    UINT8  nTimeVT 垂直显示放大倍数
  353.  出    口 :  UINT8 * o_pcTarData  字符显示数据
  354.  返    回 :  无 
  355.  =============================================================*/
  356. static void KB_TxtConverTxtData(INT32 i_nWidth, INT32 i_nHeight, ColrRef nTextBgColor,
  357.  ColrRef nTextColor, UINT8 * i_pcSrcData,
  358.  UINT8  nTimeHR,   UINT8  nTimeVT,
  359.  UINT8 * o_pcTarData)
  360. {
  361. INT32            bitsCount;
  362. INT32            loop;
  363. UINT8  byte; 
  364. UINT8  value;
  365. INT32            VTLoop, HRLoop;
  366. INT32            index;
  367. UINT8 acBGOsdBytes[KB_OSD_BYTES];
  368. UINT8 acTextOsdBytes[KB_OSD_BYTES];
  369. UINT8 acOsdBytes[KB_OSD_BYTES];
  370. UINT16 *pnDestData;
  371. UINT16 *pnSrcData;
  372. UINT16 *pnBGData;
  373. UINT16 *pnTextData;
  374. UINT16 *pnOsdData;
  375. #if (KB_OSD_BYTES == 2)
  376. UINT16 nTextData;    
  377. #endif
  378. #if (KB_OSD_BYTES == 3)
  379. KB_OSDRGB tColor;
  380. #endif
  381. #if (KB_OSD_BYTES == 2)
  382. KB_OSD_ColorRef_TO_ARGB16(nTextBgColor, acBGOsdBytes);
  383. KB_OSD_ColorRef_TO_ARGB16(nTextColor, acTextOsdBytes);
  384. #elif (KB_OSD_BYTES == 3)
  385. KB_OSDRef2Rgb(nTextBgColor, &tColor);
  386. memcpy(acBGOsdBytes, &tColor, 3);
  387. KB_OSDRef2Rgb(nTextColor, &tColor);       
  388. memcpy(acTextOsdBytes, &tColor, 3);
  389. #endif
  390.        //对于KB_OSD_BYTES == 2 ,则TEXT_USE_MEMCPY == TRUE,
  391.        //对于KB_OSD_BYTES == 3, 则TEXT_USE_MEMCPY == TRUE
  392. pnDestData = (UINT16 *)o_pcTarData;
  393. pnSrcData  = (UINT16 *)i_pcSrcData;
  394. pnTextData = (UINT16 *)acTextOsdBytes;
  395. pnBGData   = (UINT16 *)acBGOsdBytes;
  396. pnOsdData  = (UINT16 *)acOsdBytes;
  397. bitsCount = i_nWidth * i_nHeight;
  398. for(loop = 0; loop < bitsCount; loop ++)
  399. {
  400. byte = i_pcSrcData[loop>>3]; /*点所在字节*/
  401. value = (byte<<(loop%8))&0x80;
  402. if(value == 0x80)                    
  403. {
  404. #if (TEXT_USE_MEMCPY == TRUE)
  405. memcpy(acOsdBytes, acTextOsdBytes, KB_OSD_BYTES);
  406. #else
  407. nTextData = *pnTextData;
  408. #endif
  409. }
  410. else                                 
  411. {
  412. #if (TEXT_USE_MEMCPY == TRUE)
  413. memcpy(acOsdBytes, acBGOsdBytes, KB_OSD_BYTES); 
  414. #else
  415. nTextData = *pnBGData;
  416. #endif
  417. }
  418. for(VTLoop = 0; VTLoop < nTimeVT; VTLoop ++)
  419. {
  420. for(HRLoop = 0; HRLoop < nTimeHR; HRLoop ++)
  421. {
  422. #if (TEXT_USE_MEMCPY == TRUE)
  423. index = (i_nWidth * nTimeHR * (loop / i_nWidth * nTimeVT + VTLoop)
  424. + (loop % i_nWidth) * nTimeHR + HRLoop) * KB_OSD_BYTES;
  425. memcpy(o_pcTarData + index, acOsdBytes, KB_OSD_BYTES);
  426. #else
  427. index = (i_nWidth * nTimeHR * (loop / i_nWidth * nTimeVT + VTLoop)
  428. + (loop % i_nWidth) * nTimeHR + HRLoop);
  429. pnDestData[index] = nTextData;
  430. #endif
  431. }
  432. }/* end VTLoop */
  433. }
  434. }
  435. /*=============================================================
  436.  函数名称 : KB_TxtCopyRectData
  437.  功    能 :  将一个文本字符的显示数据,拷贝到另外 的存储区
  438.                     该存储区保存有原osd 的数据,故可根据需要实现
  439.                     透明效果
  440.  入    口 : INT32 i_nSrcWidth  源 矩形区域内的宽
  441.                    INT32 i_nSrcHeight 源 矩形区域内的高
  442.                    INT32 i_nTarWidth  目的矩形区域的宽
  443.                    INT32 i_nX  源矩形区域相对于目的的X 偏移
  444.                    INT32 i_nY  源矩形区域相对于目的的Y偏移
  445.                    UINT8 * i_pnSrcData 源矩形区域内的文本数据
  446.                    ColrRef nBGColor  文本背景色,在透明效果下,
  447.                                                背景色不显示相当于透明色
  448.                    UINT8 nTranFlag    透明效果标志位
  449.                    UINT8 * o_pnTarData 目的矩形区域内的原始数据
  450.  出    口 :UINT8 * o_pnTarData  存入源文本字符显示数据之后的目的数据
  451.  返    回 :  无
  452.  =============================================================*/
  453. static void KB_TxtCopyRectData(INT32 i_nSrcWidth, INT32 i_nSrcHeight, INT32 i_nTarWidth,
  454.  INT32 i_nX, INT32 i_nY, UINT8 * i_pnSrcData, 
  455.  ColrRef nBGColor, UINT8 nTranFlag,
  456.  UINT8 * o_pnTarData)
  457. {
  458. INT32             loop, loopCount;
  459. INT32             cur_x, cur_y, nTarOffset;
  460.      UINT8 acOsdBytes[KB_OSD_BYTES];
  461.      UINT16 *pnDestData;
  462.      UINT16 *pnSrcData;
  463.      UINT16 *pnBGData;
  464. #if (KB_OSD_BYTES == 3)
  465.      KB_OSDRGB tColor;
  466. #endif
  467.     
  468.     
  469. #if (KB_OSD_BYTES == 2)
  470.      KB_OSD_ColorRef_TO_ARGB16(nBGColor, acOsdBytes);
  471. #elif (KB_OSD_BYTES == 3)
  472.      KB_OSDRef2Rgb(nBGColor, &tColor);
  473.      memcpy(acOsdBytes, &tColor, 3);
  474. #endif
  475.      pnDestData = (UINT16 *)o_pnTarData;
  476.      pnSrcData  = (UINT16 *)i_pnSrcData;
  477.      pnBGData   = (UINT16 *)acOsdBytes;
  478. loopCount = i_nSrcWidth * i_nSrcHeight;
  479.     
  480.      if (nTranFlag == TEXT_TRUE)
  481.      {
  482.      for(loop = 0; loop < loopCount; loop ++)
  483.      {
  484.      cur_x = i_nX + loop % i_nSrcWidth;
  485.      cur_y = i_nY + loop / i_nSrcWidth;
  486. #if (TEXT_USE_MEMCPY == TRUE)
  487.      if( memcmp(i_pnSrcData + loop * KB_OSD_BYTES, acOsdBytes, KB_OSD_BYTES) != 0)
  488.      {
  489.          nTarOffset = (cur_y * i_nTarWidth + cur_x) * KB_OSD_BYTES;
  490.                  memcpy(o_pnTarData + nTarOffset, i_pnSrcData + loop * KB_OSD_BYTES, KB_OSD_BYTES);
  491.      }
  492. #else
  493.      if (pnSrcData[loop] != *pnBGData)
  494.      {
  495.                  nTarOffset = (cur_y * i_nTarWidth + cur_x);
  496.                  pnDestData[nTarOffset] = pnSrcData[loop];
  497.      }    
  498. #endif
  499.      }
  500.      }
  501.      else
  502.      {
  503.          for(loop = 0; loop < loopCount; loop ++)
  504.      {
  505.      cur_x = i_nX + loop % i_nSrcWidth;
  506.      cur_y = i_nY + loop / i_nSrcWidth;
  507. #if (TEXT_USE_MEMCPY == TRUE)
  508.              nTarOffset = (cur_y * i_nTarWidth + cur_x) * KB_OSD_BYTES;
  509.              memcpy(o_pnTarData + nTarOffset, i_pnSrcData + loop * KB_OSD_BYTES, KB_OSD_BYTES);
  510. #else
  511.              nTarOffset = (cur_y * i_nTarWidth + cur_x);
  512.              pnDestData[nTarOffset] = pnSrcData[loop];
  513. #endif
  514.      }
  515.      }
  516. }
  517. /*=============================================================
  518.  函数名称 : KB_TxtWriteStrToRect
  519.  功    能 :由文本字符串得到所需效果的显示数据
  520.  入    口 : char * i_pcStr  待显示的文本字符串
  521.                    ColrRef nBGColor  文本背景色
  522.                    ColrRef tTextColor  文本颜色
  523.                    UINT8 nTimeHR   水平放大倍数
  524.                    UINT8 nTimeVT   垂直放大倍数
  525.                    UINT8 nTranFlag  透明效果标志
  526.                    UINT8 * o_pcTarData 存放用于显示的数据
  527.  出    口 : 
  528.  返    回 :  RETOK ---成功,RETFIAL1 ---失败
  529.  =============================================================*/
  530. static void KB_TxtWriteStrToRect(char * i_pcStr, ColrRef nBGColor, ColrRef tTextColor,
  531.    UINT8 nTimeHR, UINT8 nTimeVT, 
  532.    UINT8 nTranFlag, UINT8 * o_pcTarData)
  533. {
  534. INT32      width, height;
  535. INT32      strWidth, strHeight; 
  536. INT32      x, y;
  537. long     sumPixels;
  538. KB_TxtGetStrWidHei(i_pcStr, &strWidth, &strHeight);
  539. strWidth *= nTimeHR;
  540. strHeight *= nTimeVT;
  541. sumPixels   = (strWidth * strHeight);
  542. if(sumPixels > TEXT_MAX_PIXELS)
  543. {
  544.        printf("nERROR===KB_TxtWriteStrToRect==文本像素超过TEXT_MAX_PIXELSn");
  545. return;
  546. }
  547. x = 0;
  548. while( KB_TxtGetData(&i_pcStr, gTxtBmpBuf, &width, &height) != TEXT_FALSE)
  549. {
  550. KB_TxtConverTxtData(width, height, nBGColor, tTextColor, gTxtBmpBuf, nTimeHR, nTimeVT,
  551.          anOneWordPic);                                              
  552. height *= nTimeVT;
  553. width *= nTimeHR;
  554. y = strHeight - height;/*下对齐*/
  555. KB_TxtCopyRectData(width, height, strWidth, x, y, anOneWordPic, nBGColor, nTranFlag, o_pcTarData);
  556. x += width; 
  557. }
  558. }
  559. unsigned char *KB_TxtGetDataFromLib(KB_OSDRect *pRect,ColrRef fColor,ColrRef bColor,UINT8 nTimeHR,UINT8 nTimeVT,UINT8* pStr,UINT32 *width,UINT32 *height)
  560. {
  561. INT32 strLength, strHeight; 
  562. KB_OSDRect tRect;
  563. KB_TxtGetStrWidHei((char*)pStr,&strLength,&strHeight);
  564. strLength*=nTimeHR;
  565. strHeight*=nTimeVT;
  566. tRect.nX=pRect->nX;
  567. tRect.nY=pRect->nY;
  568. tRect.nWidth=strLength;
  569. tRect.nHeight=strHeight;
  570. *width=strLength;
  571. *height=strHeight;
  572. if((strLength*strHeight)==0||(strLength*strHeight)>TEXT_MAX_PIXELS)
  573. return NULL;
  574. KB_TxtWriteStrToRect((char*)pStr,bColor,fColor,nTimeHR,nTimeVT,0,gTxtPicBuf);    
  575. return gTxtPicBuf;
  576. }