Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/app/gfxdemo/gfxdemo.c

    r266ec54 rfd11144  
    3333 */
    3434
     35#include <canvas.h>
    3536#include <congfx/console.h>
     37#include <draw/surface.h>
    3638#include <display.h>
    3739#include <fibril.h>
     40#include <guigfx/canvas.h>
    3841#include <gfx/bitmap.h>
    3942#include <gfx/color.h>
    4043#include <gfx/render.h>
    41 #include <gfx/font.h>
    42 #include <gfx/text.h>
    43 #include <gfx/typeface.h>
    4444#include <io/console.h>
    4545#include <io/pixelmap.h>
     
    4848#include <str.h>
    4949#include <task.h>
    50 #include <ui/ui.h>
    51 #include <ui/window.h>
    52 #include <ui/wdecor.h>
     50#include <window.h>
    5351
    5452static void wnd_close_event(void *);
     
    6058};
    6159
    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_event
    68 };
    69 
    7060static bool quit = false;
    7161
     
    119109        int i, j;
    120110        errno_t rc;
    121 
    122         if (quit)
    123                 return EOK;
    124111
    125112        rc = clear_scr(gc, w, h);
     
    278265        gfx_rect_t srect;
    279266        errno_t rc;
    280 
    281         if (quit)
    282                 return EOK;
    283267
    284268        rc = clear_scr(gc, w, h);
     
    315299
    316300                        if (quit)
    317                                 goto out;
    318                 }
    319         }
    320 
    321 out:
     301                                break;
     302                }
     303        }
     304
    322305        gfx_bitmap_destroy(bitmap);
    323306
     
    341324        gfx_coord2_t offs;
    342325        errno_t rc;
    343 
    344         if (quit)
    345                 return EOK;
    346326
    347327        rc = clear_scr(gc, w, h);
     
    386366        return rc;
    387367}
    388 
    389368/** Run bitmap color key demo on a graphic context.
    390369 *
     
    400379        gfx_coord2_t offs;
    401380        errno_t rc;
    402 
    403         if (quit)
    404                 return EOK;
    405381
    406382        rc = clear_scr(gc, w, h);
     
    448424}
    449425
    450 /** Run text demo on a graphic context.
     426/** Run demo loop on a graphic context.
    451427 *
    452428 * @param gc Graphic context
     
    454430 * @param h Height
    455431 */
    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 context
    658  * @param w Width
    659  * @param h Height
    660  */
    661432static errno_t demo_loop(gfx_context_t *gc, gfx_coord_t w, gfx_coord_t h)
    662433{
     
    677448
    678449                rc = demo_bitmap_kc(gc, w, h);
    679                 if (rc != EOK)
    680                         return rc;
    681 
    682                 rc = demo_text(gc, w, h);
    683450                if (rc != EOK)
    684451                        return rc;
     
    719486}
    720487
    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. */
     489static errno_t demo_canvas(const char *display_svc)
     490{
     491        canvas_gc_t *cgc = NULL;
    727492        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(&params);
    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, &params.rect);
    756 
    757         rc = ui_window_create(ui, &params, &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) {
    759505                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);
    770540
    771541        task_retval(0);
    772542
    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;
    787552}
    788553
     
    845610
    846611static 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)
    860612{
    861613        printf("Keyboard event type=%d key=%d\n", event->type, event->key);
     
    901653                if (rc != EOK)
    902654                        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);
    905657                if (rc != EOK)
    906658                        return 1;
Note: See TracChangeset for help on using the changeset viewer.