font_hz_bmp.c 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  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. 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* font, struct rtgui_dc* dc, const char* text, rt_ubase_t len, struct rtgui_rect* rect)
  14. {
  15. rt_base_t h;
  16. rt_uint8_t* str;
  17. struct rtgui_font_bitmap* bmp_font = (struct rtgui_font_bitmap*)(font->data);
  18. RT_ASSERT(bmp_font != RT_NULL);
  19. /* drawing height */
  20. h = (bmp_font->height + rect->y1 > rect->y2)? rect->y2 - rect->y1 : bmp_font->height;
  21. str = (rt_uint8_t*)text;
  22. while (len > 0 && rect->x1 < rect->x2)
  23. {
  24. const rt_uint8_t* font_ptr;
  25. rt_ubase_t sect, index;
  26. register rt_base_t i, j, k;
  27. /* calculate section and index */
  28. sect = *str - 0xA0;
  29. index = *(str+1) - 0xA0;
  30. /* get font pixel data */
  31. font_ptr = bmp_font->bmp + ( 94*(sect-1) + (index-1) )*(bmp_font->width + bmp_font->height);
  32. /* draw word */
  33. for (i=0; i < h; i ++)
  34. {
  35. for (j=0; j < 2; j++)
  36. for (k=0; k < 8; k++)
  37. {
  38. if ( ((font_ptr[i*2 + j] >> (7-k)) & 0x01) != 0 &&
  39. (rect->x1 + 8 * j + k < rect->x2))
  40. {
  41. rtgui_dc_draw_point(dc, rect->x1 + 8*j + k, rect->y1 + i);
  42. }
  43. }
  44. }
  45. /* move x to next character */
  46. rect->x1 += bmp_font->width;
  47. str += 2;
  48. len -= 2;
  49. }
  50. }
  51. static void rtgui_hz_bitmap_font_get_metrics(struct rtgui_font* font, const char* text, rtgui_rect_t* rect)
  52. {
  53. struct rtgui_font_bitmap* bmp_font = (struct rtgui_font_bitmap*)(font->data);
  54. RT_ASSERT(bmp_font != RT_NULL);
  55. /* set metrics rect */
  56. rect->x1 = rect->y1 = 0;
  57. rect->x2 = (rt_int16_t)(bmp_font->width * rt_strlen((const char*)text));
  58. rect->y2 = bmp_font->height;
  59. }
  60. #endif