Subversion Repositories HelenOS-historic

Rev

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

Rev 1505 Rev 1509
Line 74... Line 74...
74
    unsigned int width, height;
74
    unsigned int width, height;
75
 
75
 
76
    /* Text support in window */
76
    /* Text support in window */
77
    unsigned int rows, cols;
77
    unsigned int rows, cols;
78
    /* Style for text printing */
78
    /* Style for text printing */
79
    int bgcolor, fgcolor;
79
    style_t style;
80
    /* Auto-cursor position */
80
    /* Auto-cursor position */
81
    int cursor_active, cur_col, cur_row;
81
    int cursor_active, cur_col, cur_row;
82
    int cursor_shown;
82
    int cursor_shown;
83
} viewport_t;
83
} viewport_t;
84
 
84
 
Line 189... Line 189...
189
/** Fill line with color BGCOLOR */
189
/** Fill line with color BGCOLOR */
190
static void clear_line(int vp, unsigned int y)
190
static void clear_line(int vp, unsigned int y)
191
{
191
{
192
    unsigned int x;
192
    unsigned int x;
193
    for (x = 0; x < viewports[vp].width; x++)
193
    for (x = 0; x < viewports[vp].width; x++)
194
        putpixel(vp, x, y, viewports[vp].bgcolor);
194
        putpixel(vp, x, y, viewports[vp].style.bg_color);
195
}
195
}
196
 
196
 
197
/** Fill viewport with background color */
197
/** Fill viewport with background color */
198
static void clear_port(int vp)
198
static void clear_port(int vp)
199
{
199
{
Line 237... Line 237...
237
        for (y=viewports[vp].y + viewports[vp].height-1; y >= viewports[vp].y + rows*FONT_SCANLINES; y--)
237
        for (y=viewports[vp].y + viewports[vp].height-1; y >= viewports[vp].y + rows*FONT_SCANLINES; y--)
238
            memcpy(&screen.fbaddress[POINTPOS(viewports[vp].x,y)],
238
            memcpy(&screen.fbaddress[POINTPOS(viewports[vp].x,y)],
239
                &screen.fbaddress[POINTPOS(viewports[vp].x,y - rows*FONT_SCANLINES)],
239
                &screen.fbaddress[POINTPOS(viewports[vp].x,y - rows*FONT_SCANLINES)],
240
                screen.pixelbytes * viewports[vp].width);
240
                screen.pixelbytes * viewports[vp].width);
241
        /* Clear first row */
241
        /* Clear first row */
242
        clear_line(0, viewports[vp].bgcolor);
242
        clear_line(0, viewports[vp].style.bg_color);
243
        for (y=1;y < rows*FONT_SCANLINES; y++)
243
        for (y=1;y < rows*FONT_SCANLINES; y++)
244
            memcpy(&screen.fbaddress[POINTPOS(viewports[vp].x,viewports[vp].y+y)],
244
            memcpy(&screen.fbaddress[POINTPOS(viewports[vp].x,viewports[vp].y+y)],
245
                   &screen.fbaddress[POINTPOS(viewports[vp].x,viewports[vp].y)],
245
                   &screen.fbaddress[POINTPOS(viewports[vp].x,viewports[vp].y)],
246
                   screen.pixelbytes * viewports[vp].width);
246
                   screen.pixelbytes * viewports[vp].width);
247
    }
247
    }
Line 251... Line 251...
251
{
251
{
252
    putpixel(vp, x, y, ~getpixel(vp, x, y));
252
    putpixel(vp, x, y, ~getpixel(vp, x, y));
253
}
253
}
254
 
254
 
255
 
255
 
256
/** Draw one line of glyph at a given position */
-
 
257
static void draw_glyph_line(int vp,unsigned int glline, unsigned int x, unsigned int y)
-
 
