Rev 4343 | Rev 4348 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 4343 | Rev 4347 | ||
|---|---|---|---|
| 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 | ||