Changeset 68a552f in mainline for uspace/lib/congfx/src/console.c


Ignore:
Timestamp:
2021-02-22T19:52:08Z (3 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
26853ebc
Parents:
2ab8ab3
Message:

Efficient way of rendering to the console via shared buffer

Makes congfx reasonably fast

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/congfx/src/console.c

    r2ab8ab3 r68a552f  
    11/*
    2  * Copyright (c) 2019 Jiri Svoboda
     2 * Copyright (c) 2021 Jiri Svoboda
    33 * All rights reserved.
    44 *
     
    9292{
    9393        console_gc_t *cgc = (console_gc_t *) arg;
    94         int rv;
    9594        gfx_coord_t x, y;
    96 
    97         // XXX We should handle p0.x > p1.x and p0.y > p1.y
    98 
    99         console_set_rgb_color(cgc->con, cgc->clr, cgc->clr);
    100 
    101         for (y = rect->p0.y; y < rect->p1.y; y++) {
    102                 console_set_pos(cgc->con, rect->p0.x, y);
    103 
    104                 for (x = rect->p0.x; x < rect->p1.x; x++) {
    105                         rv = fputc('X', cgc->fout);
    106                         if (rv < 0)
    107                                 return EIO;
    108                 }
    109 
    110                 console_flush(cgc->con);
    111         }
     95        gfx_coord_t cols;
     96        gfx_rect_t crect;
     97        charfield_t ch;
     98
     99        /* Make sure rectangle is clipped and sorted */
     100        gfx_rect_clip(rect, &cgc->rect, &crect);
     101
     102        cols = cgc->rect.p1.x - cgc->rect.p0.x;
     103
     104        ch.ch = 0;
     105        ch.flags = CHAR_FLAG_DIRTY;
     106        ch.attrs.type = CHAR_ATTR_RGB;
     107        ch.attrs.val.rgb.fgcolor = cgc->clr;
     108        ch.attrs.val.rgb.bgcolor = cgc->clr;
     109
     110        for (y = crect.p0.y; y < crect.p1.y; y++) {
     111                for (x = crect.p0.x; x < crect.p1.x; x++) {
     112                        cgc->buf[y * cols + x] = ch;
     113                }
     114        }
     115
     116        console_update(cgc->con, crect.p0.x, crect.p0.y,
     117            crect.p1.x, crect.p1.y);
    112118
    113119        return EOK;
     
    131137        sysarg_t rows;
    132138        sysarg_t cols;
     139        charfield_t *buf;
    133140        errno_t rc;
    134141
     
    140147
    141148        rc = console_get_size(con, &cols, &rows);
     149        if (rc != EOK)
     150                goto error;
     151
     152        rc = console_map(con, cols, rows, &buf);
    142153        if (rc != EOK)
    143154                goto error;
     
    154165        cgc->rect.p1.x = cols;
    155166        cgc->rect.p1.y = rows - 1; /* make sure we avoid bottom-right corner */
     167        cgc->buf = buf;
    156168
    157169        *rgc = cgc;
     
    268280        console_gc_bitmap_t *cbm = (console_gc_bitmap_t *)bm;
    269281        gfx_coord_t x, y;
    270         int rv;
    271282        pixel_t clr;
     283        charfield_t ch;
    272284        pixelmap_t pixelmap;
    273285        gfx_rect_t srect;
     
    275287        gfx_rect_t crect;
    276288        gfx_coord2_t offs;
     289        gfx_coord_t cols;
    277290
    278291        if (srect0 != NULL)
     
    295308        pixelmap.data = cbm->alloc.pixels;
    296309
     310        cols = cbm->cgc->rect.p1.x - cbm->cgc->rect.p0.x;
     311
    297312        if ((cbm->flags & bmpf_color_key) == 0) {
    298313                /* Simple copy */
     
    304319                                    x - offs.x - cbm->rect.p0.x,
    305320                                    y - offs.y - cbm->rect.p0.y);
    306                                 console_set_rgb_color(cbm->cgc->con, clr, clr);
    307 
    308                                 rv = fputc('X', cbm->cgc->fout);
    309                                 if (rv < 0)
    310                                         return EIO;
    311 
    312                                 console_flush(cbm->cgc->con);
     321
     322                                ch.ch = 0;
     323                                ch.flags = CHAR_FLAG_DIRTY;
     324                                ch.attrs.type = CHAR_ATTR_RGB;
     325                                ch.attrs.val.rgb.fgcolor = clr;
     326                                ch.attrs.val.rgb.bgcolor = clr;
     327
     328                                cbm->cgc->buf[y * cols + x] = ch;
    313329                        }
    314330                }
     
    321337                                    x - offs.x - cbm->rect.p0.x,
    322338                                    y - offs.y - cbm->rect.p0.y);
    323                                 console_set_rgb_color(cbm->cgc->con, clr, clr);
    324 
    325                                 if (clr != cbm->key_color) {
    326                                         console_set_pos(cbm->cgc->con, x, y);
    327                                         rv = fputc('X', cbm->cgc->fout);
    328                                         if (rv < 0)
    329                                                 return EIO;
    330 
    331                                         console_flush(cbm->cgc->con);
    332                                 }
    333 
     339
     340                                ch.ch = 0;
     341                                ch.flags = CHAR_FLAG_DIRTY;
     342                                ch.attrs.type = CHAR_ATTR_RGB;
     343                                ch.attrs.val.rgb.fgcolor = clr;
     344                                ch.attrs.val.rgb.bgcolor = clr;
     345
     346                                if (clr != cbm->key_color)
     347                                        cbm->cgc->buf[y * cols + x] = ch;
    334348                        }
    335349                }
     
    338352                console_set_rgb_color(cbm->cgc->con, cbm->cgc->clr,
    339353                    cbm->cgc->clr);
     354                ch.ch = 0;
     355                ch.flags = CHAR_FLAG_DIRTY;
     356                ch.attrs.type = CHAR_ATTR_RGB;
     357                ch.attrs.val.rgb.fgcolor = cbm->cgc->clr;
     358                ch.attrs.val.rgb.bgcolor = cbm->cgc->clr;
    340359
    341360                for (y = crect.p0.y; y < crect.p1.y; y++) {
    342361                        for (x = crect.p0.x; x < crect.p1.x; x++) {
    343 
    344362                                clr = pixelmap_get_pixel(&pixelmap,
    345363                                    x - offs.x - cbm->rect.p0.x,
    346364                                    y - offs.y - cbm->rect.p0.y);
    347365
    348                                 if (clr != cbm->key_color) {
    349                                         console_set_pos(cbm->cgc->con, x, y);
    350                                         rv = fputc('X', cbm->cgc->fout);
    351                                         if (rv < 0)
    352                                                 return EIO;
    353 
    354                                         console_flush(cbm->cgc->con);
    355                                 }
    356 
     366                                if (clr != cbm->key_color)
     367                                        cbm->cgc->buf[y * cols + x] = ch;
    357368                        }
    358369                }
    359370        }
     371
     372        console_update(cbm->cgc->con, crect.p0.x, crect.p0.y, crect.p1.x,
     373            crect.p1.y);
    360374
    361375        return EOK;
Note: See TracChangeset for help on using the changeset viewer.