Subversion Repositories HelenOS-historic

Compare Revisions

Ignore whitespace Rev 837 → Rev 838

/kernel/trunk/genarch/src/fb/fb.c
34,33 → 34,93
 
SPINLOCK_INITIALIZE(fb_lock);
 
static unsigned char *fbaddress=NULL;
static __u8 *fbaddress=NULL;
static int xres,yres;
static int position=0;
static int columns=0;
static int rows=0;
static int pixelbytes=0;
 
#define COL_WIDTH 8
#define ROW_HEIGHT (FONT_SCANLINES)
#define ROW_PIX (xres*ROW_HEIGHT*3)
#define ROW_PIX (xres*ROW_HEIGHT*pixelbytes)
 
#define BGCOLOR 0x000080
#define FGCOLOR 0xffff00
 
#define RED(x) ((x >> 16) & 0xff)
#define GREEN(x) ((x >> 8) & 0xff)
#define BLUE(x) (x & 0xff)
#define RED(x,bits) ((x >> (16+8-bits)) & ((1<<bits)-1))
#define GREEN(x,bits) ((x >> (8+8-bits)) & ((1<<bits)-1))
#define BLUE(x,bits) ((x >> (8-bits)) & ((1<<bits)-1))
 
#define POINTPOS(x,y,colidx) ((y*xres+x)*3+colidx)
#define POINTPOS(x,y) ((y*xres+x)*pixelbytes)
 
/***************************************************************/
/* Pixel specific fuctions */
 
/** Draw pixel of given color on screen */
static inline void putpixel(int x,int y,int color)
{
fbaddress[POINTPOS(x,y,0)] = RED(color);
fbaddress[POINTPOS(x,y,1)] = GREEN(color);
fbaddress[POINTPOS(x,y,2)] = BLUE(color);
int startbyte = POINTPOS(x,y);
 
if (pixelbytes == 3) {
fbaddress[startbyte] = RED(color,8);
fbaddress[startbyte+1] = GREEN(color,8);
fbaddress[startbyte+2] = BLUE(color,8);
} else if (pixelbytes == 4) {
*((__u32 *)(fbaddress+startbyte)) = color;
} else {
int compcolor;
/* 5-bit, 5-bits, 5-bits */
compcolor = RED(color,5) << 10 \
| GREEN(color,5) << 5 \
| BLUE(color,5);
*((__u16 *)(fbaddress+startbyte)) = compcolor;
}
}
 
/** Return pixel color */
static inline int getpixel(int x,int y)
{
int startbyte = POINTPOS(x,y);
int color;
int result;
 
if (pixelbytes == 3) {
result = fbaddress[startbyte] << 16 \
| fbaddress[startbyte+1] << 8 \
| fbaddress[startbyte+2];
} else if (pixelbytes == 4) {
result = *((__u32 *)(fbaddress+startbyte)) & 0xffffff;
} else {
int red,green,blue;
color = *((__u16 *)(fbaddress+startbyte));
red = (color >> 10) & 0x1f;
green = (color >> 5) & 0x1f;
blue = color & 0x1f;
result = (red << 16) | (green << 8) | blue;
}
return result;
}
 
static void clear_line(int y);
/** Scroll screen one row up */
static void scroll_screen(void)
{
int i;
 
for (i=0;i < (xres*yres*pixelbytes)-ROW_PIX; i++)
fbaddress[i] = fbaddress[i+ROW_PIX];
 
/* Clear last row */
for (i=0; i < ROW_HEIGHT;i++)
clear_line((rows-1)*ROW_HEIGHT+i);
}
 
 
/***************************************************************/
/* Screen specific function */
 
/** Fill line with color BGCOLOR */
static void clear_line(int y)
{
80,25 → 140,10
 
static void invert_pixel(int x, int y)
{
fbaddress[POINTPOS(x,y,0)] = ~fbaddress[POINTPOS(x,y,0)];
fbaddress[POINTPOS(x,y,1)] = ~fbaddress[POINTPOS(x,y,1)];
fbaddress[POINTPOS(x,y,2)] = ~fbaddress[POINTPOS(x,y,2)];
putpixel(x,y, ~getpixel(x,y));
}
 
/** Scroll screen one row up */
static void scroll_screen(void)
{
int i;
 
for (i=0;i < (xres*yres*3)-ROW_PIX; i++)
fbaddress[i] = fbaddress[i+ROW_PIX];
 
/* Clear last row */
for (i=0; i < ROW_HEIGHT;i++)
clear_line((rows-1)*ROW_HEIGHT+i);
}
 
/** Draw one line of glyph at a given position */
static void draw_glyph_line(int glline, int x, int y)
{
111,8 → 156,11
putpixel(x+i,y,BGCOLOR);
}
 
/***************************************************************/
/* Character-console functions */
 
/** Draw character at given position */
static void draw_glyph(unsigned char glyph, int col, int row)
static void draw_glyph(__u8 glyph, int col, int row)
{
int y;
 
137,6 → 185,9
draw_glyph(chr, position % columns, position/columns);
}
 
/***************************************************************/
/* Stdout specific functions */
 
static void invert_cursor(void)
{
invert_char(position % columns, position/columns);
161,6 → 212,12
invert_cursor();
if (position % columns)
position--;
} else if (ch == '\t') {
invert_cursor();
do {
draw_char(' ');
position++;
} while (position % 8);
} else {
draw_char(ch);
position++;
184,13 → 241,15
* @param addr Address of framebuffer
* @param x X resolution
* @param y Y resolution
* @param bytes Bytes per pixel (2,3,4)
*/
void fb_init(__address addr, int x, int y)
void fb_init(__address addr, int x, int y, int bytes)
{
fbaddress = (unsigned char *)addr;
xres = x;
yres = y;
pixelbytes = bytes;
rows = y/ROW_HEIGHT;
columns = x/COL_WIDTH;