pixel_driver.c 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. /*
  2. * Change Logs:
  3. * Date Author Notes
  4. * 2012-01-24 onelife add mono color support
  5. * 2012-01-24 onelife fix a bug in _pixel_draw_raw_hline
  6. */
  7. #include <rtgui/rtgui_system.h>
  8. #include <rtgui/driver.h>
  9. #define gfx_device (rtgui_graphic_get_device()->device)
  10. #define gfx_device_ops rt_graphix_ops(gfx_device)
  11. static void _pixel_mono_set_pixel(rtgui_color_t *c, int x, int y)
  12. {
  13. rt_uint8_t pixel;
  14. pixel = rtgui_color_to_mono(*c);
  15. gfx_device_ops->set_pixel((char*)&pixel, x, y);
  16. }
  17. static void _pixel_rgb565p_set_pixel(rtgui_color_t *c, int x, int y)
  18. {
  19. rt_uint16_t pixel;
  20. pixel = rtgui_color_to_565p(*c);
  21. gfx_device_ops->set_pixel((char*)&pixel, x, y);
  22. }
  23. static void _pixel_rgb565_set_pixel(rtgui_color_t *c, int x, int y)
  24. {
  25. rt_uint16_t pixel;
  26. pixel = rtgui_color_to_565(*c);
  27. gfx_device_ops->set_pixel((char*)&pixel, x, y);
  28. }
  29. static void _pixel_rgb888_set_pixel(rtgui_color_t *c, int x, int y)
  30. {
  31. rt_uint32_t pixel;
  32. pixel = rtgui_color_to_888(*c);
  33. gfx_device_ops->set_pixel((char*)&pixel, x, y);
  34. }
  35. static void _pixel_mono_get_pixel(rtgui_color_t *c, int x, int y)
  36. {
  37. rt_uint8_t pixel;
  38. gfx_device_ops->get_pixel((char*)&pixel, x, y);
  39. *c = rtgui_color_from_mono(pixel);
  40. }
  41. static void _pixel_rgb565p_get_pixel(rtgui_color_t *c, int x, int y)
  42. {
  43. rt_uint16_t pixel;
  44. gfx_device_ops->get_pixel((char*)&pixel, x, y);
  45. *c = rtgui_color_from_565p(pixel);
  46. }
  47. static void _pixel_rgb565_get_pixel(rtgui_color_t *c, int x, int y)
  48. {
  49. rt_uint16_t pixel;
  50. gfx_device_ops->get_pixel((char*)&pixel, x, y);
  51. *c = rtgui_color_from_565(pixel);
  52. }
  53. static void _pixel_rgb888_get_pixel(rtgui_color_t *c, int x, int y)
  54. {
  55. rt_uint32_t pixel;
  56. gfx_device_ops->get_pixel((char*)&pixel, x, y);
  57. *c = rtgui_color_from_888(pixel);
  58. }
  59. static void _pixel_mono_draw_hline(rtgui_color_t *c, int x1, int x2, int y)
  60. {
  61. rt_uint8_t pixel;
  62. pixel = rtgui_color_to_mono(*c);
  63. gfx_device_ops->draw_hline((char*)&pixel, x1, x2, y);
  64. }
  65. static void _pixel_rgb565p_draw_hline(rtgui_color_t *c, int x1, int x2, int y)
  66. {
  67. rt_uint16_t pixel;
  68. pixel = rtgui_color_to_565p(*c);
  69. gfx_device_ops->draw_hline((char*)&pixel, x1, x2, y);
  70. }
  71. static void _pixel_rgb565_draw_hline(rtgui_color_t *c, int x1, int x2, int y)
  72. {
  73. rt_uint16_t pixel;
  74. pixel = rtgui_color_to_565(*c);
  75. gfx_device_ops->draw_hline((char*)&pixel, x1, x2, y);
  76. }
  77. static void _pixel_rgb888_draw_hline(rtgui_color_t *c, int x1, int x2, int y)
  78. {
  79. rt_uint32_t pixel;
  80. pixel = rtgui_color_to_888(*c);
  81. gfx_device_ops->draw_hline((char*)&pixel, x1, x2, y);
  82. }
  83. static void _pixel_mono_draw_vline(rtgui_color_t *c, int x, int y1, int y2)
  84. {
  85. rt_uint8_t pixel;
  86. pixel = rtgui_color_to_mono(*c);
  87. gfx_device_ops->draw_vline((char*)&pixel, x, y1, y2);
  88. }
  89. static void _pixel_rgb565p_draw_vline(rtgui_color_t *c, int x, int y1, int y2)
  90. {
  91. rt_uint16_t pixel;
  92. pixel = rtgui_color_to_565p(*c);
  93. gfx_device_ops->draw_vline((char*)&pixel, x, y1, y2);
  94. }
  95. static void _pixel_rgb565_draw_vline(rtgui_color_t *c, int x, int y1, int y2)
  96. {
  97. rt_uint16_t pixel;
  98. pixel = rtgui_color_to_565(*c);
  99. gfx_device_ops->draw_vline((char*)&pixel, x, y1, y2);
  100. }
  101. static void _pixel_rgb888_draw_vline(rtgui_color_t *c, int x, int y1, int y2)
  102. {
  103. rt_uint32_t pixel;
  104. pixel = rtgui_color_to_888(*c);
  105. gfx_device_ops->draw_vline((char*)&pixel, x, y1, y2);
  106. }
  107. static void _pixel_draw_raw_hline(rt_uint8_t *pixels, int x1, int x2, int y)
  108. {
  109. gfx_device_ops->blit_line((char*)pixels, x1, x2, y);
  110. }
  111. /* pixel device */
  112. const struct rtgui_graphic_driver_ops _pixel_mono_ops =
  113. {
  114. _pixel_mono_set_pixel,
  115. _pixel_mono_get_pixel,
  116. _pixel_mono_draw_hline,
  117. _pixel_mono_draw_vline,
  118. _pixel_draw_raw_hline,
  119. };
  120. const struct rtgui_graphic_driver_ops _pixel_rgb565p_ops =
  121. {
  122. _pixel_rgb565p_set_pixel,
  123. _pixel_rgb565p_get_pixel,
  124. _pixel_rgb565p_draw_hline,
  125. _pixel_rgb565p_draw_vline,
  126. _pixel_draw_raw_hline,
  127. };
  128. const struct rtgui_graphic_driver_ops _pixel_rgb565_ops =
  129. {
  130. _pixel_rgb565_set_pixel,
  131. _pixel_rgb565_get_pixel,
  132. _pixel_rgb565_draw_hline,
  133. _pixel_rgb565_draw_vline,
  134. _pixel_draw_raw_hline,
  135. };
  136. const struct rtgui_graphic_driver_ops _pixel_rgb888_ops =
  137. {
  138. _pixel_rgb888_set_pixel,
  139. _pixel_rgb888_get_pixel,
  140. _pixel_rgb888_draw_hline,
  141. _pixel_rgb888_draw_vline,
  142. _pixel_draw_raw_hline,
  143. };
  144. const struct rtgui_graphic_driver_ops *rtgui_pixel_device_get_ops(int pixel_format)
  145. {
  146. switch (pixel_format)
  147. {
  148. case RTGRAPHIC_PIXEL_FORMAT_MONO:
  149. return &_pixel_mono_ops;
  150. case RTGRAPHIC_PIXEL_FORMAT_RGB565:
  151. return &_pixel_rgb565_ops;
  152. case RTGRAPHIC_PIXEL_FORMAT_RGB565P:
  153. return &_pixel_rgb565p_ops;
  154. case RTGRAPHIC_PIXEL_FORMAT_RGB888:
  155. return &_pixel_rgb888_ops;
  156. }
  157. return RT_NULL;
  158. }