Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/memgfx/src/memgc.c

    r0d62c10 r1215db9  
    11/*
    2  * Copyright (c) 2020 Jiri Svoboda
     2 * Copyright (c) 2021 Jiri Svoboda
    33 * All rights reserved.
    44 *
     
    4848#include "../private/memgc.h"
    4949
     50static errno_t mem_gc_set_clip_rect(void *, gfx_rect_t *);
    5051static errno_t mem_gc_set_color(void *, gfx_color_t *);
    5152static errno_t mem_gc_fill_rect(void *, gfx_rect_t *);
     53static errno_t mem_gc_update(void *);
    5254static errno_t mem_gc_bitmap_create(void *, gfx_bitmap_params_t *,
    5355    gfx_bitmap_alloc_t *, void **);
     
    5557static errno_t mem_gc_bitmap_render(void *, gfx_rect_t *, gfx_coord2_t *);
    5658static errno_t mem_gc_bitmap_get_alloc(void *, gfx_bitmap_alloc_t *);
     59static errno_t mem_gc_cursor_get_pos(void *, gfx_coord2_t *);
     60static errno_t mem_gc_cursor_set_pos(void *, gfx_coord2_t *);
     61static errno_t mem_gc_cursor_set_visible(void *, bool);
    5762static void mem_gc_invalidate_rect(mem_gc_t *, gfx_rect_t *);
    5863
    5964gfx_context_ops_t mem_gc_ops = {
     65        .set_clip_rect = mem_gc_set_clip_rect,
    6066        .set_color = mem_gc_set_color,
    6167        .fill_rect = mem_gc_fill_rect,
     68        .update = mem_gc_update,
    6269        .bitmap_create = mem_gc_bitmap_create,
    6370        .bitmap_destroy = mem_gc_bitmap_destroy,
    6471        .bitmap_render = mem_gc_bitmap_render,
    65         .bitmap_get_alloc = mem_gc_bitmap_get_alloc
     72        .bitmap_get_alloc = mem_gc_bitmap_get_alloc,
     73        .cursor_get_pos = mem_gc_cursor_get_pos,
     74        .cursor_set_pos = mem_gc_cursor_set_pos,
     75        .cursor_set_visible = mem_gc_cursor_set_visible
    6676};
     77
     78/** Set clipping rectangle on memory GC.
     79 *
     80 * @param arg Memory GC
     81 * @param rect Rectangle
     82 *
     83 * @return EOK on success or an error code
     84 */
     85static errno_t mem_gc_set_clip_rect(void *arg, gfx_rect_t *rect)
     86{
     87        mem_gc_t *mgc = (mem_gc_t *) arg;
     88
     89        if (rect != NULL)
     90                gfx_rect_clip(rect, &mgc->rect, &mgc->clip_rect);
     91        else
     92                mgc->clip_rect = mgc->rect;
     93
     94        return EOK;
     95}
    6796
    6897/** Set color on memory GC.
     
    100129
    101130        /* Make sure we have a sorted, clipped rectangle */
    102         gfx_rect_clip(rect, &mgc->rect, &crect);
     131        gfx_rect_clip(rect, &mgc->clip_rect, &crect);
    103132
    104133        assert(mgc->rect.p0.x == 0);
     
    119148}
    120149
     150/** Update memory GC.
     151 *
     152 * @param arg Memory GC
     153 *
     154 * @return EOK on success or an error code
     155 */
     156static errno_t mem_gc_update(void *arg)
     157{
     158        mem_gc_t *mgc = (mem_gc_t *) arg;
     159
     160        mgc->cb->update(mgc->cb_arg);
     161        return EOK;
     162}
     163
    121164/** Create memory GC.
    122165 *
     
    125168 * @param rect Bounding rectangle
    126169 * @param alloc Allocation info
    127  * @param update_cb Function called to update a rectangle
    128  * @param cb_arg Argument to callback function
     170 * @param cb Pointer to memory GC callbacks
     171 * @param cb_arg Argument to callback functions
    129172 * @param rgc Place to store pointer to new memory GC
    130173 *
     
    132175 */
    133176errno_t mem_gc_create(gfx_rect_t *rect, gfx_bitmap_alloc_t *alloc,
    134     mem_gc_update_cb_t update_cb, void *cb_arg, mem_gc_t **rgc)
     177    mem_gc_cb_t *cb, void *cb_arg, mem_gc_t **rgc)
    135178{
    136179        mem_gc_t *mgc = NULL;
     
    150193        mgc->gc = gc;
    151194        mgc->rect = *rect;
     195        mgc->clip_rect = *rect;
    152196        mgc->alloc = *alloc;
    153197
    154         mgc->update = update_cb;
     198        mgc->cb = cb;
    155199        mgc->cb_arg = cb_arg;
    156200
     
    190234{
    191235        mgc->rect = *rect;
     236        mgc->clip_rect = *rect;
    192237        mgc->alloc = *alloc;
    193238}
     
    205250static void mem_gc_invalidate_rect(mem_gc_t *mgc, gfx_rect_t *rect)
    206251{
    207         mgc->update(mgc->cb_arg, rect);
     252        mgc->cb->invalidate(mgc->cb_arg, rect);
    208253}
    209254
     
    331376        gfx_rect_t srect;
    332377        gfx_rect_t drect;
     378        gfx_rect_t crect;
    333379        gfx_coord2_t offs;
    334380        gfx_coord_t x, y;
     
    352398        gfx_rect_translate(&offs, &srect, &drect);
    353399
     400        /* Clip destination rectangle */
     401        gfx_rect_clip(&drect, &mbm->mgc->clip_rect, &crect);
     402
    354403        assert(mbm->alloc.pitch == (mbm->rect.p1.x - mbm->rect.p0.x) *
    355404            (int)sizeof(uint32_t));
     
    369418        } else if ((mbm->flags & bmpf_color_key) == 0) {
    370419                /* Simple copy */
    371                 for (y = drect.p0.y; y < drect.p1.y; y++) {
    372                         for (x = drect.p0.x; x < drect.p1.x; x++) {
     420                for (y = crect.p0.y; y < crect.p1.y; y++) {
     421                        for (x = crect.p0.x; x < crect.p1.x; x++) {
    373422                                pixel = pixelmap_get_pixel(&smap,
    374423                                    x - mbm->rect.p0.x - offs.x,
     
    379428        } else if ((mbm->flags & bmpf_colorize) == 0) {
    380429                /* Color key */
    381                 for (y = drect.p0.y; y < drect.p1.y; y++) {
    382                         for (x = drect.p0.x; x < drect.p1.x; x++) {
     430                for (y = crect.p0.y; y < crect.p1.y; y++) {
     431                        for (x = crect.p0.x; x < crect.p1.x; x++) {
    383432                                pixel = pixelmap_get_pixel(&smap,
    384433                                    x - mbm->rect.p0.x - offs.x,
     
    390439        } else {
    391440                /* Color key & colorization */
    392                 for (y = drect.p0.y; y < drect.p1.y; y++) {
    393                         for (x = drect.p0.x; x < drect.p1.x; x++) {
     441                for (y = crect.p0.y; y < crect.p1.y; y++) {
     442                        for (x = crect.p0.x; x < crect.p1.x; x++) {
    394443                                pixel = pixelmap_get_pixel(&smap,
    395444                                    x - mbm->rect.p0.x - offs.x,
     
    402451        }
    403452
    404         mem_gc_invalidate_rect(mbm->mgc, &drect);
     453        mem_gc_invalidate_rect(mbm->mgc, &crect);
    405454        return EOK;
    406455}
     
    419468}
    420469
     470/** Get cursor position on memory GC.
     471 *
     472 * @param arg Memory GC
     473 * @param pos Place to store position
     474 *
     475 * @return EOK on success or an error code
     476 */
     477static errno_t mem_gc_cursor_get_pos(void *arg, gfx_coord2_t *pos)
     478{
     479        mem_gc_t *mgc = (mem_gc_t *) arg;
     480
     481        if (mgc->cb->cursor_get_pos != NULL)
     482                return mgc->cb->cursor_get_pos(mgc->cb_arg, pos);
     483        else
     484                return ENOTSUP;
     485}
     486
     487/** Set cursor position on memory GC.
     488 *
     489 * @param arg Memory GC
     490 * @param pos New position
     491 *
     492 * @return EOK on success or an error code
     493 */
     494static errno_t mem_gc_cursor_set_pos(void *arg, gfx_coord2_t *pos)
     495{
     496        mem_gc_t *mgc = (mem_gc_t *) arg;
     497
     498        if (mgc->cb->cursor_set_pos != NULL)
     499                return mgc->cb->cursor_set_pos(mgc->cb_arg, pos);
     500        else
     501                return ENOTSUP;
     502}
     503
     504/** Set cursor visibility on memory GC.
     505 *
     506 * @param arg Memory GC
     507 * @param visible @c true iff cursor should be made visible
     508 *
     509 * @return EOK on success or an error code
     510 */
     511static errno_t mem_gc_cursor_set_visible(void *arg, bool visible)
     512{
     513        mem_gc_t *mgc = (mem_gc_t *) arg;
     514
     515        if (mgc->cb->cursor_set_visible != NULL)
     516                return mgc->cb->cursor_set_visible(mgc->cb_arg, visible);
     517        else
     518                return ENOTSUP;
     519}
     520
    421521/** @}
    422522 */
Note: See TracChangeset for help on using the changeset viewer.