Ignore:
File:
1 edited

Legend:

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

    rbc52b5b r0d62c10  
    11/*
    2  * Copyright (c) 2021 Jiri Svoboda
     2 * Copyright (c) 2020 Jiri Svoboda
    33 * All rights reserved.
    44 *
     
    4848#include "../private/memgc.h"
    4949
    50 static errno_t mem_gc_set_clip_rect(void *, gfx_rect_t *);
    5150static errno_t mem_gc_set_color(void *, gfx_color_t *);
    5251static errno_t mem_gc_fill_rect(void *, gfx_rect_t *);
    53 static errno_t mem_gc_update(void *);
    5452static errno_t mem_gc_bitmap_create(void *, gfx_bitmap_params_t *,
    5553    gfx_bitmap_alloc_t *, void **);
     
    5755static errno_t mem_gc_bitmap_render(void *, gfx_rect_t *, gfx_coord2_t *);
    5856static errno_t mem_gc_bitmap_get_alloc(void *, gfx_bitmap_alloc_t *);
    59 static errno_t mem_gc_cursor_get_pos(void *, gfx_coord2_t *);
    60 static errno_t mem_gc_cursor_set_pos(void *, gfx_coord2_t *);
    61 static errno_t mem_gc_cursor_set_visible(void *, bool);
    6257static void mem_gc_invalidate_rect(mem_gc_t *, gfx_rect_t *);
    6358
    6459gfx_context_ops_t mem_gc_ops = {
    65         .set_clip_rect = mem_gc_set_clip_rect,
    6660        .set_color = mem_gc_set_color,
    6761        .fill_rect = mem_gc_fill_rect,
    68         .update = mem_gc_update,
    6962        .bitmap_create = mem_gc_bitmap_create,
    7063        .bitmap_destroy = mem_gc_bitmap_destroy,
    7164        .bitmap_render = mem_gc_bitmap_render,
    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
     65        .bitmap_get_alloc = mem_gc_bitmap_get_alloc
    7666};
    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  */
    85 static 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 }
    9667
    9768/** Set color on memory GC.
     
    10879        mem_gc_t *mgc = (mem_gc_t *) arg;
    10980        uint16_t r, g, b;
    110         uint8_t attr;
    11181
    11282        gfx_color_get_rgb_i16(color, &r, &g, &b);
    113         gfx_color_get_ega(color, &attr);
    114         mgc->color = PIXEL(attr, r >> 8, g >> 8, b >> 8);
     83        mgc->color = PIXEL(0, r >> 8, g >> 8, b >> 8);
    11584        return EOK;
    11685}
     
    131100
    132101        /* Make sure we have a sorted, clipped rectangle */
    133         gfx_rect_clip(rect, &mgc->clip_rect, &crect);
     102        gfx_rect_clip(rect, &mgc->rect, &crect);
    134103
    135104        assert(mgc->rect.p0.x == 0);
     
    150119}
    151120
    152 /** Update memory GC.
    153  *
    154  * @param arg Memory GC
    155  *
    156  * @return EOK on success or an error code
    157  */
    158 static errno_t mem_gc_update(void *arg)
    159 {
    160         mem_gc_t *mgc = (mem_gc_t *) arg;
    161 
    162         mgc->cb->update(mgc->cb_arg);
    163         return EOK;
    164 }
    165 
    166121/** Create memory GC.
    167122 *
     
    170125 * @param rect Bounding rectangle
    171126 * @param alloc Allocation info
    172  * @param cb Pointer to memory GC callbacks
    173  * @param cb_arg Argument to callback functions
     127 * @param update_cb Function called to update a rectangle
     128 * @param cb_arg Argument to callback function
    174129 * @param rgc Place to store pointer to new memory GC
    175130 *
     
    177132 */
    178133errno_t mem_gc_create(gfx_rect_t *rect, gfx_bitmap_alloc_t *alloc,
    179     mem_gc_cb_t *cb, void *cb_arg, mem_gc_t **rgc)
     134    mem_gc_update_cb_t update_cb, void *cb_arg, mem_gc_t **rgc)
    180135{
    181136        mem_gc_t *mgc = NULL;
     
    195150        mgc->gc = gc;
    196151        mgc->rect = *rect;
    197         mgc->clip_rect = *rect;
    198152        mgc->alloc = *alloc;
    199153
    200         mgc->cb = cb;
     154        mgc->update = update_cb;
    201155        mgc->cb_arg = cb_arg;
    202156
     
    236190{
    237191        mgc->rect = *rect;
    238         mgc->clip_rect = *rect;
    239192        mgc->alloc = *alloc;
    240193}
     
    252205static void mem_gc_invalidate_rect(mem_gc_t *mgc, gfx_rect_t *rect)
    253206{
    254         mgc->cb->invalidate(mgc->cb_arg, rect);
     207        mgc->update(mgc->cb_arg, rect);
    255208}
    256209
     
    378331        gfx_rect_t srect;
    379332        gfx_rect_t drect;
    380         gfx_rect_t crect;
    381333        gfx_coord2_t offs;
    382334        gfx_coord_t x, y;
     
    399351        /* Destination rectangle */
    400352        gfx_rect_translate(&offs, &srect, &drect);
    401 
    402         /* Clip destination rectangle */
    403         gfx_rect_clip(&drect, &mbm->mgc->clip_rect, &crect);
    404353
    405354        assert(mbm->alloc.pitch == (mbm->rect.p1.x - mbm->rect.p0.x) *
     
    420369        } else if ((mbm->flags & bmpf_color_key) == 0) {
    421370                /* Simple copy */
    422                 for (y = crect.p0.y; y < crect.p1.y; y++) {
    423                         for (x = crect.p0.x; x < crect.p1.x; x++) {
     371                for (y = drect.p0.y; y < drect.p1.y; y++) {
     372                        for (x = drect.p0.x; x < drect.p1.x; x++) {
    424373                                pixel = pixelmap_get_pixel(&smap,
    425374                                    x - mbm->rect.p0.x - offs.x,
     
    430379        } else if ((mbm->flags & bmpf_colorize) == 0) {
    431380                /* Color key */
    432                 for (y = crect.p0.y; y < crect.p1.y; y++) {
    433                         for (x = crect.p0.x; x < crect.p1.x; x++) {
     381                for (y = drect.p0.y; y < drect.p1.y; y++) {
     382                        for (x = drect.p0.x; x < drect.p1.x; x++) {
    434383                                pixel = pixelmap_get_pixel(&smap,
    435384                                    x - mbm->rect.p0.x - offs.x,
     
    441390        } else {
    442391                /* Color key & colorization */
    443                 for (y = crect.p0.y; y < crect.p1.y; y++) {
    444                         for (x = crect.p0.x; x < crect.p1.x; x++) {
     392                for (y = drect.p0.y; y < drect.p1.y; y++) {
     393                        for (x = drect.p0.x; x < drect.p1.x; x++) {
    445394                                pixel = pixelmap_get_pixel(&smap,
    446395                                    x - mbm->rect.p0.x - offs.x,
     
    453402        }
    454403
    455         mem_gc_invalidate_rect(mbm->mgc, &crect);
     404        mem_gc_invalidate_rect(mbm->mgc, &drect);
    456405        return EOK;
    457406}
     
    470419}
    471420
    472 /** Get cursor position on memory GC.
    473  *
    474  * @param arg Memory GC
    475  * @param pos Place to store position
    476  *
    477  * @return EOK on success or an error code
    478  */
    479 static errno_t mem_gc_cursor_get_pos(void *arg, gfx_coord2_t *pos)
    480 {
    481         mem_gc_t *mgc = (mem_gc_t *) arg;
    482 
    483         if (mgc->cb->cursor_get_pos != NULL)
    484                 return mgc->cb->cursor_get_pos(mgc->cb_arg, pos);
    485         else
    486                 return ENOTSUP;
    487 }
    488 
    489 /** Set cursor position on memory GC.
    490  *
    491  * @param arg Memory GC
    492  * @param pos New position
    493  *
    494  * @return EOK on success or an error code
    495  */
    496 static errno_t mem_gc_cursor_set_pos(void *arg, gfx_coord2_t *pos)
    497 {
    498         mem_gc_t *mgc = (mem_gc_t *) arg;
    499 
    500         if (mgc->cb->cursor_set_pos != NULL)
    501                 return mgc->cb->cursor_set_pos(mgc->cb_arg, pos);
    502         else
    503                 return ENOTSUP;
    504 }
    505 
    506 /** Set cursor visibility on memory GC.
    507  *
    508  * @param arg Memory GC
    509  * @param visible @c true iff cursor should be made visible
    510  *
    511  * @return EOK on success or an error code
    512  */
    513 static errno_t mem_gc_cursor_set_visible(void *arg, bool visible)
    514 {
    515         mem_gc_t *mgc = (mem_gc_t *) arg;
    516 
    517         if (mgc->cb->cursor_set_visible != NULL)
    518                 return mgc->cb->cursor_set_visible(mgc->cb_arg, visible);
    519         else
    520                 return ENOTSUP;
    521 }
    522 
    523421/** @}
    524422 */
Note: See TracChangeset for help on using the changeset viewer.