1.关于 tty图形模式网上已有现成的开源代码库:SVGALib
2.移植 SVGALib ( Ubuntu 环境 )
2.1 下载开源代码
https://launchpad.net/ubuntu/+source/svgalib/1:1.4.3-30
svgalib_1.4.3.orig.tar.gz
svgalib_1.4.3-30.debian.tar.gz
svgalib_1.4.3-30.dsc
2.2 解压、打补丁
tar xzf svgalib_1.4.3.orig.tar.gz
tar xzf svgalib_1.4.3-30.debian.tar.gz
cd svgalib-1.4.3.orig/
for file in ../debian/patches/*.patch; do patch -p1 < $file; done /* 循环打补丁,
将上层目录:debian/patches 的补丁全打上*/
2.3 编译安装
sudo make install // 此时编译将会出错,需要安装libx86
error: libx86.h: No such file or directory
error: invalid use of undefined type struct LRMI_regs?
2.3.1 下载libx86
下载地址
http://packages.ubuntu.com/lucid/libx86-1
2.3.2 解压、打补丁
tar xzf libx86_1.1+ds1.orig.tar.gz
gunzip libx86_1.1+ds1-6.diff.gz
cd libx86-1.1/
patch -p1 < ../libx86_1.1+ds1-6.diff
2.3.3 编译安装libx86
make // 出错,修改lrmi.c,添加宏, 参考561491.patch
lrmi.c:191: error: IF_MASK?undeclared (first use in this function
IF_MASK 这个宏没有定义,根据网上的561491.patch lrmi.c缺少宏,把宏复制过去就可以了
make
sudo make install
cd svgalib-1.4.3.orig
sudo make install //svgalib 安装成功!!!
3.可以参照 svgalib-1.4.3.orig/demos 里的vgatest.c 进行编写简单的调试程序。
首先能够去www.svgalib.org把原代码宕下来.
tar -zxvf svgalib-1.4.3.tar.gz
cd svgalib-1.4.3
make
make install
假如有需要可能还要执行西面这两行
echo "/usr/local/lib">>/etc/ld.so.conf
ldconfig
好了,下面就能够用svgalib了
先来个小的
#include
int main()
{
int i;
vga_init();//vga初始化
vga_setmode(G800x600x256);//配置屏幕的显示模式
vga_setcolor(5);//选用5号颜色
vga_drawline(50,50,350,350);//用5号颜色画一条线段
vga_getch(); //得到任意键
vga_setmode(TEXT);//回到控制台字符模式
return 0;
}
很简单的一个
编译的时候用 g++ foo.c -o foo -lvga
下面来个稍微复杂点的
#include
#include
#include
#include
#include
int main()
{
int i;
bool flag;
int pointx;
int pointy;
unsigned char *colors;
vga_init();
//svgalib初始化
vga_setmode(G800x600x256);
//配置屏幕的显示模式,800X600的分辨虑,256色
vga_setcolor(5);
//选用5号颜色
vga_drawline(200,300,600,100);
//用5号颜色画一条线段
vga_drawpixel(400,100);
//在坐标400,200以5号颜色画上一点
for(i=0;i<255;i++)
{
vga_setcolor(i);
vga_drawpixel(i,100);
}
vga_getch(); //按任意键继续
vga_screenoff();//关闭屏幕,您将什么都看不到
colors=(unsigned char *)malloc(800);
for(i=0;i<800;i++)
colors[i]=vga_getpixel(i,100);
//得到屏幕上纵坐标为100的线的任何点的颜色
vga_drawscanline(15,colors);
//画一条水平扫描线,但是由于已关闭屏幕,您将什么都看不到
vga_getch();//按任意键继续
vga_screenon();//打开屏幕,您将发现屏幕上多了个水平扫描线
vga_setpalette(5,20,10,15);
//改调色板,胡乱定义5号颜色为R200,G100,B150
vga_setcolor(5);
vga_drawline(200,300,700,500);
//您将看到以前的那条线的颜色也改变了,因为调色板是全局的
vga_drawscansegment(colors,100,300,50);
//画我们所得到的水平扫描线的一部分,从100,300开始50个点
//稍微来点小花样
for(i=0;i<100;i++)
{
vga_drawscansegment(colors,100+i,10+i,50);
vga_drawscansegment(colors,200-i,10+i,50);
}
for(i=0;i<100;i++)
{
vga_drawscansegment(colors,600+i/2,10+i,50);
vga_drawscansegment(colors,700-i/2,10+i,50);
}
//下面画个正弦曲线
vga_setcolor(1);
vga_drawline(10,300,700,300);
vga_drawline(680,280,700,300);
vga_drawline(680,320,700,300);
vga_drawline(400,50,400,550);
vga_drawline(380,70,400,50);
vga_drawline(420,70,400,50);
pointx=100;
pointy=300;
vga_setcolor(4);
for(i=1;i<540;i++)
{ vga_drawline(pointx,pointy,100+i,300+100*sin(i*M_PI/180));
pointx=100+i;
pointy=300+100*sin(i*M_PI/180);
}
//下面操作调色板玩玩看看
i=0;
flag=true;
while(!vga_getkey())//当没有键盘输入的时候循环
{
vga_waitretrace();
//等到射线扫描返回,此函数对防止屏幕闪烁很有用
vga_waitretrace();
//呵呵,另外一个作用就是还能够用来延时,大约1/40到1/80秒之间
vga_setpalette(4,i,i,i);
vga_setpalette(5,i,i/2,63);
if(flag)i++;
else i--;
if(i==63)flag=false;
if(i==1)flag=true;
}
vga_setmode(TEXT);//回到控制台字符模式
free(colors);
return 0;
}
一般很多程式实际上不用svgalib的绘图部分,他们一般只是获得一个图像的入口而已.
实际应用svgalib图像库绘图的时候,其中vga_打头的函数用的不是很多,gl_打头的才是重点, 因为他能很容易实现双缓冲,卷屏的操作,嗯,今天就先写到这里,以后慢慢写