Changeset dc033a1 in mainline for uspace/srv/fb/serial_console.c
- Timestamp:
- 2009-03-22T17:45:15Z (15 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 3fe00ee
- Parents:
- 0a5116db
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/fb/serial_console.c
r0a5116db rdc033a1 224 224 } 225 225 226 static void draw_text_data(keyfield_t *data) 227 { 228 int i, j; 226 /** Draw text data to viewport. 227 * 228 * @param vport Viewport id 229 * @param data Text data. 230 * @param x Leftmost column of the area. 231 * @param y Topmost row of the area. 232 * @param w Number of rows. 233 * @param h Number of columns. 234 */ 235 static void draw_text_data(keyfield_t *data, unsigned int x, 236 unsigned int y, unsigned int w, unsigned int h) 237 { 238 unsigned int i, j; 239 keyfield_t *field; 229 240 attrs_t *a0, *a1; 230 241 231 serial_goto( 0, 0);242 serial_goto(y, x); 232 243 a0 = &data[0].attrs; 233 244 serial_set_attrs(a0); 234 245 235 for (i = 0; i < scr_height; i++) { 236 for (j = 0; j < scr_width; j++) { 237 a1 = &data[i * scr_width + j].attrs; 246 for (j = 0; j < h; j++) { 247 if (j > 0 && w != scr_width) 248 serial_goto(y, x); 249 250 for (i = 0; i < w; i++) { 251 unsigned int col = x + i; 252 unsigned int row = y + j; 253 254 field = &data[j * w + i]; 255 256 a1 = &field->attrs; 238 257 if (!attrs_same(*a0, *a1)) 239 258 serial_set_attrs(a1); 240 (*putc_function)( data[i * scr_width + j].character);259 (*putc_function)(field->character); 241 260 a0 = a1; 242 261 } … … 246 265 int lastcol = 0; 247 266 int lastrow = 0; 248 249 #define FB_WRITE_BUF_SIZE 256250 static char fb_write_buf[FB_WRITE_BUF_SIZE];251 252 static void fb_write(ipc_callid_t rid, ipc_call_t *request)253 {254 int row, col;255 ipc_callid_t callid;256 size_t len;257 size_t i;258 259 row = IPC_GET_ARG1(*request);260 col = IPC_GET_ARG2(*request);261 262 if ((col >= scr_width) || (row >= scr_height)) {263 ipc_answer_0(callid, EINVAL);264 ipc_answer_0(rid, EINVAL);265 return;266 }267 268 if (!ipc_data_write_receive(&callid, &len)) {269 ipc_answer_0(callid, EINVAL);270 ipc_answer_0(rid, EINVAL);271 return;272 }273 274 if (len > FB_WRITE_BUF_SIZE)275 len = FB_WRITE_BUF_SIZE;276 if (len >= scr_width - col)277 len = scr_width - col;278 279 (void) ipc_data_write_finalize(callid, fb_write_buf, len);280 281 if ((lastcol != col) || (lastrow != row))282 serial_goto(row, col);283 284 for (i = 0; i < len; i++) {285 (*putc_function)(fb_write_buf[i]);286 }287 288 lastcol = col + len;289 lastrow = row;290 291 ipc_answer_1(rid, EOK, len);292 }293 267 294 268 /** … … 304 278 305 279 char c; 306 int newcol; 307 int newrow; 280 int col, row, w, h; 308 281 int fgcolor; 309 282 int bgcolor; … … 346 319 break; 347 320 case FB_DRAW_TEXT_DATA: 321 col = IPC_GET_ARG1(call); 322 row = IPC_GET_ARG2(call); 323 w = IPC_GET_ARG3(call); 324 h = IPC_GET_ARG4(call); 348 325 if (!interbuf) { 349 326 retval = EINVAL; 350 327 break; 351 328 } 352 draw_text_data(interbuf); 329 if (col + w > scr_width || row + h > scr_height) { 330 retval = EINVAL; 331 break; 332 } 333 draw_text_data(interbuf, col, row, w, h); 334 lastrow = row + h - 1; 335 lastcol = col + w; 353 336 retval = 0; 354 337 break; 355 338 case FB_PUTCHAR: 356 339 c = IPC_GET_ARG1(call); 357 newrow = IPC_GET_ARG2(call);358 newcol = IPC_GET_ARG3(call);359 if ((lastcol != newcol) || (lastrow != newrow))360 serial_goto( newrow, newcol);361 lastcol = newcol + 1;362 lastrow = newrow;340 row = IPC_GET_ARG2(call); 341 col = IPC_GET_ARG3(call); 342 if ((lastcol != col) || (lastrow != row)) 343 serial_goto(row, col); 344 lastcol = col + 1; 345 lastrow = row; 363 346 (*putc_function)(c); 364 347 retval = 0; 365 348 break; 366 case FB_WRITE:367 fb_write(callid, &call);368 369 /* Message already answered */370 continue;371 349 case FB_CURSOR_GOTO: 372 newrow = IPC_GET_ARG1(call);373 newcol = IPC_GET_ARG2(call);374 serial_goto( newrow, newcol);375 lastrow = newrow;376 lastcol = newcol;350 row = IPC_GET_ARG1(call); 351 col = IPC_GET_ARG2(call); 352 serial_goto(row, col); 353 lastrow = row; 354 lastcol = col; 377 355 retval = 0; 378 356 break;
Note:
See TracChangeset
for help on using the changeset viewer.