Changes in uspace/lib/congfx/src/console.c [7470d97:211fd68] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/congfx/src/console.c
r7470d97 r211fd68 1 1 /* 2 * Copyright (c) 202 1Jiri Svoboda2 * Copyright (c) 2024 Jiri Svoboda 3 3 * All rights reserved. 4 4 * … … 57 57 static errno_t console_gc_bitmap_render(void *, gfx_rect_t *, gfx_coord2_t *); 58 58 static errno_t console_gc_bitmap_get_alloc(void *, gfx_bitmap_alloc_t *); 59 static errno_t console_gc_cursor_get_pos(void *, gfx_coord2_t *); 60 static errno_t console_gc_cursor_set_pos(void *, gfx_coord2_t *); 61 static errno_t console_gc_cursor_set_visible(void *, bool); 59 62 60 63 gfx_context_ops_t console_gc_ops = { … … 66 69 .bitmap_destroy = console_gc_bitmap_destroy, 67 70 .bitmap_render = console_gc_bitmap_render, 68 .bitmap_get_alloc = console_gc_bitmap_get_alloc 71 .bitmap_get_alloc = console_gc_bitmap_get_alloc, 72 .cursor_get_pos = console_gc_cursor_get_pos, 73 .cursor_set_pos = console_gc_cursor_set_pos, 74 .cursor_set_visible = console_gc_cursor_set_visible 69 75 }; 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 } 70 113 71 114 /** Set clipping rectangle on console GC. … … 101 144 console_gc_t *cgc = (console_gc_t *) arg; 102 145 103 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); 104 147 return EOK; 105 148 } … … 125 168 cols = cgc->rect.p1.x - cgc->rect.p0.x; 126 169 127 ch.ch = cgc->clr >> 24; 128 ch.flags = CHAR_FLAG_DIRTY; 129 ch.attrs.type = CHAR_ATTR_RGB; 130 ch.attrs.val.rgb.fgcolor = cgc->clr ^ 0xffffff; 131 ch.attrs.val.rgb.bgcolor = cgc->clr; 170 console_gc_pix_to_charfield(cgc->clr, &ch); 132 171 133 172 for (y = crect.p0.y; y < crect.p1.y; y++) { … … 239 278 240 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 241 313 return EOK; 242 314 } … … 368 440 y - offs.y - cbm->rect.p0.y); 369 441 370 ch.ch = clr >> 24; 371 ch.flags = CHAR_FLAG_DIRTY; 372 ch.attrs.type = CHAR_ATTR_RGB; 373 ch.attrs.val.rgb.fgcolor = clr ^ 0xffffff; 374 ch.attrs.val.rgb.bgcolor = clr; 375 442 console_gc_pix_to_charfield(clr, &ch); 376 443 cbm->cgc->buf[y * cols + x] = ch; 377 444 } … … 386 453 y - offs.y - cbm->rect.p0.y); 387 454 388 ch.ch = clr >> 24; 389 ch.flags = CHAR_FLAG_DIRTY; 390 ch.attrs.type = CHAR_ATTR_RGB; 391 ch.attrs.val.rgb.fgcolor = clr ^ 0xffffff; 392 ch.attrs.val.rgb.bgcolor = clr; 455 console_gc_pix_to_charfield(clr, &ch); 393 456 394 457 if (clr != cbm->key_color) … … 398 461 } else { 399 462 /* Color key & colorize */ 400 ch.ch = 0; 401 ch.flags = CHAR_FLAG_DIRTY; 402 ch.attrs.type = CHAR_ATTR_RGB; 403 ch.attrs.val.rgb.fgcolor = cbm->cgc->clr; 404 ch.attrs.val.rgb.bgcolor = cbm->cgc->clr; 463 console_gc_pix_to_charfield(cbm->cgc->clr, &ch); 405 464 406 465 for (y = crect.p0.y; y < crect.p1.y; y++) { … … 435 494 } 436 495 496 /** Get cursor position on console GC. 497 * 498 * @param arg Console GC 499 * @param pos Place to store position 500 * 501 * @return EOK on success or an error code 502 */ 503 static errno_t console_gc_cursor_get_pos(void *arg, gfx_coord2_t *pos) 504 { 505 console_gc_t *cgc = (console_gc_t *) arg; 506 sysarg_t col; 507 sysarg_t row; 508 errno_t rc; 509 510 rc = console_get_pos(cgc->con, &col, &row); 511 if (rc != EOK) 512 return rc; 513 514 pos->x = col; 515 pos->y = row; 516 return EOK; 517 } 518 519 /** Set cursor position on console GC. 520 * 521 * @param arg Console GC 522 * @param pos New cursor position 523 * 524 * @return EOK on success or an error code 525 */ 526 static errno_t console_gc_cursor_set_pos(void *arg, gfx_coord2_t *pos) 527 { 528 console_gc_t *cgc = (console_gc_t *) arg; 529 530 console_set_pos(cgc->con, pos->x, pos->y); 531 return EOK; 532 } 533 534 /** Set cursor visibility on console GC. 535 * 536 * @param arg Console GC 537 * @param visible @c true iff cursor should be made visible 538 * 539 * @return EOK on success or an error code 540 */ 541 static errno_t console_gc_cursor_set_visible(void *arg, bool visible) 542 { 543 console_gc_t *cgc = (console_gc_t *) arg; 544 545 console_cursor_visibility(cgc->con, visible); 546 return EOK; 547 } 548 437 549 /** @} 438 550 */
Note:
See TracChangeset
for help on using the changeset viewer.