支持SVGA的高分辨率绘图通过调用中断 10h的4f功能来实现
主要分辨率设置代码
unsigned char set_SVGA_mode(int vmode)
{union REGS r
r.x.ax=0x4f02
r.x.bx=vmode
int86(0x10,&r,&r)
return(r.h.ah)
}
void hide_text_cursor(void)
{union REGS r
r.h.ah=1
r.h.ch=32
int86(0x10,&r,&r)
}
void selectpage(register char page)
{union REGS r
r.x.ax=0x4f05
r.x.bx=0
r.x.dx=page
int86(0x10,&r,&r)
}
void show_text_cursor(char size)
{union REGS r
r.h.ah=1
r.h.cl=size
r.h.ch=7
int86(0x10,&r,&r)
}
unsigned int get_SVGA_mode()
{union REGS r
r.x.ax=0x4f03
int86(0x10,&r,&r)
return(r.x.bx)
}
windows下本来就是图形界面,随便可以画,有关的概念是:Canvas,brush,color等类/参数,DrawLine/DrawArc函数/方法。
framebuffer(帧缓冲)。
帧的最低数量为24(人肉眼可见)(低于24则感觉到画面不流畅)。
显卡与帧的关系:由cpu调节其数据传输速率来输出其三基色的配比。
三基色:RGB(红绿蓝)。
在没有桌面和图形文件的系统界面,可以通过C语言的编程来实现在黑色背景上画图!
用下面的代码,在需要的地方(有注释)适当修改,就能画出自己喜欢的图形!
PS:同样要编译运行后才能出效果。
#include <stdio.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <linux/fb.h>
#include <stdlib.h>
#define RGB888(r,g,b) ((r &0xff) <<16 | (g &0xff) <<8 | (b &0xff))
#define RGB565(r,g,b) ((r &0x1f) <<11 | (g &0x3f) <<5 | (b &0x1f))
int main()
{
int fd = open("/dev/fb0", O_RDWR)
if(fd <0){
perror("open err. \n")
exit(EXIT_FAILURE)
printf("xres: %d\n", info.xres)
printf("yres: %d\n", info.yres)
printf("bits_per_pixel: %d\n", info.bits_per_pixel)
size_t len = info.xres*info.yres*info.bits_per_pixel >>3
unsigned long* addr = NULL
addr = mmap(NULL, len, PROT_WRITE|PROT_READ, MAP_SHARED, fd, 0)
if(addr == (void*)-1){
perror("mmap err. \n")
Turbo C提供了非常丰富的图形函数, 所有图形函数的原型均在graphics. h中, 本节主要介绍图形模式的初始化、独立图形程序的建立、基本图形功能、图形窗口以及图形模式下的文本输出等函数。另外, 使用图形函数时要确保有显示器图形驱动程序*BGI, 同时将集成开发环境Options/Linker中的Graphics lib选为on, 只有这样才能保证正确使用图形函数。由于种类比较多,所以下面仅列举2个例子,抛砖引玉→1.点
void far putpixel(int x, int y, int color)
2.线
void far line(int x0, int y0, int x1, int y1)画一条从点(x0, y0)到(x1, y1)的直线。
void far lineto(int x, int y)画一作从现行游标到点(x, y)的直线。
void far linerel(int dx, int dy)画一条从现行游标(x, y)到按相对增量确定的点(x+dx, y+dy)的直线。
void far circle(int x, int y, int radius)以(x, y)为圆心, radius为半径, 画一个圆。
c语言的图形部分是很有意思的!也是c中最精彩的内容之一,希望你能很快享受它的乐趣!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)