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


Ignore:
Timestamp:
2021-08-15T10:02:32Z (3 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
99589a9
Parents:
de0c55a
Message:

Allow the use of EGA attributes/24-bit characters alongside RGB

In a big hack (since we cannot have different pixel formats yet) we
use a pixel format that allows both 24-bit RGB (without character)
or 24-bit character with 8-bit attributes. Thus in GFX we cannot
currently have characters with any RGB color, but we can set
foreground and background individually (and it even works in EGA mode).

File:
1 edited

Legend:

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

    rde0c55a rbc52b5b  
    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) == 0) {
     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 ^ 0xffffff;
     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++) {
     
    374407                                    y - offs.y - cbm->rect.p0.y);
    375408
    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 
     409                                console_gc_pix_to_charfield(clr, &ch);
    382410                                cbm->cgc->buf[y * cols + x] = ch;
    383411                        }
     
    392420                                    y - offs.y - cbm->rect.p0.y);
    393421
    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;
     422                                console_gc_pix_to_charfield(clr, &ch);
    399423
    400424                                if (clr != cbm->key_color)
     
    404428        } else {
    405429                /* 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;
     430                console_gc_pix_to_charfield(cbm->cgc->clr, &ch);
    411431
    412432                for (y = crect.p0.y; y < crect.p1.y; y++) {
Note: See TracChangeset for help on using the changeset viewer.