Ignore:
File:
1 edited

Legend:

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

    rbb14312 r211fd68  
    11/*
    2  * Copyright (c) 2021 Jiri Svoboda
     2 * Copyright (c) 2024 Jiri Svoboda
    33 * All rights reserved.
    44 *
     
    7575};
    7676
     77/** Convert pixel value to charfield.
     78 *
     79 * On the bottom of this function lies a big big hack. In the absence
     80 * of support for different color formats (FIX ME!), here's a single
     81 * format that can represent both 3x8bit RGB and 24-bit characters
     82 * with 8-bit EGA attributes (i.e. we can specify the foreground and
     83 * background colors individually).
     84 *
     85 * A    R   G   B
     86 * 0    red grn blu  24-bit color
     87 * attr c2  c1  c0   attribute + 24-bit character
     88 */
     89static void console_gc_pix_to_charfield(pixel_t clr, charfield_t *ch)
     90{
     91        uint8_t attr;
     92
     93        if ((clr >> 24) == 0xff) {
     94                /* RGB (no text) */
     95                ch->ch = 0;
     96                ch->flags = CHAR_FLAG_DIRTY;
     97                ch->attrs.type = CHAR_ATTR_RGB;
     98                ch->attrs.val.rgb.fgcolor = clr;
     99                ch->attrs.val.rgb.bgcolor = clr;
     100        } else {
     101                /* EGA attributes (with text) */
     102                attr = clr >> 24;
     103                ch->ch = clr & 0xffffff;
     104                ch->flags = CHAR_FLAG_DIRTY;
     105                ch->attrs.type = CHAR_ATTR_INDEX;
     106                ch->attrs.val.index.fgcolor = attr & 0x7;
     107                ch->attrs.val.index.bgcolor = (attr >> 4) & 0x7;
     108                ch->attrs.val.index.attr =
     109                    ((attr & 0x8) ? CATTR_BRIGHT : 0) +
     110                    ((attr & 0x80) ? CATTR_BLINK : 0);
     111        }
     112}
     113
    77114/** Set clipping rectangle on console GC.
    78115 *
     
    107144        console_gc_t *cgc = (console_gc_t *) arg;
    108145
    109         cgc->clr = PIXEL(0, color->r >> 8, color->g >> 8, color->b >> 8);
     146        cgc->clr = PIXEL(color->attr, color->r >> 8, color->g >> 8, color->b >> 8);
    110147        return EOK;
    111148}
     
    131168        cols = cgc->rect.p1.x - cgc->rect.p0.x;
    132169
    133         ch.ch = cgc->clr >> 24;
    134         ch.flags = CHAR_FLAG_DIRTY;
    135         ch.attrs.type = CHAR_ATTR_RGB;
    136         ch.attrs.val.rgb.fgcolor = cgc->clr ^ 0xffffff;
    137         ch.attrs.val.rgb.bgcolor = cgc->clr;
     170        console_gc_pix_to_charfield(cgc->clr, &ch);
    138171
    139172        for (y = crect.p0.y; y < crect.p1.y; y++) {
     
    245278
    246279        free(cgc);
     280        return EOK;
     281}
     282
     283/** Free up console for other users, suspending GC operation.
     284 *
     285 * @param cgc Console GC
     286 * @return EOK on success or an error code
     287 */
     288errno_t console_gc_suspend(console_gc_t *cgc)
     289{
     290        console_unmap(cgc->con, cgc->buf);
     291        cgc->buf = NULL;
     292
     293        console_clear(cgc->con);
     294        console_cursor_visibility(cgc->con, true);
     295        return EOK;
     296}
     297
     298/** Resume GC operation after suspend.
     299 *
     300 * @param cgc Console GC
     301 * @return EOK on success or an error code
     302 */
     303errno_t console_gc_resume(console_gc_t *cgc)
     304{
     305        errno_t rc;
     306
     307        console_clear(cgc->con);
     308
     309        rc = console_map(cgc->con, cgc->rect.p1.x, cgc->rect.p1.y, &cgc->buf);
     310        if (rc != EOK)
     311                return rc;
     312
    247313        return EOK;
    248314}
     
    374440                                    y - offs.y - cbm->rect.p0.y);
    375441
    376                                 ch.ch = clr >> 24;
    377                                 ch.flags = CHAR_FLAG_DIRTY;
    378                                 ch.attrs.type = CHAR_ATTR_RGB;
    379                                 ch.attrs.val.rgb.fgcolor = clr ^ 0xffffff;
    380                                 ch.attrs.val.rgb.bgcolor = clr;
    381 
     442                                console_gc_pix_to_charfield(clr, &ch);
    382443                                cbm->cgc->buf[y * cols + x] = ch;
    383444                        }
     
    392453                                    y - offs.y - cbm->rect.p0.y);
    393454
    394                                 ch.ch = clr >> 24;
    395                                 ch.flags = CHAR_FLAG_DIRTY;
    396                                 ch.attrs.type = CHAR_ATTR_RGB;
    397                                 ch.attrs.val.rgb.fgcolor = clr ^ 0xffffff;
    398                                 ch.attrs.val.rgb.bgcolor = clr;
     455                                console_gc_pix_to_charfield(clr, &ch);
    399456
    400457                                if (clr != cbm->key_color)
     
    404461        } else {
    405462                /* Color key & colorize */
    406                 ch.ch = 0;
    407                 ch.flags = CHAR_FLAG_DIRTY;
    408                 ch.attrs.type = CHAR_ATTR_RGB;
    409                 ch.attrs.val.rgb.fgcolor = cbm->cgc->clr;
    410                 ch.attrs.val.rgb.bgcolor = cbm->cgc->clr;
     463                console_gc_pix_to_charfield(cbm->cgc->clr, &ch);
    411464
    412465                for (y = crect.p0.y; y < crect.p1.y; y++) {
Note: See TracChangeset for help on using the changeset viewer.