Changeset dc033a1 in mainline for uspace/srv/fb/serial_console.c


Ignore:
Timestamp:
2009-03-22T17:45:15Z (15 years ago)
Author:
Jiri Svoboda <jirik.svoboda@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
3fe00ee
Parents:
0a5116db
Message:

Get rid of FB_WRITE. We can use FB_DRAW_TEXT_DATA if we extend it just a little bit.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/fb/serial_console.c

    r0a5116db rdc033a1  
    224224}
    225225
    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 */
     235static 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;
    229240        attrs_t *a0, *a1;
    230241
    231         serial_goto(0, 0);
     242        serial_goto(y, x);
    232243        a0 = &data[0].attrs;
    233244        serial_set_attrs(a0);
    234245
    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;
    238257                        if (!attrs_same(*a0, *a1))
    239258                                serial_set_attrs(a1);
    240                         (*putc_function)(data[i * scr_width + j].character);
     259                        (*putc_function)(field->character);
    241260                        a0 = a1;
    242261                }
     
    246265int lastcol = 0;
    247266int lastrow = 0;
    248 
    249 #define FB_WRITE_BUF_SIZE 256
    250 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 }
    293267
    294268/**
     
    304278
    305279        char c;
    306         int newcol;
    307         int newrow;
     280        int col, row, w, h;
    308281        int fgcolor;
    309282        int bgcolor;
     
    346319                        break;
    347320                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);
    348325                        if (!interbuf) {
    349326                                retval = EINVAL;
    350327                                break;
    351328                        }
    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;
    353336                        retval = 0;
    354337                        break;
    355338                case FB_PUTCHAR:
    356339                        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;
    363346                        (*putc_function)(c);
    364347                        retval = 0;
    365348                        break;
    366                 case FB_WRITE:
    367                         fb_write(callid, &call);
    368                        
    369                         /* Message already answered */
    370                         continue;
    371349                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;
    377355                        retval = 0;
    378356                        break;
Note: See TracChangeset for help on using the changeset viewer.