linux控制台绘图-安装svgalib(11)

   今天不打游戏了,就接着写文章吧。现在已经到了编写关于树这个重要的数据结构的时候了,前面二查查找树已经完成,昨天AVL平衡树已经实现了,总想用一个比较直观方法显示树,这当然要图形啦。
  在LINUX下不能够直接像用TC的BGL那样进行绘图,需要借助图形库。LINUX下可选的图形库很多,我知道的有,QT/GTK/SDL/CURSES,NCURSES/MiniGuit/SVGALIB等等,如果想在Console下用的话,我想大概最容易上手不需要启动X的大概要数Cursees/NCurses/SVGALIB。实际上NCurses是基于Curse库的,并且两者都是基于字符的,也就是说在80x24的Console上你只能是进行基于字符的处理,而非像素,也就是说你不能你TC里那样画线画圆,等等,你可以想像一下当见的vi,基于这个库,就可以做出那样的界面简洁功能强大的编辑工具!要在Console下绘图话,你需要SVGALIB,虽然这是一个如此老的库!这个库是可以在官方站点上下载到源代码:http:// www.svgalib.org,和很多第一次下载代码的人一样,让我无法理解的是,下载的源代码不知道是因为编译器不同还是怎么回事,居然出现很多貌似c的语法错误,有些网友已经把大部分错误纠正过来了,但是在我的系统(ubuntu 7.10 server+fvwm,gcc 4.1.3)上还存在其它错误。下面就介绍怎么样纠正源代码和安装:
在http://www.svgalib.org下载 svgalib-1.4.3.tar.gz
解压:
tar xvf svgalib-1.4.3.tar.gz
接着,
1.这是从网上找到的纠正过程,一步步照做。
首先修改makefile.cfg。
/usr/local/lib -> /usr/lib
:注,这一步我并没有进行修改。
然后分别修改以下代码:

demos/speedtest.c

demos/linearspeed.c
gl/inlstring.h


change "movzbl **,ax" in __memset() to "movzbl **,eax"


demos/lineart.c
in screen() gcc complained of missing terminator for
  the first printf statement.  Put it all on one line.


src/vgabg.h
  delete this:

  extern void *__svgalib_linearframebuffer;


src/mach32.c
  add this:
  extern void *__svgalib_linearframebuffer;


  after the label finish_w_eeprom: in mach32_init() add a ";"


src/vga.c
  add this:
  extern void *__svgalib_linearframebuffer;


  in initialize() change the test "if ((long) GM < 0)" to
  "if ((void *) GM == MAP_FAILED)"


-- the GETINT macro is broken; remove it and replace code
  that uses it with this:
       ptr = strtok(NULL, " "); if(!ptr) break;
       mmt.HDisplay = atoi(ptr);
       ptr = strtok(NULL, " "); if(!ptr) break;
       mmt.HSyncStart = atoi(ptr);
       ptr = strtok(NULL, " "); if(!ptr) break;
       mmt.HSyncEnd = atoi(ptr);
       ptr = strtok(NULL, " "); if(!ptr) break;
       mmt.HTotal = atoi(ptr);
       ptr = strtok(NULL, " "); if(!ptr) break;
       mmt.VDisplay = atoi(ptr);
       ptr = strtok(NULL, " "); if(!ptr) break;
       mmt.VSyncStart = atoi(ptr);
       ptr = strtok(NULL, " "); if(!ptr) break;
       mmt.VSyncEnd = atoi(ptr);
       ptr = strtok(NULL, " "); if(!ptr) break;
       mmt.VTotal = atoi(ptr);


src/apm.c

  code at the end of apm_saveregs() caused "invalid lvalue
  in assignment" errors.  It's a little unclear; there may
  be inconsistencies about register sizes.  Since I don't
  have this equipment (I think), I couldn't test it.
  But it compiles if you change the last 6 assignments to

  *(unsigned long *)(&(regs[APMREG_SAVE(18)])) =
  inlXR(0xf0) ;
  *(unsigned long *)(&(regs[APMREG_SAVE(22)])) =
  inlXR(0xf4) ;
  *(unsigned long *)(&(regs[APMREG_SAVE(26)])) =
  inlXR(0x140) ;
  *(unsigned short *)(&(regs[APMREG_SAVE(30)])) =
  inXR(0x144) ;
  *(unsigned long *)(&(regs[APMREG_SAVE(32)])) =
  inlXR(0x148) ;
  *(unsigned short *)(&(regs[APMREG_SAVE(36)])) =
  inXR(0x14c) ;


src/s3.c
   after the label "default:" at end of s3_ext_set() add a ";"
  2。除以上错误外,我的GCC还是不依不饶。如果你也有同样错误,请按以下修改:
    ./src/apm.c
   行154~159,把每行的(unsign long)去除,这里出现的是无效的左值(lvalue)错误
   ?奇怪,这种c语言在其它编译器可以通过吗?
   ./src/mach32.c
   行 1594末尾加上分号
   似乎还有一些文件中也有这样label末尾的"compound statement"错误,如果有,就加分号就是了。

3。修正以上错误后再根据自己的情况看看,总之看起来都像是c语法错误(我不敢那么大胆公然说这是语法错误啦^_^)。
  接着输入
  make install
  make demoprogs
安装完成

用以下程序测试一下吧:
/*testSVGA.c*/
#include <stdio.h>
#include <vga.h>
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;
}

编译运行:
gcc -testSVGA.c -o testSVGA -lvga
./testSVGA

接下来我在Console下绘制树的c函数接口玩一下,并用来测试AVL树^_^
 
 
  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值