rtgui_theme.c 29 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039
  1. /*
  2. * File : rtgui_theme.c
  3. * This file is part of RTGUI in RT-Thread RTOS
  4. * COPYRIGHT (C) 2006 - 2009, RT-Thread Development Team
  5. *
  6. * The license and distribution terms for this file may be
  7. * found in the file LICENSE in this distribution or at
  8. * http://www.rt-thread.org/license/LICENSE
  9. *
  10. * Change Logs:
  11. * Date Author Notes
  12. * 2009-10-04 Bernard first version
  13. */
  14. #include <rtgui/rtgui.h>
  15. #include <rtgui/dc.h>
  16. #include <rtgui/widgets/widget.h>
  17. #include <rtgui/widgets/button.h>
  18. #include <rtgui/widgets/label.h>
  19. #include <rtgui/widgets/textbox.h>
  20. #include <rtgui/widgets/iconbox.h>
  21. #include <rtgui/widgets/title.h>
  22. #include <rtgui/rtgui_theme.h>
  23. #include <rtgui/rtgui_server.h>
  24. #include <rtgui/rtgui_system.h>
  25. #define SELECTED_HEIGHT 25
  26. const rtgui_color_t default_foreground = RTGUI_RGB(0x00, 0x00, 0x00);
  27. const rtgui_color_t default_background = RTGUI_RGB(212, 208, 200);
  28. const rtgui_color_t selected_color = RTGUI_RGB(0xc0, 0xc0, 0xc0);
  29. const rtgui_color_t disable_foreground = RTGUI_RGB(0x80, 0x80, 0x80);
  30. extern struct rtgui_font rtgui_font_asc16;
  31. extern struct rtgui_font rtgui_font_arial16;
  32. extern struct rtgui_font rtgui_font_asc12;
  33. extern struct rtgui_font rtgui_font_arial12;
  34. /* init theme */
  35. void rtgui_system_theme_init()
  36. {
  37. #if RTGUI_DEFAULT_FONT_SIZE == 16
  38. rtgui_font_set_defaut(&rtgui_font_asc16);
  39. #elif RTGUI_DEFAULT_FONT_SIZE == 12
  40. rtgui_font_set_defaut(&rtgui_font_asc12);
  41. #else
  42. rtgui_font_set_defaut(&rtgui_font_asc12);
  43. #endif
  44. }
  45. static const rt_uint8_t close_byte[14] = {0x06, 0x18, 0x03, 0x30, 0x01, 0xE0, 0x00,
  46. 0xC0, 0x01, 0xE0, 0x03, 0x30, 0x06, 0x18
  47. };
  48. /* window drawing */
  49. void rtgui_theme_draw_win(struct rtgui_topwin* win)
  50. {
  51. struct rtgui_dc* dc;
  52. rtgui_rect_t rect;
  53. if (win->title == RT_NULL) return; /* no title and no board */
  54. /* begin drawing */
  55. dc = rtgui_dc_begin_drawing(RTGUI_WIDGET(win->title));
  56. if (dc == RT_NULL) return;
  57. /* get rect */
  58. rtgui_widget_get_rect(RTGUI_WIDGET(win->title), &rect);
  59. /* draw border */
  60. if (win->flag & WINTITLE_BORDER)
  61. {
  62. rect.x2 -= 1; rect.y2 -= 1;
  63. RTGUI_WIDGET_FOREGROUND(RTGUI_WIDGET(win->title)) = RTGUI_RGB(212, 208, 200);
  64. rtgui_dc_draw_hline(dc, rect.x1, rect.x2, rect.y1);
  65. rtgui_dc_draw_vline(dc, rect.x1, rect.y1, rect.y2);
  66. RTGUI_WIDGET_FOREGROUND(RTGUI_WIDGET(win->title)) = white;
  67. rtgui_dc_draw_hline(dc, rect.x1 + 1, rect.x2 - 1, rect.y1 + 1);
  68. rtgui_dc_draw_vline(dc, rect.x1 + 1, rect.y1 + 1, rect.y2 - 1);
  69. RTGUI_WIDGET_FOREGROUND(RTGUI_WIDGET(win->title)) = RTGUI_RGB(128, 128, 128);
  70. rtgui_dc_draw_hline(dc, rect.x1 + 1, rect.x2 - 1, rect.y2 - 1);
  71. rtgui_dc_draw_vline(dc, rect.x2 - 1, rect.y1 + 1, rect.y2 - 1);
  72. RTGUI_WIDGET_FOREGROUND(RTGUI_WIDGET(win->title)) = RTGUI_RGB(64, 64, 64);
  73. rtgui_dc_draw_hline(dc, rect.x1, rect.x2, rect.y2);
  74. rtgui_dc_draw_vline(dc, rect.x2, rect.y1, rect.y2);
  75. /* shrink border */
  76. rtgui_rect_inflate(&rect, -WINTITLE_BORDER_SIZE);
  77. }
  78. /* draw title */
  79. if (!(win->flag & WINTITLE_NO))
  80. {
  81. rt_uint32_t index;
  82. float r, g, b, delta;
  83. if (win->flag & WINTITLE_ACTIVATE)
  84. {
  85. r = 10; g = 36; b = 106;
  86. delta = 150 / (float)(rect.x2 - rect.x1);
  87. }
  88. else
  89. {
  90. r = 128; g = 128; b = 128;
  91. delta = 64 / (float)(rect.x2 - rect.x1);
  92. }
  93. RTGUI_WIDGET_FOREGROUND(RTGUI_WIDGET(win->title)) = RTGUI_RGB(r, g, b);
  94. for (index = rect.x1; index < rect.x2 + 1; index ++)
  95. {
  96. rtgui_dc_draw_vline(dc, index, rect.y1, rect.y2);
  97. r += delta; g += delta; b += delta;
  98. }
  99. if (win->flag & WINTITLE_ACTIVATE)
  100. {
  101. RTGUI_WIDGET_FOREGROUND(RTGUI_WIDGET(win->title)) = white;
  102. }
  103. else
  104. {
  105. RTGUI_WIDGET_FOREGROUND(RTGUI_WIDGET(win->title)) = RTGUI_RGB(212, 208, 200);
  106. }
  107. rect.x1 += 4;
  108. rect.y1 += 2; rect.y2 = rect.y1 + WINTITLE_CB_HEIGHT;
  109. rtgui_dc_draw_text(dc, rtgui_wintitle_get_title(win->title), &rect);
  110. if (win->flag & WINTITLE_CLOSEBOX)
  111. {
  112. /* get close button rect */
  113. rtgui_rect_t box_rect = {0, 0, WINTITLE_CB_WIDTH, WINTITLE_CB_HEIGHT};
  114. rtgui_rect_moveto_align(&rect, &box_rect, RTGUI_ALIGN_CENTER_VERTICAL | RTGUI_ALIGN_RIGHT);
  115. box_rect.x1 -= 3; box_rect.x2 -= 3;
  116. rtgui_dc_fill_rect(dc, &box_rect);
  117. /* draw close box */
  118. if (win->flag & WINTITLE_CB_PRESSED)
  119. {
  120. rtgui_dc_draw_border(dc, &box_rect, RTGUI_BORDER_SUNKEN);
  121. RTGUI_WIDGET_FOREGROUND(RTGUI_WIDGET(win->title)) = red;
  122. rtgui_dc_draw_word(dc, box_rect.x1, box_rect.y1 + 6, 7, close_byte);
  123. }
  124. else
  125. {
  126. rtgui_dc_draw_border(dc, &box_rect, RTGUI_BORDER_RAISE);
  127. RTGUI_WIDGET_FOREGROUND(RTGUI_WIDGET(win->title)) = black;
  128. rtgui_dc_draw_word(dc, box_rect.x1 - 1, box_rect.y1 + 5, 7, close_byte);
  129. }
  130. }
  131. }
  132. rtgui_dc_end_drawing(dc);
  133. }
  134. /* widget drawing */
  135. void rtgui_theme_draw_button(rtgui_button_t* btn)
  136. {
  137. /* draw button */
  138. struct rtgui_dc* dc;
  139. struct rtgui_rect rect;
  140. rtgui_color_t bc, fc;
  141. /* begin drawing */
  142. dc = rtgui_dc_begin_drawing(RTGUI_WIDGET(btn));
  143. if (dc == RT_NULL) return;
  144. /* get widget rect */
  145. rtgui_widget_get_rect(RTGUI_WIDGET(btn), &rect);
  146. /* get foreground color */
  147. bc = RTGUI_WIDGET_BACKGROUND(RTGUI_WIDGET(btn));
  148. fc = RTGUI_WIDGET_FOREGROUND(RTGUI_WIDGET(btn));
  149. if (btn->flag & RTGUI_BUTTON_TYPE_PUSH && btn->flag & RTGUI_BUTTON_FLAG_PRESS)
  150. {
  151. /* fill button rect with background color */
  152. rtgui_dc_fill_rect(dc, &rect);
  153. /* draw border */
  154. RTGUI_WIDGET_FOREGROUND(RTGUI_WIDGET(btn)) = RTGUI_RGB(64, 64, 64);
  155. rtgui_dc_draw_hline(dc, rect.x1, rect.x2, rect.y1);
  156. rtgui_dc_draw_vline(dc, rect.x1, rect.y1, rect.y2);
  157. RTGUI_WIDGET_FOREGROUND(RTGUI_WIDGET(btn)) = RTGUI_RGB(128, 128, 128);
  158. rtgui_dc_draw_hline(dc, rect.x1, rect.x2 - 1, rect.y1 + 1);
  159. rtgui_dc_draw_vline(dc, rect.x1 + 1, rect.y1 + 1, rect.y2 - 2);
  160. RTGUI_WIDGET_FOREGROUND(RTGUI_WIDGET(btn)) = RTGUI_RGB(255, 255, 255);
  161. rtgui_dc_draw_hline(dc, rect.x1, rect.x2 + 1, rect.y2 - 1);
  162. rtgui_dc_draw_vline(dc, rect.x2 - 1, rect.y1, rect.y2);
  163. if (btn->pressed_image != RT_NULL)
  164. {
  165. rtgui_rect_t image_rect;
  166. image_rect.x1 = 0; image_rect.y1 = 0;
  167. image_rect.x2 = btn->unpressed_image->w;
  168. image_rect.y2 = btn->unpressed_image->h;
  169. rtgui_rect_moveto_align(&rect, &image_rect, RTGUI_ALIGN_CENTER_HORIZONTAL | RTGUI_ALIGN_CENTER_VERTICAL);
  170. rtgui_image_blit(btn->pressed_image, dc, &image_rect);
  171. }
  172. }
  173. else if (btn->flag & RTGUI_BUTTON_FLAG_PRESS)
  174. {
  175. if (btn->pressed_image != RT_NULL)
  176. {
  177. rtgui_rect_t image_rect;
  178. image_rect.x1 = 0; image_rect.y1 = 0;
  179. image_rect.x2 = btn->unpressed_image->w;
  180. image_rect.y2 = btn->unpressed_image->h;
  181. rtgui_rect_moveto_align(&rect, &image_rect, RTGUI_ALIGN_CENTER_HORIZONTAL | RTGUI_ALIGN_CENTER_VERTICAL);
  182. rtgui_image_blit(btn->pressed_image, dc, &image_rect);
  183. }
  184. else
  185. {
  186. /* fill button rect with background color */
  187. RTGUI_WIDGET_BACKGROUND(RTGUI_WIDGET(btn)) = RTGUI_RGB(0xff, 0xff, 0xff);
  188. rtgui_dc_fill_rect(dc, &rect);
  189. /* draw border */
  190. RTGUI_WIDGET(btn)->gc.foreground = RTGUI_RGB(0, 0, 0);
  191. rtgui_dc_draw_rect(dc, &rect);
  192. RTGUI_WIDGET(btn)->gc.foreground = RTGUI_RGB(128, 128, 128);
  193. rect.x1 += 1; rect.y1 += 1; rect.x2 -= 1; rect.y2 -= 1;
  194. rtgui_dc_draw_rect(dc, &rect);
  195. }
  196. }
  197. else
  198. {
  199. if (btn->unpressed_image != RT_NULL)
  200. {
  201. rtgui_rect_t image_rect;
  202. image_rect.x1 = 0; image_rect.y1 = 0;
  203. image_rect.x2 = btn->unpressed_image->w;
  204. image_rect.y2 = btn->unpressed_image->h;
  205. rtgui_rect_moveto_align(&rect, &image_rect, RTGUI_ALIGN_CENTER_HORIZONTAL | RTGUI_ALIGN_CENTER_VERTICAL);
  206. rtgui_image_blit(btn->unpressed_image, dc, &image_rect);
  207. }
  208. else
  209. {
  210. /* fill button rect with background color */
  211. rtgui_dc_fill_rect(dc, &rect);
  212. /* draw border */
  213. RTGUI_WIDGET(btn)->gc.foreground = RTGUI_RGB(255, 255, 255);
  214. rtgui_dc_draw_hline(dc, rect.x1, rect.x2, rect.y1);
  215. rtgui_dc_draw_vline(dc, rect.x1, rect.y1, rect.y2);
  216. RTGUI_WIDGET(btn)->gc.foreground = RTGUI_RGB(0, 0, 0);
  217. rtgui_dc_draw_hline(dc, rect.x1, rect.x2 + 1, rect.y2);
  218. rtgui_dc_draw_vline(dc, rect.x2, rect.y1, rect.y2);
  219. RTGUI_WIDGET(btn)->gc.foreground = RTGUI_RGB(128, 128, 128);
  220. rtgui_dc_draw_hline(dc, rect.x1 + 1, rect.x2, rect.y2 - 1);
  221. rtgui_dc_draw_vline(dc, rect.x2 - 1, rect.y1 + 1, rect.y2 - 1);
  222. }
  223. }
  224. if (RTGUI_WIDGET_IS_FOCUSED(RTGUI_WIDGET(btn)))
  225. {
  226. /* re-set foreground and get default rect */
  227. rtgui_widget_get_rect(RTGUI_WIDGET(btn), &rect);
  228. rtgui_rect_inflate(&rect, -2);
  229. RTGUI_WIDGET_FOREGROUND(RTGUI_WIDGET(btn)) = black;
  230. rtgui_dc_draw_focus_rect(dc, &rect);
  231. }
  232. /* set forecolor */
  233. RTGUI_WIDGET_BACKGROUND(RTGUI_WIDGET(btn)) = bc;
  234. RTGUI_WIDGET_FOREGROUND(RTGUI_WIDGET(btn)) = fc;
  235. if (btn->pressed_image == RT_NULL)
  236. {
  237. /* re-set foreground and get default rect */
  238. rtgui_widget_get_rect(RTGUI_WIDGET(btn), &rect);
  239. /* remove border */
  240. rtgui_rect_inflate(&rect, -2);
  241. /* draw text */
  242. rtgui_dc_draw_text(dc, rtgui_label_get_text(RTGUI_LABEL(btn)), &rect);
  243. }
  244. /* end drawing */
  245. rtgui_dc_end_drawing(dc);
  246. }
  247. void rtgui_theme_draw_label(rtgui_label_t* label)
  248. {
  249. /* draw label */
  250. struct rtgui_dc* dc;
  251. struct rtgui_rect rect;
  252. /* begin drawing */
  253. dc = rtgui_dc_begin_drawing(RTGUI_WIDGET(label));
  254. if (dc == RT_NULL) return;
  255. rtgui_widget_get_rect(RTGUI_WIDGET(label), &rect);
  256. rtgui_dc_fill_rect(dc, &rect);
  257. /* default left and center draw */
  258. rtgui_dc_draw_text(dc, rtgui_label_get_text(label), &rect);
  259. /* end drawing */
  260. rtgui_dc_end_drawing(dc);
  261. }
  262. #define RTGUI_TEXTBOX_MARGIN 3
  263. void rtgui_theme_draw_textbox(rtgui_textbox_t* box)
  264. {
  265. /* draw button */
  266. struct rtgui_dc* dc;
  267. struct rtgui_rect rect;
  268. rtgui_color_t fc;
  269. /* begin drawing */
  270. dc = rtgui_dc_begin_drawing(RTGUI_WIDGET(box));
  271. if (dc == RT_NULL) return;
  272. /* get widget rect */
  273. rtgui_widget_get_rect(RTGUI_WIDGET(box), &rect);
  274. fc = RTGUI_WIDGET_FOREGROUND(RTGUI_WIDGET(box));
  275. /* fill widget rect with white color */
  276. RTGUI_WIDGET_BACKGROUND(RTGUI_WIDGET(box)) = white;
  277. rtgui_dc_fill_rect(dc, &rect);
  278. /* draw border */
  279. RTGUI_WIDGET_FOREGROUND(RTGUI_WIDGET(box)) = RTGUI_RGB(123, 158, 189);
  280. rtgui_dc_draw_rect(dc, &rect);
  281. /* draw text */
  282. RTGUI_WIDGET_FOREGROUND(RTGUI_WIDGET(box)) = fc;
  283. if (box->text != RT_NULL)
  284. {
  285. rect.x1 += RTGUI_TEXTBOX_MARGIN;
  286. if (box->flag & RTGUI_TEXTBOX_MASK)
  287. {
  288. /* draw '*' */
  289. rt_size_t len = rt_strlen(box->text);
  290. if (len > 0)
  291. {
  292. char *text_mask = rtgui_malloc(len + 1);
  293. rt_memset(text_mask, '*', len + 1);
  294. text_mask[len] = 0;
  295. rtgui_dc_draw_text(dc, text_mask, &rect);
  296. rt_free(text_mask);
  297. }
  298. }
  299. else
  300. {
  301. rtgui_dc_draw_text(dc, box->text, &rect);
  302. }
  303. /* draw caret */
  304. if (box->flag & RTGUI_TEXTBOX_CARET_SHOW)
  305. {
  306. rect.x1 += box->position * box->font_width;
  307. rect.x2 = rect.x1 + box->font_width;
  308. rect.y2 -= 2;
  309. rect.y1 = rect.y2 - 3;
  310. RTGUI_WIDGET_BACKGROUND(RTGUI_WIDGET(box)) = black;
  311. rtgui_dc_fill_rect(dc, &rect);
  312. }
  313. }
  314. /* end drawing */
  315. rtgui_dc_end_drawing(dc);
  316. }
  317. void rtgui_theme_draw_iconbox(rtgui_iconbox_t* iconbox)
  318. {
  319. struct rtgui_dc* dc;
  320. struct rtgui_rect rect;
  321. /* begin drawing */
  322. dc = rtgui_dc_begin_drawing(RTGUI_WIDGET(iconbox));
  323. if (dc == RT_NULL) return;
  324. /* get widget rect */
  325. rtgui_widget_get_rect(RTGUI_WIDGET(iconbox), &rect);
  326. /* draw icon */
  327. rtgui_image_blit(iconbox->image, dc, &rect);
  328. /* draw text */
  329. if (iconbox->text_position == RTGUI_ICONBOX_TEXT_BELOW && iconbox->text != RT_NULL)
  330. {
  331. rect.y1 = iconbox->image->h + RTGUI_WIDGET_DEFAULT_MARGIN;
  332. rtgui_dc_draw_text(dc, iconbox->text, &rect);
  333. }
  334. else if (iconbox->text_position == RTGUI_ICONBOX_TEXT_RIGHT && iconbox->text != RT_NULL)
  335. {
  336. rect.x1 = iconbox->image->w + RTGUI_WIDGET_DEFAULT_MARGIN;
  337. rtgui_dc_draw_text(dc, iconbox->text, &rect);
  338. }
  339. /* end drawing */
  340. rtgui_dc_end_drawing(dc);
  341. }
  342. static const rt_uint8_t checked_byte[7] = {0x02, 0x06, 0x8E, 0xDC, 0xF8, 0x70, 0x20};
  343. void rtgui_theme_draw_checkbox(struct rtgui_checkbox* checkbox)
  344. {
  345. struct rtgui_dc* dc;
  346. struct rtgui_rect rect, box_rect;
  347. rtgui_color_t bc, fc;
  348. fc = RTGUI_WIDGET_FOREGROUND(RTGUI_WIDGET(checkbox));
  349. bc = RTGUI_WIDGET_BACKGROUND(RTGUI_WIDGET(checkbox));
  350. /* begin drawing */
  351. dc = rtgui_dc_begin_drawing(RTGUI_WIDGET(checkbox));
  352. if (dc == RT_NULL) return;
  353. /* get rect */
  354. rtgui_widget_get_rect(RTGUI_WIDGET(checkbox), &rect);
  355. /* fill rect */
  356. rtgui_dc_fill_rect(dc, &rect);
  357. if (RTGUI_WIDGET_IS_FOCUSED(RTGUI_WIDGET(checkbox)))
  358. {
  359. RTGUI_WIDGET_FOREGROUND(RTGUI_WIDGET(checkbox)) = black;
  360. /* draw focused border */
  361. rtgui_rect_inflate(&rect, -1);
  362. rtgui_dc_draw_focus_rect(dc, &rect);
  363. rtgui_rect_inflate(&rect, 1);
  364. }
  365. /* draw check box */
  366. box_rect.x1 = 0;
  367. box_rect.y1 = 0;
  368. box_rect.x2 = CHECK_BOX_W;
  369. box_rect.y2 = CHECK_BOX_H;
  370. rtgui_rect_moveto_align(&rect, &box_rect, RTGUI_ALIGN_CENTER_VERTICAL);
  371. box_rect.x1 += 2; box_rect.x2 += 2;
  372. rtgui_dc_draw_border(dc, &box_rect, RTGUI_BORDER_BOX);
  373. rtgui_rect_inflate(&box_rect, -1);
  374. RTGUI_WIDGET_BACKGROUND(RTGUI_WIDGET(checkbox)) = RTGUI_RGB(247, 247, 246);
  375. rtgui_dc_fill_rect(dc, &box_rect);
  376. if (checkbox->status_down == RTGUI_CHECKBOX_STATUS_CHECKED)
  377. {
  378. RTGUI_WIDGET_FOREGROUND(RTGUI_WIDGET(checkbox)) = RTGUI_RGB(33, 161, 33);
  379. rtgui_dc_draw_byte(dc, box_rect.x1 + 2, box_rect.y1 + 2, 7, checked_byte);
  380. }
  381. /* restore saved color */
  382. RTGUI_WIDGET_BACKGROUND(RTGUI_WIDGET(checkbox)) = bc;
  383. RTGUI_WIDGET_FOREGROUND(RTGUI_WIDGET(checkbox)) = fc;
  384. /* draw text */
  385. rect.x1 += rtgui_rect_height(rect) - 4 + 5;
  386. rtgui_dc_draw_text(dc, rtgui_label_get_text(RTGUI_LABEL(checkbox)), &rect);
  387. /* end drawing */
  388. rtgui_dc_end_drawing(dc);
  389. return;
  390. }
  391. static const rt_uint8_t radio_unchecked_byte[] =
  392. {
  393. 0x0f, 0x00, 0x30, 0xc0, 0x40, 0x20,
  394. 0x40, 0x20, 0x80, 0x10, 0x80, 0x10,
  395. 0x80, 0x10, 0x80, 0x10, 0x40, 0x20,
  396. 0x40, 0x20, 0x30, 0xc0, 0x0f, 0x00,
  397. };
  398. static const rt_uint8_t radio_checked_byte[] =
  399. {
  400. 0x0f, 0x00, 0x30, 0xc0, 0x40, 0x20,
  401. 0x40, 0x20, 0x86, 0x10, 0x8f, 0x10,
  402. 0x8f, 0x10, 0x86, 0x10, 0x40, 0x20,
  403. 0x40, 0x20, 0x30, 0xc0, 0x0f, 0x00,
  404. };
  405. void rtgui_theme_draw_radiobutton(struct rtgui_radiobox* radiobox, rt_uint16_t item)
  406. {
  407. struct rtgui_dc* dc;
  408. struct rtgui_rect rect, item_rect;
  409. int item_size, bord_size;
  410. /* begin drawing */
  411. dc = rtgui_dc_begin_drawing(RTGUI_WIDGET(radiobox));
  412. if (dc == RT_NULL) return;
  413. /* get widget rect */
  414. rtgui_widget_get_rect(RTGUI_WIDGET(radiobox), &rect);
  415. item_size = radiobox->item_size;
  416. /* get board size */
  417. if (radiobox->orient == RTGUI_VERTICAL)
  418. bord_size = item_size;
  419. else
  420. {
  421. rtgui_font_get_metrics(RTGUI_DC_FONT(dc), "H", &item_rect);
  422. bord_size = rtgui_rect_height(item_rect);
  423. }
  424. item_rect = rect;
  425. rtgui_rect_inflate(&item_rect, - bord_size);
  426. if (radiobox->orient == RTGUI_VERTICAL)
  427. {
  428. /* set the first text rect */
  429. item_rect.y1 += item * item_size;
  430. item_rect.y2 = item_rect.y1 + item_size;
  431. /* draw radio */
  432. if (radiobox->item_selection == item)
  433. {
  434. if (RTGUI_WIDGET_IS_FOCUSED(RTGUI_WIDGET(radiobox)))
  435. rtgui_dc_draw_focus_rect(dc, &item_rect);
  436. rtgui_dc_draw_word(dc, item_rect.x1, item_rect.y1 + (item_size - RADIO_BOX_H) / 2,
  437. RADIO_BOX_H, radio_checked_byte);
  438. }
  439. else
  440. {
  441. item_rect.x2 += 1; item_rect.y2 += 1;
  442. rtgui_dc_fill_rect(dc, &item_rect);
  443. item_rect.x2 -= 1; item_rect.y2 -= 1;
  444. rtgui_dc_draw_word(dc, item_rect.x1, item_rect.y1 + (item_size - RADIO_BOX_H) / 2,
  445. RADIO_BOX_H, radio_unchecked_byte);
  446. }
  447. /* draw text */
  448. item_rect.x1 += item_size + 3;
  449. rtgui_dc_draw_text(dc, radiobox->items[item], &item_rect);
  450. }
  451. else
  452. {
  453. item_rect.x1 += item * item_size;
  454. /* set the first text rect */
  455. item_rect.x2 = item_rect.x1 + item_size - 1;
  456. item_rect.y2 = item_rect.y1 + bord_size;
  457. /* draw radio */
  458. if (radiobox->item_selection == item)
  459. {
  460. if (RTGUI_WIDGET_IS_FOCUSED(RTGUI_WIDGET(radiobox)))
  461. rtgui_dc_draw_focus_rect(dc, &item_rect);
  462. rtgui_dc_draw_word(dc, item_rect.x1, item_rect.y1, RADIO_BOX_H, radio_checked_byte);
  463. }
  464. else
  465. {
  466. item_rect.x2 += 1; item_rect.y2 += 1;
  467. rtgui_dc_fill_rect(dc, &item_rect);
  468. item_rect.x2 -= 1; item_rect.y2 -= 1;
  469. rtgui_dc_draw_word(dc, item_rect.x1, item_rect.y1, RADIO_BOX_H, radio_unchecked_byte);
  470. }
  471. /* draw text */
  472. item_rect.x1 += bord_size + 3;
  473. rtgui_dc_draw_text(dc, radiobox->items[item], &item_rect);
  474. }
  475. /* end drawing */
  476. rtgui_dc_end_drawing(dc);
  477. }
  478. void rtgui_theme_draw_radiobox(struct rtgui_radiobox* radiobox)
  479. {
  480. struct rtgui_dc* dc;
  481. struct rtgui_rect rect, item_rect;
  482. int item_size, bord_size, index;
  483. rtgui_color_t fc;
  484. /* begin drawing */
  485. dc = rtgui_dc_begin_drawing(RTGUI_WIDGET(radiobox));
  486. if (dc == RT_NULL) return;
  487. /* get widget rect */
  488. rtgui_widget_get_rect(RTGUI_WIDGET(radiobox), &rect);
  489. rtgui_dc_fill_rect(dc, &rect);
  490. item_size = radiobox->item_size;
  491. /* get board size */
  492. if (radiobox->orient == RTGUI_VERTICAL)
  493. bord_size = item_size;
  494. else
  495. {
  496. rtgui_font_get_metrics(RTGUI_DC_FONT(dc), "H", &item_rect);
  497. bord_size = rtgui_rect_height(item_rect);
  498. }
  499. /* draw box */
  500. rtgui_rect_inflate(&rect, -bord_size/2);
  501. fc = RTGUI_WIDGET_FOREGROUND(RTGUI_WIDGET(radiobox));
  502. RTGUI_WIDGET_FOREGROUND(RTGUI_WIDGET(radiobox)) = white;
  503. rect.x1 ++; rect.y1 ++; rect.x2 ++; rect.y2 ++;
  504. rtgui_dc_draw_rect(dc, &rect);
  505. RTGUI_WIDGET_FOREGROUND(RTGUI_WIDGET(radiobox)) = RTGUI_RGB(128, 128, 128);
  506. rect.x1 --; rect.y1 --; rect.x2 --; rect.y2 --;
  507. rtgui_dc_draw_rect(dc, &rect);
  508. RTGUI_WIDGET_FOREGROUND(RTGUI_WIDGET(radiobox)) = fc;
  509. rtgui_rect_inflate(&rect, bord_size/2);
  510. if (radiobox->text != RT_NULL)
  511. {
  512. struct rtgui_rect text_rect;
  513. /* draw group text */
  514. rtgui_font_get_metrics(RTGUI_DC_FONT(dc), radiobox->text, &text_rect);
  515. rtgui_rect_moveto(&text_rect, rect.x1 + bord_size + 5, rect.y1);
  516. rect.x1 -= 5; rect.x2 += 5;
  517. rtgui_dc_fill_rect(dc, &text_rect);
  518. rect.x1 += 5; rect.x2 -= 5;
  519. rtgui_dc_draw_text(dc, radiobox->text, &text_rect);
  520. }
  521. /* set init item rect */
  522. item_rect = rect;
  523. rtgui_rect_inflate(&item_rect, - bord_size);
  524. if (radiobox->orient == RTGUI_VERTICAL)
  525. {
  526. rt_uint16_t offset;
  527. /* set the first text rect */
  528. item_rect.y2 = item_rect.y1 + item_size;
  529. offset = (item_size - RADIO_BOX_H) / 2;
  530. /* draw each radio button */
  531. for (index = 0; index < radiobox->item_count; index ++)
  532. {
  533. if (item_rect.y2 > rect.y2 - item_size) break;
  534. /* draw radio */
  535. if (radiobox->item_selection == index)
  536. {
  537. if (RTGUI_WIDGET_IS_FOCUSED(RTGUI_WIDGET(radiobox)))
  538. rtgui_dc_draw_focus_rect(dc, &item_rect);
  539. rtgui_dc_draw_word(dc, item_rect.x1, item_rect.y1 + offset, RADIO_BOX_H, radio_checked_byte);
  540. }
  541. else
  542. {
  543. rtgui_dc_draw_word(dc, item_rect.x1, item_rect.y1 + offset, RADIO_BOX_H, radio_unchecked_byte);
  544. }
  545. /* draw text */
  546. item_rect.x1 += item_size + 3;
  547. rtgui_dc_draw_text(dc, radiobox->items[index], &item_rect);
  548. item_rect.x1 -= item_size + 3;
  549. item_rect.y1 += item_size;
  550. item_rect.y2 += item_size;
  551. }
  552. }
  553. else
  554. {
  555. /* set the first text rect */
  556. item_rect.x2 = item_rect.x1 + item_size;
  557. item_rect.y2 = item_rect.y1 + bord_size;
  558. /* draw each radio button */
  559. for (index = 0; index < radiobox->item_count; index ++)
  560. {
  561. if (item_rect.x2 > rect.x2 - item_size) break;
  562. /* draw radio */
  563. if (radiobox->item_selection == index)
  564. {
  565. if (RTGUI_WIDGET_IS_FOCUSED(RTGUI_WIDGET(radiobox)))
  566. rtgui_dc_draw_focus_rect(dc, &item_rect);
  567. rtgui_dc_draw_word(dc, item_rect.x1, item_rect.y1, RADIO_BOX_H, radio_checked_byte);
  568. }
  569. else
  570. {
  571. rtgui_dc_draw_word(dc, item_rect.x1, item_rect.y1, RADIO_BOX_H, radio_unchecked_byte);
  572. }
  573. /* draw text */
  574. item_rect.x1 += bord_size + 3;
  575. rtgui_dc_draw_text(dc, radiobox->items[index], &item_rect);
  576. item_rect.x1 -= bord_size + 3;
  577. item_rect.x1 += item_size;
  578. item_rect.x2 += (item_size - 1);
  579. }
  580. }
  581. /* end drawing */
  582. rtgui_dc_end_drawing(dc);
  583. }
  584. void rtgui_theme_draw_slider(struct rtgui_slider* slider)
  585. {
  586. /* draw button */
  587. struct rtgui_dc* dc;
  588. int i, xsize, x0;
  589. rtgui_rect_t r, focus_rect, slider_rect, slot_rect;
  590. /* begin drawing */
  591. dc = rtgui_dc_begin_drawing(RTGUI_WIDGET(slider));
  592. if (dc == RT_NULL) return;
  593. /* get widget rect */
  594. rtgui_widget_get_rect(RTGUI_WIDGET(slider), &focus_rect);
  595. /* fill widget rect with background color */
  596. rtgui_dc_fill_rect(dc, &focus_rect);
  597. r = focus_rect;
  598. if (slider->orient == RTGUI_VERTICAL)
  599. {
  600. rtgui_rect_inflate(&r, -1);
  601. xsize = r.y2 - r.y1 + 1 - slider->thumb_width;
  602. x0 = r.y1 + slider->thumb_width / 2;
  603. /* calculate thumb position */
  604. slider_rect = r;
  605. slider_rect.x1 = 5;
  606. slider_rect.y1 = x0 + xsize * (slider->value - slider->min) / (slider->max - slider->min) - slider->thumb_width/2;
  607. slider_rect.y2 = slider_rect.y1 + slider->thumb_width;
  608. /* calculate slot position */
  609. slot_rect.y1 = x0;
  610. slot_rect.y2 = x0 + xsize;
  611. slot_rect.x1 = (slider_rect.x1 + slider_rect.x2) /2 -1;
  612. slot_rect.x2 = slot_rect.x1 +3;
  613. /* draw slot */
  614. rtgui_dc_draw_border(dc, &slot_rect, RTGUI_BORDER_RAISE);
  615. /* draw the ticks */
  616. for (i = 0; i <= slider->ticks; i++)
  617. {
  618. int x = x0 + xsize * i / slider->ticks;
  619. rtgui_dc_draw_hline(dc, 1, 3, x);
  620. }
  621. /* draw the thumb */
  622. rtgui_dc_fill_rect(dc, &slider_rect);
  623. rtgui_dc_draw_border(dc, &slider_rect, RTGUI_BORDER_RAISE);
  624. }
  625. else
  626. {
  627. rtgui_rect_inflate(&r, -1);
  628. xsize = r.x2 - r.x1 + 1 - slider->thumb_width;
  629. x0 = r.x1 + slider->thumb_width / 2;
  630. /* calculate thumb position */
  631. slider_rect = r;
  632. slider_rect.y1 = 5;
  633. slider_rect.x1 = x0 + xsize * (slider->value - slider->min) / (slider->max - slider->min) - slider->thumb_width/2;
  634. slider_rect.x2 = slider_rect.x1 + slider->thumb_width;
  635. /* calculate slot position */
  636. slot_rect.x1 = x0;
  637. slot_rect.x2 = x0 + xsize;
  638. slot_rect.y1 = (slider_rect.y1 + slider_rect.y2) /2 -1;
  639. slot_rect.y2 = slot_rect.y1 +3;
  640. /* draw slot */
  641. rtgui_dc_draw_border(dc, &slot_rect, RTGUI_BORDER_RAISE);
  642. /* draw the ticks */
  643. for (i = 0; i <= slider->ticks; i++)
  644. {
  645. int x = x0 + xsize * i / slider->ticks;
  646. rtgui_dc_draw_vline(dc, x, 1, 3);
  647. }
  648. /* draw the thumb */
  649. rtgui_dc_fill_rect(dc, &slider_rect);
  650. rtgui_dc_draw_border(dc, &slider_rect, RTGUI_BORDER_RAISE);
  651. }
  652. /* draw focus */
  653. if (RTGUI_WIDGET_IS_FOCUSED(RTGUI_WIDGET(slider)))
  654. {
  655. rtgui_dc_draw_focus_rect(dc, &focus_rect);
  656. }
  657. /* end drawing */
  658. rtgui_dc_end_drawing(dc);
  659. return;
  660. }
  661. const static rt_uint8_t _up_arrow[] = {0x10, 0x38, 0x7C, 0xFE};
  662. const static rt_uint8_t _down_arrow[] = {0xFE,0x7C, 0x38, 0x10};
  663. const static rt_uint8_t _left_arrow[] = {0x10, 0x30, 0x70, 0xF0, 0x70, 0x30, 0x10};
  664. const static rt_uint8_t _right_arrow[] = {0x80, 0xC0, 0xE0, 0xF0, 0xE0, 0xC0, 0x80};
  665. void rtgui_theme_draw_scrollbar(struct rtgui_scrollbar* bar)
  666. {
  667. /* draw scroll bar */
  668. struct rtgui_dc* dc;
  669. rtgui_rect_t rect, btn_rect, thum_rect, arrow_rect;
  670. rtgui_color_t bc, fc;
  671. /* begin drawing */
  672. dc = rtgui_dc_begin_drawing(&(bar->parent));
  673. if (dc == RT_NULL) return;
  674. rtgui_widget_get_rect(RTGUI_WIDGET(bar), &rect);
  675. /* draw background */
  676. fc = RTGUI_WIDGET_FOREGROUND(RTGUI_WIDGET(bar));
  677. if (!RTGUI_WIDGET_IS_ENABLE(RTGUI_WIDGET(bar)))
  678. RTGUI_WIDGET_FOREGROUND(RTGUI_WIDGET(bar)) = RTGUI_RGB(128, 128, 128);
  679. bc = RTGUI_WIDGET_BACKGROUND(RTGUI_WIDGET(bar));
  680. RTGUI_WIDGET_BACKGROUND(RTGUI_WIDGET(bar)) = white;
  681. rtgui_dc_fill_rect(dc, &rect);
  682. RTGUI_WIDGET_BACKGROUND(RTGUI_WIDGET(bar)) = bc;
  683. if (bar->orient == RTGUI_VERTICAL)
  684. {
  685. btn_rect = rect;
  686. btn_rect.y2 = btn_rect.y1 + (rect.x2 - rect.x1);
  687. /* draw up button */
  688. rtgui_dc_fill_rect(dc, &btn_rect);
  689. if (bar->status & SBS_UPARROW) rtgui_dc_draw_border(dc, &btn_rect, RTGUI_BORDER_SUNKEN);
  690. else rtgui_dc_draw_border(dc, &btn_rect, RTGUI_BORDER_RAISE);
  691. /* draw arrow */
  692. arrow_rect.x1 = 0; arrow_rect.y1 = 0;
  693. arrow_rect.x2 = 7; arrow_rect.y2 = 4;
  694. rtgui_rect_moveto_align(&btn_rect, &arrow_rect,
  695. RTGUI_ALIGN_CENTER_HORIZONTAL | RTGUI_ALIGN_CENTER_VERTICAL);
  696. rtgui_dc_draw_byte(dc, arrow_rect.x1, arrow_rect.y1,
  697. rtgui_rect_height(arrow_rect), _up_arrow);
  698. /* draw thumb */
  699. if (RTGUI_WIDGET_IS_ENABLE(RTGUI_WIDGET(bar)))
  700. {
  701. rtgui_scrollbar_get_thumb_rect(bar, &thum_rect);
  702. rtgui_dc_fill_rect(dc, &thum_rect);
  703. rtgui_dc_draw_border(dc, &thum_rect, RTGUI_BORDER_RAISE);
  704. }
  705. /* draw down button */
  706. btn_rect.y1 = rect.y2 - (rect.x2 - rect.x1);
  707. btn_rect.y2 = rect.y2;
  708. rtgui_dc_fill_rect(dc, &btn_rect);
  709. if (bar->status & SBS_DOWNARROW) rtgui_dc_draw_border(dc, &btn_rect, RTGUI_BORDER_SUNKEN);
  710. else rtgui_dc_draw_border(dc, &btn_rect, RTGUI_BORDER_RAISE);
  711. arrow_rect.x1 = 0; arrow_rect.y1 = 0;
  712. arrow_rect.x2 = 7; arrow_rect.y2 = 4;
  713. rtgui_rect_moveto_align(&btn_rect, &arrow_rect,
  714. RTGUI_ALIGN_CENTER_HORIZONTAL | RTGUI_ALIGN_CENTER_VERTICAL);
  715. rtgui_dc_draw_byte(dc, arrow_rect.x1, arrow_rect.y1,
  716. rtgui_rect_height(arrow_rect), _down_arrow);
  717. }
  718. else
  719. {
  720. btn_rect.x1 = rect.x1;
  721. btn_rect.y1 = rect.y1;
  722. btn_rect.x2 = rect.y2;
  723. btn_rect.y2 = rect.y2;
  724. /* draw left button */
  725. rtgui_dc_fill_rect(dc, &btn_rect);
  726. if (bar->status & SBS_LEFTARROW) rtgui_dc_draw_border(dc, &btn_rect, RTGUI_BORDER_SUNKEN);
  727. else rtgui_dc_draw_border(dc, &btn_rect, RTGUI_BORDER_RAISE);
  728. arrow_rect.x1 = 0; arrow_rect.y1 = 0;
  729. arrow_rect.x2 = 4; arrow_rect.y2 = 7;
  730. rtgui_rect_moveto_align(&btn_rect, &arrow_rect,
  731. RTGUI_ALIGN_CENTER_HORIZONTAL | RTGUI_ALIGN_CENTER_VERTICAL);
  732. rtgui_dc_draw_byte(dc, arrow_rect.x1, arrow_rect.y1,
  733. rtgui_rect_height(arrow_rect), _left_arrow);
  734. /* draw thumb */
  735. if (RTGUI_WIDGET_IS_ENABLE(RTGUI_WIDGET(bar)))
  736. {
  737. rtgui_scrollbar_get_thumb_rect(bar, &thum_rect);
  738. rtgui_dc_fill_rect(dc, &thum_rect);
  739. rtgui_dc_draw_border(dc, &thum_rect, RTGUI_BORDER_RAISE);
  740. }
  741. btn_rect.x1 = rect.x2 - rect.y2;
  742. btn_rect.x2 = rect.x2;
  743. /* draw right button */
  744. rtgui_dc_fill_rect(dc, &btn_rect);
  745. if (bar->status & SBS_RIGHTARROW) rtgui_dc_draw_border(dc, &btn_rect, RTGUI_BORDER_SUNKEN);
  746. else rtgui_dc_draw_border(dc, &btn_rect, RTGUI_BORDER_RAISE);
  747. arrow_rect.x1 = 0; arrow_rect.y1 = 0;
  748. arrow_rect.x2 = 4; arrow_rect.y2 = 7;
  749. rtgui_rect_moveto_align(&btn_rect, &arrow_rect,
  750. RTGUI_ALIGN_CENTER_HORIZONTAL | RTGUI_ALIGN_CENTER_VERTICAL);
  751. rtgui_dc_draw_byte(dc, arrow_rect.x1, arrow_rect.y1,
  752. rtgui_rect_height(arrow_rect), _right_arrow);
  753. }
  754. /* end drawing */
  755. rtgui_dc_end_drawing(dc);
  756. RTGUI_WIDGET_FOREGROUND(RTGUI_WIDGET(bar)) = fc;
  757. return;
  758. }
  759. void rtgui_theme_draw_progressbar(struct rtgui_progressbar* bar)
  760. {
  761. /* draw progress bar */
  762. struct rtgui_dc* dc;
  763. struct rtgui_rect rect;
  764. int max = bar->range;
  765. int pos = bar->position;
  766. int left;
  767. rtgui_color_t bc;
  768. /* begin drawing */
  769. dc = rtgui_dc_begin_drawing(&(bar->parent));
  770. if (dc == RT_NULL) return;
  771. bc = RTGUI_DC_BC(dc);
  772. rtgui_widget_get_rect(&(bar->parent), &rect);
  773. /* fill button rect with background color */
  774. bar->parent.gc.background = RTGUI_RGB(212, 208, 200);
  775. /* draw border */
  776. rect.x2 --; rect.y2 --;
  777. rtgui_dc_draw_border(dc, &rect, RTGUI_BORDER_SUNKEN);
  778. /* Nothing to draw */
  779. if (max == 0)
  780. {
  781. rtgui_dc_end_drawing(dc);
  782. return;
  783. }
  784. rect.x2 ++; rect.y2 ++;
  785. left = max - pos;
  786. rtgui_rect_inflate(&rect, -2);
  787. bar->parent.gc.background = RTGUI_RGB(0, 0, 255);
  788. if (bar->orientation == RTGUI_VERTICAL)
  789. {
  790. /* Vertical bar grows from bottom to top */
  791. int dy = (rtgui_rect_height(rect) * left) / max;
  792. rect.y1 += dy;
  793. rtgui_dc_fill_rect(dc, &rect);
  794. RTGUI_DC_BC(dc) = bc;
  795. rect.y1 -= dy; rect.y2 = dy;
  796. rtgui_dc_fill_rect(dc, &rect);
  797. }
  798. else
  799. {
  800. /* Horizontal bar grows from left to right */
  801. int dx = (rtgui_rect_width(rect) * left) / max;
  802. rect.x2 -= dx;
  803. rtgui_dc_fill_rect(dc, &rect);
  804. RTGUI_DC_BC(dc) = bc;
  805. rect.x1 = rect.x2; rect.x2 += dx;
  806. rtgui_dc_fill_rect(dc, &rect);
  807. }
  808. /* end drawing */
  809. rtgui_dc_end_drawing(dc);
  810. return;
  811. }
  812. void rtgui_theme_draw_staticline(struct rtgui_staticline* staticline)
  813. {
  814. struct rtgui_dc* dc;
  815. struct rtgui_rect rect;
  816. /* begin drawing */
  817. dc = rtgui_dc_begin_drawing(RTGUI_WIDGET(staticline));
  818. if (dc == RT_NULL) return ;
  819. rtgui_widget_get_rect(RTGUI_WIDGET(staticline), &rect);
  820. rtgui_dc_fill_rect(dc, &rect);
  821. if (staticline->orientation == RTGUI_HORIZONTAL)
  822. {
  823. rtgui_dc_draw_horizontal_line(dc, rect.x1, rect.x2, rect.y1);
  824. }
  825. else
  826. {
  827. rtgui_dc_draw_vertical_line(dc, rect.x1, rect.y1, rect.y2);
  828. }
  829. rtgui_dc_end_drawing(dc);
  830. }
  831. rt_uint16_t rtgui_theme_get_selected_height()
  832. {
  833. return SELECTED_HEIGHT;
  834. }
  835. void rtgui_theme_draw_selected(struct rtgui_dc* dc, rtgui_rect_t *rect)
  836. {
  837. rtgui_color_t bc;
  838. rt_uint16_t index;
  839. bc = RTGUI_DC_FC(dc);
  840. RTGUI_DC_FC(dc) = selected_color;
  841. rtgui_dc_draw_hline(dc, rect->x1 + 3, rect->x2 - 2, rect->y1 + 1);
  842. rtgui_dc_draw_hline(dc, rect->x1 + 3, rect->x2 - 2, rect->y2 - 2);
  843. rtgui_dc_draw_vline(dc, rect->x1 + 2, rect->y1 + 2, rect->y2 - 2);
  844. rtgui_dc_draw_vline(dc, rect->x2 - 2, rect->y1 + 2, rect->y2 - 2);
  845. for (index = rect->y1 + 1; index < rect->y2 - 2; index ++)
  846. rtgui_dc_draw_hline(dc, rect->x1 + 3, rect->x2 - 2, index);
  847. RTGUI_DC_FC(dc) = bc;
  848. }
  849. /* get default background color */
  850. rtgui_color_t rtgui_theme_default_bc()
  851. {
  852. return default_background;
  853. }
  854. /* get default foreground color */
  855. rtgui_color_t rtgui_theme_default_fc()
  856. {
  857. return default_foreground;
  858. }