Subversion Repositories HelenOS

Rev

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

Rev 4167 Rev 4211
Line 95... Line 95...
95
    rgb_conv_t rgb_conv;
95
    rgb_conv_t rgb_conv;
96
} screen;
96
} screen;
97
 
97
 
98
/** Backbuffer character cell. */
98
/** Backbuffer character cell. */
99
typedef struct {
99
typedef struct {
100
    uint8_t glyph;
100
    uint32_t glyph;
101
    uint32_t fg_color;
101
    uint32_t fg_color;
102
    uint32_t bg_color;
102
    uint32_t bg_color;
103
} bb_cell_t;
103
} bb_cell_t;
104
 
104
 
105
typedef struct {
105
typedef struct {
Line 192... Line 192...
192
 
192
 
193
static int fb_set_color(viewport_t *vport, ipcarg_t fg_color,
193
static int fb_set_color(viewport_t *vport, ipcarg_t fg_color,
194
    ipcarg_t bg_color, ipcarg_t attr);
194
    ipcarg_t bg_color, ipcarg_t attr);
195
 
195
 
196
static void draw_glyph_aligned(unsigned int x, unsigned int y, bool cursor,
196
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);
197
    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,
198
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);
199
    uint8_t *glyphs, uint32_t glyph, uint32_t fg_color, uint32_t bg_color);
200
 
200
 
201
static void draw_vp_glyph(viewport_t *vport, bool cursor, unsigned int col,
201
static void draw_vp_glyph(viewport_t *vport, bool cursor, unsigned int col,
202
    unsigned int row);
202
    unsigned int row);
203
 
203
 
204
 
204
 
Line 657... Line 657...
657
 * @param glyph     Code of the glyph to draw.
657
 * @param glyph     Code of the glyph to draw.
658
 * @param fg_color  Foreground color.
658
 * @param fg_color  Foreground color.
659
 * @param bg_color  Backgroudn color.
659
 * @param bg_color  Backgroudn color.
660
 */
660
 */
661
static void draw_glyph_aligned(unsigned int x, unsigned int y, bool cursor,
661
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)
662
    uint8_t *glyphs, uint32_t glyph, uint32_t fg_color, uint32_t bg_color)
663
{
663
{
664
    unsigned int i, yd;
664
    unsigned int i, yd;
665
    unsigned long fg_buf, bg_buf;
665
    unsigned long fg_buf, bg_buf;
666
    unsigned long *maskp, *dp;
666
    unsigned long *maskp, *dp;
667
    unsigned long mask;
667
    unsigned long mask;
668
    unsigned int ww, d_add;
668
    unsigned int ww, d_add;
669
 
669
 
-
 
670
    /* Check glyph range. */
-
 
671
    if (glyph >= FONT_GLYPHS)
-
 
672
        return;
-
 
673
 
670
    /*
674
    /*
671
     * Prepare a pair of words, one filled with foreground-color
675
     * Prepare a pair of words, one filled with foreground-color
672
     * pattern and the other filled with background-color pattern.
676
     * pattern and the other filled with background-color pattern.
673
     */
677
     */
674
    for (i = 0; i < sizeof(unsigned long) / screen.pixelbytes; i++) {
678
    for (i = 0; i < sizeof(unsigned long) / screen.pixelbytes; i++) {
Line 676... Line 680...
676
            fg_color);
680
            fg_color);
677
        screen.rgb_conv(&((uint8_t *)&bg_buf)[i * screen.pixelbytes],
681
        screen.rgb_conv(&((uint8_t *)&bg_buf)[i * screen.pixelbytes],
678
            bg_color);
682
            bg_color);
679
    }
683
    }
680
 
684
 
681
 
-
 
682
    /* Pointer to the current position in the mask. */
685
    /* Pointer to the current position in the mask. */
683
    maskp = (unsigned long *) &glyphs[GLYPH_POS(glyph, 0, cursor)];
686
    maskp = (unsigned long *) &glyphs[GLYPH_POS(glyph, 0, cursor)];
684
 
687
 
685
    /* Pointer to the current position on the screen. */
688
    /* Pointer to the current position on the screen. */
686
    dp = (unsigned long *) &screen.fb_addr[FB_POS(x, y)];
689
    dp = (unsigned long *) &screen.fb_addr[FB_POS(x, y)];
Line 718... Line 721...
718
 * @param glyph     Code of the glyph to draw.
721
 * @param glyph     Code of the glyph to draw.
719
 * @param fg_color  Foreground color.
722
 * @param fg_color  Foreground color.
720
 * @param bg_color  Backgroudn color.
723
 * @param bg_color  Backgroudn color.
721
 */
724
 */
722
void draw_glyph_fallback(unsigned int x, unsigned int y, bool cursor,
725
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)
726
    uint8_t *glyphs, uint32_t glyph, uint32_t fg_color, uint32_t bg_color)
