Subversion Repositories HelenOS

Rev

Rev 4153 | Rev 4327 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 4153 Rev 4263
Line 66... Line 66...
66
#include "pointer_mask.xbm"
66
#include "pointer_mask.xbm"
67
 
67
 
68
#define DEFAULT_BGCOLOR  0xf0f0f0
68
#define DEFAULT_BGCOLOR  0xf0f0f0
69
#define DEFAULT_FGCOLOR  0x000000
69
#define DEFAULT_FGCOLOR  0x000000
70
 
70
 
-
 
71
#define GLYPH_UNAVAIL   '?'
-
 
72
 
71
#define MAX_ANIM_LEN     8
73
#define MAX_ANIM_LEN     8
72
#define MAX_ANIMATIONS   4
74
#define MAX_ANIMATIONS   4
73
#define MAX_PIXMAPS      256  /**< Maximum number of saved pixmaps */
75
#define MAX_PIXMAPS      256  /**< Maximum number of saved pixmaps */
74
#define MAX_VIEWPORTS    128  /**< Viewport is a rectangular area on the screen */
76
#define MAX_VIEWPORTS    128  /**< Viewport is a rectangular area on the screen */
75
 
77
 
76
/** Function to render a pixel from a RGB value. */
78
/** Function to render a pixel from a RGB value. */
77
typedef void (*rgb_conv_t)(void *, uint32_t);
79
typedef void (*rgb_conv_t)(void *, uint32_t);
78
 
80
 
79
/** Function to draw a glyph. */
81
/** Function to draw a glyph. */
80
typedef void (*dg_t)(unsigned int x, unsigned int y, bool cursor,
82
typedef void (*dg_t)(unsigned int x, unsigned int y, bool cursor,
81
    uint8_t *glyphs, uint8_t glyph, uint32_t fg_color, uint32_t bg_color);
83
    uint8_t *glyphs, uint32_t glyph, uint32_t fg_color, uint32_t bg_color);
82
 
84
 
83
struct {
85
struct {
84
    uint8_t *fb_addr;
86
    uint8_t *fb_addr;
85
   
87
   
86
    unsigned int xres;
88
    unsigned int xres;
Line 89... Line 91...
89
    unsigned int scanline;
91
    unsigned int scanline;
90
    unsigned int glyphscanline;
92
    unsigned int glyphscanline;
91
   
93
   
92
    unsigned int pixelbytes;
94
    unsigned int pixelbytes;
93
    unsigned int glyphbytes;
95
    unsigned int glyphbytes;
-
 
96
 
-
 
97
    /** Pre-rendered mask for rendering glyphs. Specific for the visual. */
-
 
98
    uint8_t *glyphs;
94
   
99
   
95
    rgb_conv_t rgb_conv;
100
    rgb_conv_t rgb_conv;
96
} screen;
101
} screen;
97
 
102
 
98
/** Backbuffer character cell. */
103
/** Backbuffer character cell. */
99
typedef struct {
104
typedef struct {
100
    uint8_t glyph;
105
    uint32_t glyph;
101
    uint32_t fg_color;
106
    uint32_t fg_color;
102
    uint32_t bg_color;
107
    uint32_t bg_color;
103
} bb_cell_t;
108
} bb_cell_t;
104
 
109
 
