#include "OSD_header.h"
struct fb_fix_screeninfo finfo; //OSD静态属性
struct fb_var_screeninfo vinfo; //OSD动态参数
static int fbfd = 0;
char *fbp = 0;
int opframebuffer();
int background();
int putpixel(int x,int y,long int p_color);
int line(int x0,int y0,int x1,int y1,long int p_color);
/*以指定颜色来填充像素点*/
int putpixel(int x,int y,long int p_color)
{
long int fb_offset;
fb_offset =(y*vinfo.xres + x)*(vinfo.bits_per_pixel/8);
*((long*)(fbp+fb_offset)) = p_color;
close(fbfd);
return 0;
}
/*设置framebuffer的背景色*/
int background()
{
int w, h, p_width, p_height;
long int p_color,fb_offset;
opframebuffer(); //调用framebuffer初始化函数
printf("%dx%d\n",vinfo.xres,vinfo.yres);//显示OSD的列数、行数
printf("bits_per_pixel is %d\n",vinfo.bits_per_pixel);
printf("line_length is %d\n",finfo.line_length);
p_width = vinfo.xres; //提取framebuffer每行像素数
p_height = vinfo.yres; //提取framebuffer每列像素数
fbp = (char *)mmap(0, finfo.smem_len, PROT_READ | PROT_WRITE, MAP_SHARED, fbfd, 0);//framebuffer基址指针
p_color = 0x0000FF; //填充颜色=0000FF(blue)
fb_offset = 0; //framebuffer内部偏移量, 从0开始
for( h = 0; h < p_height; h++ )
{
for(w = 0; w < p_width; w++)
{
*((long *)(fbp + fb_offset)) = p_color;//填充指定颜色
fb_offset += vinfo.bits_per_pixel/8;
}
}
return 0;
}
/*framebuffer初始化*/
int opframebuffer()
{
fbfd = open("/dev/fb0", O_RDWR); //打开framebuffer文件
ioctl(fbfd, FBIOGET_FSCREENINFO, &finfo);//关联framebuffer静态属性
ioctl(fbfd, FBIOGET_VSCREENINFO, &vinfo);//关联framebuffer动态属性
return 0;
}
int main(int argc ,char ** argv )
{
int x0,y0,x1,y1;
printf("input the two points of the line:\n");
scanf("%d%d%d%d",&x0,&y0,&x1,&y1);
background();
line(x0,y0,x1,y1,0xFFFF00); // yellow
return 0;
}
int line(int x0,int y0,int x1,int y1,long int p_color)
{
int x,y,dx,dy,e,k,i;
opframebuffer(); //调用framebuffer初始化函数
fbp = (char *)mmap(0, finfo.smem_len, PROT_READ | PROT_WRITE, MAP_SHARED, fbfd, 0);//framebuffer基址指针
dx=x1-x0; dy=y1-y0; x= x0; y= y0;
if( !dx)
{
if(y1 > y0)
{
for(i=0;i<y1-y0;i++)
{
putpixel(x,y+i,p_color);
}
}
else
{
for(i=0;i<y0-y1;i++)
{
putpixel(x,y-i,p_color);
}
}
}
else
{
k = dy/dx;
if( !k && !dy)
{
if(x1 > x0)
{
for(i=0;i<x1-x0;i++)
{
putpixel(x+i,y,p_color);
}
}
else
{
for(i=0;i<x0-x1;i++)
{
putpixel(x-i,y,p_color);
}
}
}
else if(k<=1 && k >=0 && dy*dx >0 )
{
e = -dx;
while(x<=x1)
{
putpixel(x,y,p_color);
x++;
e=e+2*dy;
if(e>0)
{
y++;
e=e-2*dx;
}
if(x >x1 || y > y1) break;
}
}
else if( k> 1)
{
e= -dy;
while(y<=y1)
{
putpixel(x,y,p_color);
y++;
e = e + 2*dx;
if(e > 0)
{
x++;
e = e - 2*dy;
}
if(x > x1 || y > y1) break;
}
}
else if(k >= -1 && k <= 0 && dy*dx < 0)
{
e = -dx;
while(x <= x1)
{
putpixel(x,y,p_color);
x++;
e=e-2*dy;
if(e>0)
{
y--;
e=e-2*dx;
}
if(x > x1 || y < y1) break;
}
}
else // k< -1
{
e= -dy;
while(y >= y1)
{
putpixel(x,y,p_color);
y--;
e = e - 2*dx;
if(e > 0)
{
x++;
e = e - 2*dy;
}
if(x > x1 || y < y1) break;
}
}
}
close(fbfd);
return 0;
}
|