724
{
727
{
725
    unsigned int i, j, yd;
728
    unsigned int i, j, yd;
726
    uint8_t fg_buf[4], bg_buf[4];
729
    uint8_t fg_buf[4], bg_buf[4];
727
    uint8_t *dp, *sp;
730
    uint8_t *dp, *sp;
728
    unsigned int d_add;
731
    unsigned int d_add;
729
    uint8_t b;
732
    uint8_t b;
730
 
733
 
-
 
734
    /* Check glyph range. */
-
 
735
    if (glyph >= FONT_GLYPHS)
-
 
736
        return;
-
 
737
 
731
    /* Pre-render 1x the foreground and background color pixels. */
738
    /* Pre-render 1x the foreground and background color pixels. */
732
    if (cursor) {
739
    if (cursor) {
733
        screen.rgb_conv(fg_buf, bg_color);
740
        screen.rgb_conv(fg_buf, bg_color);
734
        screen.rgb_conv(bg_buf, fg_color);
741
        screen.rgb_conv(bg_buf, fg_color);
735
    } else {
742
    } else {
Line 777... Line 784...
777
    unsigned int row)
784
    unsigned int row)
778
{
785
{
779
    unsigned int x = vport->x + COL2X(col);
786
    unsigned int x = vport->x + COL2X(col);
780
    unsigned int y = vport->y + ROW2Y(row);
787
    unsigned int y = vport->y + ROW2Y(row);
781
 
788
 
782
    uint8_t glyph;
789
    uint32_t glyph;
783
    uint32_t fg_color;
790
    uint32_t fg_color;
784
    uint32_t bg_color;
791
    uint32_t bg_color;
785
   
792
   
786
    glyph = vport->backbuf[BB_POS(vport, col, row)].glyph;
793
    glyph = vport->backbuf[BB_POS(vport, col, row)].glyph;
787
    fg_color = vport->backbuf[BB_POS(vport, col, row)].fg_color;
794
    fg_color = vport->backbuf[BB_POS(vport, col, row)].fg_color;
Line 834... Line 841...
834
 * @param c      Character to draw
841
 * @param c      Character to draw
835
 * @param col    Screen position relative to viewport
842
 * @param col    Screen position relative to viewport
836
 * @param row    Screen position relative to viewport
843
 * @param row    Screen position relative to viewport
837
 *
844
 *
838
 */
845
 */
839
static void draw_char(viewport_t *vport, uint8_t c, unsigned int col, unsigned int row)
846
static void draw_char(viewport_t *vport, wchar_t c, unsigned int col, unsigned int row)
840
{
847
{
841
    bb_cell_t *bbp;
848
    bb_cell_t *bbp;
842
 
849
 
843
    /* Do not hide cursor if we are going to overwrite it */
850
    /* Do not hide cursor if we are going to overwrite it */
844
    if ((vport->cursor_active) && (vport->cursor_shown) &&
851
    if ((vport->cursor_active) && (vport->cursor_shown) &&
845
        ((vport->cur_col != col) || (vport->cur_row != row)))
852
        ((vport->cur_col != col) || (vport->cur_row != row)))
846
        cursor_hide(vport);
853
        cursor_hide(vport);
847
 
854
 
848
    bbp = &vport->backbuf[BB_POS(vport, col, row)];
855
    bbp = &vport->backbuf[BB_POS(vport, col, row)];
849
    bbp->glyph = c;
856
    bbp->glyph = (uint32_t) c;
850
    bbp->fg_color = vport->attr.fg_color;
857
    bbp->fg_color = vport->attr.fg_color;
851
    bbp->bg_color = vport->attr.bg_color;
858
    bbp->bg_color = vport->attr.bg_color;
852
 
859
 
853
    draw_vp_glyph(vport, false, col, row);
860
    draw_vp_glyph(vport, false, col, row);
854
   
861
   
Line 887... Line 894...
887
        for (i = 0; i < w; i++) {
894
        for (i = 0; i < w; i++) {
888
            unsigned int col = x + i;
895
            unsigned int col = x + i;
889
            unsigned int row = y + j;
896
            unsigned int row = y + j;
890
 
897
 
891
            bbp = &vport->backbuf[BB_POS(vport, col, row)];
898
            bbp = &vport->backbuf[BB_POS(vport, col, row)];
892
            uint8_t glyph = bbp->glyph;
899
            uint32_t glyph = bbp->glyph;
893
 
900
 
894
            a = &data[j * w + i].attrs;
901
            a = &data[j * w + i].attrs;
895
            rgb_from_attr(&rgb, a);
902
            rgb_from_attr(&rgb, a);
896
 
903
 
897
            bbp->glyph = data[j * w + i].character;
904
            bbp->glyph = data[j * w + i].character;
Line 1508... Line 1515...
1508
        ipc_callid_t callid;
1515
        ipc_callid_t callid;
1509
        ipc_call_t call;
1516
        ipc_call_t call;
1510
        int retval;
1517
        int retval;
1511
        unsigned int i;
1518
        unsigned int i;
1512
        int scroll;
1519
        int scroll;
1513
        uint8_t glyph;
1520
        uint32_t glyph;
1514
        unsigned int row, col;
1521
        unsigned int row, col;
1515
       
1522
       
1516
        if ((vport->cursor_active) || (anims_enabled))
1523
        if ((vport->cursor_active) || (anims_enabled))
1517
            callid = async_get_call_timeout(&call, 250000);
1524
            callid = async_get_call_timeout(&call, 250000);
1518
        else
1525
        else