Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/hid/rfb/main.c

    r0d62c10 r4c6fd56  
    11/*
     2 * Copyright (c) 2023 Jiri Svoboda
    23 * Copyright (c) 2013 Martin Sucha
    34 * All rights reserved.
     
    5051static errno_t rfb_ddev_get_info(void *, ddev_info_t *);
    5152
     53static errno_t rfb_gc_set_clip_rect(void *, gfx_rect_t *);
    5254static errno_t rfb_gc_set_color(void *, gfx_color_t *);
    5355static errno_t rfb_gc_fill_rect(void *, gfx_rect_t *);
     
    6668        rfb_t rfb;
    6769        pixel_t color;
     70        gfx_rect_t rect;
     71        gfx_rect_t clip_rect;
    6872} rfb_gc_t;
    6973
     
    7882
    7983static gfx_context_ops_t rfb_gc_ops = {
     84        .set_clip_rect = rfb_gc_set_clip_rect,
    8085        .set_color = rfb_gc_set_color,
    8186        .fill_rect = rfb_gc_fill_rect,
     
    134139}
    135140
     141/** Create RFB GC.
     142 *
     143 * @param rrgb Place to store pointer to new RFB GC
     144 * @return EOK on success, ENOMEM if out of memory
     145 */
     146static errno_t rgb_gc_create(rfb_gc_t **rrfb)
     147{
     148        rfb_gc_t *rfb;
     149
     150        rfb = calloc(1, sizeof(rfb_gc_t));
     151        if (rfb == NULL)
     152                return ENOMEM;
     153
     154        *rrfb = rfb;
     155        return EOK;
     156}
     157
     158/** Destroy RFB GC.
     159 *
     160 * @param rfb RFB GC
     161 */
     162static void rfb_gc_destroy(rfb_gc_t *rfb)
     163{
     164        free(rfb);
     165}
     166
     167/** Set clipping rectangle on RFB.
     168 *
     169 * @param arg RFB
     170 * @param rect Rectangle or @c NULL
     171 *
     172 * @return EOK on success or an error code
     173 */
     174static errno_t rfb_gc_set_clip_rect(void *arg, gfx_rect_t *rect)
     175{
     176        rfb_gc_t *rfb = (rfb_gc_t *) arg;
     177
     178        if (rect != NULL)
     179                gfx_rect_clip(rect, &rfb->rect, &rfb->clip_rect);
     180        else
     181                rfb->clip_rect = rfb->rect;
     182
     183        return EOK;
     184}
     185
    136186/** Set color on RFB.
    137187 *
     
    163213{
    164214        rfb_gc_t *rfb = (rfb_gc_t *) arg;
     215        gfx_rect_t crect;
    165216        gfx_coord_t x, y;
    166217
    167         // XXX We should handle p0.x > p1.x and p0.y > p1.y
    168 
    169         for (y = rect->p0.y; y < rect->p1.y; y++) {
    170                 for (x = rect->p0.x; x < rect->p1.x; x++) {
     218        gfx_rect_clip(rect, &rfb->clip_rect, &crect);
     219
     220        for (y = crect.p0.y; y < crect.p1.y; y++) {
     221                for (x = crect.p0.x; x < crect.p1.x; x++) {
    171222                        pixelmap_put_pixel(&rfb->rfb.framebuffer, x, y,
    172223                            rfb->color);
     
    174225        }
    175226
    176         rfb_gc_invalidate_rect(rfb, rect);
     227        rfb_gc_invalidate_rect(rfb, &crect);
    177228
    178229        return EOK;
     
    258309        gfx_rect_t srect;
    259310        gfx_rect_t drect;
     311        gfx_rect_t crect;
    260312        gfx_coord2_t offs;
    261313        gfx_coord2_t bmdim;
     
    279331        /* Destination rectangle */
    280332        gfx_rect_translate(&offs, &srect, &drect);
    281         gfx_coord2_subtract(&drect.p1, &drect.p0, &dim);
     333        gfx_rect_clip(&drect, &rfbbm->rfb->clip_rect, &crect);
     334        gfx_coord2_subtract(&crect.p1, &crect.p0, &dim);
    282335        gfx_coord2_subtract(&rfbbm->rect.p1, &rfbbm->rect.p0, &bmdim);
    283336
     
    320373        }
    321374
    322         rfb_gc_invalidate_rect(rfbbm->rfb, &drect);
     375        rfb_gc_invalidate_rect(rfbbm->rfb, &crect);
    323376
    324377        return EOK;
     
    346399{
    347400        rfb_t *rfb = (rfb_t *) arg;
     401        rfb_gc_t *rfbgc;
    348402        ddev_srv_t srv;
    349403        sysarg_t svc_id;
     
    362416                ddev_conn(icall, &srv);
    363417        } else {
    364                 rc = gfx_context_new(&rfb_gc_ops, (void *) rfb, &gc);
     418                rc = rgb_gc_create(&rfbgc);
    365419                if (rc != EOK) {
    366420                        async_answer_0(icall, ENOMEM);
     
    368422                }
    369423
     424                rfbgc->rect.p0.x = 0;
     425                rfbgc->rect.p0.y = 0;
     426                rfbgc->rect.p1.x = rfb->width;
     427                rfbgc->rect.p1.y = rfb->height;
     428                rfbgc->clip_rect = rfbgc->rect;
     429
     430                rc = gfx_context_new(&rfb_gc_ops, (void *) rfbgc, &gc);
     431                if (rc != EOK) {
     432                        rfb_gc_destroy(rfbgc);
     433                        async_answer_0(icall, ENOMEM);
     434                        return;
     435                }
     436
    370437                /* GC connection */
    371438                gc_conn(icall, gc);
     
    376443{
    377444        rfb_t rfb;
     445        loc_srv_t *srv;
    378446
    379447        log_init(NAME);
     
    415483        async_set_fallback_port_handler(client_connection, &rfb);
    416484
    417         errno_t rc = loc_server_register(NAME);
     485        errno_t rc = loc_server_register(NAME, &srv);
    418486        if (rc != EOK) {
    419487                printf("%s: Unable to register server.\n", NAME);
     
    430498        service_id_t service_id;
    431499
    432         rc = loc_service_register(service_name, &service_id);
     500        rc = loc_service_register(srv, service_name, &service_id);
    433501        if (rc != EOK) {
    434502                printf(NAME ": Unable to register service %s.\n", service_name);
     
    445513        }
    446514
    447         rc = loc_service_add_to_cat(service_id, ddev_cid);
     515        rc = loc_service_add_to_cat(srv, service_id, ddev_cid);
    448516        if (rc != EOK) {
    449517                fprintf(stderr, NAME ": Unable to add service to display device category.\n");
Note: See TracChangeset for help on using the changeset viewer.