Subversion Repositories HelenOS

Rev

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