font_hz_bmp.c 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. #include <rtgui/dc.h>
  2. #include <rtgui/font.h>
  3. #ifdef RTGUI_USING_HZ_BMP
  4. static void rtgui_hz_bitmap_font_draw_text(struct rtgui_font* font, struct rtgui_dc* dc, const char* text, rt_ubase_t len, struct rtgui_rect* rect);
  5. static void rtgui_hz_bitmap_font_get_metrics(struct rtgui_font* font, const char* text, rtgui_rect_t* rect);
  6. const struct rtgui_font_engine hz_bmp_font_engine =
  7. {
  8. RT_NULL,
  9. RT_NULL,
  10. rtgui_hz_bitmap_font_draw_text,
  11. rtgui_hz_bitmap_font_get_metrics
  12. };
  13. static void _rtgui_hz_bitmap_font_draw_text(struct rtgui_font_bitmap* bmp_font, struct rtgui_dc* dc, const char* text, rt_ubase_t len, struct rtgui_rect* rect)
  14. {
  15. rt_uint8_t* str;
  16. rtgui_color_t bc;
  17. rt_uint16_t style;
  18. register rt_base_t h, word_bytes, font_bytes;
  19. RT_ASSERT(bmp_font != RT_NULL);
  20. /* get text style */
  21. style = rtgui_dc_get_gc(dc)->textstyle;
  22. bc = rtgui_dc_get_gc(dc)->background;
  23. /* drawing height */
  24. h = (bmp_font->height + rect->y1 > rect->y2)? rect->y2 - rect->y1 : bmp_font->height;
  25. word_bytes = (bmp_font->width + 7)/8;
  26. font_bytes = word_bytes * bmp_font->height;
  27. str = (rt_uint8_t*)text;
  28. while (len > 0 && rect->x1 < rect->x2)
  29. {
  30. const rt_uint8_t* font_ptr;
  31. rt_ubase_t sect, index;
  32. register rt_base_t i, j, k;
  33. /* calculate section and index */
  34. sect = *str - 0xA0;
  35. index = *(str+1) - 0xA0;
  36. /* get font pixel data */
  37. font_ptr = bmp_font->bmp + (94 * (sect - 1) + (index - 1)) * font_bytes;
  38. /* draw word */
  39. for (i=0; i < h; i ++)
  40. {
  41. for (j=0; j < word_bytes; j++)
  42. for (k=0; k < 8; k++)
  43. {
  44. if ( ((font_ptr[i*word_bytes + j] >> (7-k)) & 0x01) != 0 &&
  45. (rect->x1 + 8 * j + k < rect->x2))
  46. {
  47. rtgui_dc_draw_point(dc, rect->x1 + 8*j + k, rect->y1 + i);
  48. }
  49. else if (style & RTGUI_TEXTSTYLE_DRAW_BACKGROUND)
  50. {
  51. rtgui_dc_draw_color_point(dc, rect->x1 + 8*j + k, rect->y1 + i, bc);
  52. }
  53. }
  54. }
  55. /* move x to next character */
  56. rect->x1 += bmp_font->width;
  57. str += 2;
  58. len -= 2;
  59. }
  60. }
  61. static void rtgui_hz_bitmap_font_draw_text (struct rtgui_font* font, struct rtgui_dc* dc, const char* text, rt_ubase_t length, struct rtgui_rect* rect)
  62. {
  63. rt_uint32_t len;
  64. struct rtgui_font *efont;
  65. struct rtgui_font_bitmap* bmp_font = (struct rtgui_font_bitmap*)(font->data);
  66. RT_ASSERT(dc != RT_NULL);
  67. /* get English font */
  68. efont = rtgui_font_refer("asc", bmp_font->height);
  69. if (efont == RT_NULL) efont = rtgui_font_default(); /* use system default font */
  70. while (length > 0)
  71. {
  72. len = 0;
  73. while (((rt_uint8_t)*(text + len)) < 0x80 && *(text + len) && len < length) len ++;
  74. /* draw text with English font */
  75. if (len > 0)
  76. {
  77. rtgui_font_draw(efont, dc, text, len, rect);
  78. text += len;
  79. length -= len;
  80. }
  81. len = 0;
  82. while (((rt_uint8_t)*(text + len)) >= 0x80 && len < length) len ++;
  83. if (len > 0)
  84. {
  85. _rtgui_hz_bitmap_font_draw_text(bmp_font, dc, text, len, rect);
  86. text += len;
  87. length -= len;
  88. }
  89. }
  90. rtgui_font_derefer(efont);
  91. }
  92. static void rtgui_hz_bitmap_font_get_metrics(struct rtgui_font* font, const char* text, rtgui_rect_t* rect)
  93. {
  94. struct rtgui_font_bitmap* bmp_font = (struct rtgui_font_bitmap*)(font->data);
  95. RT_ASSERT(bmp_font != RT_NULL);
  96. /* set metrics rect */
  97. rect->x1 = rect->y1 = 0;
  98. /* Chinese font is always fixed font */
  99. rect->x2 = (rt_int16_t)(bmp_font->width * rt_strlen((const char*)text));
  100. rect->y2 = bmp_font->height;
  101. }
  102. #endif