Changes in uspace/app/gfxdemo/gfxdemo.c [400a16d:d0dfbba] in mainline
- File:
-
- 1 edited
-
uspace/app/gfxdemo/gfxdemo.c (modified) (46 diffs)
Legend:
- Unmodified
- Added
- Removed
-
uspace/app/gfxdemo/gfxdemo.c
r400a16d rd0dfbba 1 1 /* 2 * Copyright (c) 202 1Jiri Svoboda2 * Copyright (c) 2026 Jiri Svoboda 3 3 * All rights reserved. 4 4 * … … 36 36 #include <display.h> 37 37 #include <fibril.h> 38 #include <fibril_synch.h> 38 39 #include <gfx/bitmap.h> 39 40 #include <gfx/color.h> … … 51 52 #include <ui/window.h> 52 53 #include <ui/wdecor.h> 54 #include "gfxdemo.h" 53 55 54 56 static void wnd_close_event(void *); … … 60 62 }; 61 63 64 static void uiwnd_resize_event(ui_window_t *, void *); 62 65 static void uiwnd_close_event(ui_window_t *, void *); 63 66 static void uiwnd_kbd_event(ui_window_t *, void *, kbd_event_t *); 64 67 65 68 static ui_window_cb_t ui_window_cb = { 69 .resize = uiwnd_resize_event, 66 70 .close = uiwnd_close_event, 67 71 .kbd = uiwnd_kbd_event 68 72 }; 69 73 74 static void demo_kbd_event(kbd_event_t *); 75 70 76 static bool quit = false; 77 static FIBRIL_MUTEX_INITIALIZE(quit_lock); 78 static FIBRIL_CONDVAR_INITIALIZE(quit_cv); 71 79 static gfx_typeface_t *tface; 72 80 static gfx_font_t *font; 73 81 static gfx_coord_t vpad; 82 static console_ctrl_t *con = NULL; 83 static bool textmode; 84 static console_gc_t *cgc = NULL; 85 static unsigned scr_width, scr_height; 86 static ui_t *ui; 74 87 75 88 /** Determine if we are running in text mode. 76 89 * 77 * @param w Screen width78 * @param h Screen height79 90 * @return @c true iff we are running in text mode 80 91 */ 81 static bool demo_is_text(gfx_coord_t w, gfx_coord_t h) 82 { 83 // XXX Need a proper way to determine text mode 84 return w <= 80; 92 static bool demo_is_text(void) 93 { 94 return textmode; 95 } 96 97 /** Sleep until timeout or quit request. 98 * 99 * @param msec Number of microseconds to sleep for 100 */ 101 static void demo_msleep(unsigned msec) 102 { 103 errno_t rc; 104 usec_t usec; 105 cons_event_t cevent; 106 sysarg_t cols, rows; 107 108 if (ui != NULL) 109 ui_unlock(ui); 110 fibril_mutex_lock(&quit_lock); 111 if (!quit) { 112 if (con != NULL) { 113 usec = (usec_t)msec * 1000; 114 while (usec > 0 && !quit) { 115 rc = console_get_event_timeout(con, &cevent, &usec); 116 if (rc == EOK) { 117 if (cevent.type == CEV_KEY) { 118 fibril_mutex_unlock(&quit_lock); 119 demo_kbd_event(&cevent.ev.key); 120 fibril_mutex_lock(&quit_lock); 121 } else if (cevent.type == CEV_RESIZE) { 122 rc = console_get_size(con, 123 &cols, &rows); 124 if (rc == EOK) { 125 scr_width = cols; 126 scr_height = rows; 127 } 128 rc = console_gc_resize(cgc); 129 if (rc != EOK) 130 exit(1); 131 } 132 } 133 } 134 } else { 135 (void) fibril_condvar_wait_timeout(&quit_cv, &quit_lock, 136 (usec_t)msec * 1000); 137 } 138 } 139 fibril_mutex_unlock(&quit_lock); 140 if (ui != NULL) 141 ui_lock(ui); 85 142 } 86 143 … … 138 195 139 196 /* XXX Crude way of detecting text mode */ 140 if ( w < 256) {197 if (demo_is_text()) { 141 198 /* Create dummy font for text mode */ 142 199 rc = gfx_typeface_create(gc, &tface); … … 227 284 228 285 if (font != NULL) { 229 if (demo_is_text( w, h)) {286 if (demo_is_text()) { 230 287 rc = gfx_color_new_ega(0x1e, &color); 231 288 if (rc != EOK) … … 238 295 239 296 gfx_text_fmt_init(&fmt); 297 fmt.font = font; 240 298 fmt.color = color; 241 299 fmt.halign = gfx_halign_center; … … 243 301 244 302 pos.x = w / 2; 245 pos.y = h - 1;246 rc = gfx_puttext( font,&pos, &fmt, text);303 pos.y = h; 304 rc = gfx_puttext(&pos, &fmt, text); 247 305 if (rc != EOK) { 248 306 printf("Error rendering text.\n"); … … 315 373 gfx_color_delete(color); 316 374 317 fibril_usleep(500 * 1000); 318 375 demo_msleep(500); 319 376 if (quit) 320 377 break; … … 350 407 for (j = 0; j < h; j++) { 351 408 pixelmap_put_pixel(&pixelmap, i, j, 352 PIXEL( 0, (i % 30) < 3 ? 255 : 0,409 PIXEL(255, (i % 30) < 3 ? 255 : 0, 353 410 (j % 30) < 3 ? 255 : 0, i / 2)); 354 411 } … … 386 443 k = i * i + j * j; 387 444 pixelmap_put_pixel(&pixelmap, i, j, 388 PIXEL( 0, k, k, k));445 PIXEL(255, k, k, k)); 389 446 } 390 447 } … … 421 478 k = i * i + j * j; 422 479 pixelmap_put_pixel(&pixelmap, i, j, 423 k < w * w / 2 ? PIXEL( 0, 0, 255, 0) :424 PIXEL( 0, 255, 0, 255));480 k < w * w / 2 ? PIXEL(255, 0, 255, 0) : 481 PIXEL(255, 255, 0, 255)); 425 482 } 426 483 } … … 477 534 if (rc != EOK) 478 535 goto error; 479 fibril_usleep(250 * 1000); 480 536 537 demo_msleep(250); 481 538 if (quit) 482 539 goto out; … … 538 595 } 539 596 540 fibril_usleep(500 * 1000); 541 597 demo_msleep(500); 542 598 if (quit) 543 599 break; … … 579 635 params.rect.p1.y = 40; 580 636 params.flags = bmpf_color_key; 581 params.key_color = PIXEL( 0, 255, 0, 255);637 params.key_color = PIXEL(255, 255, 0, 255); 582 638 583 639 rc = gfx_bitmap_create(gc, ¶ms, NULL, &bitmap); … … 599 655 } 600 656 601 fibril_usleep(500 * 1000); 602 657 demo_msleep(500); 603 658 if (quit) 604 659 break; … … 678 733 gfx_color_delete(color); 679 734 680 if (demo_is_text( w, h)) {735 if (demo_is_text()) { 681 736 rc = gfx_color_new_ega(0x1f, &color); 682 737 if (rc != EOK) … … 689 744 690 745 gfx_text_fmt_init(&fmt); 746 fmt.font = font; 691 747 fmt.color = color; 692 748 693 749 pos.x = rect.p0.x; 694 750 pos.y = rect.p0.y; 695 rc = gfx_puttext( font,&pos, &fmt, "Top left");751 rc = gfx_puttext(&pos, &fmt, "Top left"); 696 752 if (rc != EOK) { 697 753 printf("Error rendering text.\n"); … … 702 758 pos.y = rect.p0.y; 703 759 fmt.halign = gfx_halign_center; 704 rc = gfx_puttext( font,&pos, &fmt, "Top center");760 rc = gfx_puttext(&pos, &fmt, "Top center"); 705 761 if (rc != EOK) 706 762 goto error; … … 709 765 pos.y = rect.p0.y; 710 766 fmt.halign = gfx_halign_right; 711 rc = gfx_puttext( font,&pos, &fmt, "Top right");767 rc = gfx_puttext(&pos, &fmt, "Top right"); 712 768 if (rc != EOK) 713 769 goto error; … … 718 774 pos.y = (rect.p0.y + rect.p1.y - 1) / 2; 719 775 fmt.halign = gfx_halign_left; 720 rc = gfx_puttext( font,&pos, &fmt, "Center left");776 rc = gfx_puttext(&pos, &fmt, "Center left"); 721 777 if (rc != EOK) 722 778 goto error; … … 725 781 pos.y = (rect.p0.y + rect.p1.y - 1) / 2; 726 782 fmt.halign = gfx_halign_center; 727 rc = gfx_puttext( font,&pos, &fmt, "Center");783 rc = gfx_puttext(&pos, &fmt, "Center"); 728 784 if (rc != EOK) 729 785 goto error; … … 732 788 pos.y = (rect.p0.y + rect.p1.y - 1) / 2; 733 789 fmt.halign = gfx_halign_right; 734 rc = gfx_puttext( font,&pos, &fmt, "Center right");790 rc = gfx_puttext(&pos, &fmt, "Center right"); 735 791 if (rc != EOK) 736 792 goto error; … … 741 797 pos.y = rect.p1.y - 1; 742 798 fmt.halign = gfx_halign_left; 743 rc = gfx_puttext( font,&pos, &fmt, "Bottom left");799 rc = gfx_puttext(&pos, &fmt, "Bottom left"); 744 800 if (rc != EOK) 745 801 goto error; … … 748 804 pos.y = rect.p1.y; 749 805 fmt.halign = gfx_halign_center; 750 rc = gfx_puttext( font,&pos, &fmt, "Bottom center");806 rc = gfx_puttext(&pos, &fmt, "Bottom center"); 751 807 if (rc != EOK) 752 808 goto error; … … 755 811 pos.y = rect.p1.y; 756 812 fmt.halign = gfx_halign_right; 757 rc = gfx_puttext( font,&pos, &fmt, "Bottom right");813 rc = gfx_puttext(&pos, &fmt, "Bottom right"); 758 814 if (rc != EOK) 759 815 goto error; … … 762 818 763 819 gfx_text_fmt_init(&fmt); 820 fmt.font = font; 764 821 765 822 for (i = 0; i < 8; i++) { 766 if (demo_is_text( w, h)) {823 if (demo_is_text()) { 767 824 rc = gfx_color_new_ega(i != 0 ? i : 0x10, &color); 768 825 if (rc != EOK) … … 776 833 777 834 fmt.color = color; 835 fmt.underline = !fmt.underline; 778 836 779 837 pos.x = w / 20; 780 838 pos.y = (6 + i) * h / 15; 781 rc = gfx_puttext( font,&pos, &fmt, "The quick brown fox jumps over the lazy dog.");839 rc = gfx_puttext(&pos, &fmt, "The quick brown fox jumps over the lazy dog."); 782 840 if (rc != EOK) 783 841 goto error; … … 787 845 788 846 for (i = 0; i < 10; i++) { 789 fibril_usleep(500 * 1000); 847 demo_msleep(500); 848 if (quit) 849 break; 850 } 851 852 return EOK; 853 error: 854 return rc; 855 } 856 857 /** Run text abbreviation demo on a graphic context. 858 * 859 * @param gc Graphic context 860 * @param w Width 861 * @param h Height 862 */ 863 static errno_t demo_text_abbr(gfx_context_t *gc, gfx_coord_t w, gfx_coord_t h) 864 { 865 gfx_color_t *color = NULL; 866 gfx_rect_t rect; 867 gfx_coord2_t pos; 868 gfx_text_fmt_t fmt; 869 int i; 870 errno_t rc; 871 872 if (quit) 873 return EOK; 874 875 rc = demo_begin(gc, w, h, "Text abbreviation"); 876 if (rc != EOK) 877 goto error; 878 879 for (i = 0; i < 11; i++) { 880 881 rc = gfx_color_new_rgb_i16(0, 0, 0x8000, &color); 882 if (rc != EOK) 883 goto error; 884 885 rc = gfx_set_color(gc, color); 886 if (rc != EOK) 887 goto error; 888 889 rect.p0.x = w / 20; 890 rect.p0.y = (2 + 2 * i) * h / 25; 891 rect.p1.x = w - w / 20 - w * i / 12; 892 rect.p1.y = (3 + 2 * i) * h / 25; 893 894 rc = gfx_fill_rect(gc, &rect); 895 if (rc != EOK) 896 goto error; 897 898 gfx_color_delete(color); 899 900 if (demo_is_text()) { 901 rc = gfx_color_new_ega(0x1f, &color); 902 if (rc != EOK) 903 goto error; 904 } else { 905 rc = gfx_color_new_rgb_i16(0xffff, 0xffff, 0xffff, 906 &color); 907 if (rc != EOK) 908 goto error; 909 } 910 911 gfx_text_fmt_init(&fmt); 912 fmt.font = font; 913 fmt.color = color; 914 fmt.abbreviate = true; 915 fmt.width = rect.p1.x - rect.p0.x; 916 917 pos.x = rect.p0.x; 918 pos.y = rect.p0.y; 919 rc = gfx_puttext(&pos, &fmt, 920 "The quick brow fox jumps over the lazy dog!"); 921 if (rc != EOK) { 922 printf("Error rendering text.\n"); 923 goto error; 924 } 925 } 926 927 for (i = 0; i < 10; i++) { 928 demo_msleep(500); 790 929 if (quit) 791 930 break; … … 884 1023 } 885 1024 886 fibril_usleep(500 * 1000); 887 1025 demo_msleep(500); 888 1026 if (quit) 889 1027 break; … … 902 1040 * 903 1041 * @param gc Graphic context 904 * @param w Width 905 * @param h Height 906 */ 907 static errno_t demo_loop(gfx_context_t *gc, gfx_coord_t w, gfx_coord_t h) 908 { 909 errno_t rc; 910 911 (void) demo_font_init(gc, w, h); 1042 */ 1043 static errno_t demo_loop(gfx_context_t *gc) 1044 { 1045 errno_t rc; 1046 1047 (void) demo_font_init(gc, scr_width, scr_height); 912 1048 913 1049 while (!quit) { 914 rc = demo_rects(gc, w, h); 915 if (rc != EOK) 916 goto error; 917 918 rc = demo_bitmap(gc, w, h); 919 if (rc != EOK) 920 goto error; 921 922 rc = demo_bitmap2(gc, w, h); 923 if (rc != EOK) 924 goto error; 925 926 rc = demo_bitmap_kc(gc, w, h); 927 if (rc != EOK) 928 goto error; 929 930 rc = demo_text(gc, w, h); 931 if (rc != EOK) 932 goto error; 933 934 rc = demo_clip(gc, w, h); 1050 rc = demo_rects(gc, scr_width, scr_height); 1051 if (rc != EOK) 1052 goto error; 1053 1054 rc = demo_bitmap(gc, scr_width, scr_height); 1055 if (rc != EOK) 1056 goto error; 1057 1058 rc = demo_bitmap2(gc, scr_width, scr_height); 1059 if (rc != EOK) 1060 goto error; 1061 1062 rc = demo_bitmap_kc(gc, scr_width, scr_height); 1063 if (rc != EOK) 1064 goto error; 1065 1066 rc = demo_text(gc, scr_width, scr_height); 1067 if (rc != EOK) 1068 goto error; 1069 1070 rc = demo_text_abbr(gc, scr_width, scr_height); 1071 if (rc != EOK) 1072 goto error; 1073 1074 rc = demo_clip(gc, scr_width, scr_height); 935 1075 if (rc != EOK) 936 1076 goto error; … … 947 1087 static errno_t demo_console(void) 948 1088 { 949 console_ctrl_t *con = NULL;950 console_gc_t *cgc = NULL;951 1089 gfx_context_t *gc; 952 errno_t rc;953 954 printf("Init console..\n"); 1090 sysarg_t cols, rows; 1091 errno_t rc; 1092 955 1093 con = console_init(stdin, stdout); 956 1094 if (con == NULL) 957 1095 return EIO; 958 1096 959 printf("Create console GC\n"); 1097 rc = console_get_size(con, &cols, &rows); 1098 if (rc != EOK) 1099 return rc; 1100 960 1101 rc = console_gc_create(con, stdout, &cgc); 961 1102 if (rc != EOK) … … 964 1105 gc = console_gc_get_ctx(cgc); 965 1106 966 rc = demo_loop(gc, 80, 25); 1107 /* Currently console is always text. */ 1108 textmode = true; 1109 1110 scr_width = cols; 1111 scr_height = rows; 1112 1113 rc = demo_loop(gc); 967 1114 if (rc != EOK) 968 1115 return rc; … … 973 1120 974 1121 return EOK; 1122 } 1123 1124 static errno_t demo_ui_fibril(void *arg) 1125 { 1126 demo_ui_args_t *args = (demo_ui_args_t *)arg; 1127 errno_t rc; 1128 1129 ui_lock(args->ui); 1130 scr_width = args->dims.x; 1131 scr_height = args->dims.y; 1132 rc = demo_loop(args->gc); 1133 ui_unlock(args->ui); 1134 ui_quit(args->ui); 1135 return rc; 975 1136 } 976 1137 … … 978 1139 static errno_t demo_ui(const char *display_spec) 979 1140 { 980 ui_t *ui = NULL;981 1141 ui_wnd_params_t params; 982 1142 ui_window_t *window = NULL; … … 985 1145 gfx_rect_t wrect; 986 1146 gfx_coord2_t off; 987 errno_t rc; 988 989 printf("Init UI..\n"); 1147 gfx_rect_t ui_rect; 1148 gfx_coord2_t dims; 1149 demo_ui_args_t args; 1150 fid_t fid; 1151 errno_t rc; 990 1152 991 1153 rc = ui_create(display_spec, &ui); 992 1154 if (rc != EOK) { 993 1155 printf("Error initializing UI (%s)\n", display_spec); 1156 goto error; 1157 } 1158 1159 rc = ui_get_rect(ui, &ui_rect); 1160 if (rc != EOK) { 1161 printf("Error getting display size.\n"); 994 1162 goto error; 995 1163 } … … 1003 1171 params.caption = "GFX Demo"; 1004 1172 1173 /* Do not decorate the window in fullscreen mode */ 1174 if (ui_is_fullscreen(ui)) { 1175 params.style &= ~ui_wds_decorated; 1176 params.placement = ui_wnd_place_full_screen; 1177 } 1178 1005 1179 /* 1006 1180 * Compute window rectangle such that application area corresponds 1007 1181 * to rect 1008 1182 */ 1009 ui_wdecor_rect_from_app( params.style, &rect, &wrect);1183 ui_wdecor_rect_from_app(ui, params.style, &rect, &wrect); 1010 1184 off = wrect.p0; 1011 1185 gfx_rect_rtranslate(&off, &wrect, ¶ms.rect); 1186 1187 gfx_rect_dims(&ui_rect, &dims); 1188 1189 /* Make sure window is not larger than the entire screen */ 1190 if (params.rect.p1.x > dims.x) 1191 params.rect.p1.x = dims.x; 1192 if (params.rect.p1.y > dims.y) 1193 params.rect.p1.y = dims.y; 1012 1194 1013 1195 rc = ui_window_create(ui, ¶ms, &window); … … 1025 1207 } 1026 1208 1027 task_retval(0); 1028 1029 rc = demo_loop(gc, rect.p1.x, rect.p1.y); 1030 if (rc != EOK) 1031 goto error; 1032 1209 ui_window_get_app_rect(window, &rect); 1210 gfx_rect_dims(&rect, &dims); 1211 1212 if (!ui_is_fullscreen(ui)) 1213 task_retval(0); 1214 1215 textmode = ui_is_textmode(ui); 1216 1217 args.gc = gc; 1218 args.dims = dims; 1219 args.ui = ui; 1220 1221 fid = fibril_create(demo_ui_fibril, (void *)&args); 1222 if (fid == 0) { 1223 rc = ENOMEM; 1224 goto error; 1225 } 1226 1227 fibril_add_ready(fid); 1228 1229 ui_run(ui); 1033 1230 ui_window_destroy(window); 1034 1231 ui_destroy(ui); … … 1052 1249 errno_t rc; 1053 1250 1054 printf("Init display..\n");1055 1056 1251 rc = display_open(display_svc, &display); 1057 1252 if (rc != EOK) { … … 1065 1260 params.rect.p1.x = 400; 1066 1261 params.rect.p1.y = 300; 1262 params.caption = "GFX Demo"; 1067 1263 1068 1264 rc = display_window_create(display, ¶ms, &wnd_cb, NULL, &window); … … 1080 1276 task_retval(0); 1081 1277 1082 rc = demo_loop(gc, 400, 300); 1278 /* FIXME Assuming display service is not text mode. */ 1279 textmode = false; 1280 1281 scr_width = 400; 1282 scr_height = 300; 1283 rc = demo_loop(gc); 1083 1284 if (rc != EOK) 1084 1285 return rc; … … 1094 1295 } 1095 1296 1297 static void demo_quit(void) 1298 { 1299 fibril_mutex_lock(&quit_lock); 1300 quit = true; 1301 fibril_mutex_unlock(&quit_lock); 1302 fibril_condvar_broadcast(&quit_cv); 1303 } 1304 1096 1305 static void wnd_close_event(void *arg) 1097 1306 { 1098 printf("Close event\n"); 1099 quit = true; 1307 demo_quit(); 1308 } 1309 1310 static void demo_kbd_event(kbd_event_t *event) 1311 { 1312 if (event->type == KEY_PRESS) { 1313 /* Ctrl-Q */ 1314 if ((event->mods & KM_CTRL) != 0 && 1315 (event->mods & KM_ALT) == 0 && 1316 (event->mods & KM_SHIFT) == 0 && 1317 event->key == KC_Q) { 1318 demo_quit(); 1319 } 1320 1321 /* Escape */ 1322 if ((event->mods & KM_CTRL) == 0 && 1323 (event->mods & KM_ALT) == 0 && 1324 (event->mods & KM_SHIFT) == 0 && 1325 event->key == KC_ESCAPE) { 1326 demo_quit(); 1327 } 1328 } 1100 1329 } 1101 1330 1102 1331 static void wnd_kbd_event(void *arg, kbd_event_t *event) 1103 1332 { 1104 printf("Keyboard event type=%d key=%d\n", event->type, event->key); 1105 if (event->type == KEY_PRESS) 1106 quit = true; 1333 (void)arg; 1334 demo_kbd_event(event); 1335 } 1336 1337 static void uiwnd_resize_event(ui_window_t *window, void *arg) 1338 { 1339 gfx_rect_t rect; 1340 gfx_coord2_t dims; 1341 1342 ui_window_get_app_rect(window, &rect); 1343 gfx_rect_dims(&rect, &dims); 1344 scr_width = dims.x; 1345 scr_height = dims.y; 1107 1346 } 1108 1347 1109 1348 static void uiwnd_close_event(ui_window_t *window, void *arg) 1110 1349 { 1111 printf("Close event\n"); 1112 quit = true; 1350 demo_quit(); 1113 1351 } 1114 1352 1115 1353 static void uiwnd_kbd_event(ui_window_t *window, void *arg, kbd_event_t *event) 1116 1354 { 1117 printf("Keyboard event type=%d key=%d\n", event->type, event->key);1118 if (event->type == KEY_PRESS)1119 quit = true;1355 (void)window; 1356 (void)arg; 1357 demo_kbd_event(event); 1120 1358 } 1121 1359 … … 1129 1367 errno_t rc; 1130 1368 const char *display_svc = DISPLAY_DEFAULT; 1369 const char *ui_display_spec = UI_ANY_DEFAULT; 1131 1370 int i; 1132 1371 … … 1141 1380 } 1142 1381 1143 display_svc = argv[i++];1382 display_svc = ui_display_spec = argv[i++]; 1144 1383 } else { 1145 1384 printf("Invalid option '%s'.\n", argv[i]); … … 1149 1388 } 1150 1389 1151 if (i >= argc || str_cmp(argv[i], " display") == 0) {1152 rc = demo_ display(display_svc);1390 if (i >= argc || str_cmp(argv[i], "ui") == 0) { 1391 rc = demo_ui(ui_display_spec); 1153 1392 if (rc != EOK) 1154 1393 return 1; … … 1157 1396 if (rc != EOK) 1158 1397 return 1; 1159 } else if (str_cmp(argv[i], " ui") == 0) {1160 rc = demo_ ui(display_svc);1398 } else if (str_cmp(argv[i], "display") == 0) { 1399 rc = demo_display(display_svc); 1161 1400 if (rc != EOK) 1162 1401 return 1;
Note:
See TracChangeset
for help on using the changeset viewer.
