Changeset f8375f7 in mainline for uspace/lib/memgfx


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.

Location:
uspace/lib/memgfx
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/memgfx/include/memgfx/memgc.h

    rcea9f0c rf8375f7  
    4040#include <types/gfx/bitmap.h>
    4141#include <types/gfx/context.h>
    42 #include <types/gfx/coord.h>
    4342#include <types/gfx/ops/context.h>
    4443#include <types/memgfx/memgc.h>
     
    4645extern gfx_context_ops_t mem_gc_ops;
    4746
    48 extern errno_t mem_gc_create(gfx_rect_t *, gfx_bitmap_alloc_t *, mem_gc_t **);
     47extern errno_t mem_gc_create(gfx_rect_t *, gfx_bitmap_alloc_t *,
     48    mem_gc_update_cb_t, void *, mem_gc_t **);
    4949extern errno_t mem_gc_delete(mem_gc_t *);
    5050extern gfx_context_t *mem_gc_get_ctx(mem_gc_t *);
    51 extern void mem_gc_get_update_rect(mem_gc_t *, gfx_rect_t *);
    52 extern void mem_gc_clear_update_rect(mem_gc_t *);
    5351
    5452#endif
  • uspace/lib/memgfx/include/types/memgfx/memgc.h

    rcea9f0c rf8375f7  
    3737#define _MEMGFX_TYPES_MEMGC_H
    3838
     39#include <types/gfx/coord.h>
     40
    3941struct mem_gc;
    4042typedef struct mem_gc mem_gc_t;
     43
     44typedef void (*mem_gc_update_cb_t)(void *, gfx_rect_t *);
    4145
    4246#endif
  • uspace/lib/memgfx/private/memgc.h

    rcea9f0c rf8375f7  
    4949        /** Bounding rectangle */
    5050        gfx_rect_t rect;
    51         /** Update rectangle */
    52         gfx_rect_t upd_rect;
    5351        /** Allocation info */
    5452        gfx_bitmap_alloc_t alloc;
     53        /** Update callback */
     54        mem_gc_update_cb_t update;
     55        /** Argument to callback */
     56        void *cb_arg;
    5557        /** Current drawing color */
    5658        pixel_t color;
  • uspace/lib/memgfx/src/memgc.c

    rcea9f0c rf8375f7  
    123123 * @param rect Bounding rectangle
    124124 * @param alloc Allocation info
     125 * @param update_cb Function called to update a rectangle
     126 * @param cb_arg Argument to callback function
    125127 * @param rgc Place to store pointer to new memory GC
    126128 *
     
    128130 */
    129131errno_t mem_gc_create(gfx_rect_t *rect, gfx_bitmap_alloc_t *alloc,
    130     mem_gc_t **rgc)
     132    mem_gc_update_cb_t update_cb, void *cb_arg, mem_gc_t **rgc)
    131133{
    132134        mem_gc_t *mgc = NULL;
     
    159161        assert(alloc->pitch == rect->p1.x * (int)sizeof(uint32_t));
    160162
    161         mem_gc_clear_update_rect(mgc);
     163        mgc->update = update_cb;
     164        mgc->cb_arg = cb_arg;
    162165
    163166        *rgc = mgc;
     
    198201static void mem_gc_invalidate_rect(mem_gc_t *mgc, gfx_rect_t *rect)
    199202{
    200         gfx_rect_t nrect;
    201 
    202         gfx_rect_envelope(&mgc->upd_rect, rect, &nrect);
    203         mgc->upd_rect = nrect;
    204 }
    205 
    206 void mem_gc_get_update_rect(mem_gc_t *mgc, gfx_rect_t *rect)
    207 {
    208         *rect = mgc->upd_rect;
    209 }
    210 
    211 void mem_gc_clear_update_rect(mem_gc_t *mgc)
    212 {
    213         mgc->upd_rect.p0.x = 0;
    214         mgc->upd_rect.p0.y = 0;
    215         mgc->upd_rect.p1.x = 0;
    216         mgc->upd_rect.p1.y = 0;
     203        mgc->update(mgc->cb_arg, rect);
    217204}
    218205
  • uspace/lib/memgfx/test/memgfx.c

    rcea9f0c rf8375f7  
    3434#include <gfx/render.h>
    3535#include <io/pixelmap.h>
     36#include <mem.h>
    3637#include <memgfx/memgc.h>
    3738#include <pcut/pcut.h>
     
    4041
    4142PCUT_TEST_SUITE(memgfx);
     43
     44static void test_update_rect(void *arg, gfx_rect_t *rect);
     45
     46typedef struct {
     47        /** True if update was called */
     48        bool update_called;
     49        /** Update rectangle */
     50        gfx_rect_t rect;
     51} test_update_t;
    4252
    4353/** Test creating and deleting a memory GC */
     
    5969        PCUT_ASSERT_NOT_NULL(alloc.pixels);
    6070
    61         rc = mem_gc_create(&rect, &alloc, &mgc);
     71        rc = mem_gc_create(&rect, &alloc, NULL, NULL, &mgc);
    6272        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    6373
     
    7282        gfx_rect_t rect;
    7383        gfx_rect_t frect;
    74         gfx_rect_t urect;
    7584        gfx_bitmap_alloc_t alloc;
    7685        gfx_context_t *gc;
     
    8089        pixel_t pixel;
    8190        pixel_t expected;
     91        test_update_t update;
    8292        errno_t rc;
    8393
     
    93103        PCUT_ASSERT_NOT_NULL(alloc.pixels);
    94104
    95         rc = mem_gc_create(&rect, &alloc, &mgc);
     105        rc = mem_gc_create(&rect, &alloc, test_update_rect, &update, &mgc);
    96106        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    97107
     
    111121        frect.p1.x = 5;
    112122        frect.p1.y = 5;
     123
     124        memset(&update, 0, sizeof(update));
    113125
    114126        rc = gfx_fill_rect(gc, &frect);
     
    130142
    131143        /* Check that the update rect is equal to the filled rect */
    132         mem_gc_get_update_rect(mgc, &urect);
    133         PCUT_ASSERT_INT_EQUALS(frect.p0.x, urect.p0.x);
    134         PCUT_ASSERT_INT_EQUALS(frect.p0.y, urect.p0.y);
    135         PCUT_ASSERT_INT_EQUALS(frect.p1.x, urect.p1.x);
    136         PCUT_ASSERT_INT_EQUALS(frect.p1.y, urect.p1.y);
    137 
    138         /* Check that mem_gc_clear_update_rect() clears the update rect */
    139         mem_gc_clear_update_rect(mgc);
    140         mem_gc_get_update_rect(mgc, &urect);
    141         PCUT_ASSERT_TRUE(gfx_rect_is_empty(&urect));
     144        PCUT_ASSERT_TRUE(update.update_called);
     145        PCUT_ASSERT_INT_EQUALS(frect.p0.x, update.rect.p0.x);
     146        PCUT_ASSERT_INT_EQUALS(frect.p0.y, update.rect.p0.y);
     147        PCUT_ASSERT_INT_EQUALS(frect.p1.x, update.rect.p1.x);
     148        PCUT_ASSERT_INT_EQUALS(frect.p1.y, update.rect.p1.y);
    142149
    143150        /* TODO: Check clipping once memgc can support pitch != width etc. */
     
    152159        mem_gc_t *mgc;
    153160        gfx_rect_t rect;
    154         gfx_rect_t urect;
    155161        gfx_bitmap_alloc_t alloc;
    156162        gfx_context_t *gc;
     
    163169        pixel_t pixel;
    164170        pixel_t expected;
     171        test_update_t update;
    165172        errno_t rc;
    166173
     
    176183        PCUT_ASSERT_NOT_NULL(alloc.pixels);
    177184
    178         rc = mem_gc_create(&rect, &alloc, &mgc);
     185        rc = mem_gc_create(&rect, &alloc, test_update_rect, &update, &mgc);
    179186        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    180187
     
    211218        dpmap.height = rect.p1.y - rect.p0.y;
    212219        dpmap.data = alloc.pixels;
     220
     221        memset(&update, 0, sizeof(update));
    213222
    214223        /* Render the bitmap */
     
    229238
    230239        /* Check that the update rect is equal to the filled rect */
    231         mem_gc_get_update_rect(mgc, &urect);
    232         PCUT_ASSERT_INT_EQUALS(params.rect.p0.x, urect.p0.x);
    233         PCUT_ASSERT_INT_EQUALS(params.rect.p0.y, urect.p0.y);
    234         PCUT_ASSERT_INT_EQUALS(params.rect.p1.x, urect.p1.x);
    235         PCUT_ASSERT_INT_EQUALS(params.rect.p1.y, urect.p1.y);
    236 
    237         /* Check that mem_gc_clear_update_rect() clears the update rect */
    238         mem_gc_clear_update_rect(mgc);
    239         mem_gc_get_update_rect(mgc, &urect);
    240         PCUT_ASSERT_TRUE(gfx_rect_is_empty(&urect));
     240        PCUT_ASSERT_TRUE(update.update_called);
     241        PCUT_ASSERT_INT_EQUALS(params.rect.p0.x, update.rect.p0.x);
     242        PCUT_ASSERT_INT_EQUALS(params.rect.p0.y, update.rect.p0.y);
     243        PCUT_ASSERT_INT_EQUALS(params.rect.p1.x, update.rect.p1.x);
     244        PCUT_ASSERT_INT_EQUALS(params.rect.p1.y, update.rect.p1.y);
    241245
    242246        /* TODO: Check clipping once memgc can support pitch != width etc. */
     
    246250}
    247251
     252/** Called by memory GC when a rectangle is updated. */
     253static void test_update_rect(void *arg, gfx_rect_t *rect)
     254{
     255        test_update_t *update = (test_update_t *)arg;
     256
     257        update->update_called = true;
     258        update->rect = *rect;
     259}
     260
    248261PCUT_EXPORT(memgfx);
Note: See TracChangeset for help on using the changeset viewer.