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

DVD

开发平台:

C/C++

  1. //*****************************************************************************
  2. //File Name: kb_machblue_text.c
  3. //
  4. //Description: text function
  5. //
  6. // used by Machblue to access the platform's font api
  7. // used by Machblue to access the platform's text drawing api
  8. //
  9. //Author: wisco & steven  
  10. //
  11. //Date:  2006.12.29
  12. //
  13. //Version:  v1.0
  14. //*****************************************************************************
  15. #include "gendef.h"
  16. #include "Text.h"
  17. #include "machblue_defines.h"
  18. #include "machblue_porting_core.h"
  19. #include "kb_machblue_client_define.h"
  20. #define  MB_TEXT_MAX_PIXELS   640*48
  21. /* 20点阵字库数据 */
  22. extern const unsigned char j_zk20[355700];
  23. /**
  24.  * Creates a new font object.
  25.  * font < pointer to font to create >
  26.  * font_name < name of the font to create >
  27.  * style < style of the font to create >
  28.  * size         < size of the font to create >
  29.  
  30.  * @return MB_SUCCESS and updates "font" on success, MB_FAILURE othrewise.
  31.  */
  32. mb_error_t mb_font_create(mb_font_t *font,const mb_char_t *font_name,mb_font_style_t style,int size)
  33. {
  34. kb_movie_font_t  *p_font;
  35. //mb_printf("nmb_font_create");
  36. p_font=(kb_movie_font_t *)mb_malloc(sizeof(kb_movie_font_t));
  37. if(p_font==NULL)
  38. {
  39. mb_printf("n[Machblue]:Font create malloc error.");
  40. return MB_FAILURE;
  41. }
  42. switch(size)
  43. {
  44. case 16:
  45. break;
  46. case 20:
  47. p_font->m_dfb_font.Ascender=10; 
  48. p_font->m_dfb_font.Descender=10;  
  49. p_font->m_dfb_font.Height=20;  
  50. p_font->m_dfb_font.MaxAdvance=0; 
  51. p_font->m_dfb_font.Kerning=0; 
  52. p_font->m_dfb_font.StringWidth=0;  
  53. p_font->m_dfb_font.StringExtents=0;    
  54. p_font->m_dfb_font.GlyphExtents=0;  
  55. p_font->address.Address=(UINT8 *)(j_zk20);
  56. p_font->address.English_Adderss=(UINT8 *)(j_zk20+3200);
  57. p_font->address.Chinese_Adderss=(UINT8 *)(j_zk20+14100);
  58. break;
  59. case 24:
  60. break;
  61. default:
  62. p_font->m_dfb_font.Ascender=10; 
  63. p_font->m_dfb_font.Descender=10;  
  64. p_font->m_dfb_font.Height=20;  
  65. p_font->m_dfb_font.MaxAdvance=0; 
  66. p_font->m_dfb_font.Kerning=0; 
  67. p_font->m_dfb_font.StringWidth=0;  
  68. p_font->m_dfb_font.StringExtents=0;    
  69. p_font->m_dfb_font.GlyphExtents=0;  
  70. p_font->address.Address=(UINT8 *)(j_zk20);
  71. p_font->address.English_Adderss=(UINT8 *)(j_zk20+3200);
  72. p_font->address.Chinese_Adderss=(UINT8 *)(j_zk20+14100);
  73. break;
  74. }
  75. p_font->font_name=font_name;
  76. p_font->m_size=size;
  77. *font=(mb_font_t)p_font;
  78. return  MB_SUCCESS;
  79. }
  80. /**
  81.  * Deletes an existing font object.
  82.  *
  83.  * font  < font object to delete >
  84.  *
  85.  * @return MB_SUCCESS on success and MB_FAILURE on failure.
  86.  */
  87. mb_error_t mb_font_delete(mb_font_t font)
  88. {
  89. kb_movie_font_t  *p_font=(kb_movie_font_t *)font;
  90. //mb_printf("nmb_font_delete");
  91. if(p_font==NULL)
  92. {
  93. mb_printf("n[Machblue]:Font delete NULL.");
  94. return MB_FAILURE;
  95. }
  96. mb_free(p_font);
  97. return MB_SUCCESS;
  98. }
  99. /**
  100.  * Sets a new font size to the font object.
  101.  * font < font object to modify >
  102.  * new_size  < new size to set >
  103.  
  104.  * @return MB_SUCCESS on success and MB_FAILURE on failure.
  105.  */
  106. mb_error_t mb_font_size_set(mb_font_t font,int new_size)
  107. {
  108. //mb_printf("nmb_font_size_set");
  109. return MB_SUCCESS;
  110. }
  111. /**
  112.  * Gets a font object attributes.
  113.  * font < font object to query >
  114.  * size < pointer to int to store font size >
  115.  * ascender < pointer to int to store font ascender >
  116.  * spacing    < pointer to int to store font spacing >
  117.  
  118.  * @return MB_SUCCESS on success and MB_FAILURE on failure.
  119.  */
  120. mb_error_t mb_font_attributes_get(mb_font_t font,int *out_size,int *out_ascender,int *out_spacing)
  121. {
  122. kb_movie_font_t *p_font=(kb_movie_font_t *)font;
  123. //mb_printf("nmb_font_attributes_get [%d][%d][%d]",p_font->m_size,p_font->m_dfb_font.Ascender,p_font->m_dfb_font.MaxAdvance);
  124. if(p_font==NULL)
  125. {
  126. mb_printf("n[Machblue]:Font get attributes NULL.");
  127. return MB_FAILURE;
  128. }
  129. *out_size=p_font->m_size;
  130. *out_ascender=p_font->m_dfb_font.Ascender;
  131. *out_spacing=p_font->m_dfb_font.MaxAdvance;
  132. return MB_SUCCESS;
  133. }
  134. /**
  135.  * Gets a text extent (bounds).
  136.  * text < text to evaluate >
  137.  * length < length in characters of the text to evaluate >
  138.  * font < font to use for the extent calculation >
  139.  * bounds    < pointer to mb_rect_t used to store calculated extent >
  140.  
  141.  * @return MB_SUCCESS on success and MB_FAILURE on failure.
  142.  */
  143. mb_error_t mb_text_bounds_get(const mb_char_t *text,int length,mb_font_t font,mb_rect_t *bounds)
  144. {
  145. kb_movie_font_t *pFont=(kb_movie_font_t *)font;
  146. INT32 strWidth,strHeight; 
  147. if(pFont==NULL)
  148. {
  149. mb_printf("n[Machblue]:Text get bounds NULL.");
  150. return MB_FAILURE;
  151. }
  152. switch(pFont->m_size)
  153. {
  154. case 16:
  155. case 32:
  156.   KB_TxtSetCharType(TEXT_ENG16X8);
  157. KB_TxtSetHZType(TEXT_HZ16X16);
  158. break;
  159. case 20:
  160. case 40:
  161. KB_TxtSetCharType(TEXT_ENG20X10);
  162. KB_TxtSetHZType(TEXT_HZ20X20);
  163. break;
  164. case 24:
  165. case 48:
  166. KB_TxtSetCharType(TEXT_ENG24X12);
  167. KB_TxtSetHZType(TEXT_HZ24X24);
  168.   break; 
  169. default:
  170. KB_TxtSetCharType(TEXT_ENG20X10);
  171. KB_TxtSetHZType(TEXT_HZ20X20);
  172. break;
  173. }
  174. KB_TxtGetStrWidHei((char*)text,&strWidth,&strHeight);
  175. bounds->x=0;
  176. bounds->y=0;
  177. bounds->height=(int)strHeight;
  178. bounds->width=(int)strWidth;
  179. //mb_printf("nmb_text_bounds_get text[%s] length[%d] [%d][%d]",text,length,strHeight,strWidth);
  180. return MB_SUCCESS;
  181. }
  182. /**
  183.  * Draws a text into a surface.
  184.  * text < text to draw >
  185.  * length < length in characters of the text to draw >
  186.  * surface < destination surface to draw text to >
  187.  * font,        < font to draw text with >
  188.  * baseline_anchor_point < anchor point to draw text at (relative to surface) >
  189.  * clipping_rect           < text clipping rectangle (relative to surface) >
  190.  * color             < color of the text to draw in native surface format >
  191.  
  192.  * @return MB_SUCCESS on success and MB_FAILURE on failure.
  193.  */
  194. UINT32 mb_color_translate(unsigned int color)
  195. {
  196. UINT32 a1,a2,a3,a4;
  197. //mb_printf("nmb_color_translate color[%d]",color);
  198. a1 = (UINT32)((UINT32)((UINT32)color/(16*16*16))%16);
  199. a2 = (UINT32)((UINT32)((UINT32)color/(16*16))%16);
  200. a3 = (UINT32)((UINT32)((UINT32)color/16)%16);
  201. a4 = (UINT32)((UINT32)color%16);
  202. a1 = a1 * 17;
  203. a2 = a2 * 17;
  204. a3 = a3 * 17;
  205. a4 = a4 * 17;
  206. a1 = a1 * (16*16*16*16*16*16);
  207. a2 = a2 * (16*16*16*16);
  208. a3 = a3 * (16*16);
  209. a4 = a4;
  210. return a1+a2+a3+a4;
  211. }
  212. mb_error_t mb_text_draw(const mb_char_t *text,int length,mb_surface_t surface,mb_font_t font,
  213.         mb_point_t *baseline_anchor_point,mb_rect_t *clipping_rect,unsigned int color)
  214. {
  215. unsigned char nTimeHR,nTimeVT,*pData,*pSurBuf,*pSrc,*pDes;
  216. ColrRef bgColor;
  217. KB_OSDRect osdRect;
  218. kb_movie_font_t *pFont=(kb_movie_font_t *)font;
  219. mb_rect_t tRect;
  220. unsigned long index,strWidth,strHeight,offset;
  221. int sPitch;
  222. UINT32 text_color;
  223. if(pFont->m_size==32||pFont->m_size==40||pFont->m_size==48)
  224. {
  225. nTimeVT=2;
  226. nTimeHR=2;
  227. }
  228. else
  229. {
  230. nTimeVT=1;
  231. nTimeHR=1;
  232. bgColor=KB_COLOR_TRANSPARENCY; 
  233. switch(pFont->m_size)
  234. {
  235. case 16:
  236. case 32:
  237.   KB_TxtSetCharType(TEXT_ENG16X8);
  238. KB_TxtSetHZType(TEXT_HZ16X16);
  239. break;
  240. case 20:
  241. case 40:
  242. KB_TxtSetCharType(TEXT_ENG20X10);
  243. KB_TxtSetHZType(TEXT_HZ20X20);
  244. break;
  245. case 24:
  246. case 48:
  247. KB_TxtSetCharType(TEXT_ENG24X12);
  248. KB_TxtSetHZType(TEXT_HZ24X24);
  249.   break; 
  250. default:
  251. KB_TxtSetCharType(TEXT_ENG20X10);
  252. KB_TxtSetHZType(TEXT_HZ20X20);
  253. break;
  254. }
  255. osdRect.nX=clipping_rect->x;
  256. osdRect.nY=clipping_rect->y;
  257. osdRect.nWidth=clipping_rect->width;
  258. osdRect.nHeight=clipping_rect->height;
  259. text_color = mb_color_translate(color);
  260. pData=KB_TxtGetDataFromLib(&osdRect,text_color,bgColor,nTimeHR,nTimeVT,(UINT8*)text,&strWidth,&strHeight);
  261. if(pData==NULL)
  262. {
  263. mb_printf("n[Machblue]:Text draw error.");
  264. return MB_FAILURE;
  265. }
  266. tRect.x=baseline_anchor_point->x;
  267. tRect.y=baseline_anchor_point->y;
  268. tRect.width=(unsigned int)strWidth;
  269. tRect.height=(unsigned int)strHeight;
  270. mb_surface_lock(surface,&sPitch,(void **)&pSurBuf);
  271. pSurBuf+=(tRect.y*KB_OSD_WIDTH+tRect.x)*KB_OSD_BYTES;
  272. for(index=0;index<tRect.height;index++)
  273. {
  274. pSrc=(unsigned char*)&pData[index*strWidth*KB_OSD_BYTES];
  275. pDes=(unsigned char*)&pSurBuf[index*KB_OSD_WIDTH*KB_OSD_BYTES];
  276. for(offset=0;offset<((unsigned long)(tRect.width)*KB_OSD_BYTES);)
  277. {
  278. if((pSrc[offset]!=0)&&(pSrc[offset+1]!=0))
  279. {
  280. pDes[offset]=pSrc[offset];
  281. pDes[offset+1]=pSrc[offset+1];
  282. }
  283. offset+=2;
  284. }
  285. }
  286. return MB_SUCCESS ;
  287. }