1
0

pixel_driver.c 4.8 KB

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