Rev 4164 | Rev 4211 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 4164 | Rev 4167 | ||
---|---|---|---|
Line 864... | Line 864... | ||
864 | } |
864 | } |
865 | 865 | ||
866 | cursor_show(vport); |
866 | cursor_show(vport); |
867 | } |
867 | } |
868 | 868 | ||
869 | - | ||
870 | /** Draw text data to viewport |
869 | /** Draw text data to viewport. |
871 | * |
870 | * |
872 | * @param vport Viewport id |
871 | * @param vport Viewport id |
873 | * @param data Text data fitting exactly into viewport |
872 | * @param data Text data. |
- | 873 | * @param x Leftmost column of the area. |
|
- | 874 | * @param y Topmost row of the area. |
|
874 | * |
875 | * @param w Number of rows. |
- | 876 | * @param h Number of columns. |
|
875 | */ |
877 | */ |
876 | static void draw_text_data(viewport_t *vport, keyfield_t *data) |
878 | static void draw_text_data(viewport_t *vport, keyfield_t *data, unsigned int x, |
- | 879 | unsigned int y, unsigned int w, unsigned int h) |
|
877 | { |
880 | { |
878 | unsigned int i; |
881 | unsigned int i, j; |
879 | bb_cell_t *bbp; |
882 | bb_cell_t *bbp; |
880 | attrs_t *a; |
883 | attrs_t *a; |
881 | attr_rgb_t rgb; |
884 | attr_rgb_t rgb; |
882 | - | ||
883 | for (i = 0; i < vport->cols * vport->rows; i++) { |
- | |
884 | unsigned int col = i % vport->cols; |
- | |
885 | unsigned int row = i / vport->cols; |
- | |
886 | - | ||
887 | bbp = &vport->backbuf[BB_POS(vport, col, row)]; |
- | |
888 | uint8_t glyph = bbp->glyph; |
- | |
889 | - | ||
890 | a = &data[i].attrs; |
- | |
891 | rgb_from_attr(&rgb, a); |
- | |
892 | 885 | ||
- | 886 | for (j = 0; j < h; j++) { |
|
- | 887 | for (i = 0; i < w; i++) { |
|
- | 888 | unsigned int col = x + i; |
|
- | 889 | unsigned int row = y + j; |
|
- | 890 | ||
- | 891 | bbp = &vport->backbuf[BB_POS(vport, col, row)]; |
|
- | 892 | uint8_t glyph = bbp->glyph; |
|
- | 893 | ||
- | 894 | a = &data[j * w + i].attrs; |
|
- | 895 | rgb_from_attr(&rgb, a); |
|
- | 896 | ||
893 | bbp->glyph = data[i].character; |
897 | bbp->glyph = data[j * w + i].character; |
894 | bbp->fg_color = rgb.fg_color; |
898 | bbp->fg_color = rgb.fg_color; |
895 | bbp->bg_color = rgb.bg_color; |
899 | bbp->bg_color = rgb.bg_color; |
896 | 900 | ||
897 | draw_vp_glyph(vport, false, col, row); |
901 | draw_vp_glyph(vport, false, col, row); |
- | 902 | } |
|
898 | } |
903 | } |
899 | cursor_show(vport); |
904 | cursor_show(vport); |
900 | } |
905 | } |
901 | 906 | ||
902 | 907 | ||
Line 996... | Line 1001... | ||
996 | bool handled = true; |
1001 | bool handled = true; |
997 | int retval = EOK; |
1002 | int retval = EOK; |
998 | viewport_t *vport = &viewports[vp]; |
1003 | viewport_t *vport = &viewports[vp]; |
999 | unsigned int x; |
1004 | unsigned int x; |
1000 | unsigned int y; |
1005 | unsigned int y; |
- | 1006 | unsigned int w; |
|
- | 1007 | unsigned int h; |
|
1001 | 1008 | ||
1002 | switch (IPC_GET_METHOD(*call)) { |
1009 | switch (IPC_GET_METHOD(*call)) { |
1003 | case IPC_M_SHARE_OUT: |
1010 | case IPC_M_SHARE_OUT: |
1004 | /* We accept one area for data interchange */ |
1011 | /* We accept one area for data interchange */ |
1005 | if (IPC_GET_ARG1(*call) == shm_id) { |
1012 | if (IPC_GET_ARG1(*call) == shm_id) { |
Line 1056... | Line 1063... | ||
1056 | 1063 | ||
1057 | ppm_draw(shm, shm_size, IPC_GET_ARG1(*call), |
1064 | ppm_draw(shm, shm_size, IPC_GET_ARG1(*call), |
1058 | IPC_GET_ARG2(*call), vport->width - x, vport->height - y, putpixel, (void *) vport); |
1065 | IPC_GET_ARG2(*call), vport->width - x, vport->height - y, putpixel, (void *) vport); |
1059 | break; |
1066 | break; |
1060 | case FB_DRAW_TEXT_DATA: |
1067 | case FB_DRAW_TEXT_DATA: |
- | 1068 | x = IPC_GET_ARG1(*call); |
|
- | 1069 | y = IPC_GET_ARG2(*call); |
|
- | 1070 | w = IPC_GET_ARG3(*call); |
|
- | 1071 | h = IPC_GET_ARG4(*call); |
|
1061 | if (!interbuffer) { |
1072 | if (!interbuffer) { |
1062 | retval = EINVAL; |
1073 | retval = EINVAL; |
1063 | break; |
1074 | break; |
1064 | } |
1075 | } |
- | 1076 | if (x + w > vport->cols || y + h > vport->rows) { |
|
- | 1077 | retval = EINVAL; |
|
- | 1078 | break; |
|
- | 1079 | } |
|
1065 | if (intersize < vport->cols * vport->rows * sizeof(*interbuffer)) { |
1080 | if (intersize < w * h * sizeof(*interbuffer)) { |
1066 | retval = EINVAL; |
1081 | retval = EINVAL; |
1067 | break; |
1082 | break; |
1068 | } |
1083 | } |
1069 | draw_text_data(vport, interbuffer); |
1084 | draw_text_data(vport, interbuffer, x, y, w, h); |
1070 | break; |
1085 | break; |
1071 | default: |
1086 | default: |
1072 | handled = false; |
1087 | handled = false; |
1073 | } |
1088 | } |
1074 | 1089 | ||
Line 1470... | Line 1485... | ||
1470 | ipcarg_t bg_color, ipcarg_t flags) |
1485 | ipcarg_t bg_color, ipcarg_t flags) |
1471 | { |
1486 | { |
1472 | return rgb_from_idx(&vport->attr, fg_color, bg_color, flags); |
1487 | return rgb_from_idx(&vport->attr, fg_color, bg_color, flags); |
1473 | } |
1488 | } |
1474 | 1489 | ||
1475 | #define FB_WRITE_BUF_SIZE 256 |
- | |
1476 | static char fb_write_buf[FB_WRITE_BUF_SIZE]; |
- | |
1477 | - | ||
1478 | static void fb_write(viewport_t *vport, ipc_callid_t rid, ipc_call_t *request) |
- | |
1479 | { |
- | |
1480 | int row, col; |
- | |
1481 | ipc_callid_t callid; |
- | |
1482 | size_t len; |
- | |
1483 | size_t i; |
- | |
1484 | - | ||
1485 | row = IPC_GET_ARG1(*request); |
- | |
1486 | col = IPC_GET_ARG2(*request); |
- | |
1487 | - | ||
1488 | if ((col >= vport->cols) || (row >= vport->rows)) { |
- | |
1489 | ipc_answer_0(callid, EINVAL); |
- | |
1490 | ipc_answer_0(rid, EINVAL); |
- | |
1491 | return; |
- | |
1492 | } |
- | |
1493 | - | ||
1494 | if (!ipc_data_write_receive(&callid, &len)) { |
- | |
1495 | ipc_answer_0(callid, EINVAL); |
- | |
1496 | ipc_answer_0(rid, EINVAL); |
- | |
1497 | return; |
- | |
1498 | } |
- | |
1499 | - | ||
1500 | if (len > FB_WRITE_BUF_SIZE) |
- | |
1501 | len = FB_WRITE_BUF_SIZE; |
- | |
1502 | if (len >= vport->cols - col) |
- | |
1503 | len = vport->cols - col; |
- | |
1504 | - | ||
1505 | (void) ipc_data_write_finalize(callid, fb_write_buf, len); |
- | |
1506 | - | ||
1507 | for (i = 0; i < len; i++) { |
- | |
1508 | draw_char(vport, fb_write_buf[i], col++, row); |
- | |
1509 | } |
- | |
1510 | - | ||
1511 | ipc_answer_1(rid, EOK, len); |
- | |
1512 | } |
- | |
1513 | - | ||
1514 | - | ||
1515 | /** Function for handling connections to FB |
1490 | /** Function for handling connections to FB |
1516 | * |
1491 | * |
1517 | */ |
1492 | */ |
1518 | static void fb_client_connection(ipc_callid_t iid, ipc_call_t *icall) |
1493 | static void fb_client_connection(ipc_callid_t iid, ipc_call_t *icall) |
1519 | { |
1494 | { |
Line 1584... | Line 1559... | ||
1584 | 1559 | ||
1585 | draw_char(vport, glyph, col, row); |
1560 | draw_char(vport, glyph, col, row); |
1586 | 1561 | ||
1587 | /* Message already answered */ |
1562 | /* Message already answered */ |
1588 | continue; |
1563 | continue; |
1589 | case FB_WRITE: |
- | |
1590 | fb_write(vport, callid, &call); |
- | |
1591 | - | ||
1592 | /* Message already answered */ |
- | |
1593 | continue; |
- | |
1594 | case FB_CLEAR: |
1564 | case FB_CLEAR: |
1595 | vport_clear(vport); |
1565 | vport_clear(vport); |
1596 | cursor_show(vport); |
1566 | cursor_show(vport); |
1597 | retval = EOK; |
1567 | retval = EOK; |
1598 | break; |
1568 | break; |