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 |