rtgui 中的 dc 也就是繪圖引擎,可以說是 rtgui 中最重要的一個部分,其中分成 3 個部分:給硬體的 dc_hw、給 buffer 的 dc_buffer 以及給 client 的。
接下來將會追蹤 dc_hw 中的程式碼,分析 rtgui 是如何在螢幕上面描繪點線面。
結構#
dc#
File: dc.h
63 | /* |
dc_engine#
49 | struct rtgui_dc_engine |
dc_hw#
83 | /* |
hw_engine#
File: dc_hw.c
44 | const struct rtgui_dc_engine dc_hw_engine = |
啟動 dc#
我們可以從 rtgui 官方提供的範例發現,在使用 dc 前,需要先利用 rtgui_dc_begin_drawing
來啟動引擎,並在結束時呼叫 rtgui_dc_end_drawing
;而啟動時,會判斷要使用哪種 dc,並啟動,如 1866 至 1871 行
1866 | /* create client or hardware DC */ |
如果判斷為 hw,則進入 rtgui_dc_hw_create
建立 dc#
功能 | 回傳值 | *owner |
---|---|---|
建立 dc | dc 指標 | dc 擁有者 |
57 | struct rtgui_dc *rtgui_dc_hw_create(rtgui_widget_t *owner) |
運作 dc (畫圖)#
點#
功能 | 回傳值 |
---|---|
畫點 | void |
*self |
x |
y |
---|---|---|
dc 本體 | 座標 x | 座標 y |
89 | /* |
首先傳進去的座標一律為邏輯位置,也就是以此 dc 所屬物件(有可能是視窗、元件等)的 $(x_1,y_1)$ 為原點之座標;由於 $(x_1,y_1)$ 為該物件(通常為矩形)的左下角,所以傳入的座標不會有負號。
接著將邏輯座標轉為實際座標(也就是螢幕上的真正位置),所以把 $(x,y)$ 轉成 $(x+x_1,y+y_1)$;由於 dc 是跟隨物件的,所以新座標不可超過 $(x_2,y_2)$,也就是右上角。
最後利用驅動中設定好的 set_pixel
函數來上色,這裡使用預設顏色。
彩色點#
功能 | 回傳值 |
---|---|
畫彩色點 | void |
*self |
x |
y |
color |
---|---|---|---|
dc 本體 | 座標 x | 座標 y | 所選的顏色 |
113 | static void rtgui_dc_hw_draw_color_point(struct rtgui_dc *self, int x, int y, rtgui_color_t color) |
跟上面最大的不同是可以選顏色 (131)。
水平線#
134 | /* |
鉛直線#
167 | /* |
矩形#
200 | static void rtgui_dc_hw_fill_rect(struct rtgui_dc *self, struct rtgui_rect *rect) |
blit(?)#
243 | static void rtgui_dc_hw_blit_line(struct rtgui_dc *self, int x1, int x2, int y, rt_uint8_t *line_data) |
272 | static void rtgui_dc_hw_blit(struct rtgui_dc *dc, |