change graphic driver as RT-Thread device driver

git-svn-id: https://rt-thread.googlecode.com/svn/trunk@1454 bbd45198-f89e-11dd-88c7-29a3b14d5316
This commit is contained in:
bernard.xiong@gmail.com
2011-06-05 15:16:41 +00:00
parent b936b13ed2
commit bbf68d15e5
13 changed files with 482 additions and 100 deletions

View File

@@ -13,58 +13,16 @@
*/
#include <rtgui/driver.h>
#ifdef RTGUI_USING_GRAPHIC_DRIVER_LIST
struct rtgui_list_node _rtgui_graphic_driver_list = {RT_NULL};
struct rtgui_graphic_driver _driver;
void rtgui_graphic_driver_add(struct rtgui_graphic_driver* driver)
{
rtgui_list_insert(&_rtgui_graphic_driver_list, &(driver->list));
}
void rtgui_graphic_driver_remove(struct rtgui_graphic_driver* driver)
{
rtgui_list_remove(&_rtgui_graphic_driver_list, &(driver->list));
}
struct rtgui_graphic_driver* rtgui_graphic_driver_find(char* name)
{
struct rtgui_list_node* node;
struct rtgui_graphic_driver* driver;
/* search in list */
rtgui_list_foreach(node, &(_rtgui_graphic_driver_list))
{
driver = rtgui_list_entry(node, struct rtgui_graphic_driver, list);
/* find it */
if (rt_strncmp(driver->name, name, RTGUI_NAME_MAX) == 0)
{
return driver;
}
}
return RT_NULL;
}
extern const struct rtgui_graphic_driver_ops *rtgui_pixel_device_get_ops(int pixel_format);
extern const struct rtgui_graphic_driver_ops *rtgui_framebuffer_get_ops(int pixel_format);
/* get default driver */
struct rtgui_graphic_driver* rtgui_graphic_driver_get_default()
{
return rtgui_list_entry(_rtgui_graphic_driver_list.next,
struct rtgui_graphic_driver, list);
return &_driver;
}
#else
static const struct rtgui_graphic_driver* _default_graphic_driver = RT_NULL;
void rtgui_graphic_driver_add(const struct rtgui_graphic_driver* driver)
{
_default_graphic_driver = driver;
}
const struct rtgui_graphic_driver* rtgui_graphic_driver_get_default()
{
return _default_graphic_driver;
}
#endif
void rtgui_graphic_driver_get_rect(const struct rtgui_graphic_driver *driver, rtgui_rect_t *rect)
{
@@ -76,9 +34,51 @@ void rtgui_graphic_driver_get_rect(const struct rtgui_graphic_driver *driver, rt
rect->y2 = driver->height;
}
void rtgui_graphic_driver_get_default_rect(rtgui_rect_t *rect)
rt_err_t rtgui_graphic_set_device(rt_device_t device)
{
/* return default the extent of default driver */
rtgui_graphic_driver_get_rect(rtgui_graphic_driver_get_default(), rect);
rt_err_t result;
struct rt_lcd_info info;
/* get framebuffer address */
result = rt_device_control(device, LCD_GET_INFO, &info);
if (result != RT_EOK)
{
/* get device information failed */
return -RT_ERROR;
}
/* initialize framebuffer driver */
_driver.device = device;
_driver.pixel_format = info.pixel_format;
_driver.byte_per_pixel = info.byte_per_pixel;
_driver.width = info.width;
_driver.height = info.height;
_driver.pitch = _driver.width * _driver.byte_per_pixel;
_driver.framebuffer = info.framebuffer;
if (info.framebuffer != RT_NULL)
{
/* is a frame buffer device */
_driver.ops = rtgui_framebuffer_get_ops(_driver.pixel_format);
}
else
{
/* is a pixel device */
_driver.ops = rtgui_pixel_device_get_ops(_driver.pixel_format);
}
return RT_EOK;
}
/* screen update */
void rtgui_graphic_driver_screen_update(struct rtgui_graphic_driver* driver, rtgui_rect_t *rect)
{
rt_device_control(driver->device, LCD_RECT_UPDATE, rect);
}
/* get video frame buffer */
rt_uint8_t* rtgui_graphic_driver_get_framebuffer(struct rtgui_graphic_driver* driver)
{
return (rt_uint8_t*)driver->framebuffer;
}

View File

@@ -140,7 +140,7 @@ void rtgui_mouse_init()
/* init cursor */
_rtgui_cursor->bpp = gd->byte_per_pixel;
_rtgui_cursor->framebuffer = gd->get_framebuffer();
_rtgui_cursor->framebuffer = rtgui_graphic_driver_get_framebuffer(gd);
_rtgui_cursor->screen_pitch = _rtgui_cursor->bpp * gd->width;
#ifdef RTGUI_USING_MOUSE_CURSOR
@@ -430,7 +430,7 @@ static void rtgui_winrect_show()
void (*set_pixel) (rtgui_color_t *c, rt_base_t x, rt_base_t y);
c = black;
set_pixel = rtgui_graphic_driver_get_default()->set_pixel;
set_pixel = rtgui_graphic_driver_get_default()->ops->set_pixel;
win_rect = _rtgui_cursor->win_rect;
win_rect_inner = win_rect;
@@ -470,7 +470,7 @@ static void rtgui_winrect_show()
}
/* update rect */
rtgui_graphic_driver_get_default()->screen_update(&win_rect);
rtgui_graphic_driver_screen_update(rtgui_graphic_driver_get_default(), &win_rect);
}
#define display_direct_memcpy(src, dest, src_pitch, dest_pitch, height, len) \

View File

@@ -188,10 +188,12 @@ void rtgui_server_handle_set_wm(struct rtgui_event_set_wm *event)
void rtgui_server_handle_update(struct rtgui_event_update_end* event)
{
const struct rtgui_graphic_driver* driver = rtgui_graphic_driver_get_default();
struct rtgui_graphic_driver* driver;
driver = rtgui_graphic_driver_get_default();
if (driver != RT_NULL)
{
driver->screen_update(&(event->rect));
rtgui_graphic_driver_screen_update(driver, &(event->rect));
}
}
@@ -277,7 +279,7 @@ void rtgui_server_handle_mouse_btn(struct rtgui_event_mouse* event)
if (rtgui_server_focus_topwin != wnd)
{
/* raise this window */
rtgui_topwin_raise(wnd->wid, wnd->tid);
rtgui_topwin_activate_win(wnd);
rtgui_server_focus_panel = RT_NULL;
}