258
{
-
 
259
    unsigned int i;
-
 
260
 
-
 
261
    for (i = 0; i < 8; i++)
-
 
262
        if (glline & (1 << (7 - i))) {
-
 
263
            putpixel(vp, x + i, y, viewports[vp].fgcolor);
-
 
264
        } else
-
 
265
            putpixel(vp, x + i, y, viewports[vp].bgcolor);
-
 
266
}
-
 
267
 
-
 
268
/***************************************************************/
256
/***************************************************************/
269
/* Character-console functions */
257
/* Character-console functions */
270
 
258
 
271
/** Draw character at given position */
259
/** Draw character at given position */
272
static void draw_glyph(int vp,__u8 glyph, unsigned int sx, unsigned int sy)
260
static void draw_glyph(int vp,__u8 glyph, unsigned int sx, unsigned int sy, style_t style)
273
{
261
{
-
 
262
    int i;
274
    unsigned int y;
263
    unsigned int y;
-
 
264
    unsigned int glline;
275
 
265
 
276
    for (y = 0; y < FONT_SCANLINES; y++)
266
    for (y = 0; y < FONT_SCANLINES; y++) {
277
        draw_glyph_line(vp ,fb_font[glyph * FONT_SCANLINES + y], sx, sy + y);
267
        glline = fb_font[glyph * FONT_SCANLINES + y];
-
 
268
        for (i = 0; i < 8; i++) {
-
 
269
            if (glline & (1 << (7 - i)))
-
 
270
                putpixel(vp, sx + i, sy + y, style.fg_color);
-
 
271
            else
-
 
272
                putpixel(vp, sx + i, sy + y, style.bg_color);
-
 
273
        }
-
 
274
    }
278
}
275
}
279
 
276
 
280
/** Invert character at given position */
277
/** Invert character at given position */
281
static void invert_char(int vp,unsigned int row, unsigned int col)
278
static void invert_char(int vp,unsigned int row, unsigned int col)
282
{
279
{
Line 300... Line 297...
300
    for (y = 0; y < helenos_height; y++)
297
    for (y = 0; y < helenos_height; y++)
301
        for (x = 0; x < helenos_width; x++) {
298
        for (x = 0; x < helenos_width; x++) {
302
            byte = helenos_bits[rowbytes * y + x / 8];
299
            byte = helenos_bits[rowbytes * y + x / 8];
303
            byte >>= x % 8;
300
            byte >>= x % 8;
304
            if (byte & 1)
301
            if (byte & 1)
305
                putpixel(vp ,startx + x, starty + y, viewports[vp].fgcolor);
302
                putpixel(vp ,startx + x, starty + y, viewports[vp].style.fg_color);
306
        }
303
        }
307
}
304
}
308
 
305
 
309
/***************************************************************/
306
/***************************************************************/
310
/* Stdout specific functions */
307
/* Stdout specific functions */
Line 338... Line 335...
338
    viewports[i].height = height;
335
    viewports[i].height = height;
339
   
336
   
340
    viewports[i].rows = height / FONT_SCANLINES;
337
    viewports[i].rows = height / FONT_SCANLINES;
341
    viewports[i].cols = width / COL_WIDTH;
338
    viewports[i].cols = width / COL_WIDTH;
342
 
339
 
343
    viewports[i].bgcolor = DEFAULT_BGCOLOR;
340
    viewports[i].style.bg_color = DEFAULT_BGCOLOR;
344
    viewports[i].fgcolor = DEFAULT_FGCOLOR;
341
    viewports[i].style.fg_color = DEFAULT_FGCOLOR;
345
   
342
   
346
    viewports[i].cur_col = 0;
343
    viewports[i].cur_col = 0;
347
    viewports[i].cur_row = 0;
344
    viewports[i].cur_row = 0;
348
    viewports[i].cursor_active = 0;
345
    viewports[i].cursor_active = 0;
349
 
346
 
Line 435... Line 432...
435
 * @param vp Viewport identification
432
 * @param vp Viewport identification
436
 * @param c Character to print
433
 * @param c Character to print
437
 * @param row Screen position relative to viewport
434
 * @param row Screen position relative to viewport
