Changeset 68a552f in mainline for uspace/lib
- Timestamp:
- 2021-02-22T19:52:08Z (4 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 26853ebc
- Parents:
- 2ab8ab3
- Location:
- uspace/lib
- Files:
-
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/c/generic/io/con_srv.c
r2ab8ab3 r68a552f 1 1 /* 2 * Copyright (c) 20 12Jiri Svoboda2 * Copyright (c) 2021 Jiri Svoboda 3 3 * All rights reserved. 4 4 * … … 34 34 * @brief Console protocol server stub 35 35 */ 36 #include <as.h> 36 37 #include <errno.h> 37 38 #include <io/cons_event.h> … … 307 308 } 308 309 310 /** Create shared buffer for efficient rendering */ 311 static void con_map_srv(con_srv_t *srv, ipc_call_t *icall) 312 { 313 errno_t rc; 314 charfield_t *buf; 315 sysarg_t cols, rows; 316 ipc_call_t call; 317 size_t size; 318 319 if (srv->srvs->ops->map == NULL || srv->srvs->ops->unmap == NULL) { 320 async_answer_0(icall, ENOTSUP); 321 return; 322 } 323 324 cols = ipc_get_arg1(icall); 325 rows = ipc_get_arg2(icall); 326 327 if (!async_share_in_receive(&call, &size)) { 328 async_answer_0(icall, EINVAL); 329 return; 330 } 331 332 /* Check size */ 333 if (size != PAGES2SIZE(SIZE2PAGES(cols * rows * sizeof(charfield_t)))) { 334 async_answer_0(&call, EINVAL); 335 async_answer_0(icall, EINVAL); 336 return; 337 } 338 339 rc = srv->srvs->ops->map(srv, cols, rows, &buf); 340 if (rc != EOK) { 341 async_answer_0(&call, rc); 342 async_answer_0(icall, rc); 343 return; 344 } 345 346 rc = async_share_in_finalize(&call, buf, AS_AREA_READ | 347 AS_AREA_WRITE | AS_AREA_CACHEABLE); 348 if (rc != EOK) { 349 srv->srvs->ops->unmap(srv); 350 async_answer_0(icall, EIO); 351 return; 352 } 353 354 async_answer_0(icall, EOK); 355 } 356 357 /** Delete shared buffer */ 358 static void con_unmap_srv(con_srv_t *srv, ipc_call_t *icall) 359 { 360 if (srv->srvs->ops->unmap == NULL) { 361 async_answer_0(icall, ENOTSUP); 362 return; 363 } 364 365 srv->srvs->ops->unmap(srv); 366 async_answer_0(icall, EOK); 367 } 368 369 /** Update console area from shared buffer */ 370 static void con_update_srv(con_srv_t *srv, ipc_call_t *icall) 371 { 372 sysarg_t c0, r0, c1, r1; 373 374 c0 = ipc_get_arg1(icall); 375 r0 = ipc_get_arg2(icall); 376 c1 = ipc_get_arg3(icall); 377 r1 = ipc_get_arg4(icall); 378 379 if (srv->srvs->ops->update == NULL) { 380 async_answer_0(icall, ENOTSUP); 381 return; 382 } 383 384 srv->srvs->ops->update(srv, c0, r0, c1, r1); 385 async_answer_0(icall, EOK); 386 } 387 309 388 static con_srv_t *con_srv_create(con_srvs_t *srvs) 310 389 { … … 412 491 con_get_event_srv(srv, &call); 413 492 break; 493 case CONSOLE_MAP: 494 con_map_srv(srv, &call); 495 break; 496 case CONSOLE_UNMAP: 497 con_unmap_srv(srv, &call); 498 break; 499 case CONSOLE_UPDATE: 500 con_update_srv(srv, &call); 501 break; 414 502 default: 415 503 async_answer_0(&call, ENOTSUP); -
uspace/lib/c/generic/io/console.c
r2ab8ab3 r68a552f 1 1 /* 2 * Copyright (c) 2021 Jiri Svoboda 2 3 * Copyright (c) 2006 Josef Cejka 3 4 * Copyright (c) 2006 Jakub Vana 4 * Copyright (c) 2008 Jiri Svoboda5 5 * All rights reserved. 6 6 * … … 35 35 */ 36 36 37 #include <as.h> 37 38 #include <libc.h> 38 39 #include <async.h> … … 264 265 } 265 266 267 /** Create a shared buffer for fast rendering to the console. 268 * 269 * @param ctrl Console 270 * @param cols Number of columns 271 * @param rows Number of rows 272 * @param rbuf Place to store pointer to the shared buffer 273 * @return EOK on success or an error code 274 */ 275 errno_t console_map(console_ctrl_t *ctrl, sysarg_t cols, sysarg_t rows, 276 charfield_t **rbuf) 277 { 278 async_exch_t *exch = NULL; 279 void *buf; 280 aid_t req; 281 ipc_call_t answer; 282 size_t asize; 283 errno_t rc; 284 285 exch = async_exchange_begin(ctrl->output_sess); 286 req = async_send_2(exch, CONSOLE_MAP, cols, rows, &answer); 287 if (rc != EOK) 288 goto error; 289 290 asize = PAGES2SIZE(SIZE2PAGES(cols * rows * sizeof(charfield_t))); 291 292 rc = async_share_in_start_0_0(exch, asize, &buf); 293 if (rc != EOK) { 294 async_forget(req); 295 goto error; 296 } 297 298 async_exchange_end(exch); 299 exch = NULL; 300 301 async_wait_for(req, &rc); 302 if (rc != EOK) 303 goto error; 304 305 *rbuf = (charfield_t *)buf; 306 return EOK; 307 error: 308 if (exch != NULL) 309 async_exchange_end(exch); 310 return rc; 311 } 312 313 /** Unmap console shared buffer. 314 * 315 * @param ctrl Console 316 * @param buf Buffer 317 */ 318 void console_unmap(console_ctrl_t *ctrl, charfield_t *buf) 319 { 320 as_area_destroy(buf); 321 } 322 323 /** Update console rectangle from shared buffer. 324 * 325 * @param ctrl Console 326 * @param c0 Column coordinate of top-left corner (inclusive) 327 * @param r0 Row coordinate of top-left corner (inclusive) 328 * @param c1 Column coordinate of bottom-right corner (exclusive) 329 * @param r1 Row coordinate of bottom-right corner (exclusive) 330 * 331 * @return EOK on sucess or an error code 332 */ 333 errno_t console_update(console_ctrl_t *ctrl, sysarg_t c0, sysarg_t r0, 334 sysarg_t c1, sysarg_t r1) 335 { 336 async_exch_t *exch = async_exchange_begin(ctrl->output_sess); 337 errno_t rc = async_req_4_0(exch, CONSOLE_UPDATE, c0, r0, c1, r1); 338 async_exchange_end(exch); 339 340 return rc; 341 } 342 266 343 /** @} 267 344 */ -
uspace/lib/c/include/io/con_srv.h
r2ab8ab3 r68a552f 1 1 /* 2 * Copyright (c) 20 12Jiri Svoboda2 * Copyright (c) 2021 Jiri Svoboda 3 3 * All rights reserved. 4 4 * … … 39 39 #include <async.h> 40 40 #include <fibril_synch.h> 41 #include <io/charfield.h> 41 42 #include <io/color.h> 42 43 #include <io/concaps.h> … … 83 84 void (*set_cursor_visibility)(con_srv_t *, bool); 84 85 errno_t (*get_event)(con_srv_t *, cons_event_t *); 86 errno_t (*map)(con_srv_t *, sysarg_t, sysarg_t, charfield_t **); 87 void (*unmap)(con_srv_t *); 88 void (*update)(con_srv_t *, sysarg_t, sysarg_t, sysarg_t, sysarg_t); 85 89 }; 86 90 -
uspace/lib/c/include/io/console.h
r2ab8ab3 r68a552f 1 1 /* 2 * Copyright (c) 20 08Jiri Svoboda2 * Copyright (c) 2021 Jiri Svoboda 3 3 * All rights reserved. 4 4 * … … 37 37 38 38 #include <time.h> 39 #include <io/charfield.h> 39 40 #include <io/concaps.h> 40 41 #include <io/kbd_event.h> … … 86 87 extern bool console_get_event_timeout(console_ctrl_t *, cons_event_t *, 87 88 usec_t *); 89 extern errno_t console_map(console_ctrl_t *, sysarg_t, sysarg_t, 90 charfield_t **); 91 extern void console_unmap(console_ctrl_t *, charfield_t *); 92 extern errno_t console_update(console_ctrl_t *, sysarg_t, sysarg_t, sysarg_t, 93 sysarg_t); 88 94 89 95 #endif -
uspace/lib/c/include/ipc/console.h
r2ab8ab3 r68a552f 1 1 /* 2 * Copyright (c) 2021 Jiri Svoboda 2 3 * Copyright (c) 2006 Josef Cejka 3 4 * All rights reserved. … … 48 49 CONSOLE_SET_COLOR, 49 50 CONSOLE_SET_RGB_COLOR, 50 CONSOLE_SET_CURSOR_VISIBILITY 51 CONSOLE_SET_CURSOR_VISIBILITY, 52 CONSOLE_MAP, 53 CONSOLE_UNMAP, 54 CONSOLE_UPDATE 51 55 } console_request_t; 52 56 -
uspace/lib/congfx/private/console.h
r2ab8ab3 r68a552f 1 1 /* 2 * Copyright (c) 20 19Jiri Svoboda2 * Copyright (c) 2021 Jiri Svoboda 3 3 * All rights reserved. 4 4 * … … 39 39 40 40 #include <gfx/context.h> 41 #include <io/charfield.h> 41 42 #include <io/console.h> 42 43 #include <io/pixel.h> … … 58 59 /** Current drawing color */ 59 60 pixel_t clr; 61 /** Shared console buffer */ 62 charfield_t *buf; 60 63 }; 61 64 -
uspace/lib/congfx/src/console.c
r2ab8ab3 r68a552f 1 1 /* 2 * Copyright (c) 20 19Jiri Svoboda2 * Copyright (c) 2021 Jiri Svoboda 3 3 * All rights reserved. 4 4 * … … 92 92 { 93 93 console_gc_t *cgc = (console_gc_t *) arg; 94 int rv;95 94 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); 112 118 113 119 return EOK; … … 131 137 sysarg_t rows; 132 138 sysarg_t cols; 139 charfield_t *buf; 133 140 errno_t rc; 134 141 … … 140 147 141 148 rc = console_get_size(con, &cols, &rows); 149 if (rc != EOK) 150 goto error; 151 152 rc = console_map(con, cols, rows, &buf); 142 153 if (rc != EOK) 143 154 goto error; … … 154 165 cgc->rect.p1.x = cols; 155 166 cgc->rect.p1.y = rows - 1; /* make sure we avoid bottom-right corner */ 167 cgc->buf = buf; 156 168 157 169 *rgc = cgc; … … 268 280 console_gc_bitmap_t *cbm = (console_gc_bitmap_t *)bm; 269 281 gfx_coord_t x, y; 270 int rv;271 282 pixel_t clr; 283 charfield_t ch; 272 284 pixelmap_t pixelmap; 273 285 gfx_rect_t srect; … … 275 287 gfx_rect_t crect; 276 288 gfx_coord2_t offs; 289 gfx_coord_t cols; 277 290 278 291 if (srect0 != NULL) … … 295 308 pixelmap.data = cbm->alloc.pixels; 296 309 310 cols = cbm->cgc->rect.p1.x - cbm->cgc->rect.p0.x; 311 297 312 if ((cbm->flags & bmpf_color_key) == 0) { 298 313 /* Simple copy */ … … 304 319 x - offs.x - cbm->rect.p0.x, 305 320 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; 313 329 } 314 330 } … … 321 337 x - offs.x - cbm->rect.p0.x, 322 338 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; 334 348 } 335 349 } … … 338 352 console_set_rgb_color(cbm->cgc->con, cbm->cgc->clr, 339 353 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; 340 359 341 360 for (y = crect.p0.y; y < crect.p1.y; y++) { 342 361 for (x = crect.p0.x; x < crect.p1.x; x++) { 343 344 362 clr = pixelmap_get_pixel(&pixelmap, 345 363 x - offs.x - cbm->rect.p0.x, 346 364 y - offs.y - cbm->rect.p0.y); 347 365 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; 357 368 } 358 369 } 359 370 } 371 372 console_update(cbm->cgc->con, crect.p0.x, crect.p0.y, crect.p1.x, 373 crect.p1.y); 360 374 361 375 return EOK;
Note:
See TracChangeset
for help on using the changeset viewer.