Changes in uspace/lib/congfx/src/console.c [bb14312:211fd68] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/congfx/src/console.c
rbb14312 r211fd68 1 1 /* 2 * Copyright (c) 202 1Jiri Svoboda2 * Copyright (c) 2024 Jiri Svoboda 3 3 * All rights reserved. 4 4 * … … 75 75 }; 76 76 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 */ 89 static 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 77 114 /** Set clipping rectangle on console GC. 78 115 * … … 107 144 console_gc_t *cgc = (console_gc_t *) arg; 108 145 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); 110 147 return EOK; 111 148 } … … 131 168 cols = cgc->rect.p1.x - cgc->rect.p0.x; 132 169 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); 138 171 139 172 for (y = crect.p0.y; y < crect.p1.y; y++) { … … 245 278 246 279 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 */ 288 errno_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 */ 303 errno_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 247 313 return EOK; 248 314 } … … 374 440 y - offs.y - cbm->rect.p0.y); 375 441 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); 382 443 cbm->cgc->buf[y * cols + x] = ch; 383 444 } … … 392 453 y - offs.y - cbm->rect.p0.y); 393 454 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); 399 456 400 457 if (clr != cbm->key_color) … … 404 461 } else { 405 462 /* 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); 411 464 412 465 for (y = crect.p0.y; y < crect.p1.y; y++) {
Note:
See TracChangeset
for help on using the changeset viewer.