Changeset f8375f7 in mainline for uspace/lib/guigfx/src/canvas.c


Ignore:
Timestamp:
2020-05-30T17:16:39Z (5 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
dbef30f
Parents:
cea9f0c
Message:

Communicate memory GC updates via callback function

This is what we want in most use cases. Allows us to expose memory GC
ops directly without interposing on them (greatly simplifying the code).
The previous behavior is easily achieved by supplying the right callback
function.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/guigfx/src/canvas.c

    rcea9f0c rf8375f7  
    4949//#include "../../private/color.h"
    5050
    51 static errno_t canvas_gc_set_color(void *, gfx_color_t *);
    52 static errno_t canvas_gc_fill_rect(void *, gfx_rect_t *);
    53 static errno_t canvas_gc_bitmap_create(void *, gfx_bitmap_params_t *,
    54     gfx_bitmap_alloc_t *, void **);
    55 static errno_t canvas_gc_bitmap_destroy(void *);
    56 static errno_t canvas_gc_bitmap_render(void *, gfx_rect_t *, gfx_coord2_t *);
    57 static errno_t canvas_gc_bitmap_get_alloc(void *, gfx_bitmap_alloc_t *);
    58 
    59 gfx_context_ops_t canvas_gc_ops = {
    60         .set_color = canvas_gc_set_color,
    61         .fill_rect = canvas_gc_fill_rect,
    62         .bitmap_create = canvas_gc_bitmap_create,
    63         .bitmap_destroy = canvas_gc_bitmap_destroy,
    64         .bitmap_render = canvas_gc_bitmap_render,
    65         .bitmap_get_alloc = canvas_gc_bitmap_get_alloc
    66 };
    67 
    68 /** Set color on canvas GC.
    69  *
    70  * Set drawing color on canvas GC.
    71  *
    72  * @param arg Canvas GC
    73  * @param color Color
    74  *
    75  * @return EOK on success or an error code
    76  */
    77 static errno_t canvas_gc_set_color(void *arg, gfx_color_t *color)
    78 {
    79         canvas_gc_t *cgc = (canvas_gc_t *) arg;
    80 
    81         return gfx_set_color(cgc->mbgc, color);
    82 }
    83 
    84 /** Fill rectangle on canvas GC.
    85  *
    86  * @param arg Canvas GC
    87  * @param rect Rectangle
    88  *
    89  * @return EOK on success or an error code
    90  */
    91 static errno_t canvas_gc_fill_rect(void *arg, gfx_rect_t *rect)
    92 {
    93         canvas_gc_t *cgc = (canvas_gc_t *) arg;
    94         errno_t rc;
    95 
    96         rc = gfx_fill_rect(cgc->mbgc, rect);
    97         if (rc == EOK)
    98                 update_canvas(cgc->canvas, cgc->surface);
    99 
    100         return rc;
    101 }
     51static void canvas_gc_update_cb(void *, gfx_rect_t *);
    10252
    10353/** Create canvas GC.
     
    11565{
    11666        canvas_gc_t *cgc = NULL;
    117         gfx_context_t *gc = NULL;
    11867        surface_coord_t w, h;
    11968        gfx_rect_t rect;
     
    12978        }
    13079
    131         rc = gfx_context_new(&canvas_gc_ops, cgc, &gc);
    132         if (rc != EOK)
    133                 goto error;
    134 
    13580        rect.p0.x = 0;
    13681        rect.p0.y = 0;
     
    14287        alloc.pixels = surface_direct_access(surface);
    14388
    144         rc = mem_gc_create(&rect, &alloc, &cgc->mgc);
     89        rc = mem_gc_create(&rect, &alloc, canvas_gc_update_cb,
     90            (void *)cgc, &cgc->mgc);
    14591        if (rc != EOK)
    14692                goto error;
    14793
    148         cgc->mbgc = mem_gc_get_ctx(cgc->mgc);
     94        cgc->gc = mem_gc_get_ctx(cgc->mgc);
    14995
    150         cgc->gc = gc;
    15196        cgc->canvas = canvas;
    15297        cgc->surface = surface;
     
    15499        return EOK;
    155100error:
    156         if (gc != NULL)
    157                 gfx_context_delete(gc);
    158101        if (cgc != NULL)
    159102                free(cgc);
     
    189132}
    190133
    191 /** Create bitmap in canvas GC.
     134/** Canvas GC update callback called by memory GC.
    192135 *
    193136 * @param arg Canvas GC
    194  * @param params Bitmap params
    195  * @param alloc Bitmap allocation info or @c NULL
    196  * @param rbm Place to store pointer to new bitmap
    197  * @return EOK on success or an error code
     137 * @param rect Rectangle to update
    198138 */
    199 errno_t canvas_gc_bitmap_create(void *arg, gfx_bitmap_params_t *params,
    200     gfx_bitmap_alloc_t *alloc, void **rbm)
     139static void canvas_gc_update_cb(void *arg, gfx_rect_t *rect)
    201140{
    202         canvas_gc_t *cgc = (canvas_gc_t *) arg;
    203         canvas_gc_bitmap_t *cbm = NULL;
    204         errno_t rc;
     141        canvas_gc_t *cgc = (canvas_gc_t *)arg;
    205142
    206         cbm = calloc(1, sizeof(canvas_gc_bitmap_t));
    207         if (cbm == NULL)
    208                 return ENOMEM;
    209 
    210         rc = gfx_bitmap_create(cgc->mbgc, params, alloc, &cbm->mbitmap);
    211         if (rc != EOK)
    212                 goto error;
    213 
    214         cbm->cgc = cgc;
    215         *rbm = (void *)cbm;
    216         return EOK;
    217 error:
    218         if (cbm != NULL)
    219                 free(cbm);
    220         return rc;
    221 }
    222 
    223 /** Destroy bitmap in canvas GC.
    224  *
    225  * @param bm Bitmap
    226  * @return EOK on success or an error code
    227  */
    228 static errno_t canvas_gc_bitmap_destroy(void *bm)
    229 {
    230         canvas_gc_bitmap_t *cbm = (canvas_gc_bitmap_t *)bm;
    231         errno_t rc;
    232 
    233         rc = gfx_bitmap_destroy(cbm->mbitmap);
    234         if (rc != EOK)
    235                 return rc;
    236 
    237         free(cbm);
    238         return EOK;
    239 }
    240 
    241 /** Render bitmap in canvas GC.
    242  *
    243  * @param bm Bitmap
    244  * @param srect0 Source rectangle or @c NULL
    245  * @param offs0 Offset or @c NULL
    246  * @return EOK on success or an error code
    247  */
    248 static errno_t canvas_gc_bitmap_render(void *bm, gfx_rect_t *srect0,
    249     gfx_coord2_t *offs0)
    250 {
    251         canvas_gc_bitmap_t *cbm = (canvas_gc_bitmap_t *)bm;
    252         errno_t rc;
    253 
    254         rc = gfx_bitmap_render(cbm->mbitmap, srect0, offs0);
    255         if (rc == EOK)
    256                 update_canvas(cbm->cgc->canvas, cbm->cgc->surface);
    257 
    258         return rc;
    259 }
    260 
    261 /** Get allocation info for bitmap in canvas GC.
    262  *
    263  * @param bm Bitmap
    264  * @param alloc Place to store allocation info
    265  * @return EOK on success or an error code
    266  */
    267 static errno_t canvas_gc_bitmap_get_alloc(void *bm, gfx_bitmap_alloc_t *alloc)
    268 {
    269         canvas_gc_bitmap_t *cbm = (canvas_gc_bitmap_t *)bm;
    270 
    271         return gfx_bitmap_get_alloc(cbm->mbitmap, alloc);
     143        update_canvas(cgc->canvas, cgc->surface);
    272144}
    273145
Note: See TracChangeset for help on using the changeset viewer.