105
typedef struct {
110
typedef struct {
Line 118... Line 123...
118
     */
123
     */
119
 
124
 
120
    /** Current attributes. */
125
    /** Current attributes. */
121
    attr_rgb_t attr;
126
    attr_rgb_t attr;
122
 
127
 
123
    /** Pre-rendered mask for rendering glyphs. Different viewports
-
 
124
     * might use different drawing functions depending on whether their
-
 
125
     * scanlines are aligned on a word boundary.*/
-
 
126
    uint8_t *glyphs;
-
 
127
 
-
 
128
    uint8_t *bgpixel;
128
    uint8_t *bgpixel;
129
 
129
 
-
 
130
    /**
130
    /** Glyph drawing function for this viewport. */
131
     * Glyph drawing function for this viewport.  Different viewports
-
 
132
     * might use different drawing functions depending on whether their
-
 
133
     * scanlines are aligned on a word boundary.
-
 
134
     */
131
    dg_t dglyph;
135
    dg_t dglyph;
132
   
136
   
133
    /* Auto-cursor position */
137
    /* Auto-cursor position */
134
    bool cursor_active;
138
    bool cursor_active;
135
    unsigned int cur_col;
139
    unsigned int cur_col;
Line 192... Line 196...
192
 
196
 
193
static int fb_set_color(viewport_t *vport, ipcarg_t fg_color,
197
static int fb_set_color(viewport_t *vport, ipcarg_t fg_color,
194
    ipcarg_t bg_color, ipcarg_t attr);
198
    ipcarg_t bg_color, ipcarg_t attr);
195
 
199
 
196
static void draw_glyph_aligned(unsigned int x, unsigned int y, bool cursor,
200
static void draw_glyph_aligned(unsigned int x, unsigned int y, bool cursor,
197
    uint8_t *glyphs, uint8_t glyph, uint32_t fg_color, uint32_t bg_color);
201
    uint8_t *glyphs, uint32_t glyph, uint32_t fg_color, uint32_t bg_color);
198
static void draw_glyph_fallback(unsigned int x, unsigned int y, bool cursor,
202
static void draw_glyph_fallback(unsigned int x, unsigned int y, bool cursor,
199
    uint8_t *glyphs, uint8_t glyph, uint32_t fg_color, uint32_t bg_color);
203
    uint8_t *glyphs, uint32_t glyph, uint32_t fg_color, uint32_t bg_color);
200
 
204
 
201
static void draw_vp_glyph(viewport_t *vport, bool cursor, unsigned int col,
205
static void draw_vp_glyph(viewport_t *vport, bool cursor, unsigned int col,
202
    unsigned int row);
206
    unsigned int row);
203
 
207
 
204
 
208
 
Line 384... Line 388...
384
 */
388
 */
385
static void vport_scroll(viewport_t *vport, int lines)
389
static void vport_scroll(viewport_t *vport, int lines)
386
{
390
{
387
    unsigned int row, col;
391
    unsigned int row, col;
388
    unsigned int x, y;
392
    unsigned int x, y;
389
    uint8_t glyph;
393
    uint32_t glyph;
390
    uint32_t fg_color;
394
    uint32_t fg_color;
391
    uint32_t bg_color;
395
    uint32_t bg_color;
392
    bb_cell_t *bbp, *xbp;
396
    bb_cell_t *bbp, *xbp;
393
 
397
 
394
    /*
398
    /*
Line 417... Line 421...
417
                glyph = 0;
421
                glyph = 0;
418
                fg_color = vport->attr.fg_color;
422
                fg_color = vport->attr.fg_color;
419
                bg_color = vport->attr.bg_color;
423
                bg_color = vport->attr.bg_color;
420
            }
424
            }
421
 
425
 
422
            (*vport->dglyph)(x, y, false, vport->glyphs, glyph,
426
            (*vport->dglyph)(x, y, false, screen.glyphs, glyph,
423
                fg_color, bg_color);
427
                fg_color, bg_color);
424
            x += FONT_WIDTH;
428
            x += FONT_WIDTH;
425
        }
429
        }
426
        y += FONT_SCANLINES;
430
        y += FONT_SCANLINES;
427
    }
431
    }
Line 445... Line 449...
445
 
449
 
446
/** Render glyphs
450
/** Render glyphs
447
 *
451
 *
448
 * Convert glyphs from device independent font
452
 * Convert glyphs from device independent font
449
 * description to current visual representation.
453
 * description to current visual representation.
450
 *
-
 
451
 * @param vport Viewport
-
 
452
 *
-
 
453
 */
454
 */
454
static void render_glyphs(viewport_t* vport)
455
static void render_glyphs(void)
455
{
456
{
456
    unsigned int glyph;
457
    unsigned int glyph;
457
   
458
 
458
    for (glyph = 0; glyph < FONT_GLYPHS; glyph++) {
459
    for (glyph = 0; glyph < FONT_GLYPHS; glyph++) {
459
        unsigned int y;
460
        unsigned int y;
460
       
461
 
461
        for (y = 0; y < FONT_SCANLINES; y++) {
462
        for (y = 0; y < FONT_SCANLINES; y++) {
462
            unsigned int x;
463
            unsigned int x;
463
           
464
 
464
            for (x = 0; x < FONT_WIDTH; x++) {
465
            for (x = 0; x < FONT_WIDTH; x++) {
465
                screen.rgb_conv(&vport->glyphs[GLYPH_POS(glyph, y, false) + x * screen.pixelbytes],
466
                screen.rgb_conv(&screen.glyphs[GLYPH_POS(glyph, y, false) + x * screen.pixelbytes],
466
                    (fb_font[glyph * FONT_SCANLINES + y] & (1 << (7 - x)))
467
                    (fb_font[glyph][y] & (1 << (7 - x)))
467
                    ? 0xffffff : 0x000000);
468
                    ? 0xffffff : 0x000000);
468
               
469
 
469
                screen.rgb_conv(&vport->glyphs[GLYPH_POS(glyph, y, true) + x * screen.pixelbytes],
470
                screen.rgb_conv(&screen.glyphs[GLYPH_POS(glyph, y, true) + x * screen.pixelbytes],
470
                    (fb_font[glyph * FONT_SCANLINES + y] & (1 << (7 - x)))
471
                    (fb_font[glyph][y] & (1 << (7 - x)))
471
                    ? 0x000000 : 0xffffff);
472
                    ? 0x000000 : 0xffffff);
472
            }
473
            }
473
        }
474
        }
474
    }
475
    }
475
   
-
 
476
    screen.rgb_conv(vport->bgpixel, vport->attr.bg_color);
-
 
477
}
476
}
478
 
477
 
479
 
478
 
480
/** Create new viewport
479
/** Create new viewport
481
 *
480
 *
Line 500... Line 499...
500
        return ELIMIT;
499
        return ELIMIT;
501
   
500
   
502
    unsigned int cols = width / FONT_WIDTH;
501
    unsigned int cols = width / FONT_WIDTH;
503
    unsigned int rows = height / FONT_SCANLINES;
502
    unsigned int rows = height / FONT_SCANLINES;
504
    unsigned int bbsize = cols * rows * sizeof(bb_cell_t);
503
    unsigned int bbsize = cols * rows * sizeof(bb_cell_t);
505
    unsigned int glyphsize = 2 * FONT_GLYPHS * screen.glyphbytes;
-
 
506
    unsigned int word_size = sizeof(unsigned long);
504
    unsigned int word_size = sizeof(unsigned long);
507
   
505
   
508
    bb_cell_t *backbuf = (bb_cell_t *) malloc(bbsize);
506
    bb_cell_t *backbuf = (bb_cell_t *) malloc(bbsize);
509
    if (!backbuf)
507
    if (!backbuf)
510
        return ENOMEM;
508
        return ENOMEM;
511
   
509
   
512
    uint8_t *glyphs = (uint8_t *) malloc(glyphsize);
-
 
513
    if (!glyphs) {
-
 
514
        free(backbuf);
-
 
515
        return ENOMEM;
-
 
516
    }
-
 
517
   
-
 
518
    uint8_t *bgpixel = (uint8_t *) malloc(screen.pixelbytes);
510
    uint8_t *bgpixel = (uint8_t *) malloc(screen.pixelbytes);
519
    if (!bgpixel) {
511
    if (!bgpixel) {
520
        free(glyphs);
-
 
521
        free(backbuf);
512
        free(backbuf);
522
        return ENOMEM;
513
        return ENOMEM;
523
    }
514
    }
524
 
515
 
525
    backbuf_clear(backbuf, cols * rows, DEFAULT_FGCOLOR, DEFAULT_BGCOLOR);
516
    backbuf_clear(backbuf, cols * rows, DEFAULT_FGCOLOR, DEFAULT_BGCOLOR);
526
    memset(glyphs, 0, glyphsize);
-
 
527
    memset(bgpixel, 0, screen.pixelbytes);
517
    memset(bgpixel, 0, screen.pixelbytes);
528
   
518
   
529
    viewports[i].x = x;
519
    viewports[i].x = x;
530
    viewports[i].y = y;
520
    viewports[i].y = y;
531
    viewports[i].width = width;
521
    viewports[i].width = width;
Line 535... Line 525...
535
    viewports[i].rows = rows;
525
    viewports[i].rows = rows;
536
   
526
   
537
    viewports[i].attr.bg_color = DEFAULT_BGCOLOR;
527
    viewports[i].attr.bg_color = DEFAULT_BGCOLOR;
538
    viewports[i].attr.fg_color = DEFAULT_FGCOLOR;
528
    viewports[i].attr.fg_color = DEFAULT_FGCOLOR;
539
   
529
   
540
    viewports[i].glyphs = glyphs;
-
 
541
    viewports[i].bgpixel = bgpixel;
530
    viewports[i].bgpixel = bgpixel;
542
 
531
 
543
    /*
532
    /*
544
     * Conditions necessary  to select aligned version:
533
     * Conditions necessary  to select aligned version:
545
     *
534
     *
Line 565... Line 554...
565
    viewports[i].bbsize = bbsize;
554
    viewports[i].bbsize = bbsize;
566
    viewports[i].backbuf = backbuf;
555
    viewports[i].backbuf = backbuf;
567
   
556
   
568
    viewports[i].initialized = true;
557
    viewports[i].initialized = true;
569
   
558
   
570
    render_glyphs(&viewports[i]);
559
    screen.rgb_conv(viewports[i].bgpixel, viewports[i].attr.bg_color);
571
   
560
   
572
    return i;
561
    return i;
573
}
562
}
574
 
563
 
575
 
564
 
Line 583... Line 572...
583
 *
572
 *
584
 */
573
 */
585
static bool screen_init(void *addr, unsigned int xres, unsigned int yres,
574
static bool screen_init(void *addr, unsigned int xres, unsigned int yres,
586
    unsigned int scan, unsigned int visual)
575
    unsigned int scan, unsigned int visual)
587
{
576
{
-
 
577
    unsigned int glyphsize;
-
 
578
    uint8_t *glyphs;
588
    switch (visual) {
579
    switch (visual) {
589
    case VISUAL_INDIRECT_8:
580
    case VISUAL_INDIRECT_8:
590
        screen.rgb_conv = rgb_323;
581
        screen.rgb_conv = rgb_323;
591
        screen.pixelbytes = 1;
582
        screen.pixelbytes = 1;
592
        break;
583
        break;
Line 627... Line 618...
627
    screen.yres = yres;
618
    screen.yres = yres;
628
    screen.scanline = scan;
619
    screen.scanline = scan;
629
   
620
   
630
    screen.glyphscanline = FONT_WIDTH * screen.pixelbytes;
621
    screen.glyphscanline = FONT_WIDTH * screen.pixelbytes;
631
    screen.glyphbytes = screen.glyphscanline * FONT_SCANLINES;
622
    screen.glyphbytes = screen.glyphscanline * FONT_SCANLINES;
-
 
623
 
-
 
624
    glyphsize = 2 * FONT_GLYPHS * screen.glyphbytes;
-
 
625
    glyphs = (uint8_t *) malloc(glyphsize);
-
 
626
    if (!glyphs)
-
 
627
        return false;
-
 
628
   
-
 
629
    memset(glyphs, 0, glyphsize);
-
 
630
    screen.glyphs = glyphs;
-
 
631
 
-
 
632
    render_glyphs();
632
   
633
   
633
    /* Create first viewport */
634
    /* Create first viewport */
634
    vport_create(0, 0, xres, yres);
635
    vport_create(0, 0, xres, yres);
635
   
636
   
636
    return true;
637
    return true;
Line 657... Line 658...
657
 * @param glyph     Code of the glyph to draw.
658
 * @param glyph     Code of the glyph to draw.
658
 * @param fg_color  Foreground color.
659
 * @param fg_color  Foreground color.
659
 * @param bg_color  Backgroudn color.
660
 * @param bg_color  Backgroudn color.
660
 */
661
 */
661
static void draw_glyph_aligned(unsigned int x, unsigned int y, bool cursor,
662
static void draw_glyph_aligned(unsigned int x, unsigned int y, bool cursor,
662
    uint8_t *glyphs, uint8_t glyph, uint32_t fg_color, uint32_t bg_color)
663
    uint8_t *glyphs, uint32_t glyph, uint32_t fg_color, uint32_t bg_color)
663
{
664
{
664
    unsigned int i, yd;
665
    unsigned int i, yd;
665
    unsigned long fg_buf, bg_buf;
666
    unsigned long fg_buf, bg_buf;
666
    unsigned long *maskp, *dp;
667
    unsigned long *maskp, *dp;
667
    unsigned long mask;
668
    unsigned long mask;
Line 676... Line 677...
676
            fg_color);
677
            fg_color);
677
        screen.rgb_conv(&((uint8_t *)&bg_buf)[i * screen.pixelbytes],
678
        screen.rgb_conv(&((uint8_t *)&bg_buf)[i * screen.pixelbytes],
678
            bg_color);
679
            bg_color);
679
    }
680
    }
680
 
681
 
681
 
-
 
682
    /* Pointer to the current position in the mask. */
682
    /* Pointer to the current position in the mask. */
683
    maskp = (unsigned long *) &glyphs[GLYPH_POS(glyph, 0, cursor)];
683
    maskp = (unsigned long *) &glyphs[GLYPH_POS(glyph, 0, cursor)];
684
 
684
 
685
    /* Pointer to the current position on the screen. */
685
    /* Pointer to the current position on the screen. */
686
    dp = (unsigned long *) &screen.fb_addr[FB_POS(x, y)];
686
    dp = (unsigned long *) &screen.fb_addr[FB_POS(x, y)];
Line 718... Line 718...
718
 * @param glyph     Code of the glyph to draw.
718
 * @param glyph     Code of the glyph to draw.
719
 * @param fg_color  Foreground color.
719
 * @param fg_color  Foreground color.
720
 * @param bg_color  Backgroudn color.
720
 * @param bg_color  Backgroudn color.
721
 */
721
 */
722
void draw_glyph_fallback(unsigned int x, unsigned int y, bool cursor,
722
void draw_glyph_fallback(unsigned int x, unsigned int y, bool cursor,
723
    uint8_t *glyphs, uint8_t glyph, uint32_t fg_color, uint32_t bg_color)
723
    uint8_t *glyphs, uint32_t glyph, uint32_t fg_color, uint32_t bg_color)
724
{
724
{
725
    unsigned int i, j, yd;
725
    unsigned int i, j, yd;
726
    uint8_t fg_buf[4], bg_buf[4];
726
    uint8_t fg_buf[4], bg_buf[4];
727
    uint8_t *dp, *sp;
727
    uint8_t *dp, *sp;
728
    unsigned int d_add;
728
    unsigned int d_add;
Line 743... Line 743...
743
    /* Offset to add when moving to another screen scanline. */
743
    /* Offset to add when moving to another screen scanline. */
744
    d_add = screen.scanline - FONT_WIDTH * screen.pixelbytes;
744
    d_add = screen.scanline - FONT_WIDTH * screen.pixelbytes;
745
 
745
 
746
    for (yd = 0; yd < FONT_SCANLINES; yd++) {
746
    for (yd = 0; yd < FONT_SCANLINES; yd++) {
747
        /* Byte containing bits of the glyph scanline. */
747
        /* Byte containing bits of the glyph scanline. */
748
        b = fb_font[glyph * FONT_SCANLINES + yd];
748
        b = fb_font[glyph][yd];
749
 
749
 
750
        for (i = 0; i < FONT_WIDTH; i++) {
750
        for (i = 0; i < FONT_WIDTH; i++) {
751
            /* Choose color based on the current bit. */
751
            /* Choose color based on the current bit. */
752
            sp = (b & 0x80) ? fg_buf : bg_buf;
752
            sp = (b & 0x80) ? fg_buf : bg_buf;
753
 
753
 
Line 777... Line 777...
777
    unsigned int row)
777
    unsigned int row)
778
{
778
{
779
    unsigned int x = vport->x + COL2X(col);
779
    unsigned int x = vport->x + COL2X(col);
780
    unsigned int y = vport->y + ROW2Y(row);
780
    unsigned int y = vport->y + ROW2Y(row);
781
 
781
 
782
    uint8_t glyph;
782
    uint32_t glyph;
783
    uint32_t fg_color;
783
    uint32_t fg_color;
784
    uint32_t bg_color;
784
    uint32_t bg_color;
785
   
785
   
786
    glyph = vport->backbuf[BB_POS(vport, col, row)].glyph;
786
    glyph = vport->backbuf[BB_POS(vport, col, row)].glyph;
787
    fg_color = vport->backbuf[BB_POS(vport, col, row)].fg_color;
787
    fg_color = vport->backbuf[BB_POS(vport, col, row)].fg_color;
788
    bg_color = vport->backbuf[BB_POS(vport, col, row)].bg_color;
788
    bg_color = vport->backbuf[BB_POS(vport, col, row)].bg_color;
789
 
789
 
790
    (*vport->dglyph)(x, y, cursor, vport->glyphs, glyph,
790
    (*vport->dglyph)(x, y, cursor, screen.glyphs, glyph,
791
        fg_color, bg_color);
791
        fg_color, bg_color);
792
}
792
}
793
 
793
 
794
/** Hide cursor if it is shown
794
/** Hide cursor if it is shown
795
 *
795
 *
Line 834... Line 834...
834
 * @param c      Character to draw
834
 * @param c      Character to draw
835
 * @param col    Screen position relative to viewport
835
 * @param col    Screen position relative to viewport
836
 * @param row    Screen position relative to viewport
836
 * @param row    Screen position relative to viewport
837
 *
837
 *
838
 */
838
 */
839
static void draw_char(viewport_t *vport, uint8_t c, unsigned int col, unsigned int row)
839
static void draw_char(viewport_t *vport, wchar_t c, unsigned int col, unsigned int row)
840
{
840
{
841
    bb_cell_t *bbp;
841
    bb_cell_t *bbp;
842
 
842
 
843
    /* Do not hide cursor if we are going to overwrite it */
843
    /* Do not hide cursor if we are going to overwrite it */
844
    if ((vport->cursor_active) && (vport->cursor_shown) &&
844
    if ((vport->cursor_active) && (vport->cursor_shown) &&
845
        ((vport->cur_col != col) || (vport->cur_row != row)))
845
        ((vport->cur_col != col) || (vport->cur_row != row)))
846
        cursor_hide(vport);
846
        cursor_hide(vport);
847
 
847
 
848
    bbp = &vport->backbuf[BB_POS(vport, col, row)];
848
    bbp = &vport->backbuf[BB_POS(vport, col, row)];
849
    bbp->glyph = c;
849
    bbp->glyph = fb_font_glyph(c);
850
    bbp->fg_color = vport->attr.fg_color;
850
    bbp->fg_color = vport->attr.fg_color;
851
    bbp->bg_color = vport->attr.bg_color;
851
    bbp->bg_color = vport->attr.bg_color;
852
 
852
 
853
    draw_vp_glyph(vport, false, col, row);
853
    draw_vp_glyph(vport, false, col, row);
854
   
854
   
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
 
-
 
893
            a = &data[j * w + i].attrs;
-
 
894
            rgb_from_attr(&rgb, a);
-
 
895
 
893
        bbp->glyph = data[i].character;
896
            bbp->glyph = fb_font_glyph(data[j * w + i].character);
894
        bbp->fg_color = rgb.fg_color;
897
            bbp->fg_color = rgb.fg_color;
895
        bbp->bg_color = rgb.bg_color;
898
            bbp->bg_color = rgb.bg_color;
896
 
899
 
897
        draw_vp_glyph(vport, false, col, row);
900
            draw_vp_glyph(vport, false, col, row);
-
 
901
        }
898
    }
902
    }
899
    cursor_show(vport);
903
    cursor_show(vport);
900
}
904
}
901
 
905
 
902
 
906
 
Line 996... Line 1000...
996
    bool handled = true;
1000
    bool handled = true;
997
    int retval = EOK;
1001
    int retval = EOK;
998
    viewport_t *vport = &viewports[vp];
1002
    viewport_t *vport = &viewports[vp];
999
    unsigned int x;
1003
    unsigned int x;
1000
    unsigned int y;
1004
    unsigned int y;
-
 
1005
    unsigned int w;
-
 
1006
    unsigned int h;
1001
   
1007
   
1002
    switch (IPC_GET_METHOD(*call)) {
1008
    switch (IPC_GET_METHOD(*call)) {
1003
    case IPC_M_SHARE_OUT:
1009
    case IPC_M_SHARE_OUT:
1004
        /* We accept one area for data interchange */
1010
        /* We accept one area for data interchange */
1005
        if (IPC_GET_ARG1(*call) == shm_id) {
1011
        if (IPC_GET_ARG1(*call) == shm_id) {
Line 1056... Line 1062...
1056
       
1062
       
1057
        ppm_draw(shm, shm_size, IPC_GET_ARG1(*call),
1063
        ppm_draw(shm, shm_size, IPC_GET_ARG1(*call),
1058
            IPC_GET_ARG2(*call), vport->width - x, vport->height - y, putpixel, (void *) vport);
1064
            IPC_GET_ARG2(*call), vport->width - x, vport->height - y, putpixel, (void *) vport);
1059
        break;
1065
        break;
1060
    case FB_DRAW_TEXT_DATA:
1066
    case FB_DRAW_TEXT_DATA:
-
 
1067
        x = IPC_GET_ARG1(*call);
-
 
1068
        y = IPC_GET_ARG2(*call);
-
 
1069
        w = IPC_GET_ARG3(*call);
-
 
1070
        h = IPC_GET_ARG4(*call);
1061
        if (!interbuffer) {
1071
        if (!interbuffer) {
1062
            retval = EINVAL;
1072
            retval = EINVAL;
1063
            break;
1073
            break;
1064
        }
1074
        }
-
 
1075
        if (x + w > vport->cols || y + h > vport->rows) {
-
 
1076
            retval = EINVAL;
-
 
1077
            break;
-
 
1078
        }
1065
        if (intersize < vport->cols * vport->rows * sizeof(*interbuffer)) {
1079
        if (intersize < w * h * sizeof(*interbuffer)) {
1066
            retval = EINVAL;
1080
            retval = EINVAL;
1067
            break;
1081
            break;
1068
        }
1082
        }
1069
        draw_text_data(vport, interbuffer);
1083
        draw_text_data(vport, interbuffer, x, y, w, h);
1070
        break;
1084
        break;
1071
    default:
1085
    default:
1072
        handled = false;
1086
        handled = false;
1073
    }
1087
    }
1074
   
1088
   
Line 1493... Line 1507...
1493
        ipc_callid_t callid;
1507
        ipc_callid_t callid;
1494
        ipc_call_t call;
1508
        ipc_call_t call;
1495
        int retval;
1509
        int retval;
1496
        unsigned int i;
1510
        unsigned int i;
1497
        int scroll;
1511
        int scroll;
1498
        uint8_t glyph;
1512
        wchar_t ch;
1499
        unsigned int row, col;
1513
        unsigned int row, col;
1500
       
1514
       
1501
        if ((vport->cursor_active) || (anims_enabled))
1515
        if ((vport->cursor_active) || (anims_enabled))
1502
            callid = async_get_call_timeout(&call, 250000);
1516
            callid = async_get_call_timeout(&call, 250000);
1503
        else
1517
        else
Line 1530... Line 1544...
1530
           
1544
           
1531
            /* Exit thread */
1545
            /* Exit thread */
1532
            return;
1546
            return;
1533
       
1547
       
1534
        case FB_PUTCHAR:
1548
        case FB_PUTCHAR:
1535
            glyph = IPC_GET_ARG1(call);
1549
            ch = IPC_GET_ARG1(call);
1536
            row = IPC_GET_ARG2(call);
1550
            row = IPC_GET_ARG2(call);
1537
            col = IPC_GET_ARG3(call);
1551
            col = IPC_GET_ARG3(call);
1538
           
1552
           
1539
            if ((col >= vport->cols) || (row >= vport->rows)) {
1553
            if ((col >= vport->cols) || (row >= vport->rows)) {
1540
                retval = EINVAL;
1554
                retval = EINVAL;
1541
                break;
1555
                break;
1542
            }
1556
            }
1543
            ipc_answer_0(callid, EOK);
1557
            ipc_answer_0(callid, EOK);
1544
           
1558
           
1545
            draw_char(vport, glyph, col, row);
1559
            draw_char(vport, ch, col, row);
1546
           
1560
           
1547
            /* Message already answered */
1561
            /* Message already answered */
1548
            continue;
1562
            continue;
1549
        case FB_CLEAR:
1563
        case FB_CLEAR:
1550
            vport_clear(vport);
1564
            vport_clear(vport);
Line 1617... Line 1631...
1617
            if (!viewports[i].initialized) {
1631
            if (!viewports[i].initialized) {
1618
                retval = EADDRNOTAVAIL;
1632
                retval = EADDRNOTAVAIL;
1619
                break;
1633
                break;
1620
            }
1634
            }
1621
            viewports[i].initialized = false;
1635
            viewports[i].initialized = false;
1622
            if (viewports[i].glyphs)
-
 
1623
                free(viewports[i].glyphs);
-
 
1624
            if (viewports[i].bgpixel)
1636
            if (viewports[i].bgpixel)
1625
                free(viewports[i].bgpixel);
1637
                free(viewports[i].bgpixel);
1626
            if (viewports[i].backbuf)
1638
            if (viewports[i].backbuf)
1627
                free(viewports[i].backbuf);
1639
                free(viewports[i].backbuf);
1628
            retval = EOK;
1640
            retval = EOK;