digfont.c 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309
  1. /*
  2. * File : digfont.c
  3. * This file is part of RT-Thread RTOS
  4. * COPYRIGHT (C) 2006 - 2012, RT-Thread Development Team
  5. *
  6. * The license and distribution terms for this file may be
  7. * found in the file LICENSE in this distribution or at
  8. * http://www.rt-thread.org/license/LICENSE
  9. *
  10. * Change Logs:
  11. * Date Author Notes
  12. * 2012-12-21 pife first version
  13. */
  14. #include <rtthread.h>
  15. #include <rtgui/rtgui.h>
  16. #include <rtgui/dc.h>
  17. #include <rtgui/widgets/digfont.h>
  18. #define DIGFONT_V 1
  19. #define DIGFONT_H 0
  20. int rtgui_digitfont_create(struct rtgui_digitfont * font)
  21. {
  22. int i;
  23. int half;
  24. int space;
  25. int seg35_y;
  26. int hight;
  27. struct rtgui_digitfont_data * data, *databuf;
  28. struct rtgui_digitfont_data temp, temp2;;
  29. data= rt_malloc(sizeof(struct rtgui_digitfont_data) * 7 * font->seg1_nr);
  30. if (data== RT_NULL)
  31. {
  32. rt_kprintf("out of memory.\n");
  33. goto __err;
  34. }
  35. databuf = font->data = data;
  36. data = &temp;
  37. half = font->seg1_nr >> 1;
  38. space = font->seg1_hspace;
  39. seg35_y = font->seg1_vspace + font->seg2_len + (half<<1) - font->seg1_vspace;
  40. hight = (font->seg1_vspace << 1) + font->seg2_len + font->seg3_len + (half << 1) - 1;
  41. //seg 1
  42. data->type = DIGFONT_H;
  43. data->x = font->seg1_hspace;
  44. data->y = 0;
  45. data->len = font->seg1_len;
  46. *databuf++ = *data;
  47. for(i=1; i<font->seg1_nr; i++)
  48. {
  49. data->len -= 2;
  50. data->x ++;
  51. data->y ++;
  52. *databuf++ = *data;
  53. }
  54. //seg 2
  55. data->type = DIGFONT_V;
  56. data->x = (font->seg1_hspace << 1) + font->seg1_len -1;
  57. data->y = font->seg1_vspace ;
  58. data->len = font->seg2_len;
  59. *databuf++ = *data;
  60. for(i=1; i<font->seg1_nr; i++)
  61. {
  62. if (i >= half)
  63. {
  64. data->len -= 2;
  65. }
  66. data->x --;
  67. data->y ++;
  68. *databuf++ = *data;
  69. }
  70. //seg 3
  71. data->type = DIGFONT_V;
  72. data->x = (font->seg1_hspace << 1) + font->seg1_len -1;
  73. data->y = seg35_y;
  74. data->len = font->seg3_len;
  75. *databuf++ = *data;
  76. temp2 = *data;
  77. for(i=1; i<font->seg1_nr; i++)
  78. {
  79. if (i < half)
  80. data->y --;
  81. else
  82. {
  83. data->len -= 2;
  84. data->y ++;
  85. }
  86. data->x --;
  87. *databuf++ = *data;
  88. }
  89. // seg4
  90. data->type = DIGFONT_H;
  91. data->x = font->seg1_hspace;
  92. data->y = hight -1;
  93. data->len = font->seg1_len;
  94. *databuf++ = *data;
  95. for(i=1; i<font->seg1_nr; i++)
  96. {
  97. data->len -= 2;
  98. data->x ++;
  99. data->y --;
  100. *databuf++ = *data;
  101. }
  102. //seg5
  103. data->type = DIGFONT_V;
  104. data->x = 0;
  105. data->y = seg35_y;
  106. data->len = font->seg3_len;
  107. *databuf++ = *data;
  108. for(i=1; i<font->seg1_nr; i++)
  109. {
  110. if (i < half)
  111. data->y --;
  112. else
  113. {
  114. data->len -= 2;
  115. data->y ++;
  116. }
  117. data->x ++;
  118. *databuf++ = *data;
  119. }
  120. //seg 6
  121. data->type = DIGFONT_V;
  122. data->x = 0;
  123. data->y = font->seg1_vspace ;
  124. data->len = font->seg2_len;
  125. *databuf++ = *data;
  126. for(i=1; i<font->seg1_nr; i++)
  127. {
  128. if (i >= half)
  129. {
  130. data->len -= 2;
  131. }
  132. data->x ++;
  133. data->y ++;
  134. *databuf++ = *data;
  135. }
  136. //seg7
  137. data->type = DIGFONT_H;
  138. data->x = font->seg1_hspace + half - 1;
  139. data->y = font->seg1_vspace + font->seg2_len + half -1;
  140. data->len = (font->seg1_hspace << 1) + font->seg1_len - \
  141. ((font->seg1_hspace + half -1) << 1);
  142. *databuf++ = *data;
  143. temp2 = *data;
  144. for(i=0; i<half; i++)
  145. {
  146. data->x ++;
  147. data->y --;
  148. data->len -= 2;
  149. *databuf++ = *data;
  150. }
  151. *data = temp2;
  152. for (i=0; i<half; i++)
  153. {
  154. data->x ++;
  155. data->y ++;
  156. data->len -= 2;
  157. *databuf++ = *data;
  158. }
  159. return 0;
  160. __err:
  161. return -1;
  162. }
  163. int rtgui_dc_draw_digitfont(struct rtgui_dc *dc, struct rtgui_digitfont * font, rtgui_rect_t * rect)
  164. {
  165. int i, size;
  166. struct rtgui_digitfont_data * data;
  167. size = font->seg1_nr * 7;
  168. data = font->data;
  169. for(i=0; i<size; i++)
  170. {
  171. if (data->type == DIGFONT_H)
  172. rtgui_dc_draw_hline(dc, rect->x1 + data->x, \
  173. rect->x1 + data->x + data->len, rect->y1 + data->y);
  174. else
  175. rtgui_dc_draw_vline(dc, rect->x1 + data->x, rect->y1 + data->y, \
  176. rect->y1 + data->y + data->len);
  177. data++;
  178. }
  179. }
  180. const char digtube_code_table[] =
  181. { 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,};
  182. int rtgui_dc_draw_digitfont_code(struct rtgui_dc *dc, struct rtgui_digitfont * font, rtgui_rect_t * rect, char code)
  183. {
  184. int i,j;
  185. struct rtgui_digitfont_data * data;
  186. rtgui_color_t color;
  187. data = font->data;
  188. color = RTGUI_DC_FC(dc);
  189. for(i=0; i<7; i++)
  190. {
  191. if (code & (1 << i))
  192. RTGUI_DC_FC(dc) = color;
  193. else
  194. RTGUI_DC_FC(dc) = RTGUI_DC_BC(dc);
  195. for (j=0; j<font->seg1_nr; j++)
  196. {
  197. if (data->type == DIGFONT_H)
  198. rtgui_dc_draw_hline(dc, rect->x1 + data->x, \
  199. rect->x1 + data->x + data->len, rect->y1 + data->y);
  200. else
  201. rtgui_dc_draw_vline(dc, rect->x1 + data->x, rect->y1 + data->y, \
  202. rect->y1 + data->y + data->len);
  203. data++;
  204. }
  205. }
  206. RTGUI_DC_FC(dc) = color;
  207. return 0;
  208. }
  209. int rtgui_get_digfont_metrics(struct rtgui_digitfont * font, rtgui_rect_t * rect)
  210. {
  211. int half = font->seg1_nr >> 1;
  212. rect->x1 = 0;
  213. rect->y1 = 0;
  214. rect->x2 = (font->seg1_hspace << 1) + font->seg1_len;
  215. rect->y2 = (font->seg1_vspace << 1) + font->seg2_len + font->seg3_len + (half << 1) - 1;
  216. return 0;
  217. }
  218. /* debug */
  219. struct rtgui_digitfont digitfont_40 =
  220. {
  221. 34, //int seg1_len;
  222. 3, //int seg1_hspace;
  223. 1, //int seg1_vpace;
  224. 9, //int seg1_nr; //9
  225. 30, //int seg2_len;
  226. 30, //int seg3_len;
  227. RT_NULL,
  228. };
  229. #ifdef _WIN32
  230. #include <windows.h>
  231. #include <stdio.h>
  232. #include <stdlib.h>
  233. #include <string.h>
  234. static char fontbuf[80];
  235. int digfont_file(char * name, struct rtgui_digitfont * font)
  236. {
  237. int i;
  238. int size;
  239. FILE * file;
  240. struct rtgui_digitfont_data * data;
  241. if (font->data == RT_NULL)
  242. rtgui_digitfont_create(font);
  243. /* create a file to store data */
  244. file = fopen(name, "wb + ");
  245. if (file == RT_NULL)
  246. {
  247. rt_kprintf("open < % s > failed.\n", name);
  248. return -1;
  249. }
  250. data = font->data;
  251. size = font->seg1_nr * 7;
  252. for( i=0; i<size; i++)
  253. {
  254. if ((i % (font->seg1_nr)) == 0)
  255. {
  256. sprintf(fontbuf, "\n/* seg <%d> */\n", i/font->seg1_nr + 1);
  257. fwrite(fontbuf, strlen(fontbuf), 1, file);
  258. }
  259. sprintf(fontbuf, " { % 2d, % 2d, % 2d, % 2d}, \n", data->x, data->y, data->len, data->type);
  260. fwrite(fontbuf, strlen(fontbuf), 1, file);
  261. data ++;
  262. }
  263. fclose(file);
  264. return 0;
  265. }
  266. #if defined(RT_USING_FINSH)
  267. #include <finsh.h>
  268. FINSH_FUNCTION_EXPORT(digfont_file, create the font file of digit font)
  269. #endif
  270. #endif