Changes in uspace/app/gfxdemo/gfxdemo.c [266ec54:fd11144] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/app/gfxdemo/gfxdemo.c
r266ec54 rfd11144 33 33 */ 34 34 35 #include <canvas.h> 35 36 #include <congfx/console.h> 37 #include <draw/surface.h> 36 38 #include <display.h> 37 39 #include <fibril.h> 40 #include <guigfx/canvas.h> 38 41 #include <gfx/bitmap.h> 39 42 #include <gfx/color.h> 40 43 #include <gfx/render.h> 41 #include <gfx/font.h>42 #include <gfx/text.h>43 #include <gfx/typeface.h>44 44 #include <io/console.h> 45 45 #include <io/pixelmap.h> … … 48 48 #include <str.h> 49 49 #include <task.h> 50 #include <ui/ui.h> 51 #include <ui/window.h> 52 #include <ui/wdecor.h> 50 #include <window.h> 53 51 54 52 static void wnd_close_event(void *); … … 60 58 }; 61 59 62 static void uiwnd_close_event(ui_window_t *, void *);63 static void uiwnd_kbd_event(ui_window_t *, void *, kbd_event_t *);64 65 static ui_window_cb_t ui_window_cb = {66 .close = uiwnd_close_event,67 .kbd = uiwnd_kbd_event68 };69 70 60 static bool quit = false; 71 61 … … 119 109 int i, j; 120 110 errno_t rc; 121 122 if (quit)123 return EOK;124 111 125 112 rc = clear_scr(gc, w, h); … … 278 265 gfx_rect_t srect; 279 266 errno_t rc; 280 281 if (quit)282 return EOK;283 267 284 268 rc = clear_scr(gc, w, h); … … 315 299 316 300 if (quit) 317 goto out; 318 } 319 } 320 321 out: 301 break; 302 } 303 } 304 322 305 gfx_bitmap_destroy(bitmap); 323 306 … … 341 324 gfx_coord2_t offs; 342 325 errno_t rc; 343 344 if (quit)345 return EOK;346 326 347 327 rc = clear_scr(gc, w, h); … … 386 366 return rc; 387 367 } 388 389 368 /** Run bitmap color key demo on a graphic context. 390 369 * … … 400 379 gfx_coord2_t offs; 401 380 errno_t rc; 402 403 if (quit)404 return EOK;405 381 406 382 rc = clear_scr(gc, w, h); … … 448 424 } 449 425 450 /** Run text demoon a graphic context.426 /** Run demo loop on a graphic context. 451 427 * 452 428 * @param gc Graphic context … … 454 430 * @param h Height 455 431 */ 456 static errno_t demo_text(gfx_context_t *gc, gfx_coord_t w, gfx_coord_t h)457 {458 gfx_color_t *color = NULL;459 gfx_rect_t rect;460 gfx_typeface_t *tface = NULL;461 gfx_font_info_t *finfo;462 gfx_font_t *font = NULL;463 gfx_coord2_t pos;464 gfx_text_fmt_t fmt;465 int i;466 errno_t rc;467 468 if (quit)469 return EOK;470 471 rc = gfx_typeface_open(gc, "/data/font/helena.tpf", &tface);472 if (rc != EOK) {473 printf("Error opening typeface\n");474 goto error;475 }476 477 finfo = gfx_typeface_first_font(tface);478 if (finfo == NULL) {479 printf("Typeface contains no font.\n");480 rc = ENOENT;481 goto error;482 }483 484 rc = gfx_font_open(finfo, &font);485 if (rc != EOK) {486 printf("Error opening font.\n");487 goto error;488 }489 490 rc = clear_scr(gc, w, h);491 if (rc != EOK)492 goto error;493 494 /* Vertical bars */495 496 for (i = 0; i < 20; i++) {497 rc = gfx_color_new_rgb_i16(0, 0x8000 * i / 20,498 0x8000 * i / 20, &color);499 if (rc != EOK)500 goto error;501 502 rc = gfx_set_color(gc, color);503 if (rc != EOK)504 goto error;505 506 rect.p0.x = w * i / 20;507 rect.p0.y = 0;508 rect.p1.x = w * (i + 1) / 20;509 rect.p1.y = h;510 511 rc = gfx_fill_rect(gc, &rect);512 if (rc != EOK)513 goto error;514 515 gfx_color_delete(color);516 }517 518 rc = gfx_color_new_rgb_i16(0, 0, 0x8000, &color);519 if (rc != EOK)520 goto error;521 522 rc = gfx_set_color(gc, color);523 if (rc != EOK)524 goto error;525 526 rect.p0.x = w / 20;527 rect.p0.y = 2 * h / 15;528 rect.p1.x = w - w / 20;529 rect.p1.y = 5 * h / 15;530 531 rc = gfx_fill_rect(gc, &rect);532 if (rc != EOK)533 goto error;534 535 gfx_color_delete(color);536 537 rc = gfx_color_new_rgb_i16(0xffff, 0xffff, 0xffff, &color);538 if (rc != EOK)539 goto error;540 541 rc = gfx_set_color(gc, color);542 if (rc != EOK)543 goto error;544 545 gfx_text_fmt_init(&fmt);546 547 pos.x = rect.p0.x;548 pos.y = rect.p0.y;549 rc = gfx_puttext(font, &pos, &fmt, "Top left");550 if (rc != EOK) {551 printf("Error rendering text.\n");552 goto error;553 }554 555 pos.x = (rect.p0.x + rect.p1.x - 1) / 2;556 pos.y = rect.p0.y;557 fmt.halign = gfx_halign_center;558 rc = gfx_puttext(font, &pos, &fmt, "Top center");559 if (rc != EOK)560 goto error;561 562 pos.x = rect.p1.x - 1;563 pos.y = rect.p0.y;564 fmt.halign = gfx_halign_right;565 rc = gfx_puttext(font, &pos, &fmt, "Top right");566 if (rc != EOK)567 goto error;568 569 fmt.valign = gfx_valign_center;570 571 pos.x = rect.p0.x;572 pos.y = (rect.p0.y + rect.p1.y - 1) / 2;573 fmt.halign = gfx_halign_left;574 rc = gfx_puttext(font, &pos, &fmt, "Center left");575 if (rc != EOK)576 goto error;577 578 pos.x = (rect.p0.x + rect.p1.x - 1) / 2;579 pos.y = (rect.p0.y + rect.p1.y - 1) / 2;580 fmt.halign = gfx_halign_center;581 rc = gfx_puttext(font, &pos, &fmt, "Center");582 if (rc != EOK)583 goto error;584 585 pos.x = rect.p1.x - 1;586 pos.y = (rect.p0.y + rect.p1.y - 1) / 2;587 fmt.halign = gfx_halign_right;588 rc = gfx_puttext(font, &pos, &fmt, "Center right");589 if (rc != EOK)590 goto error;591 592 fmt.valign = gfx_valign_bottom;593 594 pos.x = rect.p0.x;595 pos.y = rect.p1.y - 1;596 fmt.halign = gfx_halign_left;597 rc = gfx_puttext(font, &pos, &fmt, "Bottom left");598 if (rc != EOK)599 goto error;600 601 pos.x = (rect.p0.x + rect.p1.x - 1) / 2;602 pos.y = rect.p1.y - 1;603 fmt.halign = gfx_halign_center;604 rc = gfx_puttext(font, &pos, &fmt, "Bottom center");605 if (rc != EOK)606 goto error;607 608 pos.x = rect.p1.x - 1;609 pos.y = rect.p1.y - 1;610 fmt.halign = gfx_halign_right;611 rc = gfx_puttext(font, &pos, &fmt, "Bottom right");612 if (rc != EOK)613 goto error;614 615 gfx_color_delete(color);616 617 gfx_text_fmt_init(&fmt);618 619 for (i = 0; i < 8; i++) {620 rc = gfx_color_new_rgb_i16((i & 4) ? 0xffff : 0,621 (i & 2) ? 0xffff : 0, (i & 1) ? 0xffff : 0, &color);622 if (rc != EOK)623 goto error;624 625 rc = gfx_set_color(gc, color);626 if (rc != EOK)627 goto error;628 629 pos.x = w / 20;630 pos.y = (7 + i) * h / 15;631 rc = gfx_puttext(font, &pos, &fmt, "The quick brown fox jumps over the lazy dog.");632 if (rc != EOK)633 goto error;634 635 gfx_color_delete(color);636 }637 638 for (i = 0; i < 10; i++) {639 fibril_usleep(500 * 1000);640 if (quit)641 break;642 }643 644 gfx_font_close(font);645 gfx_typeface_destroy(tface);646 return EOK;647 error:648 if (font != NULL)649 gfx_font_close(font);650 if (tface != NULL)651 gfx_typeface_destroy(tface);652 return rc;653 }654 655 /** Run demo loop on a graphic context.656 *657 * @param gc Graphic context658 * @param w Width659 * @param h Height660 */661 432 static errno_t demo_loop(gfx_context_t *gc, gfx_coord_t w, gfx_coord_t h) 662 433 { … … 677 448 678 449 rc = demo_bitmap_kc(gc, w, h); 679 if (rc != EOK)680 return rc;681 682 rc = demo_text(gc, w, h);683 450 if (rc != EOK) 684 451 return rc; … … 719 486 } 720 487 721 /** Run demo on UI. */ 722 static errno_t demo_ui(const char *display_spec) 723 { 724 ui_t *ui = NULL; 725 ui_wnd_params_t params; 726 ui_window_t *window = NULL; 488 /** Run demo on canvas. */ 489 static errno_t demo_canvas(const char *display_svc) 490 { 491 canvas_gc_t *cgc = NULL; 727 492 gfx_context_t *gc; 728 gfx_rect_t rect; 729 gfx_rect_t wrect; 730 gfx_coord2_t off; 731 errno_t rc; 732 733 printf("Init UI..\n"); 734 735 rc = ui_create(display_spec, &ui); 736 if (rc != EOK) { 737 printf("Error initializing UI (%s)\n", display_spec); 738 goto error; 739 } 740 741 rect.p0.x = 0; 742 rect.p0.y = 0; 743 rect.p1.x = 400; 744 rect.p1.y = 300; 745 746 ui_wnd_params_init(¶ms); 747 params.caption = "GFX Demo"; 748 749 /* 750 * Compute window rectangle such that application area corresponds 751 * to rect 752 */ 753 ui_wdecor_rect_from_app(params.style, &rect, &wrect); 754 off = wrect.p0; 755 gfx_rect_rtranslate(&off, &wrect, ¶ms.rect); 756 757 rc = ui_window_create(ui, ¶ms, &window); 758 if (rc != EOK) { 493 window_t *window = NULL; 494 pixel_t *pixbuf = NULL; 495 surface_t *surface = NULL; 496 canvas_t *canvas = NULL; 497 gfx_coord_t vw, vh; 498 errno_t rc; 499 500 printf("Init canvas..\n"); 501 502 window = window_open(display_svc, NULL, 503 WINDOW_MAIN | WINDOW_DECORATED, "GFX Demo"); 504 if (window == NULL) { 759 505 printf("Error creating window.\n"); 760 goto error; 761 } 762 763 ui_window_set_cb(window, &ui_window_cb, NULL); 764 765 rc = ui_window_get_app_gc(window, &gc); 766 if (rc != EOK) { 767 printf("Error creating graphic context.\n"); 768 goto error; 769 } 506 return -1; 507 } 508 509 vw = 400; 510 vh = 300; 511 512 pixbuf = calloc(vw * vh, sizeof(pixel_t)); 513 if (pixbuf == NULL) { 514 printf("Error allocating memory for pixel buffer.\n"); 515 return ENOMEM; 516 } 517 518 surface = surface_create(vw, vh, pixbuf, 0); 519 if (surface == NULL) { 520 printf("Error creating surface.\n"); 521 return EIO; 522 } 523 524 canvas = create_canvas(window_root(window), NULL, vw, vh, 525 surface); 526 if (canvas == NULL) { 527 printf("Error creating canvas.\n"); 528 return EIO; 529 } 530 531 window_resize(window, 0, 0, vw + 10, vh + 30, WINDOW_PLACEMENT_ANY); 532 window_exec(window); 533 534 printf("Create canvas GC\n"); 535 rc = canvas_gc_create(canvas, surface, &cgc); 536 if (rc != EOK) 537 return rc; 538 539 gc = canvas_gc_get_ctx(cgc); 770 540 771 541 task_retval(0); 772 542 773 rc = demo_loop(gc, rect.p1.x, rect.p1.y); 774 if (rc != EOK) 775 goto error; 776 777 ui_window_destroy(window); 778 ui_destroy(ui); 779 780 return EOK; 781 error: 782 if (window != NULL) 783 ui_window_destroy(window); 784 if (ui != NULL) 785 ui_destroy(ui); 786 return rc; 543 rc = demo_loop(gc, 400, 300); 544 if (rc != EOK) 545 return rc; 546 547 rc = canvas_gc_delete(cgc); 548 if (rc != EOK) 549 return rc; 550 551 return EOK; 787 552 } 788 553 … … 845 610 846 611 static void wnd_kbd_event(void *arg, kbd_event_t *event) 847 {848 printf("Keyboard event type=%d key=%d\n", event->type, event->key);849 if (event->type == KEY_PRESS)850 quit = true;851 }852 853 static void uiwnd_close_event(ui_window_t *window, void *arg)854 {855 printf("Close event\n");856 quit = true;857 }858 859 static void uiwnd_kbd_event(ui_window_t *window, void *arg, kbd_event_t *event)860 612 { 861 613 printf("Keyboard event type=%d key=%d\n", event->type, event->key); … … 901 653 if (rc != EOK) 902 654 return 1; 903 } else if (str_cmp(argv[i], " ui") == 0) {904 rc = demo_ ui(display_svc);655 } else if (str_cmp(argv[i], "canvas") == 0) { 656 rc = demo_canvas(display_svc); 905 657 if (rc != EOK) 906 658 return 1;
Note:
See TracChangeset
for help on using the changeset viewer.