font_hz_bmp.c 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  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. #ifdef RTGUI_USING_FONT_COMPACT
  14. extern rt_uint32_t rtgui_font_mph12(const rt_uint16_t key);
  15. extern rt_uint32_t rtgui_font_mph16(const rt_uint16_t key);
  16. rt_inline const rt_uint8_t *_rtgui_hz_bitmap_get_font_ptr(struct rtgui_font_bitmap *bmp_font,
  17. rt_uint8_t *str,
  18. rt_base_t font_bytes)
  19. {
  20. rt_uint16_t cha = *(rt_uint16_t *)str;
  21. int idx;
  22. if (bmp_font->height == 16)
  23. idx = rtgui_font_mph16(cha);
  24. else // asume the height is 12
  25. idx = rtgui_font_mph12(cha);
  26. /* don't access beyond the data */
  27. if (idx < 0)
  28. idx = 0;
  29. /* get font pixel data */
  30. return bmp_font->bmp + idx * font_bytes;
  31. }
  32. #else
  33. rt_inline const rt_uint8_t *_rtgui_hz_bitmap_get_font_ptr(struct rtgui_font_bitmap *bmp_font,
  34. rt_uint8_t *str,
  35. rt_base_t font_bytes)
  36. {
  37. rt_ubase_t sect, index;
  38. /* calculate section and index */
  39. sect = *str - 0xA0;
  40. index = *(str + 1) - 0xA0;
  41. /* get font pixel data */
  42. return bmp_font->bmp + (94 * (sect - 1) + (index - 1)) * font_bytes;
  43. }
  44. #endif
  45. 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)
  46. {
  47. rtgui_color_t bc;
  48. rt_uint16_t style;
  49. rt_uint8_t *str;
  50. register rt_base_t h, word_bytes, font_bytes;
  51. RT_ASSERT(bmp_font != RT_NULL);
  52. /* get text style */
  53. style = rtgui_dc_get_gc(dc)->textstyle;
  54. bc = rtgui_dc_get_gc(dc)->background;
  55. /* drawing height */
  56. h = (bmp_font->height + rect->y1 > rect->y2) ? rect->y2 - rect->y1 : bmp_font->height;
  57. word_bytes = (bmp_font->width + 7) / 8;
  58. font_bytes = word_bytes * bmp_font->height;
  59. str = (rt_uint8_t *)text;
  60. while (len > 0 && rect->x1 < rect->x2)
  61. {
  62. const rt_uint8_t *font_ptr;
  63. register rt_base_t i, j, k;
  64. /* get font pixel data */
  65. font_ptr = _rtgui_hz_bitmap_get_font_ptr(bmp_font, str, font_bytes);
  66. /* draw word */
  67. for (i = 0; i < h; i ++)
  68. {
  69. for (j = 0; j < word_bytes; j++)
  70. for (k = 0; k < 8; k++)
  71. {
  72. if (((font_ptr[i * word_bytes + j] >> (7 - k)) & 0x01) != 0 &&
  73. (rect->x1 + 8 * j + k < rect->x2))
  74. {
  75. rtgui_dc_draw_point(dc, rect->x1 + 8 * j + k, rect->y1 + i);
  76. }
  77. else if (style & RTGUI_TEXTSTYLE_DRAW_BACKGROUND)
  78. {
  79. rtgui_dc_draw_color_point(dc, rect->x1 + 8 * j + k, rect->y1 + i, bc);
  80. }
  81. }
  82. }
  83. /* move x to next character */
  84. rect->x1 += bmp_font->width;
  85. str += 2;
  86. len -= 2;
  87. }
  88. }
  89. 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)
  90. {
  91. rt_uint32_t len;
  92. struct rtgui_font *efont;
  93. struct rtgui_font_bitmap *bmp_font = (struct rtgui_font_bitmap *)(font->data);
  94. RT_ASSERT(dc != RT_NULL);
  95. /* get English font */
  96. efont = rtgui_font_refer("asc", bmp_font->height);
  97. if (efont == RT_NULL) efont = rtgui_font_default(); /* use system default font */
  98. while (length > 0)
  99. {
  100. len = 0;
  101. while (((rt_uint8_t) * (text + len)) < 0x80 && *(text + len) && len < length) len ++;
  102. /* draw text with English font */
  103. if (len > 0)
  104. {
  105. rtgui_font_draw(efont, dc, text, len, rect);
  106. text += len;
  107. length -= len;
  108. }
  109. len = 0;
  110. while (((rt_uint8_t) * (text + len)) >= 0x80 && len < length) len ++;
  111. if (len > 0)
  112. {
  113. _rtgui_hz_bitmap_font_draw_text(bmp_font, dc, text, len, rect);
  114. text += len;
  115. length -= len;
  116. }
  117. }
  118. rtgui_font_derefer(efont);
  119. }
  120. static void rtgui_hz_bitmap_font_get_metrics(struct rtgui_font *font, const char *text, rtgui_rect_t *rect)
  121. {
  122. struct rtgui_font_bitmap *bmp_font = (struct rtgui_font_bitmap *)(font->data);
  123. RT_ASSERT(bmp_font != RT_NULL);
  124. /* set metrics rect */
  125. rect->x1 = rect->y1 = 0;
  126. /* Chinese font is always fixed font */
  127. rect->x2 = (rt_int16_t)(bmp_font->width * rt_strlen((const char *)text));
  128. rect->y2 = bmp_font->height;
  129. }
  130. #endif