提交 b1218f8c 编写于 作者: B bernard.xiong

re-write Hardware DC implementation.

git-svn-id: https://rt-thread.googlecode.com/svn/trunk@849 bbd45198-f89e-11dd-88c7-29a3b14d5316
上级 0c2f85b5
...@@ -13,7 +13,9 @@ ...@@ -13,7 +13,9 @@
* 2010-08-09 Bernard rename hardware dc to client dc * 2010-08-09 Bernard rename hardware dc to client dc
*/ */
#include <rtgui/dc.h> #include <rtgui/dc.h>
#include <rtgui/dc_hw.h>
#include <rtgui/dc_client.h> #include <rtgui/dc_client.h>
#include <rtgui/driver.h> #include <rtgui/driver.h>
#include <rtgui/rtgui_system.h> #include <rtgui/rtgui_system.h>
#include <rtgui/widgets/view.h> #include <rtgui/widgets/view.h>
...@@ -39,12 +41,18 @@ static void rtgui_dc_client_get_rect(struct rtgui_dc* dc, rtgui_rect_t* rect); ...@@ -39,12 +41,18 @@ static void rtgui_dc_client_get_rect(struct rtgui_dc* dc, rtgui_rect_t* rect);
struct rtgui_dc* rtgui_dc_begin_drawing(rtgui_widget_t* owner) struct rtgui_dc* rtgui_dc_begin_drawing(rtgui_widget_t* owner)
{ {
if (rtgui_region_is_flat(&owner->clip))
{
/* use hardware DC */
return rtgui_dc_hw_create(owner);
}
return rtgui_dc_client_create(owner); return rtgui_dc_client_create(owner);
} }
void rtgui_dc_end_drawing(struct rtgui_dc* dc) void rtgui_dc_end_drawing(struct rtgui_dc* dc)
{ {
rtgui_dc_client_fini(dc); dc->engine->fini(dc);
} }
const struct rtgui_dc_engine dc_client_engine = const struct rtgui_dc_engine dc_client_engine =
......
...@@ -215,11 +215,8 @@ static void rtgui_dc_hw_draw_point(struct rtgui_dc* self, int x, int y) ...@@ -215,11 +215,8 @@ static void rtgui_dc_hw_draw_point(struct rtgui_dc* self, int x, int y)
x = x + owner->extent.x1; x = x + owner->extent.x1;
y = y + owner->extent.y1; y = y + owner->extent.y1;
if (rtgui_region_contains_point(&(owner->clip), x, y, &rect) == RT_EOK) /* draw this point */
{ hw_driver->set_pixel(&(owner->gc.foreground), x, y);
/* draw this point */
hw_driver->set_pixel(&(owner->gc.foreground), x, y);
}
} }
static void rtgui_dc_hw_draw_color_point(struct rtgui_dc* self, int x, int y, rtgui_color_t color) static void rtgui_dc_hw_draw_color_point(struct rtgui_dc* self, int x, int y, rtgui_color_t color)
...@@ -236,11 +233,8 @@ static void rtgui_dc_hw_draw_color_point(struct rtgui_dc* self, int x, int y, rt ...@@ -236,11 +233,8 @@ static void rtgui_dc_hw_draw_color_point(struct rtgui_dc* self, int x, int y, rt
x = x + owner->extent.x1; x = x + owner->extent.x1;
y = y + owner->extent.y1; y = y + owner->extent.y1;
if (rtgui_region_contains_point(&(owner->clip), x, y, &rect) == RT_EOK) /* draw this point */
{ hw_driver->set_pixel(&color, x, y);
/* draw this point */
hw_driver->set_pixel(&color, x, y);
}
} }
/* /*
...@@ -261,41 +255,8 @@ static void rtgui_dc_hw_draw_vline(struct rtgui_dc* self, int x, int y1, int y2) ...@@ -261,41 +255,8 @@ static void rtgui_dc_hw_draw_vline(struct rtgui_dc* self, int x, int y1, int y2)
y1 = y1 + owner->extent.y1; y1 = y1 + owner->extent.y1;
y2 = y2 + owner->extent.y1; y2 = y2 + owner->extent.y1;
if (owner->clip.data == RT_NULL) /* draw vline */
{ hw_driver->draw_vline(&(owner->gc.foreground), x, y1, y2);
rtgui_rect_t* prect;
prect = &(owner->clip.extents);
/* calculate vline intersect */
if (prect->x1 > x || prect->x2 <= x) return;
if (prect->y2 <= y1 || prect->y1 > y2) return;
if (prect->y1 > y1) y1 = prect->y1;
if (prect->y2 < y2) y2 = prect->y2;
/* draw vline */
hw_driver->draw_vline(&(owner->gc.foreground), x, y1, y2);
}
else for (index = 0; index < rtgui_region_num_rects(&(owner->clip)); index ++)
{
rtgui_rect_t* prect;
register rt_base_t draw_y1, draw_y2;
prect = ((rtgui_rect_t *)(owner->clip.data + index + 1));
draw_y1 = y1;
draw_y2 = y2;
/* calculate vline clip */
if (prect->x1 > x || prect->x2 <= x) continue;
if (prect->y2 <= y1 || prect->y1 > y2) continue;
if (prect->y1 > y1) draw_y1 = prect->y1;
if (prect->y2 < y2) draw_y2 = prect->y2;
/* draw vline */
hw_driver->draw_vline(&(owner->gc.foreground), x, draw_y1, draw_y2);
}
} }
/* /*
...@@ -317,69 +278,33 @@ static void rtgui_dc_hw_draw_hline(struct rtgui_dc* self, int x1, int x2, int y) ...@@ -317,69 +278,33 @@ static void rtgui_dc_hw_draw_hline(struct rtgui_dc* self, int x1, int x2, int y)
x2 = x2 + owner->extent.x1; x2 = x2 + owner->extent.x1;
y = y + owner->extent.y1; y = y + owner->extent.y1;
if (owner->clip.data == RT_NULL) /* draw hline */
{ hw_driver->draw_hline(&(owner->gc.foreground), x1, x2, y);
rtgui_rect_t* prect;
prect = &(owner->clip.extents);
/* calculate vline intersect */
if (prect->y1 > y || prect->y2 <= y ) return;
if (prect->x2 <= x1 || prect->x1 > x2) return;
if (prect->x1 > x1) x1 = prect->x1;
if (prect->x2 < x2) x2 = prect->x2;
/* draw hline */
hw_driver->draw_hline(&(owner->gc.foreground), x1, x2, y);
}
else for (index = 0; index < rtgui_region_num_rects(&(owner->clip)); index ++)
{
rtgui_rect_t* prect;
register rt_base_t draw_x1, draw_x2;
prect = ((rtgui_rect_t *)(owner->clip.data + index + 1));
draw_x1 = x1;
draw_x2 = x2;
/* calculate hline clip */
if (prect->y1 > y || prect->y2 <= y ) continue;
if (prect->x2 <= x1 || prect->x1 > x2) continue;
if (prect->x1 > x1) draw_x1 = prect->x1;
if (prect->x2 < x2) draw_x2 = prect->x2;
/* draw hline */
hw_driver->draw_hline(&(owner->gc.foreground), draw_x1, draw_x2, y);
}
} }
static void rtgui_dc_hw_fill_rect (struct rtgui_dc* self, struct rtgui_rect* rect) static void rtgui_dc_hw_fill_rect (struct rtgui_dc* self, struct rtgui_rect* rect)
{ {
rtgui_color_t foreground; rtgui_color_t color;
register rt_base_t index; register rt_base_t index, x1, x2;
rtgui_widget_t *owner; rtgui_widget_t *owner;
if (self == RT_NULL) return; if (self == RT_NULL) return;
/* get owner */ /* get owner */
owner = RTGUI_CONTAINER_OF(self, struct rtgui_widget, dc_type); owner = RTGUI_CONTAINER_OF(self, struct rtgui_widget, dc_type);
if (!RTGUI_WIDGET_IS_DC_VISIBLE(owner)) return; if (!RTGUI_WIDGET_IS_DC_VISIBLE(owner)) return;
/* save foreground color */ /* get background color */
foreground = owner->gc.foreground; color = owner->gc.background;
/* convert logic to device */
/* set background color as foreground color */ x1 = rect->x1 + owner->extent.x1;
owner->gc.foreground = owner->gc.background; x2 = rect->x2 + owner->extent.x1;
/* fill rect */ /* fill rect */
for (index = rect->y1; index < rect->y2; index ++) for (index = owner->extent.y1 + rect->y1; index < owner->extent.y1 + rect->y2; index ++)
{ {
rtgui_dc_hw_draw_hline(self, rect->x1, rect->x2, index); hw_driver->draw_hline(&color, x1, x2, index);
} }
/* restore foreground color */
owner->gc.foreground = foreground;
} }
static void rtgui_dc_hw_blit(struct rtgui_dc* dc, struct rtgui_point* dc_point, struct rtgui_dc* dest, rtgui_rect_t* rect) static void rtgui_dc_hw_blit(struct rtgui_dc* dc, struct rtgui_point* dc_point, struct rtgui_dc* dest, rtgui_rect_t* rect)
...@@ -455,40 +380,7 @@ void rtgui_dc_hw_draw_raw_hline(struct rtgui_dc* self, rt_uint8_t* raw_ptr, int ...@@ -455,40 +380,7 @@ void rtgui_dc_hw_draw_raw_hline(struct rtgui_dc* self, rt_uint8_t* raw_ptr, int
x2 = x2 + owner->extent.x1; x2 = x2 + owner->extent.x1;
y = y + owner->extent.y1; y = y + owner->extent.y1;
if (owner->clip.data == RT_NULL) /* draw raw hline */
{ hw_driver->draw_raw_hline(raw_ptr, x1, x2, y);
rtgui_rect_t* prect;
prect = &(owner->clip.extents);
/* calculate hline intersect */
if (prect->y1 > y || prect->y2 <= y ) return;
if (prect->x2 <= x1 || prect->x1 > x2) return;
if (prect->x1 > x1) x1 = prect->x1;
if (prect->x2 < x2) x2 = prect->x2;
/* draw raw hline */
hw_driver->draw_raw_hline(raw_ptr, x1, x2, y);
}
else for (index = 0; index < rtgui_region_num_rects(&(owner->clip)); index ++)
{
rtgui_rect_t* prect;
register rt_base_t draw_x1, draw_x2;
prect = ((rtgui_rect_t *)(owner->clip.data + index + 1));
draw_x1 = x1;
draw_x2 = x2;
/* calculate hline clip */
if (prect->y1 > y || prect->y2 <= y ) continue;
if (prect->x2 <= x1 || prect->x1 > x2) continue;
if (prect->x1 > x1) draw_x1 = prect->x1;
if (prect->x2 < x2) draw_x2 = prect->x2;
/* draw raw hline */
hw_driver->draw_raw_hline(raw_ptr + (draw_x1 - x1) * hw_driver->byte_per_pixel, draw_x1, draw_x2, y);
}
} }
...@@ -2128,6 +2128,17 @@ void rtgui_region_dump(rtgui_region_t* region) ...@@ -2128,6 +2128,17 @@ void rtgui_region_dump(rtgui_region_t* region)
} }
} }
int rtgui_region_is_flat(rtgui_region_t* region)
{
int num;
num = PIXREGION_NUM_RECTS(region);
if (num == 1) return RT_EOK;
return -RT_ERROR;
}
void rtgui_rect_moveto(rtgui_rect_t *rect, int x, int y) void rtgui_rect_moveto(rtgui_rect_t *rect, int x, int y)
{ {
rect->x1 += x; rect->x1 += x;
......
...@@ -82,6 +82,7 @@ rtgui_region_status_t rtgui_region_validate (rtgui_region_t *badreg, int *pOverl ...@@ -82,6 +82,7 @@ rtgui_region_status_t rtgui_region_validate (rtgui_region_t *badreg, int *pOverl
void rtgui_region_reset(rtgui_region_t *region, rtgui_rect_t* rect); void rtgui_region_reset(rtgui_region_t *region, rtgui_rect_t* rect);
void rtgui_region_empty (rtgui_region_t *region); void rtgui_region_empty (rtgui_region_t *region);
void rtgui_region_dump(rtgui_region_t* region); void rtgui_region_dump(rtgui_region_t* region);
int rtgui_region_is_flat(rtgui_region_t* region);
/* rect functions */ /* rect functions */
extern rtgui_rect_t rtgui_empty_rect; extern rtgui_rect_t rtgui_empty_rect;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册