Changeset 2ab8ab3 in mainline for uspace/lib/ui/src/window.c


Ignore:
Timestamp:
2021-02-16T18:12:05Z (3 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
68a552f
Parents:
ef734b7
Message:

Client-side UI rendering

It is possible to turn on and off and if turned on, one can also
enable or disable window double buffering (currently both options
are build-time).

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/ui/src/window.c

    ref734b7 r2ab8ab3  
    11/*
    2  * Copyright (c) 2020 Jiri Svoboda
     2 * Copyright (c) 2021 Jiri Svoboda
    33 * All rights reserved.
    44 *
     
    8484};
    8585
    86 static void ui_window_app_update(void *, gfx_rect_t *);
     86static void ui_window_invalidate(void *, gfx_rect_t *);
     87static void ui_window_update(void *);
     88static void ui_window_app_invalidate(void *, gfx_rect_t *);
     89static void ui_window_app_update(void *);
    8790
    8891/** Initialize window parameters structure.
     
    123126        ui_wdecor_t *wdecor = NULL;
    124127        dummy_gc_t *dgc = NULL;
     128        gfx_bitmap_params_t bparams;
     129        gfx_bitmap_alloc_t alloc;
     130        gfx_bitmap_t *bmp = NULL;
     131        mem_gc_t *memgc = NULL;
    125132        errno_t rc;
    126133
     
    196203        }
    197204
    198         rc = ui_resource_create(gc, &res);
     205#ifdef CONFIG_UI_CS_RENDER
     206        /* Create window bitmap */
     207        gfx_bitmap_params_init(&bparams);
     208#ifndef CONFIG_WIN_DOUBLE_BUF
     209        bparams.flags |= bmpf_direct_output;
     210#endif
     211
     212        /* Move rectangle so that top-left corner is 0,0 */
     213        gfx_rect_rtranslate(&params->rect.p0, &params->rect, &bparams.rect);
     214
     215        rc = gfx_bitmap_create(gc, &bparams, NULL, &bmp);
     216        if (rc != EOK)
     217                goto error;
     218
     219        /* Create memory GC */
     220        rc = gfx_bitmap_get_alloc(bmp, &alloc);
     221        if (rc != EOK) {
     222                gfx_bitmap_destroy(window->app_bmp);
     223                return rc;
     224        }
     225
     226        rc = mem_gc_create(&bparams.rect, &alloc, ui_window_invalidate,
     227            ui_window_update, (void *) window, &memgc);
     228        if (rc != EOK) {
     229                gfx_bitmap_destroy(window->app_bmp);
     230                return rc;
     231        }
     232
     233        window->bmp = bmp;
     234        window->mgc = memgc;
     235        window->gc = mem_gc_get_ctx(memgc);
     236        window->realgc = gc;
     237#else
     238        (void) ui_window_update;
     239        (void) ui_window_invalidate;
     240        (void) alloc;
     241        (void) bparams;
     242        window->gc = gc;
     243#endif
     244        rc = ui_resource_create(window->gc, &res);
    199245        if (rc != EOK)
    200246                goto error;
     
    211257        window->dwindow = dwindow;
    212258        window->rect = dparams.rect;
    213         window->gc = gc;
     259
    214260        window->res = res;
    215261        window->wdecor = wdecor;
     
    222268        if (res != NULL)
    223269                ui_resource_destroy(res);
     270        if (memgc != NULL)
     271                mem_gc_delete(memgc);
     272        if (bmp != NULL)
     273                gfx_bitmap_destroy(bmp);
    224274        if (dgc != NULL)
    225275                dummygc_destroy(dgc);
     
    242292        ui_wdecor_destroy(window->wdecor);
    243293        ui_resource_destroy(window->res);
     294        if (0 && window->app_mgc != NULL)
     295                mem_gc_delete(window->app_mgc);
     296        if (0 && window->app_bmp != NULL)
     297                gfx_bitmap_destroy(window->app_bmp);
     298        if (window->mgc != NULL) {
     299                mem_gc_delete(window->mgc);
     300                window->gc = NULL;
     301        }
     302        if (window->bmp != NULL)
     303                gfx_bitmap_destroy(window->bmp);
    244304        gfx_context_delete(window->gc);
    245305        display_window_destroy(window->dwindow);
     
    294354        gfx_rect_t arect;
    295355        gfx_bitmap_t *app_bmp = NULL;
    296         gfx_bitmap_params_t params;
    297         gfx_bitmap_alloc_t alloc;
     356        gfx_bitmap_t *win_bmp = NULL;
     357        gfx_bitmap_params_t app_params;
     358        gfx_bitmap_params_t win_params;
     359        gfx_bitmap_alloc_t app_alloc;
     360        gfx_bitmap_alloc_t win_alloc;
    298361        errno_t rc;
    299362
     
    305368        gfx_rect_rtranslate(&offs, rect, &nrect);
    306369
     370        /* mgc != NULL iff client-side rendering */
     371        if (window->mgc != NULL) {
     372                /* Resize window bitmap */
     373                assert(window->bmp != NULL);
     374
     375                gfx_bitmap_params_init(&win_params);
     376#ifndef CONFIG_WIN_DOUBLE_BUF
     377                win_params.flags |= bmpf_direct_output;
     378#endif
     379                win_params.rect = nrect;
     380
     381                rc = gfx_bitmap_create(window->realgc, &win_params, NULL,
     382                    &win_bmp);
     383                if (rc != EOK)
     384                        goto error;
     385
     386                rc = gfx_bitmap_get_alloc(win_bmp, &win_alloc);
     387                if (rc != EOK)
     388                        goto error;
     389        }
     390
     391        /* Application area GC? */
    307392        if (window->app_gc != NULL) {
     393                /* Resize application bitmap */
    308394                assert(window->app_bmp != NULL);
    309395
    310                 gfx_bitmap_params_init(&params);
     396                gfx_bitmap_params_init(&app_params);
    311397
    312398                /*
     
    315401                 */
    316402                ui_wdecor_app_from_rect(window->wdecor->style, &nrect, &arect);
    317                 gfx_rect_rtranslate(&arect.p0, &arect, &params.rect);
    318 
    319                 rc = gfx_bitmap_create(window->gc, &params, NULL,
     403                gfx_rect_rtranslate(&arect.p0, &arect, &app_params.rect);
     404
     405                rc = gfx_bitmap_create(window->gc, &app_params, NULL,
    320406                    &app_bmp);
    321407                if (rc != EOK)
    322408                        goto error;
    323409
    324                 rc = gfx_bitmap_get_alloc(app_bmp, &alloc);
     410                rc = gfx_bitmap_get_alloc(app_bmp, &app_alloc);
    325411                if (rc != EOK)
    326412                        goto error;
     
    334420        }
    335421
     422        /* CLient side rendering? */
     423        if (window->mgc != NULL) {
     424                mem_gc_retarget(window->mgc, &win_params.rect, &win_alloc);
     425
     426                gfx_bitmap_destroy(window->bmp);
     427                window->bmp = win_bmp;
     428        }
     429
    336430        ui_wdecor_set_rect(window->wdecor, &nrect);
    337431        ui_wdecor_paint(window->wdecor);
    338 
     432        gfx_update(window->gc);
     433
     434        /* Application area GC? */
    339435        if (window->app_gc != NULL) {
    340                 mem_gc_retarget(window->app_mgc, &params.rect, &alloc);
     436                mem_gc_retarget(window->app_mgc, &app_params.rect, &app_alloc);
    341437
    342438                gfx_bitmap_destroy(window->app_bmp);
     
    348444        if (app_bmp != NULL)
    349445                gfx_bitmap_destroy(app_bmp);
     446        if (win_bmp != NULL)
     447                gfx_bitmap_destroy(win_bmp);
    350448        return rc;
    351449}
     
    420518                }
    421519
    422                 rc = mem_gc_create(&params.rect, &alloc, ui_window_app_update,
    423                     (void *) window, &memgc);
     520                rc = mem_gc_create(&params.rect, &alloc, ui_window_app_invalidate,
     521                    ui_window_app_update, (void *) window, &memgc);
    424522                if (rc != EOK) {
    425523                        gfx_bitmap_destroy(window->app_bmp);
     
    696794                return ui_control_paint(window->control);
    697795
     796        rc = gfx_update(window->res->gc);
     797        if (rc != EOK)
     798                return rc;
     799
    698800        return EOK;
    699801}
     
    710812}
    711813
    712 /** Application area update callback
     814/** Window invalidate callback
    713815 *
    714816 * @param arg Argument (ui_window_t *)
    715817 * @param rect Rectangle to update
    716818 */
    717 static void ui_window_app_update(void *arg, gfx_rect_t *rect)
     819static void ui_window_invalidate(void *arg, gfx_rect_t *rect)
     820{
     821        ui_window_t *window = (ui_window_t *) arg;
     822        gfx_rect_t env;
     823
     824        gfx_rect_envelope(&window->dirty_rect, rect, &env);
     825        window->dirty_rect = env;
     826}
     827
     828/** Window update callback
     829 *
     830 * @param arg Argument (ui_window_t *)
     831 */
     832static void ui_window_update(void *arg)
     833{
     834        ui_window_t *window = (ui_window_t *) arg;
     835
     836        if (!gfx_rect_is_empty(&window->dirty_rect))
     837                (void) gfx_bitmap_render(window->bmp, &window->dirty_rect, NULL);
     838
     839        window->dirty_rect.p0.x = 0;
     840        window->dirty_rect.p0.y = 0;
     841        window->dirty_rect.p1.x = 0;
     842        window->dirty_rect.p1.y = 0;
     843}
     844
     845/** Application area invalidate callback
     846 *
     847 * @param arg Argument (ui_window_t *)
     848 * @param rect Rectangle to update
     849 */
     850static void ui_window_app_invalidate(void *arg, gfx_rect_t *rect)
    718851{
    719852        ui_window_t *window = (ui_window_t *) arg;
     
    724857        /* Render bitmap rectangle inside the application area */
    725858        (void) gfx_bitmap_render(window->app_bmp, rect, &arect.p0);
     859        /*
     860         * TODO Update applications to call gfx_update(), then
     861         * we can defer update to ui_window_app_update().
     862         */
     863        (void) gfx_update(window->res->gc);
     864}
     865
     866/** Application area update callback
     867 *
     868 * @param arg Argument (ui_window_t *)
     869 */
     870static void ui_window_app_update(void *arg)
     871{
     872        ui_window_t *window = (ui_window_t *) arg;
     873
     874        /*
     875         * Not used since display is updated immediately
     876         * in ui_window_app_invalidate
     877         */
     878        (void) window;
    726879}
    727880
Note: See TracChangeset for help on using the changeset viewer.