438
 * @param col Screen position relative to viewport
435
 * @param col Screen position relative to viewport
439
 */
436
 */
440
static void draw_char(int vp, char c, unsigned int row, unsigned int col)
437
static void draw_char(int vp, char c, unsigned int row, unsigned int col, style_t style)
441
{
438
{
442
    viewport_t *vport = &viewports[vp];
439
    viewport_t *vport = &viewports[vp];
443
 
440
 
444
    /* Optimize - do not hide cursor if we are going to overwrite it */
441
    /* Optimize - do not hide cursor if we are going to overwrite it */
445
    if (vport->cursor_active && vport->cursor_shown &&
442
    if (vport->cursor_active && vport->cursor_shown &&
446
        (vport->cur_col != col || vport->cur_row != row))
443
        (vport->cur_col != col || vport->cur_row != row))
447
        invert_char(vp, vport->cur_row, vport->cur_col);
444
        invert_char(vp, vport->cur_row, vport->cur_col);
448
   
445
   
449
    draw_glyph(vp, c, col * COL_WIDTH, row * FONT_SCANLINES);
446
    draw_glyph(vp, c, col * COL_WIDTH, row * FONT_SCANLINES, style);
450
 
447
 
451
    vport->cur_col = col;
448
    vport->cur_col = col;
452
    vport->cur_row = row;
449
    vport->cur_row = row;
453
 
450
 
454
    vport->cur_col++;
451
    vport->cur_col++;
Line 467... Line 464...
467
    int i;
464
    int i;
468
    char c;
465
    char c;
469
 
466
 
470
    clear_port(vp);
467
    clear_port(vp);
471
    for (i=0; i < vport->cols * vport->rows; i++) {
468
    for (i=0; i < vport->cols * vport->rows; i++) {
472
        if (data[i].character == ' ') /* TODO: && data[i].style==vport->style */
469
        if (data[i].character == ' ' && style_same(data[i].style,vport->style))
473
            continue;
470
            continue;
474
        draw_char(vp, data[i].character, i/vport->rows, i % vport->cols);
471
        draw_char(vp, data[i].character, i/vport->rows, i % vport->cols,
-
 
472
              data[i].style);
475
    }
473
    }
476
    cursor_print(vp);
474
    cursor_print(vp);
477
}
475
}
478
 
476
 
479
 
477
 
Line 542... Line 540...
542
                retval = EINVAL;
540
                retval = EINVAL;
543
                break;
541
                break;
544
            }
542
            }
545
            ipc_answer_fast(callid,0,0,0);
543
            ipc_answer_fast(callid,0,0,0);
546
 
544
 
547
            draw_char(vp, c, row, col);
545
            draw_char(vp, c, row, col, vport->style);
548
            continue; /* msg already answered */
546
            continue; /* msg already answered */
549
        case FB_CLEAR:
547
        case FB_CLEAR:
550
            clear_port(vp);
548
            clear_port(vp);
551
            cursor_print(vp);
549
            cursor_print(vp);
552
            retval = 0;
550
            retval = 0;
Line 618... Line 616...
618
            }
616
            }
619
            viewports[i].initialized = 0;
617
            viewports[i].initialized = 0;
620
            retval = 0;
618
            retval = 0;
621
            break;
619
            break;
622
        case FB_SET_STYLE:
620
        case FB_SET_STYLE:
623
            vport->fgcolor = IPC_GET_ARG1(call);
621
            vport->style.fg_color = IPC_GET_ARG1(call);
624
            vport->bgcolor = IPC_GET_ARG2(call);
622
            vport->style.bg_color = IPC_GET_ARG2(call);
625
            retval = 0;
623
            retval = 0;
626
            break;
624
            break;
627
        case FB_GET_RESOLUTION:
625
        case FB_GET_RESOLUTION:
628
            ipc_answer_fast(callid, 0, screen.xres,screen.yres);
626
            ipc_answer_fast(callid, 0, screen.xres,screen.yres);
629
            continue;
627
            continue;